xref: /MusicFree/src/core/pluginMeta.ts (revision e08d37a33b6e5f38f39dcb49b2eb1095f0d66a1c)
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 (pluginMetaAll[k]) {
26                    newMeta[k] = pluginMetaAll[k];
27                }
28            });
29            await setStorage(StorageKeys.PluginMetaKey, newMeta);
30            pluginMetaAll = newMeta;
31        }
32        pluginMetaAllStateMapper.notify();
33    }
34}
35
36async function setPluginMeta(plugin: Plugin, meta: IPlugin.IPluginMeta) {
37    const newMeta = produce(pluginMetaAll, draft => {
38        draft[plugin.name] = meta;
39    });
40    await setStorage(StorageKeys.PluginMetaKey, newMeta);
41    pluginMetaAll = newMeta;
42    pluginMetaAllStateMapper.notify();
43}
44
45async function setPluginMetaProp(plugin: Plugin, prop: string, value: any) {
46    const newMeta = produce(pluginMetaAll, draft => {
47        objectPath.set(draft, `${plugin.name}.${prop}`, value);
48    });
49    await setStorage(StorageKeys.PluginMetaKey, newMeta);
50    pluginMetaAll = newMeta;
51    pluginMetaAllStateMapper.notify();
52}
53
54function getPluginMeta(plugin: Plugin) {
55    return pluginMetaAll[plugin.name] ?? {};
56}
57
58export const PluginMeta = {
59    setupMeta,
60    setPluginMeta,
61    setPluginMetaProp,
62    getPluginMeta,
63    usePluginMetaAll: pluginMetaAllStateMapper.useMappedState,
64};
65