feat: optimize frontend document panel rendering and folder creation.

This commit is contained in:
2025-12-12 03:47:50 +01:00
parent 6ba8084caa
commit b6857bd0b3
5 changed files with 9 additions and 23 deletions
-8
View File
@@ -26,18 +26,10 @@ const DocumentsInner: React.FC<{
const { openDetailPanel } = surfaceConfig; const { openDetailPanel } = surfaceConfig;
const sidebarHidden = sidebarCollapsed || sidebarSuppressed; const sidebarHidden = sidebarCollapsed || sidebarSuppressed;
const documentsTablePropsWithNav = surfaceConfig.documentsTableProps
? {
...surfaceConfig.documentsTableProps,
onBreadcrumbNavigate: surfaceConfig.handleBreadcrumbNavigate,
}
: null;
const { surface } = useWorkspaceSurface({ const { surface } = useWorkspaceSurface({
sidebarHidden, sidebarHidden,
onExpandSidebar: expandSidebar, onExpandSidebar: expandSidebar,
...surfaceConfig, ...surfaceConfig,
documentsTableProps: documentsTablePropsWithNav,
}); });
useEffect(() => { useEffect(() => {
+1 -1
View File
@@ -22,7 +22,7 @@ const useDocumentsShell = (): DocumentsShellView => {
return useMemo(() => { return useMemo(() => {
const surfaceConfig: WorkspaceSurfaceConfig = { const surfaceConfig: WorkspaceSurfaceConfig = {
documentsTableProps: {}, viewMode: shell.search?.documentsViewMode,
detailPanelProps: (shell.detailPanel?.detailPanelProps ?? null) as WorkspaceSurfaceConfig['detailPanelProps'], detailPanelProps: (shell.detailPanel?.detailPanelProps ?? null) as WorkspaceSurfaceConfig['detailPanelProps'],
detailPanelOpen: Boolean(shell.detailPanel?.detailPanelOpen), detailPanelOpen: Boolean(shell.detailPanel?.detailPanelOpen),
openDetailPanel: shell.detailPanel?.openDetailPanel as WorkspaceSurfaceConfig['openDetailPanel'], openDetailPanel: shell.detailPanel?.openDetailPanel as WorkspaceSurfaceConfig['openDetailPanel'],
+3 -9
View File
@@ -16,7 +16,6 @@ type EnsureViewerData = (docId: Identifier, options?: Record<string, unknown>) =
type GetDocumentAsset = (document: unknown, assetType: string) => unknown; type GetDocumentAsset = (document: unknown, assetType: string) => unknown;
type NotifyApiError = (error: unknown, fallbackMessage?: string) => void; type NotifyApiError = (error: unknown, fallbackMessage?: string) => void;
type DocumentsTableProps = ComponentProps<typeof DocumentsPanel> | null;
type DetailPanelProps = (ComponentProps<typeof DocumentViewerPanel> & { type DetailPanelProps = (ComponentProps<typeof DocumentViewerPanel> & {
onClose?: () => void; onClose?: () => void;
onOpenViewer?: (args: { documentIds: Array<string> }) => void; onOpenViewer?: (args: { documentIds: Array<string> }) => void;
@@ -32,7 +31,7 @@ type WorkspaceSurface = { content: ReactNode; detail?: ReactNode | null; detailM
export interface UseWorkspaceSurfaceArgs { export interface UseWorkspaceSurfaceArgs {
sidebarHidden?: boolean; sidebarHidden?: boolean;
onExpandSidebar?: () => void; onExpandSidebar?: () => void;
documentsTableProps?: DocumentsTableProps; viewMode?: string;
detailPanelProps?: DetailPanelProps; detailPanelProps?: DetailPanelProps;
detailPanelOpen?: boolean; detailPanelOpen?: boolean;
viewerWorkspaceDocument?: unknown; viewerWorkspaceDocument?: unknown;
@@ -51,7 +50,7 @@ interface UseWorkspaceSurfaceResult {
export const useWorkspaceSurface = ({ export const useWorkspaceSurface = ({
sidebarHidden = false, sidebarHidden = false,
onExpandSidebar, onExpandSidebar,
documentsTableProps, viewMode,
detailPanelProps, detailPanelProps,
detailPanelOpen = false, detailPanelOpen = false,
viewerWorkspaceDocument, viewerWorkspaceDocument,
@@ -105,12 +104,7 @@ export const useWorkspaceSurface = ({
}, [sidebarHidden, onExpandSidebar]); }, [sidebarHidden, onExpandSidebar]);
const documentsSurface = useMemo<WorkspaceSurface>(() => { const documentsSurface = useMemo<WorkspaceSurface>(() => {
if (!documentsTableProps) {
return null;
}
const sidebarToggle = renderSidebarToggle ? renderSidebarToggle() : null; const sidebarToggle = renderSidebarToggle ? renderSidebarToggle() : null;
const viewMode = documentsTableProps.viewMode;
const sidebarMode = viewMode === 'desk' ? 'overlay' : 'inline'; const sidebarMode = viewMode === 'desk' ? 'overlay' : 'inline';
const detailMode: 'overlay' | 'inline' | null = detailPanelOpen && detailPanelProps ? sidebarMode : null; const detailMode: 'overlay' | 'inline' | null = detailPanelOpen && detailPanelProps ? sidebarMode : null;
@@ -157,7 +151,7 @@ export const useWorkspaceSurface = ({
detailMode, detailMode,
}; };
}, [ }, [
documentsTableProps, viewMode,
renderSidebarToggle, renderSidebarToggle,
detailPanelOpen, detailPanelOpen,
detailPanelProps, detailPanelProps,
@@ -179,11 +179,10 @@ const useFolderTreeActions = ({
setCreatingFolder(true); setCreatingFolder(true);
let succeeded = false; let succeeded = false;
try { try {
const folderData = await foldersManager.create(name.trim(), targetParentId); await foldersManager.create(name.trim(), targetParentId);
showToast('Folder created.', 'success'); showToast('Folder created.', 'success');
await selectFolder(folderData.id, { immediate: true });
succeeded = true; succeeded = true;
return true; return true;
} catch (error) { } catch (error) {
@@ -199,7 +198,6 @@ const useFolderTreeActions = ({
}, },
[ [
notifyApiError, notifyApiError,
selectFolder,
selectedFolder, selectedFolder,
setCreatingFolder, setCreatingFolder,
foldersManager, foldersManager,
@@ -50,7 +50,7 @@ interface DocumentsPanelProps {
headerLeading?: ReactNode; headerLeading?: ReactNode;
} }
const DocumentsPanelInner: React.FC<DocumentsPanelProps> = (props) => { const DocumentsPanelInner: React.FC<DocumentsPanelProps> = React.memo((props) => {
const { headerLeading } = props; const { headerLeading } = props;
const shell = useAppShell(); const shell = useAppShell();
const { const {
@@ -304,7 +304,9 @@ const DocumentsPanelInner: React.FC<DocumentsPanelProps> = (props) => {
</DocumentsViewStateContext.Provider> </DocumentsViewStateContext.Provider>
</DocumentsAssetContext.Provider> </DocumentsAssetContext.Provider>
); );
}; });
DocumentsPanelInner.displayName = 'DocumentsPanelInner';
const DocumentsPanel: React.FC<DocumentsPanelProps> = (props) => { const DocumentsPanel: React.FC<DocumentsPanelProps> = (props) => {
const shell = useAppShell(); const shell = useAppShell();