Skip to content

Commit 4773d1b

Browse files
committed
Save in localstorage
1 parent 10fec66 commit 4773d1b

File tree

3 files changed

+69
-4
lines changed

3 files changed

+69
-4
lines changed

src/consts/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
11
export const PURPLE_COLOR = '#713A91';
2+
3+
export const LOCAL_STORAGE_KEY = {
4+
HOURS_TAB: 'hours:view_tab',
5+
HOURS_SELECTED_DATE: 'hours:view_date',
6+
};

src/hooks/useLocalStorage.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { useCallback, useState } from 'react';
2+
3+
type Value = boolean | number | string | any[] | Record<string, any>;
4+
type ParseFn<T> = (raw: string) => T;
5+
6+
function readFromStorage<T extends Value>(
7+
key: string,
8+
valueParse?: ParseFn<T>
9+
): T | null {
10+
const raw = window.localStorage.getItem(key);
11+
if (raw === null) {
12+
return raw;
13+
}
14+
try {
15+
const value = JSON.parse(raw);
16+
if (typeof valueParse === 'function') {
17+
return valueParse(value);
18+
}
19+
return value;
20+
} catch {
21+
return null;
22+
}
23+
}
24+
25+
export default function useLocalStorage<T extends Value>(
26+
key: string,
27+
defaultValue: T,
28+
getFromStorageFirst: boolean,
29+
valueParse?: (raw: string) => T
30+
): [T, (t: T) => void] {
31+
const [value, setValue] = useState<T>(() => {
32+
if (getFromStorageFirst) {
33+
return readFromStorage(key, valueParse) ?? defaultValue;
34+
}
35+
return defaultValue;
36+
});
37+
38+
const setItem = useCallback(
39+
(value: T) => {
40+
window.localStorage.setItem(key, JSON.stringify(value));
41+
setValue(value);
42+
},
43+
[key]
44+
);
45+
46+
return [value, setItem];
47+
}

src/screens/hours/HoursScreen.tsx

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useMemo, useState } from 'react';
1+
import React, { useMemo } from 'react';
22
import { Layout, Space } from 'antd';
33
import { observer } from 'mobx-react';
44
import { createUseStyles } from 'react-jss';
@@ -8,15 +8,28 @@ import { getTimeItems } from '../../helpers/TaskHelper';
88
import TotalHours from './components/TotalHours/TotalHours';
99
import Header from './components/Header';
1010
import GridWithTimeItemsView from './components/GridWithTimeItemsView';
11-
import { HoursTabView } from './types';
1211
import TimelineScreen from './components/TimelineScreen';
12+
import { HoursTabView } from './types';
13+
import useLocalStorage from '../../hooks/useLocalStorage';
14+
import { LOCAL_STORAGE_KEY } from '../../consts';
1315

1416
const { tasksStore } = rootStore;
1517

18+
const parseDateFromString = (value: string) => new Date(value);
19+
1620
export default observer(function HoursScreen() {
1721
const classes = useStyles();
18-
const [date, setDate] = useState<Date>(new Date());
19-
const [tab, setTab] = useState<HoursTabView>(HoursTabView.Edit);
22+
const [date, setDate] = useLocalStorage<Date>(
23+
LOCAL_STORAGE_KEY.HOURS_SELECTED_DATE,
24+
new Date(),
25+
true,
26+
parseDateFromString
27+
);
28+
const [tab, setTab] = useLocalStorage<HoursTabView>(
29+
LOCAL_STORAGE_KEY.HOURS_TAB,
30+
HoursTabView.Edit,
31+
true
32+
);
2033

2134
const tasks = useMemo(() => tasksStore.getTasksByDate(date), [
2235
tasksStore.tasks,

0 commit comments

Comments
 (0)