diff --git a/packages/editor/src/services/AppStorage.ts b/packages/editor/src/services/AppStorage.ts index 77331e11..5f2ed0ac 100644 --- a/packages/editor/src/services/AppStorage.ts +++ b/packages/editor/src/services/AppStorage.ts @@ -2,12 +2,13 @@ import { observable, makeObservable, action, toJS } from 'mobx'; import { Application, ComponentSchema, Module, RuntimeModule } from '@sunmao-ui/core'; import { produce } from 'immer'; import { DefaultNewModule, EmptyAppSchema } from '../constants'; -import { addModuleId } from '../utils/addModuleId'; +import { addModuleId, removeModuleId } from '../utils/addModuleId'; import { StorageHandler } from '../types'; export class AppStorage { app: Application; modules: Module[]; + modulesWithId: Module[]; static AppLSKey = 'schema'; static ModulesLSKey = 'modules'; @@ -17,20 +18,23 @@ export class AppStorage { private storageHandler?: StorageHandler ) { this.app = defaultApplication || EmptyAppSchema; - this.modules = defaultModules || []; + this.modules = defaultModules?.map(removeModuleId) || []; + this.modulesWithId = defaultModules || []; makeObservable(this, { app: observable.shallow, modules: observable.shallow, + modulesWithId: observable.shallow, setApp: action, setModules: action, + setModulesWithId: action, }); } createModule() { let index = this.modules.length; - this.modules.forEach((module) => { + this.modules.forEach(module => { if (module.metadata.name === `myModule${index}`) { index++; } @@ -46,7 +50,7 @@ export class AppStorage { metadata: { ...DefaultNewModule.metadata, name, - } + }, }; this.setModules([...this.modules, newModule]); @@ -84,6 +88,8 @@ export class AppStorage { draft[i].impl = components; }); this.setModules(newModules); + const modulesWithId = newModules.map(addModuleId); + this.setModulesWithId(modulesWithId); this.saveModules(); break; } @@ -118,7 +124,10 @@ export class AppStorage { draft[i].spec.stateMap = stateMap; draft[i].version = version; }); + this.setModules(newModules); + const modulesWithId = newModules.map(addModuleId); + this.setModulesWithId(modulesWithId); this.saveModules(); } @@ -127,8 +136,8 @@ export class AppStorage { } private saveModules() { - const modules = this.modules.map(addModuleId); - this.storageHandler?.onSaveModules && this.storageHandler?.onSaveModules(modules); + this.storageHandler?.onSaveModules && + this.storageHandler?.onSaveModules(this.modulesWithId); } setApp(app: Application) { @@ -138,4 +147,8 @@ export class AppStorage { setModules(modules: Module[]) { this.modules = modules; } + + setModulesWithId(modules: Module[]) { + this.modulesWithId = modules; + } } diff --git a/packages/editor/src/services/EditorStore.ts b/packages/editor/src/services/EditorStore.ts index 10ec2117..530951df 100644 --- a/packages/editor/src/services/EditorStore.ts +++ b/packages/editor/src/services/EditorStore.ts @@ -5,7 +5,6 @@ import { Registry, StateManager } from '@sunmao-ui/runtime'; import { EventBusType } from './eventBus'; import { AppStorage } from './AppStorage'; import { SchemaValidator } from '../validator'; -import { removeModuleId } from '../utils/addModuleId'; import { DataSourceType } from '../components/DataSource'; import { genOperation } from '../operations'; import { ExplorerMenuTabs, ToolMenuTabs } from '../constants/enum'; @@ -27,7 +26,7 @@ enum DataSourceName { LOCALSTORAGE = 'localStorage', } -type DataSourceId = `${DataSourceName}${number}` +type DataSourceId = `${DataSourceName}${number}`; export class EditorStore { components: ComponentSchema[] = []; // currentEditingComponents, it could be app's or module's components @@ -93,7 +92,11 @@ export class EditorStore { this.eventBus.send('componentsRefresh', this.originComponents); this.setComponents(this.originComponents); - if (this.APICount === -1 || this.stateCount === -1 || this.localStorageCount === -1) { + if ( + this.APICount === -1 || + this.stateCount === -1 || + this.localStorageCount === -1 + ) { this.initDataSourceCount(); } } @@ -122,6 +125,10 @@ export class EditorStore { return this.appStorage.modules; } + get modulesWithId() { + return this.appStorage.modulesWithId; + } + get selectedComponent() { return this.components.find(c => c.id === this._selectedComponentId); } @@ -153,10 +160,7 @@ export class EditorStore { m.version === this.currentEditingTarget.version && m.metadata.name === this.currentEditingTarget.name ); - if (module) { - return removeModuleId(module).impl; - } - return []; + return module?.impl || []; case 'app': return this.app.spec.components; } @@ -189,8 +193,11 @@ export class EditorStore { clearSunmaoGlobalState() { this.stateManager.clear(); - // reregister all modules - this.modules.forEach(m => { + this.setSelectedComponentId(''); + + // Remove old modules and re-register all modules, + this.registry.unregisterAllModules(); + this.modulesWithId.forEach(m => { const modules = createModule(m); this.registry.registerModule(modules, true); }); @@ -258,7 +265,11 @@ export class EditorStore { const { apis, states, localStorages } = this.dataSources; let id: DataSourceId; - const getCount = (dataSource: ComponentSchema[], dataSourceName: DataSourceName, count: number): number => { + const getCount = ( + dataSource: ComponentSchema[], + dataSourceName: DataSourceName, + count: number + ): number => { const ids = dataSource.map(({ id }) => id); let id: DataSourceId = `${dataSourceName}${count}`; while (ids.includes(id)) { @@ -277,7 +288,11 @@ export class EditorStore { id = `state${this.stateCount}`; break; case DataSourceType.LOCALSTORAGE: - this.localStorageCount = getCount(localStorages, DataSourceName.LOCALSTORAGE, this.localStorageCount); + this.localStorageCount = getCount( + localStorages, + DataSourceName.LOCALSTORAGE, + this.localStorageCount + ); id = `localStorage${this.localStorageCount}`; break; } diff --git a/packages/runtime/src/components/_internal/ImplWrapper.tsx b/packages/runtime/src/components/_internal/ImplWrapper.tsx index f79ac14a..81843e4d 100644 --- a/packages/runtime/src/components/_internal/ImplWrapper.tsx +++ b/packages/runtime/src/components/_internal/ImplWrapper.tsx @@ -26,7 +26,6 @@ const _ImplWrapper = React.forwardRef((props, }; useEffect(() => { - console.log(c.id, eleRef.current, isInModule); if (eleRef.current && !isInModule) { eleMap.set(c.id, eleRef.current); } diff --git a/packages/runtime/src/services/Registry.tsx b/packages/runtime/src/services/Registry.tsx index 6391f5a7..b445ef9e 100644 --- a/packages/runtime/src/services/Registry.tsx +++ b/packages/runtime/src/services/Registry.tsx @@ -170,6 +170,10 @@ export class Registry { return this.getModule(version, name); } + unregisterAllModules() { + this.modules = new Map>(); + } + registerUtilMethod(m: UtilMethod) { if (this.utilMethods.get(m.name)) { throw new Error(`Already has utilMethod ${m.name} in this registry.`);