unpack timers from localStorage

This commit is contained in:
Вячеслав 2025-06-14 19:43:26 +05:00
parent b0b04f645e
commit 2a1bae6021
4 changed files with 52 additions and 13 deletions

View file

@ -2,7 +2,7 @@ import {useEffect, useState} from 'react';
import TimeManager from '../../helpers/TimeManager';
import Button from '../Button/Button';
import styles from './Timer.module.css'
import {formatTime} from '../../helpers/Formatters';
import {formatTime, isToday} from '../../helpers/DateFunctions.ts';
import LocalStorageManager from "../../helpers/LocalStorageManager.ts";
interface TimerProps {
@ -10,7 +10,25 @@ interface TimerProps {
}
const Timer = (props: TimerProps) => {
const [timeManager, recreateTimeManager] = useState(() => new TimeManager(0))
const [timeManager, recreateTimeManager] = useState(() => {
const localStorageManager = new LocalStorageManager<TimeManager>();
const storedRaw = localStorageManager.getItem(props.id);
let stored: TimeManager | null = null;
if (storedRaw === null) {
return new TimeManager(0);
}
stored = TimeManager.initFromJSON(storedRaw);
if (!isToday(stored.getStartDate())) {
localStorageManager.removeItem(props.id);
return new TimeManager(0);
}
return TimeManager.initFromJSON(storedRaw);
})
const [remainingTime, setRemainingTime] = useState({minutes: 0, seconds: 0});
const [startDate, setStartDate] = useState('00:00');
const [endDate, setEndDate] = useState('00:00');
@ -18,18 +36,12 @@ const Timer = (props: TimerProps) => {
useEffect(() => {
timeManager.start()
console.log("timer started")
const interval = setInterval(() => {
setRemainingTime(timeManager.getRemainingTime());
const startString = formatTime(timeManager.getStartDate());
const endString = formatTime(timeManager.getEndDate());
if (startString === endString) {
setStartDate('00:00');
setEndDate('00:00');
} else {
setStartDate(startString);
setEndDate(endString);
}
setStartDate(startString === endString ? '00:00' : startString);
setEndDate(startString === endString ? '00:00' : endString);
}, 100);
return () => {
@ -46,6 +58,10 @@ const Timer = (props: TimerProps) => {
const handlePause = () => handleUpdate(m => m.togglePause());
const handleAdd = () => handleUpdate(m => m.addTime(1));
const handleSubstraction = () => handleUpdate(m => m.subtractTime(1));
const handleClear = () => {
localStorageManager.removeItem(props.id);
recreateTimeManager(new TimeManager(0));
}
const handleRecreation = (minutes: number) => {
const newTimeManager = new TimeManager(minutes)
recreateTimeManager(newTimeManager);
@ -59,7 +75,7 @@ const Timer = (props: TimerProps) => {
<Button label='-1 мин' onClick={handleSubstraction}/>
<Button label='+1 мин' onClick={handleAdd}/>
</div>
<Button label='X' onClick={() => handleRecreation(-1)}/>
<Button label='X' onClick={() => handleClear()}/>
</div>
<div className={styles.clock}>
<a onClick={handlePause}

View file

@ -9,4 +9,13 @@ export const formatTime = (date: Date) => {
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
return `${hours}:${minutes}`;
};
};
export const isToday = (date: Date) => {
const today = new Date();
return (
date.getFullYear() === today.getFullYear() &&
date.getMonth() === today.getMonth() &&
date.getDate() === today.getDate()
);
}

View file

@ -15,6 +15,20 @@ class TimeManager {
this.endDate = new Date(this.endTime);
}
static initFromJSON(json: TimeManager): TimeManager {
const manager = new TimeManager(0);
manager.startDate = new Date(json.startDate);
manager.endDate = new Date(json.endDate);
manager.initialTime = json.initialTime;
manager.endTime = json.endTime;
manager.pauseTime = json.pauseTime;
manager.remainingTimeOnPause = json.remainingTimeOnPause;
manager.isPaused = json.isPaused;
return manager;
}
start(): void {
if (this.intervalId !== null || this.pauseTime !== null) return;

View file

@ -1,7 +1,7 @@
import {useEffect, useState} from 'react';
import Timer from '../../components/Timer/Timer';
import styles from './Timers.module.css';
import {formatFullTime} from "../../helpers/Formatters.ts";
import {formatFullTime} from "../../helpers/DateFunctions.ts";
const Timers = () => {
const [time, setTime] = useState(new Date());