diff --git a/webapp/packages/core-blocks/src/Loader/useAutoLoad.ts b/webapp/packages/core-blocks/src/Loader/useAutoLoad.ts index 8065e7307c..713a6866ee 100644 --- a/webapp/packages/core-blocks/src/Loader/useAutoLoad.ts +++ b/webapp/packages/core-blocks/src/Loader/useAutoLoad.ts @@ -11,6 +11,8 @@ import { type ILoadableState, isContainsException } from '@cloudbeaver/core-util import { getComputed } from '../getComputed.js'; import { useObjectRef } from '../useObjectRef.js'; +import { useService } from '@cloudbeaver/core-di'; +import { SessionExpireService } from '@cloudbeaver/core-root'; export function useAutoLoad( component: { name: string }, @@ -18,7 +20,8 @@ export function useAutoLoad( enabled = true, lazy = false, throwExceptions = false, -) { +): void { + const sessionExpireService = useService(SessionExpireService); const unmountedRef = useObjectRef({ unmounted: false }); const [loadFunctionName] = useState(`${component.name}.useAutoLoad(...)` as const); if (!Array.isArray(state)) { @@ -34,7 +37,7 @@ export function useAutoLoad( const obj = { [loadFunctionName]: async () => { - if (!enabled || unmountedRef.unmounted) { + if (!enabled || unmountedRef.unmounted || sessionExpireService.expired) { return; } diff --git a/webapp/packages/core-blocks/src/ResourcesHooks/useResource.ts b/webapp/packages/core-blocks/src/ResourcesHooks/useResource.ts index 6ca64fcdd8..5607fb4501 100644 --- a/webapp/packages/core-blocks/src/ResourcesHooks/useResource.ts +++ b/webapp/packages/core-blocks/src/ResourcesHooks/useResource.ts @@ -28,6 +28,7 @@ import { } from '@cloudbeaver/core-resource'; import { type ILoadableState, isContainsException, LoadingError } from '@cloudbeaver/core-utils'; import { mutex } from '@dbeaver/js-helpers'; +import { SessionExpireService } from '@cloudbeaver/core-root'; import { ErrorContext } from '../ErrorContext.js'; import { useObjectRef } from '../useObjectRef.js'; @@ -112,6 +113,7 @@ export function useResource< ): IMapResourceResult | IMapResourceListResult | IDataResourceResult { // eslint-disable-next-line react-hooks/rules-of-hooks const resource = ctor instanceof Resource ? ctor : useService(ctor); + const sessionExpireService = useService(SessionExpireService); const unmountedRef = useObjectRef({ unmounted: false }); const errorContext = useContext(ErrorContext); const [loadingException, setLoadingException] = useState(null); @@ -201,7 +203,7 @@ export function useResource< const loading = getComputed(() => key !== null && resource.isLoading(key)); const loaded = getComputed(() => key === null || resource.isLoaded(key, includes)); const outdated = getComputed(() => key === null || resource.isOutdated(key, includes)); - const canLoad = key !== null && actions?.freeze !== true && preloaded && outdated && !loading; + const canLoad = key !== null && actions?.freeze !== true && preloaded && outdated && !loading && !sessionExpireService.expired; const result = useMemo | IMapResourceListResult>( () => ({ diff --git a/webapp/packages/core-root/src/SessionExpireService.ts b/webapp/packages/core-root/src/SessionExpireService.ts index 049917c228..b95f37e106 100644 --- a/webapp/packages/core-root/src/SessionExpireService.ts +++ b/webapp/packages/core-root/src/SessionExpireService.ts @@ -1,6 +1,6 @@ /* * CloudBeaver - Cloud Database Manager - * Copyright (C) 2020-2024 DBeaver Corp and others + * Copyright (C) 2020-2025 DBeaver Corp and others * * Licensed under the Apache License, Version 2.0. * you may not use this file except in compliance with the License. @@ -9,6 +9,7 @@ import { Bootstrap, injectable } from '@cloudbeaver/core-di'; import { Executor, type IExecutor } from '@cloudbeaver/core-executor'; import { EServerErrorCode, GQLError, GraphQLService, SessionError } from '@cloudbeaver/core-sdk'; import { errorOf } from '@cloudbeaver/core-utils'; +import { makeObservable, observable } from 'mobx'; export const SESSION_EXPIRE_MIN_TIME = 5 * 1000 * 60; @@ -23,9 +24,12 @@ export class SessionExpireService extends Bootstrap { this.sessionExpired = this.sessionExpired.bind(this); this.onSessionExpire = new Executor(); + makeObservable(this, { + isExpired: observable, + }); } - get expired() { + get expired(): boolean { return this.isExpired; }