display folders

This commit is contained in:
m
2026-07-29 21:58:52 +02:00
parent 3c7a1d18da
commit 470474011d
15 changed files with 961 additions and 496 deletions
+26 -5
View File
@@ -3,18 +3,22 @@ import { apiClient } from '../api/client';
import { useAuth } from './AuthContext';
type OcrDoneCallback = (resourceId: string) => void;
type ResourceCreatedCallback = (resourceId: string) => void;
interface SseContextValue {
onOcrDone: (cb: OcrDoneCallback) => () => void;
onResourceCreated: (cb: ResourceCreatedCallback) => () => void;
}
const SseContext = createContext<SseContextValue>({
onOcrDone: () => () => {},
onResourceCreated: () => () => {},
});
export function SseProvider({ children }: { children: React.ReactNode }) {
const { user } = useAuth();
const listenersRef = useRef<Set<OcrDoneCallback>>(new Set());
const ocrListenersRef = useRef<Set<OcrDoneCallback>>(new Set());
const resourceListenersRef = useRef<Set<ResourceCreatedCallback>>(new Set());
const cancelRef = useRef<() => void>(() => {});
const reconnectTimeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);
@@ -28,7 +32,9 @@ export function SseProvider({ children }: { children: React.ReactNode }) {
const cancel = await apiClient.subscribeEvents(
(event, data) => {
if (event === 'ocr_done') {
listenersRef.current.forEach((cb) => cb(data));
ocrListenersRef.current.forEach((cb) => cb(data));
} else if (event === 'resource.created') {
resourceListenersRef.current.forEach((cb) => cb(data));
}
},
() => {
@@ -62,14 +68,21 @@ export function SseProvider({ children }: { children: React.ReactNode }) {
}, [connect]);
const onOcrDone = useCallback((cb: OcrDoneCallback) => {
listenersRef.current.add(cb);
ocrListenersRef.current.add(cb);
return () => {
listenersRef.current.delete(cb);
ocrListenersRef.current.delete(cb);
};
}, []);
const onResourceCreated = useCallback((cb: ResourceCreatedCallback) => {
resourceListenersRef.current.add(cb);
return () => {
resourceListenersRef.current.delete(cb);
};
}, []);
return (
<SseContext.Provider value={{ onOcrDone }}>
<SseContext.Provider value={{ onOcrDone, onResourceCreated }}>
{children}
</SseContext.Provider>
);
@@ -82,3 +95,11 @@ export function useOcrDone(onDone?: OcrDoneCallback) {
}, [onDone, ctx]);
return { onOcrDone: ctx.onOcrDone };
}
export function useResourceCreated(onCreated?: ResourceCreatedCallback) {
const ctx = useContext(SseContext);
useEffect(() => {
if (onCreated) return ctx.onResourceCreated(onCreated);
}, [onCreated, ctx]);
return { onResourceCreated: ctx.onResourceCreated };
}