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