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