1e08d37a3S猫头猫import {StorageKeys} from '@/constants/commonConst'; 2e08d37a3S猫头猫import StateMapper from '@/utils/stateMapper'; 3e08d37a3S猫头猫import {getStorage, setStorage} from '@/utils/storage'; 4*5589cdf3S猫头猫import {produce} from 'immer'; 5e08d37a3S猫头猫import objectPath from 'object-path'; 6e08d37a3S猫头猫import {Plugin} from './pluginManager'; 7e08d37a3S猫头猫 8e08d37a3S猫头猫/** 9e08d37a3S猫头猫 * key: platform 10e08d37a3S猫头猫 * value: Record<string, any> 11e08d37a3S猫头猫 */ 12e08d37a3S猫头猫let pluginMetaAll: Record<string, IPlugin.IPluginMeta> = {}; 13e08d37a3S猫头猫let getPluginMetaAll = () => pluginMetaAll; 14e08d37a3S猫头猫let pluginMetaAllStateMapper = new StateMapper(getPluginMetaAll); 15e08d37a3S猫头猫 16e08d37a3S猫头猫/** 先初始化meta,再初始化plugins */ 17e08d37a3S猫头猫async function setupMeta(validKeys?: string[]) { 18e08d37a3S猫头猫 const meta = await getStorage(StorageKeys.PluginMetaKey); 19e08d37a3S猫头猫 if (meta !== null) { 20e08d37a3S猫头猫 if (!validKeys) { 21e08d37a3S猫头猫 pluginMetaAll = meta; 22e08d37a3S猫头猫 } else { 23e08d37a3S猫头猫 const newMeta: Record<string, IPlugin.IPluginMeta> = {}; 24e08d37a3S猫头猫 validKeys.forEach(k => { 2534588741S猫头猫 if (meta[k]) { 2634588741S猫头猫 newMeta[k] = meta[k]; 27e08d37a3S猫头猫 } 28e08d37a3S猫头猫 }); 29e08d37a3S猫头猫 await setStorage(StorageKeys.PluginMetaKey, newMeta); 30e08d37a3S猫头猫 pluginMetaAll = newMeta; 31e08d37a3S猫头猫 } 32e08d37a3S猫头猫 pluginMetaAllStateMapper.notify(); 33e08d37a3S猫头猫 } 34e08d37a3S猫头猫} 35e08d37a3S猫头猫 3634588741S猫头猫async function setPluginMetaAll(newMeta: Record<string, IPlugin.IPluginMeta>) { 3734588741S猫头猫 await setStorage(StorageKeys.PluginMetaKey, newMeta); 3834588741S猫头猫 pluginMetaAll = newMeta; 3934588741S猫头猫 pluginMetaAllStateMapper.notify(); 4034588741S猫头猫} 4134588741S猫头猫 42e08d37a3S猫头猫async function setPluginMeta(plugin: Plugin, meta: IPlugin.IPluginMeta) { 43e08d37a3S猫头猫 const newMeta = produce(pluginMetaAll, draft => { 44e08d37a3S猫头猫 draft[plugin.name] = meta; 45e08d37a3S猫头猫 }); 46e08d37a3S猫头猫 await setStorage(StorageKeys.PluginMetaKey, newMeta); 47e08d37a3S猫头猫 pluginMetaAll = newMeta; 48e08d37a3S猫头猫 pluginMetaAllStateMapper.notify(); 49e08d37a3S猫头猫} 50e08d37a3S猫头猫 51c2b3a262S猫头猫async function setPluginMetaProp<K extends keyof IPlugin.IPluginMeta>( 52c2b3a262S猫头猫 plugin: Plugin, 53c2b3a262S猫头猫 prop: K, 54c2b3a262S猫头猫 value: IPlugin.IPluginMeta[K], 55c2b3a262S猫头猫) { 56e08d37a3S猫头猫 const newMeta = produce(pluginMetaAll, draft => { 57e08d37a3S猫头猫 objectPath.set(draft, `${plugin.name}.${prop}`, value); 58e08d37a3S猫头猫 }); 59e08d37a3S猫头猫 await setStorage(StorageKeys.PluginMetaKey, newMeta); 60e08d37a3S猫头猫 pluginMetaAll = newMeta; 61e08d37a3S猫头猫 pluginMetaAllStateMapper.notify(); 62e08d37a3S猫头猫} 63e08d37a3S猫头猫 64e08d37a3S猫头猫function getPluginMeta(plugin: Plugin) { 65e08d37a3S猫头猫 return pluginMetaAll[plugin.name] ?? {}; 66e08d37a3S猫头猫} 67e08d37a3S猫头猫 68e08d37a3S猫头猫export const PluginMeta = { 69e08d37a3S猫头猫 setupMeta, 70e08d37a3S猫头猫 setPluginMeta, 7134588741S猫头猫 setPluginMetaAll, 7234588741S猫头猫 getPluginMetaAll, 73e08d37a3S猫头猫 setPluginMetaProp, 74e08d37a3S猫头猫 getPluginMeta, 75e08d37a3S猫头猫 usePluginMetaAll: pluginMetaAllStateMapper.useMappedState, 76e08d37a3S猫头猫}; 77