diff --git a/frontend/src/app/DocumentsRoute.tsx b/frontend/src/app/DocumentsRoute.tsx index f1b0ade..a4f60bc 100644 --- a/frontend/src/app/DocumentsRoute.tsx +++ b/frontend/src/app/DocumentsRoute.tsx @@ -4,8 +4,8 @@ import { useNavigate } from 'react-router-dom'; import { DocumentsFilterProvider, } from '../documents/context/DocumentsFilterContext'; -import { PreviewProvider } from '../preview/PreviewContext'; -import { DocumentOpenProvider } from '../context/DocumentOpenContext'; +import { PreviewProvider, usePreviewContext } from '../preview/PreviewContext'; +import { DocumentOpenProvider } from '../contexts/DocumentOpenContext'; import { useWorkspaceSurface } from './useWorkspaceSurface'; import { DocumentsHeaderBreadcrumb } from '../documents/panel/DocumentsPanelHeader'; import { SidebarProvider, useSidebarContext } from '../sidebar/SidebarContext'; @@ -24,8 +24,11 @@ const DocumentsRouteContent: React.FC = () => { const { sidebarSuppressed, expandSidebar, + openDetailPanel, } = usePanelManager(); + const { openPreview } = usePreviewContext(); + const sidebarHidden = sidebarCollapsed || sidebarSuppressed; const handleHeaderBreadcrumbClick = useCallback((crumb: DocumentsHeaderBreadcrumb) => { @@ -40,6 +43,12 @@ const DocumentsRouteContent: React.FC = () => { navigate(`/documents/${documentId}`); }, [navigate]); + const handleOpenSidepanel = useCallback((docId: string) => { + if (openDetailPanel) { + openDetailPanel({ documentIds: [docId] }); + } + }, [openDetailPanel]); + const documentsTablePropsWithNav = useMemo(() => ( surfaceConfig.documentsTableProps ? { ...surfaceConfig.documentsTableProps, onBreadcrumbNavigate: handleHeaderBreadcrumbClick } @@ -84,7 +93,11 @@ const DocumentsRouteContent: React.FC = () => { - + {content} diff --git a/frontend/src/context/DocumentOpenContext.tsx b/frontend/src/contexts/DocumentOpenContext.tsx similarity index 59% rename from frontend/src/context/DocumentOpenContext.tsx rename to frontend/src/contexts/DocumentOpenContext.tsx index 692ac2d..3f396e6 100644 --- a/frontend/src/context/DocumentOpenContext.tsx +++ b/frontend/src/contexts/DocumentOpenContext.tsx @@ -1,6 +1,4 @@ import React, { createContext, useContext, useCallback } from 'react'; -import { usePreviewContext } from '../preview/PreviewContext'; -import { useAppShell } from '../appShellContext'; import type { Document } from '../types/documents'; import type { Identifier } from '../types/identifiers'; @@ -20,25 +18,31 @@ export const useDocumentOpen = () => { return context; }; -export const DocumentOpenProvider: React.FC<{ children: React.ReactNode; onOpenViewer?: (docId: Identifier) => void }> = ({ children, onOpenViewer }) => { - const { openPreview } = usePreviewContext(); - const appShell = useAppShell(); - - // We cast appShell.openDetailPanel because AppShellContext is loosely typed - const openDetailPanel = appShell.openDetailPanel as ((args: { documentIds: Identifier[] }) => void) | undefined; +interface DocumentOpenProviderProps { + children: React.ReactNode; + onOpenViewer?: (docId: Identifier) => void; + onOpenPreview?: (doc: Document) => void; + onOpenSidepanel?: (docId: Identifier) => void; +} +export const DocumentOpenProvider: React.FC = ({ + children, + onOpenViewer, + onOpenPreview, + onOpenSidepanel, +}) => { const openDocument = useCallback((doc: Document, target: DocumentOpenTarget = 'preview') => { if (!doc) return; switch (target) { case 'preview': - openPreview(doc); + if (onOpenPreview) { + onOpenPreview(doc); + } break; case 'sidepanel': - if (openDetailPanel) { - openDetailPanel({ documentIds: [doc.id] }); - } else { - console.warn('openDetailPanel is not available in AppShellContext'); + if (onOpenSidepanel) { + onOpenSidepanel(doc.id); } break; case 'viewer': @@ -47,7 +51,7 @@ export const DocumentOpenProvider: React.FC<{ children: React.ReactNode; onOpenV } break; } - }, [openPreview, openDetailPanel, onOpenViewer]); + }, [onOpenPreview, onOpenSidepanel, onOpenViewer]); return ( diff --git a/frontend/src/desktop/DesktopWorkspace.tsx b/frontend/src/desktop/DesktopWorkspace.tsx index 6c6f474..57c7793 100644 --- a/frontend/src/desktop/DesktopWorkspace.tsx +++ b/frontend/src/desktop/DesktopWorkspace.tsx @@ -19,7 +19,7 @@ import { PointerTrackingProvider, usePointerTracking } from './PointerTrackingCo import type { Identifier } from '../types/identifiers'; import type { DocumentsListEntry, Document } from '../types/documents'; import { useAppState } from '../app/appState'; -import { useDocumentOpen } from '../context/DocumentOpenContext'; +import { useDocumentOpen } from '../contexts/DocumentOpenContext'; type TagLike = { id?: Identifier | null; label?: string; color?: string | null } | null; type OverlaySource = { url: string; alt?: string | null; mimeType?: string | null; }; diff --git a/frontend/src/documents/DocumentsManager.ts b/frontend/src/documents/DocumentsManager.ts index d39711c..98b5924 100644 --- a/frontend/src/documents/DocumentsManager.ts +++ b/frontend/src/documents/DocumentsManager.ts @@ -7,13 +7,9 @@ type FetchDocument = (id: DocumentId) => Promise; class DocumentsManager { private byId: Map; - private fetcher?: FetchDocument; - private inflight: Map>; - private listeners: Set<() => void>; - private emitScheduled: boolean; constructor( diff --git a/frontend/src/documents/hooks/useDocumentItemLogic.ts b/frontend/src/documents/hooks/useDocumentItemLogic.ts index 5a4ae9a..2602809 100644 --- a/frontend/src/documents/hooks/useDocumentItemLogic.ts +++ b/frontend/src/documents/hooks/useDocumentItemLogic.ts @@ -1,7 +1,7 @@ import React, { type DragEvent } from 'react'; import { parseTagTransferPayload } from '../tagTransfer'; import { createDocumentEntryKey } from '../../app/entryKey'; -import { useDocumentOpen } from '../../context/DocumentOpenContext'; +import { useDocumentOpen } from '../../contexts/DocumentOpenContext'; import type { Document } from '../../types/documents'; import type { DocumentsViewProps } from '../panel/DocumentsPanel'; import type { DocumentViewLogic } from './useDocumentViewLogic'; diff --git a/frontend/src/documents/hooks/useDocumentsNavigation.ts b/frontend/src/documents/hooks/useDocumentsNavigation.ts index 99812d9..f0e38f7 100644 --- a/frontend/src/documents/hooks/useDocumentsNavigation.ts +++ b/frontend/src/documents/hooks/useDocumentsNavigation.ts @@ -1,7 +1,7 @@ import React, { useCallback, useMemo } from 'react'; import type { DocumentsListEntry } from '../../types/documents'; import { useWorkspaceSelectionContext } from '../../app/WorkspaceSelectionContext'; -import { useDocumentOpen } from '../../context/DocumentOpenContext'; +import { useDocumentOpen } from '../../contexts/DocumentOpenContext'; interface UseDocumentsNavigationProps { entries: DocumentsListEntry[];