|
1 | 1 | import Button from '@/components/Button/Button'; |
2 | 2 | import FloatingBackground from '@/components/FloatingBackground/FloatingBackground'; |
3 | | -import { useCallback, useEffect, useState } from 'react'; |
| 3 | +import { useCallback, useEffect, useRef, useState } from 'react'; |
4 | 4 | import { useNavigate } from 'react-router-dom'; |
5 | | -import { formatMillisecondsToHMS, getTodayAtHour } from '@/utils/time'; |
6 | 5 |
|
7 | 6 | const Main = () => { |
8 | 7 | const [restTime, setRestTime] = useState(10); |
| 8 | + |
| 9 | + const nowTime = useRef(Date.now()); |
| 10 | + const eightTime = new Date(); |
| 11 | + eightTime.setHours(8, 0, 0, 0); |
| 12 | + |
9 | 13 | const isVoted = localStorage.getItem('voted') === 'true'; |
10 | 14 |
|
| 15 | + const changeDateTime = useCallback((diff: number) => { |
| 16 | + const hours = Math.floor(diff / (1000 * 60 * 60)); |
| 17 | + const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); |
| 18 | + const seconds = Math.floor((diff % (1000 * 60)) / 1000); |
| 19 | + |
| 20 | + return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`; |
| 21 | + }, []); |
| 22 | + |
11 | 23 | useEffect(() => { |
12 | | - const todayAtFour = getTodayAtHour(16); // 16시 |
| 24 | + const todayAtFour = new Date(); |
| 25 | + todayAtFour.setHours(16, 0, 0, 0); // 16시 |
13 | 26 |
|
14 | 27 | const updateTimer = () => { |
15 | 28 | const now = new Date().getTime(); |
@@ -39,30 +52,38 @@ const Main = () => { |
39 | 52 | <FloatingBackground /> |
40 | 53 | <div className="flex flex-col justify-center gap-6"> |
41 | 54 | <p className="text-base sm:text-lg md:text-xl text-gray-600 font-pb"> |
42 | | - {restTime > 0 ? '투표 결과 발표까지 남은 시간' : '투표 집계가 완료되었습니다.'} |
| 55 | + {nowTime.current > eightTime.getTime() && restTime > 0 |
| 56 | + ? '투표 결과 발표까지 남은 시간' |
| 57 | + : '투표 집계가 완료되었습니다.'} |
43 | 58 | </p> |
44 | 59 | <p |
45 | 60 | className={`${ |
46 | | - restTime > 0 |
| 61 | + nowTime.current > eightTime.getTime() && restTime > 0 |
47 | 62 | ? 'text-gray-600' |
48 | 63 | : 'bg-gradient-to-r from-red-500 to-lime-300 bg-clip-text text-transparent' |
49 | 64 | } text-3xl sm:text-4xl md:text-5xl font-pb`} |
50 | 65 | > |
51 | | - {restTime > 0 ? formatMillisecondsToHMS(restTime) : '결과 발표'} |
| 66 | + {nowTime.current > eightTime.getTime() && restTime > 0 |
| 67 | + ? changeDateTime(restTime) |
| 68 | + : '결과 발표'} |
52 | 69 | </p> |
53 | 70 | <p className="mt-4 text-3xl sm:text-5xl md:text-6xl font-pb leading-none"> |
54 | 71 | <span className="bg-[var(--color-primary-base)] px-2">너로</span> 정했다! |
55 | 72 | </p> |
56 | 73 | </div> |
57 | 74 | <div className="w-full max-w-xs text-base sm:text-lg md:text-xl font-pb mt-10"> |
58 | | - {restTime > 0 ? ( |
| 75 | + {nowTime.current > eightTime.getTime() && restTime > 0 ? ( |
59 | 76 | <Button |
60 | 77 | onClick={handleMoveToVote} |
61 | 78 | label={isVoted ? '투표완료' : '투표하기'} |
62 | 79 | disabled={isVoted} |
63 | 80 | /> |
64 | 81 | ) : ( |
65 | | - <Button onClick={handleMoveToResult} label="결과 확인" /> |
| 82 | + <Button |
| 83 | + onClick={handleMoveToResult} |
| 84 | + label="결과 확인" |
| 85 | + disabled={nowTime.current - eightTime.getTime() > 0 ? true : false} |
| 86 | + /> |
66 | 87 | )} |
67 | 88 | </div> |
68 | 89 | </div> |
|
0 commit comments