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