xref: /MusicFree/src/core/pluginMeta.ts (revision 2aa881935ca35b8fb1abc4206e0dc35149231456)
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(plugin: Plugin, prop: string, value: any) {
52    const newMeta = produce(pluginMetaAll, draft => {
53        objectPath.set(draft, `${plugin.name}.${prop}`, value);
54    });
55    await setStorage(StorageKeys.PluginMetaKey, newMeta);
56    pluginMetaAll = newMeta;
57    pluginMetaAllStateMapper.notify();
58}
59
60function getPluginMeta(plugin: Plugin) {
61    return pluginMetaAll[plugin.name] ?? {};
62}
63
64export const PluginMeta = {
65    setupMeta,
66    setPluginMeta,
67    setPluginMetaAll,
68    getPluginMetaAll,
69    setPluginMetaProp,
70    getPluginMeta,
71    usePluginMetaAll: pluginMetaAllStateMapper.useMappedState,
72};
73