Skip to content

Commit 87a838c

Browse files
authored
Merge pull request #62 from team-washer/fix/admin-force-cancel
강제 취소 리프레시 및 남은 시간 표시
2 parents 3d8b48f + e5f7da8 commit 87a838c

2 files changed

Lines changed: 69 additions & 20 deletions

File tree

‎src/app/admin/page.tsx‎

Lines changed: 68 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,17 @@ import {
6161
import { usePullToRefresh } from '@/shared/hooks/use-pull-to-refresh';
6262
import { 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+
6475
export 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!

‎src/shared/lib/reservation-store.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ function convertServerMachineToClient(
9494
id: serverMachine.label || `unknown-${Date.now()}`,
9595
serverId: serverMachine.id || 0,
9696
type,
97-
floor: (serverMachine.floor as FloorType) || '3F',
97+
floor: (serverMachine.floor as FloorType) || 3,
9898
location,
9999
status,
100100
isOutOfOrder: serverMachine.isOutOfOrder || false,

0 commit comments

Comments
 (0)