@@ -61,6 +61,17 @@ import {
6161import { usePullToRefresh } from '@/shared/hooks/use-pull-to-refresh' ;
6262import { RoleDecryption } from '@/shared/lib/role-decryption' ;
6363
64+ // 시간을 포맷팅하는 함수 (초 -> HH:MM:SS)
65+ const formatSecondsToTime = ( seconds : number ) : string => {
66+ if ( seconds <= 0 ) return '00:00:00' ;
67+
68+ const hours = Math . floor ( seconds / 3600 ) ;
69+ const minutes = Math . floor ( ( seconds % 3600 ) / 60 ) ;
70+ const remainingSeconds = seconds % 60 ;
71+
72+ return `${ hours . toString ( ) . padStart ( 2 , '0' ) } :${ minutes . toString ( ) . padStart ( 2 , '0' ) } :${ remainingSeconds . toString ( ) . padStart ( 2 , '0' ) } ` ;
73+ } ;
74+
6475export default function AdminPage ( ) {
6576 const router = useRouter ( ) ;
6677 const { toast } = useToast ( ) ;
@@ -134,6 +145,47 @@ export default function AdminPage() {
134145 threshold : 80 ,
135146 } ) ;
136147
148+ // 실시간 카운트다운을 위한 useEffect
149+ useEffect ( ( ) => {
150+ const interval = setInterval ( ( ) => {
151+ setAdminReservations ( prevReservations =>
152+ prevReservations . map ( reservation => {
153+ if ( reservation . remainingSeconds > 0 ) {
154+ return {
155+ ...reservation ,
156+ remainingSeconds : reservation . remainingSeconds - 1 ,
157+ remainingTime : formatSecondsToTime ( reservation . remainingSeconds - 1 )
158+ } ;
159+ }
160+ return reservation ;
161+ } )
162+ ) ;
163+
164+ // 정지된 사용자의 남은 시간도 업데이트
165+ setAdminUsers ( prevUsers =>
166+ prevUsers . map ( user => {
167+ if ( user . restrictedUntil ) {
168+ const now = new Date ( ) ;
169+ const restrictedUntil = new Date ( user . restrictedUntil ) ;
170+ const diffMs = restrictedUntil . getTime ( ) - now . getTime ( ) ;
171+
172+ if ( diffMs <= 0 ) {
173+ // 정지 시간이 끝났으면 정지 상태 해제
174+ return {
175+ ...user ,
176+ restrictedUntil : null ,
177+ restrictionReason : null
178+ } ;
179+ }
180+ }
181+ return user ;
182+ } )
183+ ) ;
184+ } , 1000 ) ;
185+
186+ return ( ) => clearInterval ( interval ) ;
187+ } , [ ] ) ;
188+
137189 useEffect ( ( ) => {
138190 const isAdminUser = RoleDecryption ( ) === 'ROLE_ADMIN' ;
139191 setIsAdmin ( isAdminUser ) ;
@@ -324,16 +376,13 @@ export default function AdminPage() {
324376 deviceName ,
325377 ! currentStatus
326378 ) ;
327- // if (response.success) {
328- // toast({
329- // title: !currentStatus ? '기기 고장 등록' : '기기 수리 완료',
330- // description: `${deviceName} 기기가 ${
331- // !currentStatus ? '고장 상태로 등록' : '수리 완료 상태로 변경'
332- // }되었습니다.`,
333- // });
334- // await loadOutOfOrderDevices();
335- // await fetchMachines(); // 메인 기기 목록도 새로고침
336- // }
379+ toast ( {
380+ title : ! currentStatus ? '기기 고장 등록' : '기기 수리 완료' ,
381+ description : `${ deviceName } 기기가 ${ ! currentStatus ? '고장 상태로 등록' : '수리 완료 상태로 변경'
382+ } 되었습니다.`,
383+ } ) ;
384+ await loadOutOfOrderDevices ( ) ;
385+ await fetchMachines ( ) ; // 메인 기기 목록도 새로고침
337386 } catch ( error ) {
338387 toast ( {
339388 title : '상태 변경 실패' ,
@@ -349,13 +398,11 @@ export default function AdminPage() {
349398 const response = await reservationApi . forceDeleteReservation (
350399 reservationId
351400 ) ;
352- // if (response.success) {
353- // toast({
354- // title: '예약 삭제 완료',
355- // description: '예약이 성공적으로 삭제되었습니다.',
356- // });
357- // await loadAdminReservations();
358- // }
401+ toast ( {
402+ title : '예약 삭제 완료' ,
403+ description : '예약이 성공적으로 삭제되었습니다.' ,
404+ } ) ;
405+ await loadAdminReservations ( ) ;
359406 } catch ( error ) {
360407 toast ( {
361408 title : '예약 삭제 실패' ,
@@ -759,7 +806,9 @@ export default function AdminPage() {
759806 </ p >
760807 < p className = 'text-xs text-gray-500' >
761808 남은 시간:{ ' ' }
762- { reservation . remainingTime }
809+ < span className = { `font-mono ${ reservation . remainingSeconds <= 300 ? 'text-red-600 font-semibold' : '' } ` } >
810+ { reservation . remainingTime }
811+ </ span >
763812 </ p >
764813 </ div >
765814 < Badge
@@ -1310,7 +1359,7 @@ export default function AdminPage() {
13101359 < Clock className = 'h-3 w-3 mr-1' />
13111360 정지 중
13121361 </ Badge >
1313- < p className = 'text-xs text-red-600 mt-1' >
1362+ < p className = 'text-xs text-red-600 mt-1 font-mono ' >
13141363 남은 시간:{ ' ' }
13151364 { getRestrictedTimeRemaining (
13161365 user . restrictedUntil !
0 commit comments