/
index.tsx
98 lines (86 loc) · 2.37 KB
/
index.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/** @module Components.Editor.AutoSave */
import { Button, Switch, Tooltip } from 'antd'
import { RedoOutlined } from '@ant-design/icons'
import { useCallback, useContext, useEffect, useState } from 'react'
import { useCookies } from 'react-cookie'
import { EditorContext } from '@/context/editor'
import { setModel, setTemplate } from '@/context/editor/actions'
import style from '../index.module.css'
/**
* AutoSave
* @returns AutoSave
*/
const AutoSave: React.FunctionComponent = () => {
// State
const [disabled, setDisabled] = useState<boolean>(true)
const [checked, setChecked] = useState<boolean>(true)
// Cookies
const [cookies, setCookie] = useCookies(['accepted'])
// Data
const { model, template, dispatch } = useContext(EditorContext)
// Auto-save
useEffect(() => {
if (cookies.accepted) {
setDisabled(false)
if (checked) {
const id = setInterval(() => {
sessionStorage.setItem('model', model)
sessionStorage.setItem('template', template)
}, 30_000)
return () => clearInterval(id)
}
} else setDisabled(true)
}, [cookies.accepted, checked, model, template, setCookie])
/**
* On checked
* @param checked Checked
*/
const onChecked = useCallback((checked: boolean): void => {
setChecked(checked)
}, [])
/**
* On reload
*/
const onReload = useCallback((): void => {
const model = sessionStorage.getItem('model')
const template = sessionStorage.getItem('template')
dispatch(setModel(model ?? ''))
dispatch(setTemplate(template ?? ''))
}, [dispatch])
/**
* Render
*/
return (
<div id="autoSave" className={style.autoSave}>
<Tooltip
title={
'Auto-save' +
(disabled ? ' (Essential privacy policy must be activated)' : '')
}
>
<Switch
size="small"
disabled={disabled}
checked={checked}
checkedChildren="on"
unCheckedChildren="off"
onChange={onChecked}
/>
</Tooltip>
<Tooltip
title={
'Reload auto-saved' +
(disabled ? ' (Essential privacy policy must be activated)' : '')
}
>
<Button
size="small"
disabled={disabled}
icon={<RedoOutlined />}
onClick={onReload}
/>
</Tooltip>
</div>
)
}
export default AutoSave