import React, { useEffect, useCallback } from 'react'; import { useDocumentViewLogic, DocumentViewLogic } from './hooks/useDocumentViewLogic'; import { useDocumentsNavigation } from './hooks/useDocumentsNavigation'; import { useWorkspaceSelectionContext } from '../app/WorkspaceSelectionContext'; import { usePreviewContext } from '../preview/PreviewContext'; import DocumentsListRow from './components/DocumentsListRow'; import DocumentsGridCard from './components/DocumentsGridCard'; import DocumentsListContainer from './components/DocumentsListContainer'; import DocumentsGridContainer from './components/DocumentsGridContainer'; import type { DocumentsViewProps } from './panel/DocumentsPanel'; interface AbstractDocumentsViewProps void; children: React.ReactNode }> extends DocumentsViewProps { ContainerComponent: React.ComponentType; ItemComponent: React.ComponentType<{ entry: any; viewLogic: DocumentViewLogic } & DocumentsViewProps>; containerProps?: Omit; [key: string]: any; } const AbstractDocumentsView = void; children: React.ReactNode }>({ ContainerComponent, ItemComponent, containerProps, ...props }: AbstractDocumentsViewProps) => { const { entries, onDocumentRename, onFolderRename, onFolderSelect, scrollRef, viewId } = props; const { openPreview } = usePreviewContext(); const viewLogic = useDocumentViewLogic({ onDocumentRename, onFolderRename, }); const { handleKeyDown, handleFocus } = useDocumentsNavigation({ entries, onFolderSelect, onPreview: openPreview, }); const { clearSelection } = viewLogic; useEffect(() => { if (scrollRef?.current) { scrollRef.current.scrollTop = 0; } }, [scrollRef, viewId]); const { focusedEntryKey } = useWorkspaceSelectionContext(); const ensureFocusedEntryVisible = useCallback(() => { if (!focusedEntryKey) return; const container = scrollRef?.current; if (!container) return; let selector = null; if (focusedEntryKey.startsWith('document:')) { selector = `#document-${focusedEntryKey.slice('document:'.length)}`; } else if (focusedEntryKey.startsWith('folder:')) { selector = `#folder-${focusedEntryKey.slice('folder:'.length)}`; } if (!selector) { return; } const entry = container.querySelector(selector) as HTMLElement; if (!entry || !container.contains(entry)) { return; } entry.scrollIntoView({ block: 'nearest' }); }, [focusedEntryKey, scrollRef]); useEffect(() => { ensureFocusedEntryVisible(); }, [ensureFocusedEntryVisible]); return ( {entries.map((entry) => ( ))} ); }; export const DocumentsList: React.FC = (props) => { return ( ); }; export const DocumentsGrid: React.FC = (props) => { return ( ); };