diff --git a/webapp/packages/core-blocks/src/useMapResource.ts b/webapp/packages/core-blocks/src/useMapResource.ts index 34ed52191e..8cd1f20efc 100644 --- a/webapp/packages/core-blocks/src/useMapResource.ts +++ b/webapp/packages/core-blocks/src/useMapResource.ts @@ -14,6 +14,7 @@ import { NotificationService } from '@cloudbeaver/core-events'; import { CachedResourceIncludeArgs, CachedMapResource, CachedMapResourceGetter, ResourceKey, CachedMapResourceValue, CachedMapResourceKey, CachedMapResourceArguments, CachedMapResourceLoader, ResourceKeyList, CachedMapResourceListGetter, isResourceKeyList } from '@cloudbeaver/core-sdk'; import type { ILoadableState } from './Loader/Loader'; +import { useObjectRef } from './useObjectRef'; import { useObservableRef } from './useObservableRef'; interface IActions< @@ -137,9 +138,19 @@ export function useMapResource< includes = keyObj.includes; } + const keyRef = useObjectRef(() => ({ + loadedKey: null as TKeyArg | null, + get actual() { + if (this.loadedKey === this.key) { + return true; + } + + return resource.isKeyEqual(this.loadedKey, this.key); + }, + }), { key }); + const refObj = useObservableRef(() => ({ loading: false, - firstRender: true, prevData: undefined as CachedMapResourceLoader< TKeyArg, CachedMapResourceKey, @@ -178,7 +189,7 @@ export function useMapResource< return; } - this.firstRender = false; + keyRef.loadedKey = key; this.loading = true; const prevent = await actions?.onLoad?.(resource); @@ -298,7 +309,7 @@ export function useMapResource< const preloaded = refObj.preloaded; // make mobx subscription useEffect(() => { - if (!preloaded || (!outdated && !refObj.firstRender) || refObj.key === null) { + if (!preloaded || (!outdated && keyRef.actual) || refObj.key === null) { return; } diff --git a/webapp/packages/core-sdk/src/Resource/CachedMapResource.ts b/webapp/packages/core-sdk/src/Resource/CachedMapResource.ts index 01f2cab5c8..fbb6b2770c 100644 --- a/webapp/packages/core-sdk/src/Resource/CachedMapResource.ts +++ b/webapp/packages/core-sdk/src/Resource/CachedMapResource.ts @@ -392,6 +392,14 @@ export abstract class CachedMapResource< }, {}); } + isKeyEqual(param: ResourceKey, second: ResourceKey): boolean { + if (this.isAlias(param) || this.isAlias(second)) { + return true; + } + + return this.includes(param, second); + } + protected dataSet(key: TKey, value: TValue): void { this.data.set(key, value); } @@ -400,14 +408,6 @@ export abstract class CachedMapResource< this.data.delete(key); } - protected lock(param: ResourceKey, second: ResourceKey): boolean { - if (this.isAlias(param) || this.isAlias(second)) { - return true; - } - - return this.includes(param, second); - } - protected commitIncludes(key: ResourceKey, includes: string[]): void { key = this.transformParam(key); ResourceKeyUtils.forEach(key, key => { diff --git a/webapp/packages/core-sdk/src/Resource/CachedResource.ts b/webapp/packages/core-sdk/src/Resource/CachedResource.ts index c52768e826..e4f1287ec0 100644 --- a/webapp/packages/core-sdk/src/Resource/CachedResource.ts +++ b/webapp/packages/core-sdk/src/Resource/CachedResource.ts @@ -63,7 +63,7 @@ export abstract class CachedResource< constructor(defaultValue: TData, defaultIncludes: string[] = []) { super(); - this.lock = this.lock.bind(this); + this.isKeyEqual = this.isKeyEqual.bind(this); this.includes = this.includes.bind(this); this.loadingTask = this.loadingTask.bind(this); @@ -79,9 +79,9 @@ export abstract class CachedResource< exception: null, includes: observable([...this.defaultIncludes]), }, undefined, { deep: false }))); - this.scheduler = new TaskScheduler(this.lock); + this.scheduler = new TaskScheduler(this.isKeyEqual); this.data = defaultValue; - this.beforeLoad = new Executor(null, this.lock); + this.beforeLoad = new Executor(null, this.isKeyEqual); this.onDataOutdated = new SyncExecutor(null); this.onDataUpdate = new SyncExecutor(null); this.onDataError = new SyncExecutor>(null); @@ -404,7 +404,7 @@ export abstract class CachedResource< this.onDataOutdated.execute(param); } - protected lock(param: TParam, second: TParam): boolean { + isKeyEqual(param: TParam, second: TParam): boolean { if (this.isAlias(param) || this.isAlias(second)) { return true; } diff --git a/webapp/packages/plugin-sql-editor/src/SqlEditor/SqlEditor.tsx b/webapp/packages/plugin-sql-editor/src/SqlEditor/SqlEditor.tsx index af84e97332..f20844612d 100644 --- a/webapp/packages/plugin-sql-editor/src/SqlEditor/SqlEditor.tsx +++ b/webapp/packages/plugin-sql-editor/src/SqlEditor/SqlEditor.tsx @@ -132,6 +132,7 @@ export const SqlEditor = observer(function SqlEditor({ state, c container={sqlEditorModeService.tabsContainer} state={state} data={data} + lazy onChange={tab => state.currentEditorId = tab.tabId} >