diff --git a/rsconcept/frontend/src/context/LibraryContext.tsx b/rsconcept/frontend/src/context/LibraryContext.tsx index a1b8f167..da669f51 100644 --- a/rsconcept/frontend/src/context/LibraryContext.tsx +++ b/rsconcept/frontend/src/context/LibraryContext.tsx @@ -13,11 +13,13 @@ 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'; @@ -34,6 +36,12 @@ 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; @@ -75,6 +83,14 @@ 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 + } = useOssDetails({ target: ossID }); + const folders = useMemo(() => { const result = new FolderTree(); result.addPath(LocationHead.USER, 0); @@ -300,6 +316,12 @@ export const LibraryState = ({ children }: LibraryStateProps) => { processingError, setProcessingError, + globalOSS, + setGlobalID, + setGlobalOSS, + ossLoading, + ossError, + reloadItems, applyFilter, diff --git a/rsconcept/frontend/src/context/OssContext.tsx b/rsconcept/frontend/src/context/OssContext.tsx index b496ce2e..69903708 100644 --- a/rsconcept/frontend/src/context/OssContext.tsx +++ b/rsconcept/frontend/src/context/OssContext.tsx @@ -1,6 +1,6 @@ 'use client'; -import { createContext, useCallback, useContext, useMemo, useState } from 'react'; +import { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react'; import { DataCallback } from '@/backend/apiTransport'; import { @@ -14,10 +14,16 @@ import { } from '@/backend/library'; import { patchDeleteOperation, patchUpdatePositions, postCreateOperation } from '@/backend/oss'; import { type ErrorData } from '@/components/info/InfoError'; -import useOssDetails from '@/hooks/useOssDetails'; import { AccessPolicy, ILibraryItem } from '@/models/library'; import { ILibraryUpdateData } from '@/models/library'; -import { IOperation, IOperationCreateData, IOperationSchema, IPositionsData, ITargetOperation } from '@/models/oss'; +import { + IOperation, + IOperationCreateData, + IOperationSchema, + IOperationSchemaData, + IPositionsData, + ITargetOperation +} from '@/models/oss'; import { UserID } from '@/models/user'; import { contextOutsideScope } from '@/utils/labels'; @@ -66,13 +72,8 @@ interface OssStateProps { export const OssState = ({ itemID, children }: OssStateProps) => { const library = useLibrary(); + const schema = library.globalOSS; const { user } = useAuth(); - const { - schema, // prettier: split lines - error: errorLoading, - setSchema, - loading - } = useOssDetails({ target: itemID }); const [processing, setProcessing] = useState(false); const [processingError, setProcessingError] = useState(undefined); @@ -90,6 +91,12 @@ export const OssState = ({ itemID, children }: OssStateProps) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [user, schema, toggleTracking]); + useEffect(() => { + if (schema?.id !== Number(itemID)) { + library.setGlobalID(itemID); + } + }, [itemID, schema, library]); + const update = useCallback( (data: ILibraryUpdateData, callback?: DataCallback) => { if (!schema) { @@ -102,13 +109,14 @@ export const OssState = ({ itemID, children }: OssStateProps) => { setLoading: setProcessing, onError: setProcessingError, onSuccess: newData => { - setSchema(Object.assign(schema, newData)); + const fullData: IOperationSchemaData = Object.assign(schema, newData); + library.setGlobalOSS(fullData); library.localUpdateItem(newData); if (callback) callback(newData); } }); }, - [itemID, setSchema, schema, library] + [itemID, schema, library] ); const subscribe = useCallback( @@ -133,7 +141,7 @@ export const OssState = ({ itemID, children }: OssStateProps) => { } }); }, - [itemID, schema, user] + [itemID, user, schema] ); const unsubscribe = useCallback( @@ -278,13 +286,13 @@ export const OssState = ({ itemID, children }: OssStateProps) => { setLoading: setProcessing, onError: setProcessingError, onSuccess: newData => { - setSchema(newData.oss); + library.setGlobalOSS(newData.oss); library.localUpdateTimestamp(newData.oss.id); if (callback) callback(newData.new_operation); } }); }, - [itemID, library, setSchema] + [itemID, library] ); const deleteOperation = useCallback( @@ -296,13 +304,13 @@ export const OssState = ({ itemID, children }: OssStateProps) => { setLoading: setProcessing, onError: setProcessingError, onSuccess: newData => { - setSchema(newData); + library.setGlobalOSS(newData); library.localUpdateTimestamp(newData.id); if (callback) callback(); } }); }, - [itemID, library, setSchema] + [itemID, library] ); return ( @@ -310,8 +318,8 @@ export const OssState = ({ itemID, children }: OssStateProps) => { value={{ schema, itemID, - loading, - errorLoading, + loading: library.ossLoading, + errorLoading: library.ossError, processing, processingError, isOwned,