xref: /MusicFree/src/core/pluginMeta.ts (revision 5589cdf32b2bb0f641e5ac7bf1f6152cd6b9b70e)
1import {StorageKeys} from '@/constants/commonConst';
2import StateMapper from '@/utils/stateMapper';
3import {getStorage, setStorage} from '@/utils/storage';
4import {produce} from 'immer';
5import objectPath from 'object-path';
6import {Plugin} from './pluginManager';
7
8/**
9 * key: platform
10 * value: Record<string, any>
11 */
12let pluginMetaAll: Record<string, IPlugin.IPluginMeta> = {};
13let getPluginMetaAll = () => pluginMetaAll;
14let pluginMetaAllStateMapper = new StateMapper(getPluginMetaAll);
15
16/** 先初始化meta,再初始化plugins */
17async function setupMeta(validKeys?: string[]) {
18    const meta = await getStorage(StorageKeys.PluginMetaKey);
19    if (meta !== null) {
20        if (!validKeys) {
21            pluginMetaAll = meta;
22        } else {
23            const newMeta: Record<string, IPlugin.IPluginMeta> = {};
24            validKeys.forEach(k => {
25                if (meta[k]) {
26                    newMeta[k] = meta[k];
27                }
28            });
29            await setStorage(StorageKeys.PluginMetaKey, newMeta);
30            pluginMetaAll = newMeta;
31        }
32        pluginMetaAllStateMapper.notify();
33    }
34}
35
36async function setPluginMetaAll(newMeta: Record<string, IPlugin.IPluginMeta>) {
37    await setStorage(StorageKeys.PluginMetaKey, newMeta);
38    pluginMetaAll = newMeta;
39    pluginMetaAllStateMapper.notify();
40}
41
42async function setPluginMeta(plugin: Plugin, meta: IPlugin.IPluginMeta) {
43    const newMeta = produce(pluginMetaAll, draft => {
44        draft[plugin.name] = meta;
45    });
46    await setStorage(StorageKeys.PluginMetaKey, newMeta);
47    pluginMetaAll = newMeta;
48    pluginMetaAllStateMapper.notify();
49}
50
51async function setPluginMetaProp<K extends keyof IPlugin.IPluginMeta>(
52    plugin: Plugin,
53    prop: K,
54    value: IPlugin.IPluginMeta[K],
55) {
56    const newMeta = produce(pluginMetaAll, draft => {
57        objectPath.set(draft, `${plugin.name}.${prop}`, value);
58    });
59    await setStorage(StorageKeys.PluginMetaKey, newMeta);
60    pluginMetaAll = newMeta;
61    pluginMetaAllStateMapper.notify();
62}
63
64function getPluginMeta(plugin: Plugin) {
65    return pluginMetaAll[plugin.name] ?? {};
66}
67
68export const PluginMeta = {
69    setupMeta,
70    setPluginMeta,
71    setPluginMetaAll,
72    getPluginMetaAll,
73    setPluginMetaProp,
74    getPluginMeta,
75    usePluginMetaAll: pluginMetaAllStateMapper.useMappedState,
76};
77