feat: refactor document opening/preview logic to support preview/sidepanel actions.

This commit is contained in:
2025-12-04 01:02:54 +01:00
parent 447b012e48
commit 8bb9f9950a
6 changed files with 37 additions and 24 deletions
@@ -0,0 +1,61 @@
import React, { createContext, useContext, useCallback } from 'react';
import type { Document } from '../types/documents';
import type { Identifier } from '../types/identifiers';
export type DocumentOpenTarget = 'preview' | 'sidepanel' | 'viewer';
export interface DocumentOpenContextValue {
openDocument: (doc: Document, target?: DocumentOpenTarget) => void;
}
const DocumentOpenContext = createContext<DocumentOpenContextValue | null>(null);
export const useDocumentOpen = () => {
const context = useContext(DocumentOpenContext);
if (!context) {
throw new Error('useDocumentOpen must be used within a DocumentOpenProvider');
}
return context;
};
interface DocumentOpenProviderProps {
children: React.ReactNode;
onOpenViewer?: (docId: Identifier) => void;
onOpenPreview?: (doc: Document) => void;
onOpenSidepanel?: (docId: Identifier) => void;
}
export const DocumentOpenProvider: React.FC<DocumentOpenProviderProps> = ({
children,
onOpenViewer,
onOpenPreview,
onOpenSidepanel,
}) => {
const openDocument = useCallback((doc: Document, target: DocumentOpenTarget = 'preview') => {
if (!doc) return;
switch (target) {
case 'preview':
if (onOpenPreview) {
onOpenPreview(doc);
}
break;
case 'sidepanel':
if (onOpenSidepanel) {
onOpenSidepanel(doc.id);
}
break;
case 'viewer':
if (onOpenViewer) {
onOpenViewer(doc.id);
}
break;
}
}, [onOpenPreview, onOpenSidepanel, onOpenViewer]);
return (
<DocumentOpenContext.Provider value={{ openDocument }}>
{children}
</DocumentOpenContext.Provider>
);
};