mirror of
https://github.com/sheptikhinv/timers.git
synced 2026-02-07 07:41:36 +05:00
small refactoring
This commit is contained in:
parent
c6a64db982
commit
9ce248272d
1 changed files with 55 additions and 27 deletions
|
|
@ -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}>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue