From fbd84ece4daa9cd668467ccfda7732d1269f495f Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Fri, 16 Aug 2024 12:44:09 +0300 Subject: [PATCH] R: Invalidate OSS on RSForm change. Add lazy loading --- .../frontend/src/app/ApplicationLayout.tsx | 4 +- .../frontend/src/app/GlobalProviders.tsx | 5 +- .../src/components/info/TooltipOperation.tsx | 2 +- .../frontend/src/context/GlobalOssContext.tsx | 111 ++++++++++++++++ .../frontend/src/context/LibraryContext.tsx | 45 +------ rsconcept/frontend/src/context/OssContext.tsx | 122 +++++++++--------- .../frontend/src/context/RSFormContext.tsx | 75 +++++------ .../frontend/src/pages/OssPage/OssTabs.tsx | 4 +- .../frontend/src/pages/RSFormPage/RSTabs.tsx | 11 +- 9 files changed, 223 insertions(+), 156 deletions(-) create mode 100644 rsconcept/frontend/src/context/GlobalOssContext.tsx diff --git a/rsconcept/frontend/src/app/ApplicationLayout.tsx b/rsconcept/frontend/src/app/ApplicationLayout.tsx index f592d4a2..5f7417ee 100644 --- a/rsconcept/frontend/src/app/ApplicationLayout.tsx +++ b/rsconcept/frontend/src/app/ApplicationLayout.tsx @@ -11,7 +11,7 @@ function ApplicationLayout() { const { viewportHeight, mainHeight, showScroll } = useConceptOptions(); return ( -
+
diff --git a/rsconcept/frontend/src/app/GlobalProviders.tsx b/rsconcept/frontend/src/app/GlobalProviders.tsx index db0369e9..a0d8ef4e 100644 --- a/rsconcept/frontend/src/app/GlobalProviders.tsx +++ b/rsconcept/frontend/src/app/GlobalProviders.tsx @@ -6,6 +6,7 @@ import { pdfjs } from 'react-pdf'; import { AuthState } from '@/context/AuthContext'; import { OptionsState } from '@/context/ConceptOptionsContext'; +import { GlobalOssState } from '@/context/GlobalOssContext'; import { LibraryState } from '@/context/LibraryContext'; import { UsersState } from '@/context/UsersContext'; @@ -37,9 +38,11 @@ function GlobalProviders({ children }: { children: React.ReactNode }) { + {children} - + + diff --git a/rsconcept/frontend/src/components/info/TooltipOperation.tsx b/rsconcept/frontend/src/components/info/TooltipOperation.tsx index 0877297e..acb6c9bc 100644 --- a/rsconcept/frontend/src/components/info/TooltipOperation.tsx +++ b/rsconcept/frontend/src/components/info/TooltipOperation.tsx @@ -62,7 +62,7 @@ function TooltipOperation({ node, anchor }: TooltipOperationProps) { ); return ( - +

{node.data.operation.alias}

Тип: {labelOperationType(node.data.operation.operation_type)} diff --git a/rsconcept/frontend/src/context/GlobalOssContext.tsx b/rsconcept/frontend/src/context/GlobalOssContext.tsx new file mode 100644 index 00000000..32345a4b --- /dev/null +++ b/rsconcept/frontend/src/context/GlobalOssContext.tsx @@ -0,0 +1,111 @@ +'use client'; + +import { createContext, useCallback, useContext, useState } from 'react'; + +import { ErrorData } from '@/components/info/InfoError'; +import useOssDetails from '@/hooks/useOssDetails'; +import { LibraryItemID } from '@/models/library'; +import { IOperationSchema, IOperationSchemaData } from '@/models/oss'; +import { contextOutsideScope } from '@/utils/labels'; + +import { useLibrary } from './LibraryContext'; + +interface IGlobalOssContext { + schema: IOperationSchema | undefined; + setID: (id: string | undefined) => void; + setData: (data: IOperationSchemaData) => void; + loading: boolean; + loadingError: ErrorData; + isValid: boolean; + + invalidate: () => void; + invalidateItem: (target: LibraryItemID) => void; + reload: (callback?: () => void) => void; +} + +const GlobalOssContext = createContext(null); +export const useGlobalOss = (): IGlobalOssContext => { + const context = useContext(GlobalOssContext); + if (context === null) { + throw new Error(contextOutsideScope('useGlobalOss', 'GlobalOssState')); + } + return context; +}; + +interface GlobalOssStateProps { + children: React.ReactNode; +} + +export const GlobalOssState = ({ children }: GlobalOssStateProps) => { + const library = useLibrary(); + const [isValid, setIsValid] = useState(false); + const [ossID, setIdInternal] = useState(undefined); + const { + schema: schema, // prettier: split lines + error: loadingError, + setSchema: setDataInternal, + loading: loading, + reload: reloadInternal + } = useOssDetails({ target: ossID, items: library.items }); + + const reload = useCallback( + (callback?: () => void) => { + reloadInternal(undefined, () => { + setIsValid(true); + if (callback) callback(); + }); + }, + [reloadInternal] + ); + + const setData = useCallback( + (data: IOperationSchemaData) => { + setDataInternal(data); + setIsValid(true); + }, + [setDataInternal] + ); + + const setID = useCallback( + (id: string | undefined) => { + setIdInternal(prev => { + if (prev === id && !isValid) { + reload(); + } + return id; + }); + }, + [setIdInternal, isValid, reload] + ); + + const invalidate = useCallback(() => { + setIsValid(false); + }, []); + + const invalidateItem = useCallback( + (target: LibraryItemID) => { + if (schema?.schemas.includes(target)) { + setIsValid(false); + } + }, + [schema] + ); + + return ( + + {children} + + ); +}; diff --git a/rsconcept/frontend/src/context/LibraryContext.tsx b/rsconcept/frontend/src/context/LibraryContext.tsx index 4851c18b..f156722b 100644 --- a/rsconcept/frontend/src/context/LibraryContext.tsx +++ b/rsconcept/frontend/src/context/LibraryContext.tsx @@ -13,13 +13,11 @@ import { } from '@/backend/library'; import { getRSFormDetails, postRSFormFromFile } from '@/backend/rsforms'; import { ErrorData } from '@/components/info/InfoError'; -import useOssDetails from '@/hooks/useOssDetails'; import { FolderTree } from '@/models/FolderTree'; import { ILibraryItem, LibraryItemID, LocationHead } from '@/models/library'; import { ILibraryCreateData } from '@/models/library'; import { matchLibraryItem, matchLibraryItemLocation } from '@/models/libraryAPI'; import { ILibraryFilter } from '@/models/miscellaneous'; -import { IOperationSchema, IOperationSchemaData } from '@/models/oss'; import { IRSForm, IRSFormCloneData, IRSFormData } from '@/models/rsform'; import { RSFormLoader } from '@/models/RSFormLoader'; import { contextOutsideScope } from '@/utils/labels'; @@ -36,17 +34,10 @@ interface ILibraryContext { loadingError: ErrorData; setLoadingError: (error: ErrorData) => void; - globalOSS: IOperationSchema | undefined; - setGlobalID: (id: string | undefined) => void; - setGlobalOSS: (data: IOperationSchemaData) => void; - ossLoading: boolean; - ossError: ErrorData; - processing: boolean; processingError: ErrorData; setProcessingError: (error: ErrorData) => void; - reloadOSS: (callback?: () => void) => void; reloadItems: (callback?: () => void) => void; applyFilter: (params: ILibraryFilter) => ILibraryItem[]; @@ -84,22 +75,6 @@ export const LibraryState = ({ children }: LibraryStateProps) => { const [processingError, setProcessingError] = useState(undefined); const [cachedTemplates, setCachedTemplates] = useState([]); - const [ossID, setGlobalID] = useState(undefined); - const { - schema: globalOSS, // prettier: split lines - error: ossError, - setSchema: setGlobalOSS, - loading: ossLoading, - reload: reloadOssInternal - } = useOssDetails({ target: ossID, items: items }); - - const reloadOSS = useCallback( - (callback?: () => void) => { - reloadOssInternal(setProcessing, callback); - }, - [reloadOssInternal] - ); - const folders = useMemo(() => { const result = new FolderTree(); result.addPath(LocationHead.USER, 0); @@ -280,17 +255,11 @@ export const LibraryState = ({ children }: LibraryStateProps) => { 1 ); } - if (globalOSS?.schemas.includes(target)) { - reloadOSS(() => { - if (callback) callback(); - }); - } else { - if (callback) callback(); - } + if (callback) callback(); }) }); }, - [reloadItems, reloadOSS, user, globalOSS] + [reloadItems, user] ); const cloneItem = useCallback( @@ -326,20 +295,12 @@ export const LibraryState = ({ children }: LibraryStateProps) => { loading, loadingError, setLoadingError, + reloadItems, processing, processingError, setProcessingError, - globalOSS, - setGlobalID, - setGlobalOSS, - ossLoading, - ossError, - reloadOSS, - - reloadItems, - applyFilter, createItem, cloneItem, diff --git a/rsconcept/frontend/src/context/OssContext.tsx b/rsconcept/frontend/src/context/OssContext.tsx index 2bb28435..b2f2a14a 100644 --- a/rsconcept/frontend/src/context/OssContext.tsx +++ b/rsconcept/frontend/src/context/OssContext.tsx @@ -39,6 +39,7 @@ import { UserID } from '@/models/user'; import { contextOutsideScope } from '@/utils/labels'; import { useAuth } from './AuthContext'; +import { useGlobalOss } from './GlobalOssContext'; import { useLibrary } from './LibraryContext'; interface IOssContext { @@ -46,7 +47,7 @@ interface IOssContext { itemID: string; loading: boolean; - errorLoading: ErrorData; + loadingError: ErrorData; processing: boolean; processingError: ErrorData; @@ -87,7 +88,8 @@ interface OssStateProps { export const OssState = ({ itemID, children }: OssStateProps) => { const library = useLibrary(); - const schema = library.globalOSS; + const oss = useGlobalOss(); + const model = oss.schema; const { user } = useAuth(); const [processing, setProcessing] = useState(false); const [processingError, setProcessingError] = useState(undefined); @@ -95,25 +97,23 @@ export const OssState = ({ itemID, children }: OssStateProps) => { const [toggleTracking, setToggleTracking] = useState(false); const isOwned = useMemo(() => { - return user?.id === schema?.owner || false; - }, [user, schema?.owner]); + return user?.id === model?.owner || false; + }, [user, model?.owner]); const isSubscribed = useMemo(() => { - if (!user || !schema || !user.id) { + if (!user || !model || !user.id) { return false; } - return schema.subscribers.includes(user.id); - }, [user, schema, toggleTracking]); + return model.subscribers.includes(user.id); + }, [user, model, toggleTracking]); useEffect(() => { - if (schema?.id !== Number(itemID)) { - library.setGlobalID(itemID); - } - }, [itemID, schema, library]); + oss.setID(itemID); + }, [itemID, oss.setID]); const update = useCallback( (data: ILibraryUpdateData, callback?: DataCallback) => { - if (!schema) { + if (!model) { return; } setProcessingError(undefined); @@ -123,19 +123,19 @@ export const OssState = ({ itemID, children }: OssStateProps) => { setLoading: setProcessing, onError: setProcessingError, onSuccess: newData => { - const fullData: IOperationSchemaData = Object.assign(schema, newData); - library.setGlobalOSS(fullData); + const fullData: IOperationSchemaData = Object.assign(model, newData); + oss.setData(fullData); library.localUpdateItem(newData); if (callback) callback(newData); } }); }, - [itemID, schema, library] + [itemID, model, library.localUpdateItem, oss.setData] ); const subscribe = useCallback( (callback?: () => void) => { - if (!schema || !user) { + if (!model || !user) { return; } setProcessingError(undefined); @@ -144,23 +144,23 @@ export const OssState = ({ itemID, children }: OssStateProps) => { setLoading: setProcessing, onError: setProcessingError, onSuccess: () => { - if (user.id && !schema.subscribers.includes(user.id)) { - schema.subscribers.push(user.id); + if (user.id && !model.subscribers.includes(user.id)) { + model.subscribers.push(user.id); } - if (!user.subscriptions.includes(schema.id)) { - user.subscriptions.push(schema.id); + if (!user.subscriptions.includes(model.id)) { + user.subscriptions.push(model.id); } setToggleTracking(prev => !prev); if (callback) callback(); } }); }, - [itemID, user, schema] + [itemID, user, model] ); const unsubscribe = useCallback( (callback?: () => void) => { - if (!schema || !user) { + if (!model || !user) { return; } setProcessingError(undefined); @@ -169,23 +169,23 @@ export const OssState = ({ itemID, children }: OssStateProps) => { setLoading: setProcessing, onError: setProcessingError, onSuccess: () => { - if (user.id && schema.subscribers.includes(user.id)) { - schema.subscribers.splice(schema.subscribers.indexOf(user.id), 1); + if (user.id && model.subscribers.includes(user.id)) { + model.subscribers.splice(model.subscribers.indexOf(user.id), 1); } - if (user.subscriptions.includes(schema.id)) { - user.subscriptions.splice(user.subscriptions.indexOf(schema.id), 1); + if (user.subscriptions.includes(model.id)) { + user.subscriptions.splice(user.subscriptions.indexOf(model.id), 1); } setToggleTracking(prev => !prev); if (callback) callback(); } }); }, - [itemID, schema, user] + [itemID, model, user] ); const setOwner = useCallback( (newOwner: UserID, callback?: () => void) => { - if (!schema) { + if (!model) { return; } setProcessingError(undefined); @@ -197,18 +197,18 @@ export const OssState = ({ itemID, children }: OssStateProps) => { setLoading: setProcessing, onError: setProcessingError, onSuccess: () => { - schema.owner = newOwner; - library.localUpdateItem(schema); + model.owner = newOwner; + library.localUpdateItem(model); if (callback) callback(); } }); }, - [itemID, schema, library] + [itemID, model, library.localUpdateItem] ); const setAccessPolicy = useCallback( (newPolicy: AccessPolicy, callback?: () => void) => { - if (!schema) { + if (!model) { return; } setProcessingError(undefined); @@ -220,18 +220,18 @@ export const OssState = ({ itemID, children }: OssStateProps) => { setLoading: setProcessing, onError: setProcessingError, onSuccess: () => { - schema.access_policy = newPolicy; - library.localUpdateItem(schema); + model.access_policy = newPolicy; + library.localUpdateItem(model); if (callback) callback(); } }); }, - [itemID, schema, library] + [itemID, model, library.localUpdateItem] ); const setLocation = useCallback( (newLocation: string, callback?: () => void) => { - if (!schema) { + if (!model) { return; } setProcessingError(undefined); @@ -243,18 +243,18 @@ export const OssState = ({ itemID, children }: OssStateProps) => { setLoading: setProcessing, onError: setProcessingError, onSuccess: () => { - schema.location = newLocation; - library.localUpdateItem(schema); + model.location = newLocation; + library.localUpdateItem(model); if (callback) callback(); } }); }, - [itemID, schema, library] + [itemID, model, library.localUpdateItem] ); const setEditors = useCallback( (newEditors: UserID[], callback?: () => void) => { - if (!schema) { + if (!model) { return; } setProcessingError(undefined); @@ -266,12 +266,12 @@ export const OssState = ({ itemID, children }: OssStateProps) => { setLoading: setProcessing, onError: setProcessingError, onSuccess: () => { - schema.editors = newEditors; + model.editors = newEditors; if (callback) callback(); } }); }, - [itemID, schema] + [itemID, model] ); const savePositions = useCallback( @@ -288,7 +288,7 @@ export const OssState = ({ itemID, children }: OssStateProps) => { } }); }, - [itemID, library] + [itemID, library.localUpdateTimestamp] ); const createOperation = useCallback( @@ -300,13 +300,13 @@ export const OssState = ({ itemID, children }: OssStateProps) => { setLoading: setProcessing, onError: setProcessingError, onSuccess: newData => { - library.setGlobalOSS(newData.oss); + oss.setData(newData.oss); library.localUpdateTimestamp(newData.oss.id); if (callback) callback(newData.new_operation); } }); }, - [itemID, library] + [itemID, library.localUpdateTimestamp, oss.setData] ); const deleteOperation = useCallback( @@ -318,13 +318,13 @@ export const OssState = ({ itemID, children }: OssStateProps) => { setLoading: setProcessing, onError: setProcessingError, onSuccess: newData => { - library.setGlobalOSS(newData); + oss.setData(newData); library.localUpdateTimestamp(newData.id); if (callback) callback(); } }); }, - [itemID, library] + [itemID, library.localUpdateTimestamp, oss.setData] ); const createInput = useCallback( @@ -336,19 +336,19 @@ export const OssState = ({ itemID, children }: OssStateProps) => { setLoading: setProcessing, onError: setProcessingError, onSuccess: newData => { - library.setGlobalOSS(newData.oss); + oss.setData(newData.oss); library.reloadItems(() => { if (callback) callback(newData.new_schema); }); } }); }, - [itemID, library] + [itemID, library.reloadItems, oss.setData] ); const setInput = useCallback( (data: IOperationSetInputData, callback?: () => void) => { - if (!schema) { + if (!model) { return; } setProcessingError(undefined); @@ -358,18 +358,18 @@ export const OssState = ({ itemID, children }: OssStateProps) => { setLoading: setProcessing, onError: setProcessingError, onSuccess: newData => { - library.setGlobalOSS(newData); + oss.setData(newData); library.localUpdateTimestamp(newData.id); if (callback) callback(); } }); }, - [itemID, schema, library] + [itemID, model, library.localUpdateTimestamp, oss.setData] ); const updateOperation = useCallback( (data: IOperationUpdateData, callback?: () => void) => { - if (!schema) { + if (!model) { return; } setProcessingError(undefined); @@ -379,19 +379,19 @@ export const OssState = ({ itemID, children }: OssStateProps) => { setLoading: setProcessing, onError: setProcessingError, onSuccess: newData => { - library.setGlobalOSS(newData); + oss.setData(newData); library.reloadItems(() => { if (callback) callback(); }); } }); }, - [itemID, schema, library] + [itemID, model, library.reloadItems, oss.setData] ); const executeOperation = useCallback( (data: ITargetOperation, callback?: () => void) => { - if (!schema) { + if (!model) { return; } setProcessingError(undefined); @@ -401,23 +401,23 @@ export const OssState = ({ itemID, children }: OssStateProps) => { setLoading: setProcessing, onError: setProcessingError, onSuccess: newData => { - library.setGlobalOSS(newData); + oss.setData(newData); library.reloadItems(() => { if (callback) callback(); }); } }); }, - [itemID, schema, library] + [itemID, model, library.reloadItems, oss.setData] ); return ( { const library = useLibrary(); + const oss = useGlobalOss(); const { user } = useAuth(); const { schema, // prettier: split lines @@ -159,15 +161,12 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = onSuccess: newData => { setSchema(Object.assign(schema, newData)); library.localUpdateItem(newData); - if (library.globalOSS?.schemas.includes(newData.id)) { - library.reloadOSS(() => { - if (callback) callback(newData); - }); - } else if (callback) callback(newData); + oss.invalidateItem(newData.id); + if (callback) callback(newData); } }); }, - [itemID, setSchema, schema, library] + [itemID, setSchema, schema, library.localUpdateItem, oss.invalidateItem] ); const upload = useCallback( @@ -188,7 +187,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = } }); }, - [itemID, setSchema, schema, library] + [itemID, setSchema, schema, library.localUpdateItem] ); const subscribe = useCallback( @@ -261,7 +260,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = } }); }, - [itemID, schema, library] + [itemID, schema, library.localUpdateItem] ); const setAccessPolicy = useCallback( @@ -284,7 +283,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = } }); }, - [itemID, schema, library] + [itemID, schema, library.localUpdateItem] ); const setLocation = useCallback( @@ -306,7 +305,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = } }); }, - [itemID, schema, library] + [itemID, schema, library.reloadItems] ); const setEditors = useCallback( @@ -344,13 +343,12 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = onSuccess: newData => { setSchema(newData); library.localUpdateTimestamp(newData.id); + oss.invalidateItem(newData.id); if (callback) callback(); - - // TODO: deal with OSS cache invalidation } }); }, - [itemID, schema, library, user, setSchema] + [itemID, schema, user, setSchema, library.localUpdateTimestamp, oss.invalidateItem] ); const restoreOrder = useCallback( @@ -370,7 +368,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = } }); }, - [itemID, schema, library, user, setSchema] + [itemID, schema, user, setSchema, library.localUpdateTimestamp] ); const produceStructure = useCallback( @@ -384,11 +382,12 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = onSuccess: newData => { setSchema(newData.schema); library.localUpdateTimestamp(newData.schema.id); + oss.invalidateItem(newData.schema.id); if (callback) callback(newData.cst_list); } }); }, - [setSchema, library, itemID] + [setSchema, itemID, library.localUpdateTimestamp, oss.invalidateItem] ); const download = useCallback( @@ -415,13 +414,12 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = onSuccess: newData => { setSchema(newData.schema); library.localUpdateTimestamp(newData.schema.id); + oss.invalidateItem(newData.schema.id); if (callback) callback(newData.new_cst); - - // TODO: deal with OSS cache invalidation } }); }, - [itemID, library, setSchema] + [itemID, setSchema, library.localUpdateTimestamp, oss.invalidateItem] ); const cstDelete = useCallback( @@ -435,13 +433,12 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = onSuccess: newData => { setSchema(newData); library.localUpdateTimestamp(newData.id); + oss.invalidateItem(newData.id); if (callback) callback(); - - // TODO: deal with OSS cache invalidation } }); }, - [itemID, library, setSchema] + [itemID, setSchema, library.localUpdateTimestamp, oss.invalidateItem] ); const cstUpdate = useCallback( @@ -455,13 +452,12 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = onSuccess: newData => reload(setProcessing, () => { library.localUpdateTimestamp(Number(itemID)); + oss.invalidateItem(Number(itemID)); if (callback) callback(newData); - - // TODO: deal with OSS cache invalidation }) }); }, - [itemID, library, reload] + [itemID, reload, library.localUpdateTimestamp, oss.invalidateItem] ); const cstRename = useCallback( @@ -475,15 +471,12 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = onSuccess: newData => { setSchema(newData.schema); library.localUpdateTimestamp(newData.schema.id); - if (library.globalOSS?.schemas.includes(newData.schema.id)) { - library.reloadOSS(() => { - if (callback) callback(newData.new_cst); - }); - } else if (callback) callback(newData.new_cst); + oss.invalidateItem(newData.schema.id); + if (callback) callback(newData.new_cst); } }); }, - [setSchema, library, itemID] + [setSchema, itemID, library.localUpdateTimestamp, oss.invalidateItem] ); const cstSubstitute = useCallback( @@ -497,15 +490,12 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = onSuccess: newData => { setSchema(newData); library.localUpdateTimestamp(newData.id); - if (library.globalOSS?.schemas.includes(newData.id)) { - library.reloadOSS(() => { - if (callback) callback(); - }); - } else if (callback) callback(); + oss.invalidateItem(newData.id); + if (callback) callback(); } }); }, - [setSchema, library, itemID] + [setSchema, itemID, library.localUpdateTimestamp, oss.invalidateItem] ); const cstMoveTo = useCallback( @@ -523,7 +513,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = } }); }, - [itemID, library, setSchema] + [itemID, setSchema, library.localUpdateTimestamp] ); const versionCreate = useCallback( @@ -541,7 +531,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = } }); }, - [itemID, library, setSchema] + [itemID, setSchema, library.localUpdateTimestamp] ); const findPredecessor = useCallback((data: ITargetCst, callback: (reference: IConstituentaReference) => void) => { @@ -612,7 +602,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = } }); }, - [setSchema, library] + [setSchema, library.localUpdateItem] ); const inlineSynthesis = useCallback( @@ -625,14 +615,13 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = onError: setProcessingError, onSuccess: newData => { setSchema(newData); - library.localUpdateTimestamp(Number(itemID)); + library.localUpdateTimestamp(newData.id); + oss.invalidateItem(newData.id); if (callback) callback(newData); - - // TODO: deal with OSS cache invalidation } }); }, - [library, itemID, setSchema] + [itemID, setSchema, library.localUpdateTimestamp, oss.invalidateItem] ); return ( diff --git a/rsconcept/frontend/src/pages/OssPage/OssTabs.tsx b/rsconcept/frontend/src/pages/OssPage/OssTabs.tsx index 2d5dc170..35e4de12 100644 --- a/rsconcept/frontend/src/pages/OssPage/OssTabs.tsx +++ b/rsconcept/frontend/src/pages/OssPage/OssTabs.tsx @@ -36,7 +36,7 @@ function OssTabs() { const activeTab = query.get('tab') ? (Number(query.get('tab')) as OssTabID) : OssTabID.GRAPH; const { calculateHeight, setNoFooter } = useConceptOptions(); - const { schema, loading, errorLoading } = useOSS(); + const { schema, loading, loadingError: errorLoading } = useOSS(); const { destroyItem } = useLibrary(); const [isModified, setIsModified] = useState(false); @@ -100,7 +100,7 @@ function OssTabs() { }); }, [schema, destroyItem, router]); - const panelHeight = useMemo(() => calculateHeight('1.75rem + 4px'), [calculateHeight]); + const panelHeight = useMemo(() => calculateHeight('1.625rem + 2px'), [calculateHeight]); const cardPanel = useMemo( () => ( diff --git a/rsconcept/frontend/src/pages/RSFormPage/RSTabs.tsx b/rsconcept/frontend/src/pages/RSFormPage/RSTabs.tsx index 0b820452..d51d4b42 100644 --- a/rsconcept/frontend/src/pages/RSFormPage/RSTabs.tsx +++ b/rsconcept/frontend/src/pages/RSFormPage/RSTabs.tsx @@ -14,6 +14,7 @@ import TabLabel from '@/components/ui/TabLabel'; import TextURL from '@/components/ui/TextURL'; import AnimateFade from '@/components/wrap/AnimateFade'; import { useConceptOptions } from '@/context/ConceptOptionsContext'; +import { useGlobalOss } from '@/context/GlobalOssContext'; import { useLibrary } from '@/context/LibraryContext'; import { useBlockNavigation, useConceptNavigation } from '@/context/NavigationContext'; import { useRSForm } from '@/context/RSFormContext'; @@ -47,6 +48,7 @@ function RSTabs() { const { setNoFooter, calculateHeight } = useConceptOptions(); const { schema, loading, errorLoading, isArchive, itemID } = useRSForm(); const library = useLibrary(); + const oss = useGlobalOss(); const [isModified, setIsModified] = useState(false); useBlockNavigation(isModified); @@ -177,18 +179,19 @@ function RSTabs() { if (!schema || !window.confirm(prompts.deleteLibraryItem)) { return; } - const backToOSS = library.globalOSS?.schemas.includes(schema.id); + const backToOSS = oss.schema?.schemas.includes(schema.id); library.destroyItem(schema.id, () => { toast.success(information.itemDestroyed); if (backToOSS) { - router.push(urls.oss(library.globalOSS!.id, OssTabID.GRAPH)); + oss.invalidate(); + router.push(urls.oss(oss.schema!.id, OssTabID.GRAPH)); } else { router.push(urls.library); } }); - }, [schema, library, router]); + }, [schema, library, oss, router]); - const panelHeight = useMemo(() => calculateHeight('1.75rem + 4px'), [calculateHeight]); + const panelHeight = useMemo(() => calculateHeight('1.625rem + 2px'), [calculateHeight]); const cardPanel = useMemo( () => (