/
index.ts
85 lines (69 loc) · 1.5 KB
/
index.ts
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
import {Component} from 'react';
import {get, set, del} from './local-storage';
const debounce = require('throttle-debounce/debounce');
export interface ILocalStorageProps {
name: string;
data: any;
persist?: boolean;
onMount?: (data) => void;
debounce?: number;
}
export class LocalStorage extends Component<ILocalStorageProps, any> {
static defaultProps = {
debounce: 200
};
componentDidMount () {
const {name, onMount} = this.props;
if (onMount) {
let json = '';
try {
json = get(name);
} catch {
json = 'null';
}
if (typeof json === 'string') {
try {
const data = JSON.parse(json);
onMount(data);
} catch {}
}
} else {
this.put();
}
}
componentDidUpdate (props) {
if (props.name !== this.props.name) {
this.remove();
this.put();
} else {
try {
const newJson = JSON.stringify(this.props.data);
if (JSON.stringify(props.data) !== newJson) {
this.put(newJson);
}
} catch {}
}
}
componentWillUnmount () {
this.remove();
}
put = debounce(this.props.debounce, (rawData?: string) => {
const {name, data} = this.props;
try {
if (!rawData) {
rawData = JSON.stringify(data);
}
set(name, rawData);
} catch {}
});
remove (name = this.props.name) {
if (!this.props.persist) {
try {
del(name);
} catch {}
}
}
render () {
return null;
}
}