R: Move OSS to global library context

This commit is contained in:
Ivan 2024-07-27 22:50:10 +03:00
parent 342a1837ed
commit 4899860a05
2 changed files with 48 additions and 18 deletions

View File

@ -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<ErrorData>(undefined);
const [cachedTemplates, setCachedTemplates] = useState<IRSForm[]>([]);
const [ossID, setGlobalID] = useState<string | undefined>(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,

View File

@ -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<ErrorData>(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<ILibraryItem>) => {
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,