mirror of
https://github.com/sheptikhinv/timers.git
synced 2026-02-07 07:41:36 +05:00
unpack timers from localStorage
This commit is contained in:
parent
b0b04f645e
commit
2a1bae6021
4 changed files with 52 additions and 13 deletions
|
|
@ -2,7 +2,7 @@ import {useEffect, 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'
|
||||||
import {formatTime} from '../../helpers/Formatters';
|
import {formatTime, isToday} from '../../helpers/DateFunctions.ts';
|
||||||
import LocalStorageManager from "../../helpers/LocalStorageManager.ts";
|
import LocalStorageManager from "../../helpers/LocalStorageManager.ts";
|
||||||
|
|
||||||
interface TimerProps {
|
interface TimerProps {
|
||||||
|
|
@ -10,7 +10,25 @@ interface TimerProps {
|
||||||
}
|
}
|
||||||
|
|
||||||
const Timer = (props: 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 [remainingTime, setRemainingTime] = useState({minutes: 0, seconds: 0});
|
||||||
const [startDate, setStartDate] = useState('00:00');
|
const [startDate, setStartDate] = useState('00:00');
|
||||||
const [endDate, setEndDate] = useState('00:00');
|
const [endDate, setEndDate] = useState('00:00');
|
||||||
|
|
@ -18,18 +36,12 @@ const Timer = (props: TimerProps) => {
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
timeManager.start()
|
timeManager.start()
|
||||||
console.log("timer started")
|
|
||||||
const interval = setInterval(() => {
|
const interval = setInterval(() => {
|
||||||
setRemainingTime(timeManager.getRemainingTime());
|
setRemainingTime(timeManager.getRemainingTime());
|
||||||
const startString = formatTime(timeManager.getStartDate());
|
const startString = formatTime(timeManager.getStartDate());
|
||||||
const endString = formatTime(timeManager.getEndDate());
|
const endString = formatTime(timeManager.getEndDate());
|
||||||
if (startString === endString) {
|
setStartDate(startString === endString ? '00:00' : startString);
|
||||||
setStartDate('00:00');
|
setEndDate(startString === endString ? '00:00' : endString);
|
||||||
setEndDate('00:00');
|
|
||||||
} else {
|
|
||||||
setStartDate(startString);
|
|
||||||
setEndDate(endString);
|
|
||||||
}
|
|
||||||
}, 100);
|
}, 100);
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
|
|
@ -46,6 +58,10 @@ const Timer = (props: TimerProps) => {
|
||||||
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 = () => {
|
||||||
|
localStorageManager.removeItem(props.id);
|
||||||
|
recreateTimeManager(new TimeManager(0));
|
||||||
|
}
|
||||||
const handleRecreation = (minutes: number) => {
|
const handleRecreation = (minutes: number) => {
|
||||||
const newTimeManager = new TimeManager(minutes)
|
const newTimeManager = new TimeManager(minutes)
|
||||||
recreateTimeManager(newTimeManager);
|
recreateTimeManager(newTimeManager);
|
||||||
|
|
@ -59,7 +75,7 @@ const Timer = (props: TimerProps) => {
|
||||||
<Button label='-1 мин' onClick={handleSubstraction}/>
|
<Button label='-1 мин' onClick={handleSubstraction}/>
|
||||||
<Button label='+1 мин' onClick={handleAdd}/>
|
<Button label='+1 мин' onClick={handleAdd}/>
|
||||||
</div>
|
</div>
|
||||||
<Button label='X' onClick={() => handleRecreation(-1)}/>
|
<Button label='X' onClick={() => handleClear()}/>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.clock}>
|
<div className={styles.clock}>
|
||||||
<a onClick={handlePause}
|
<a onClick={handlePause}
|
||||||
|
|
|
||||||
|
|
@ -10,3 +10,12 @@ export const formatTime = (date: Date) => {
|
||||||
const minutes = String(date.getMinutes()).padStart(2, '0');
|
const minutes = String(date.getMinutes()).padStart(2, '0');
|
||||||
return `${hours}:${minutes}`;
|
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()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -15,6 +15,20 @@ class TimeManager {
|
||||||
this.endDate = new Date(this.endTime);
|
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 {
|
start(): void {
|
||||||
if (this.intervalId !== null || this.pauseTime !== null) return;
|
if (this.intervalId !== null || this.pauseTime !== null) return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import {useEffect, useState} from 'react';
|
import {useEffect, useState} from 'react';
|
||||||
import Timer from '../../components/Timer/Timer';
|
import Timer from '../../components/Timer/Timer';
|
||||||
import styles from './Timers.module.css';
|
import styles from './Timers.module.css';
|
||||||
import {formatFullTime} from "../../helpers/Formatters.ts";
|
import {formatFullTime} from "../../helpers/DateFunctions.ts";
|
||||||
|
|
||||||
const Timers = () => {
|
const Timers = () => {
|
||||||
const [time, setTime] = useState(new Date());
|
const [time, setTime] = useState(new Date());
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue