xref: /MusicFree/src/core/persistStatus.ts (revision 4ade83edc3d07d31371dc1e6b3750001ca6d44da)
1import getOrCreateMMKV from '@/utils/getOrCreateMMKV';
2import safeParse from '@/utils/safeParse';
3import {useState} from 'react';
4
5// Internal Method
6const getStore = () => {
7    return getOrCreateMMKV(`App.PersistStatus`);
8};
9
10interface IPersistConfig {
11    /** 当前的音乐 */
12    'music.musicItem': IMusic.IMusicItem;
13    /** 进度 */
14    'music.progress': number;
15    /** 模式 */
16    'music.repeatMode': string;
17    /** 列表 */
18    'music.playList': IMusic.IMusicItem[];
19    /** 速度 */
20    'music.rate': number;
21    /** 音质 */
22    'music.quality': IMusic.IQualityKey;
23    /** app */
24    'app.skipVersion': string;
25    /** 歌词-是否启用翻译 */
26    'lyric.showTranslation': boolean;
27}
28
29function set<K extends keyof IPersistConfig>(
30    key: K,
31    value: IPersistConfig[K] | undefined,
32) {
33    const store = getStore();
34    if (value === undefined) {
35        store.delete(key);
36    } else {
37        store.set(key, JSON.stringify(value));
38    }
39}
40
41function get<K extends keyof IPersistConfig>(key: K): IPersistConfig[K] | null {
42    const store = getStore();
43    const raw = store.getString(key);
44    if (raw) {
45        return safeParse(raw) as IPersistConfig[K];
46    }
47    return null;
48}
49
50function useStateImpl<K extends keyof IPersistConfig>(
51    key: K,
52    defaultValue?: IPersistConfig[K],
53) {
54    const [state, setState] = useState(get(key) ?? defaultValue);
55
56    function _setState(newVal: IPersistConfig[K]) {
57        setState(newVal);
58        set(key, newVal);
59    }
60
61    return [state, _setState] as const;
62}
63
64const PersistStatus = {
65    get,
66    set,
67    useLocalState: useStateImpl,
68};
69
70export default PersistStatus;
71