R: Invalidate OSS on RSForm change. Minor UI fixes
Some checks are pending
Frontend CI / build (22.x) (push) Waiting to run

This commit is contained in:
Ivan 2024-08-16 12:44:53 +03:00
parent 35883458f3
commit 88c9b646eb
9 changed files with 223 additions and 156 deletions

View File

@ -11,7 +11,7 @@ function ApplicationLayout() {
const { viewportHeight, mainHeight, showScroll } = useConceptOptions();
return (
<NavigationState>
<div className='min-w-[20rem] clr-app antialiased'>
<div className='min-w-[20rem] clr-app antialiased h-full'>
<ConceptToaster
className='mt-[4rem] text-sm' // prettier: split lines
autoClose={3000}
@ -29,7 +29,7 @@ function ApplicationLayout() {
}}
>
<main
className='w-full cc-scroll-y'
className='w-full h-full cc-scroll-y'
style={{ overflowY: showScroll ? 'scroll' : 'auto', minHeight: mainHeight }}
>
<Outlet />

View File

@ -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 }) {
<UsersState>
<AuthState>
<LibraryState>
<GlobalOssState>
{children}
</GlobalOssState>
</LibraryState>
</AuthState>
</UsersState>

View File

@ -62,7 +62,7 @@ function TooltipOperation({ node, anchor }: TooltipOperationProps) {
);
return (
<Tooltip layer='z-modalTooltip' anchorSelect={anchor} className='max-w-[35rem] max-h-[40rem] dense my-3'>
<Tooltip layer='z-modalTooltip' anchorSelect={anchor} className='max-w-[35rem] max-h-[40rem] dense'>
<h2>{node.data.operation.alias}</h2>
<p>
<b>Тип:</b> {labelOperationType(node.data.operation.operation_type)}

View File

@ -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<IGlobalOssContext | null>(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<string | undefined>(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 (
<GlobalOssContext.Provider
value={{
schema,
setID,
setData,
loading,
loadingError,
reload,
isValid,
invalidateItem,
invalidate
}}
>
{children}
</GlobalOssContext.Provider>
);
};

View File

@ -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<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,
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();
}
})
});
},
[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,

View File

@ -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<ErrorData>(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<ILibraryItem>) => {
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 (
<OssContext.Provider
value={{
schema,
schema: model,
itemID,
loading: library.ossLoading,
errorLoading: library.ossError,
loading: oss.loading,
loadingError: oss.loadingError,
processing,
processingError,
isOwned,

View File

@ -53,6 +53,7 @@ import { UserID } from '@/models/user';
import { contextOutsideScope } from '@/utils/labels';
import { useAuth } from './AuthContext';
import { useGlobalOss } from './GlobalOssContext';
import { useLibrary } from './LibraryContext';
interface IRSFormContext {
@ -116,6 +117,7 @@ interface RSFormStateProps {
export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) => {
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(() => {
oss.invalidateItem(newData.id);
if (callback) callback(newData);
});
} else 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(() => {
oss.invalidateItem(newData.schema.id);
if (callback) callback(newData.new_cst);
});
} else 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(() => {
oss.invalidateItem(newData.id);
if (callback) callback();
});
} else 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 (

View File

@ -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(
() => (

View File

@ -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(
() => (