import React, { useEffect, useCallback } from 'react'; import { useDocumentViewLogic, DocumentViewLogic } from './logic/useDocumentViewLogic'; import { useDocumentsNavigation } from './logic/useDocumentsNavigation'; import { useWorkspaceSelectionContext } from '../app/WorkspaceSelectionContext'; import { usePanelManager } from '../app/PanelManagerContext'; 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'; import { useDocumentsViewStateContext } from './context/DocumentsViewStateContext'; import { useDocumentsCommandContext } from './context/DocumentsCommandContext'; 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, viewMode } = props; const { viewId, scrollRef } = useDocumentsViewStateContext(); const { document: { onRename: onDocumentRename }, folder: { onRename: onFolderRename, onSelect: onFolderSelect } } = useDocumentsCommandContext(); const viewLogic = useDocumentViewLogic({ onDocumentRename, onFolderRename, }); const { handleKeyDown, handleFocus } = useDocumentsNavigation({ entries, onFolderSelect, viewMode: viewMode || props.viewMode, scrollRef: scrollRef, }); 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]); const { detailPanelOpen } = usePanelManager(); useEffect(() => { const container = scrollRef?.current; if (!container) return; const handleTransitionEnd = () => { ensureFocusedEntryVisible(); }; container.addEventListener('transitionend', handleTransitionEnd); // Immediate check in case there is no transition or it finished already ensureFocusedEntryVisible(); return () => { container.removeEventListener('transitionend', handleTransitionEnd); }; }, [scrollRef, ensureFocusedEntryVisible, detailPanelOpen]); return ( {entries.map((entry) => ( ))} ); }; export const DocumentsList: React.FC = (props) => { return ( ); }; export const DocumentsGrid: React.FC = (props) => { return ( ); };