small refactoring

This commit is contained in:
Вячеслав 2026-01-27 16:28:44 +05:00
parent c6a64db982
commit 9ce248272d

View file

@ -1,4 +1,4 @@
import {useEffect, useState} from 'react'; import {useEffect, useRef, useState} from 'react';
import TimeManager from '../../helpers/TimeManager'; import TimeManager from '../../helpers/TimeManager';
import Button from '../Button/Button'; import Button from '../Button/Button';
import styles from './Timer.module.css' import styles from './Timer.module.css'
@ -9,40 +9,67 @@ interface TimerProps {
id: string id: string
} }
type TimerViewState = {
remainingTime: { minutes: number; seconds: number };
startDate: string;
endDate: string;
};
const Timer = (props: TimerProps) => { const Timer = (props: TimerProps) => {
const [timeManager, recreateTimeManager] = useState(() => { const storageRef = useRef(new LocalStorageManager<TimeManager>());
const localStorageManager = new LocalStorageManager<TimeManager>();
const storedRaw = localStorageManager.getItem(props.id); const [timeManager, setTimeManager] = useState(() => {
let stored: TimeManager | null = null; const storedRaw = storageRef.current.getItem(props.id);
if (storedRaw === null) { if (storedRaw === null) {
return new TimeManager(0); return new TimeManager(0);
} }
stored = TimeManager.initFromJSON(storedRaw); const stored = TimeManager.initFromJSON(storedRaw);
if (!isToday(stored.getStartDate())) { if (!isToday(stored.getStartDate())) {
localStorageManager.removeItem(props.id); storageRef.current.removeItem(props.id);
return new TimeManager(0); return new TimeManager(0);
} }
return TimeManager.initFromJSON(storedRaw); return stored;
}) });
const [remainingTime, setRemainingTime] = useState({minutes: 0, seconds: 0});
const [startDate, setStartDate] = useState('00:00'); const [view, setView] = useState<TimerViewState>({
const [endDate, setEndDate] = useState('00:00'); remainingTime: {minutes: 0, seconds: 0},
const localStorageManager = new LocalStorageManager<TimeManager>(); startDate: '00:00',
endDate: '00:00',
});
useEffect(() => { useEffect(() => {
timeManager.start() timeManager.start()
const interval = setInterval(() => { const interval = setInterval(() => {
setRemainingTime(timeManager.getRemainingTime()); const remainingTime = timeManager.getRemainingTime();
const startString = formatTime(timeManager.getStartDate());
const endString = formatTime(timeManager.getEndDate()); const startDateString = formatTime(timeManager.getStartDate());
setStartDate(startString === endString ? '00:00' : startString); const endDateString = formatTime(timeManager.getEndDate());
setEndDate(startString === endString ? '00:00' : endString); const same = startDateString === endDateString;
}, 100);
const next: TimerViewState = {
remainingTime,
startDate: same ? '00:00' : startDateString,
endDate: same ? '00:00' : endDateString,
};
setView((prev) => {
if (
prev.remainingTime.minutes === next.remainingTime.minutes &&
prev.remainingTime.seconds === next.remainingTime.seconds &&
prev.startDate === next.startDate &&
prev.endDate === next.endDate
) {
return prev;
}
return next;
})
}, 250);
return () => { return () => {
clearInterval(interval); clearInterval(interval);
@ -52,20 +79,21 @@ const Timer = (props: TimerProps) => {
const handleUpdate = (updater: (manager: TimeManager) => void) => { const handleUpdate = (updater: (manager: TimeManager) => void) => {
updater(timeManager); updater(timeManager);
localStorageManager.setItem(props.id, timeManager); storageRef.current.setItem(props.id, timeManager);
} }
const handlePause = () => handleUpdate(m => m.togglePause()); const handlePause = () => handleUpdate(m => m.togglePause());
const handleAdd = () => handleUpdate(m => m.addTime(1)); const handleAdd = () => handleUpdate(m => m.addTime(1));
const handleSubstraction = () => handleUpdate(m => m.subtractTime(1)); const handleSubstraction = () => handleUpdate(m => m.subtractTime(1));
const handleClear = () => { const handleClear = () => {
localStorageManager.removeItem(props.id); storageRef.current.removeItem(props.id);
recreateTimeManager(new TimeManager(0)); setTimeManager(new TimeManager(0));
} }
const handleRecreation = (minutes: number) => { const handleRecreation = (minutes: number) => {
const newTimeManager = new TimeManager(minutes) const newTimeManager = new TimeManager(minutes)
recreateTimeManager(newTimeManager); setTimeManager(newTimeManager);
localStorageManager.setItem(props.id, newTimeManager); storageRef.current.setItem(props.id, newTimeManager);
} }
return ( return (
@ -79,14 +107,14 @@ const Timer = (props: TimerProps) => {
</div> </div>
<div className={styles.clock}> <div className={styles.clock}>
<a onClick={handlePause} <a onClick={handlePause}
className={styles.clock_text}>{remainingTime.minutes}:{remainingTime.seconds < 10 ? '0' : ''}{remainingTime.seconds}</a> className={styles.clock_text}>{view.remainingTime.minutes}:{view.remainingTime.seconds < 10 ? '0' : ''}{view.remainingTime.seconds}</a>
</div> </div>
<div className={styles.dates_container}> <div className={styles.dates_container}>
<div className={styles.dates_item}> <div className={styles.dates_item}>
{startDate} {view.startDate}
</div> </div>
<div className={styles.dates_item}> <div className={styles.dates_item}>
{endDate} {view.endDate}
</div> </div>
</div> </div>
<div className={styles.presets_buttons}> <div className={styles.presets_buttons}>