refactor: centralize documents route configuration into new useDocumentsShell hook and export related types.
This commit is contained in:
@@ -1,70 +1,22 @@
|
||||
import React, { useCallback, useEffect, useMemo } from 'react';
|
||||
import type { ReactNode } from 'react';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
import { useAppShell } from '../appShellContext';
|
||||
import {
|
||||
DocumentsFilterProvider,
|
||||
} from '../documents/context/DocumentsFilterContext';
|
||||
import type { DocumentsFilterValue } from '../documents/context/DocumentsFilterContext';
|
||||
import { useWorkspaceSurface } from './useWorkspaceSurface';
|
||||
import { DocumentsHeaderBreadcrumb } from '../documents/panel/DocumentsPanelHeader';
|
||||
import { SidebarProvider, useSidebarContext } from '../sidebar/SidebarContext';
|
||||
import { PanelManagerProvider, usePanelManager } from './PanelManagerContext';
|
||||
import Sidebar from '../sidebar/Sidebar';
|
||||
import type { Identifier } from '../types/identifiers';
|
||||
|
||||
type EnsureAssetUrl = (
|
||||
docId: Identifier,
|
||||
asset: unknown,
|
||||
options?: Record<string, unknown>,
|
||||
) => Promise<unknown> | void;
|
||||
|
||||
type EnsurePreviewData = (docId: Identifier, options?: Record<string, unknown>) => Promise<unknown>;
|
||||
type GetDocumentAsset = (document: unknown, assetType: string) => unknown;
|
||||
type NotifyApiError = (error: unknown, fallbackMessage?: string) => void;
|
||||
|
||||
interface DocumentsTableProps {
|
||||
breadcrumbs?: DocumentsHeaderBreadcrumb[] | null;
|
||||
onBreadcrumbNavigate?: (crumb: DocumentsHeaderBreadcrumb) => void;
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
interface DocumentsRouteAppShell {
|
||||
sidebarProps?: Record<string, unknown> | null;
|
||||
documentsTableProps?: DocumentsTableProps | null;
|
||||
detailPanelProps?: Record<string, unknown> | null;
|
||||
detailPanelOpen?: boolean;
|
||||
openTagsModal?: () => void;
|
||||
openCorrespondentsModal?: () => void;
|
||||
previewWorkspaceDocument?: unknown;
|
||||
documentLink?: unknown;
|
||||
previewDocumentId?: Identifier | null;
|
||||
closeDocumentPreview?: () => void;
|
||||
ensurePreviewData?: EnsurePreviewData;
|
||||
ensureAssetUrl?: EnsureAssetUrl;
|
||||
getDocumentAsset?: GetDocumentAsset;
|
||||
notifyApiError?: NotifyApiError;
|
||||
documentsFilter: DocumentsFilterValue;
|
||||
}
|
||||
import useDocumentsShell from './useDocumentsShell';
|
||||
|
||||
const DocumentsRouteContent: React.FC = () => {
|
||||
const {
|
||||
sidebarProps,
|
||||
documentsTableProps,
|
||||
detailPanelProps,
|
||||
detailPanelOpen,
|
||||
openTagsModal,
|
||||
openCorrespondentsModal,
|
||||
previewWorkspaceDocument,
|
||||
documentLink,
|
||||
previewDocumentId,
|
||||
closeDocumentPreview,
|
||||
ensurePreviewData,
|
||||
ensureAssetUrl,
|
||||
getDocumentAsset,
|
||||
notifyApiError,
|
||||
surfaceConfig,
|
||||
documentsFilter,
|
||||
} = useAppShell() as unknown as DocumentsRouteAppShell;
|
||||
} = useDocumentsShell();
|
||||
const navigate = useNavigate();
|
||||
const { collapsed: sidebarCollapsed } = useSidebarContext();
|
||||
const {
|
||||
@@ -72,20 +24,6 @@ const DocumentsRouteContent: React.FC = () => {
|
||||
expandSidebar,
|
||||
} = usePanelManager();
|
||||
|
||||
const safeSidebarProps = useMemo<Record<string, unknown>>(
|
||||
() => (sidebarProps && Object(sidebarProps) === sidebarProps ? sidebarProps : {}),
|
||||
[sidebarProps],
|
||||
);
|
||||
|
||||
const sidebarPropsWithActions = useMemo(
|
||||
() => ({
|
||||
...safeSidebarProps,
|
||||
onManageTags: openTagsModal,
|
||||
onManageCorrespondents: openCorrespondentsModal,
|
||||
}),
|
||||
[safeSidebarProps, openTagsModal, openCorrespondentsModal],
|
||||
);
|
||||
|
||||
const sidebarHidden = sidebarCollapsed || sidebarSuppressed;
|
||||
|
||||
const handleHeaderBreadcrumbClick = useCallback((crumb: DocumentsHeaderBreadcrumb) => {
|
||||
@@ -97,25 +35,16 @@ const DocumentsRouteContent: React.FC = () => {
|
||||
}, [navigate]);
|
||||
|
||||
const documentsTablePropsWithNav = useMemo(() => (
|
||||
documentsTableProps
|
||||
? { ...documentsTableProps, onBreadcrumbNavigate: handleHeaderBreadcrumbClick }
|
||||
surfaceConfig.documentsTableProps
|
||||
? { ...surfaceConfig.documentsTableProps, onBreadcrumbNavigate: handleHeaderBreadcrumbClick }
|
||||
: null
|
||||
), [documentsTableProps, handleHeaderBreadcrumbClick]);
|
||||
), [surfaceConfig.documentsTableProps, handleHeaderBreadcrumbClick]);
|
||||
|
||||
const { surface } = useWorkspaceSurface({
|
||||
sidebarHidden,
|
||||
onExpandSidebar: expandSidebar,
|
||||
...surfaceConfig,
|
||||
documentsTableProps: documentsTablePropsWithNav,
|
||||
detailPanelProps,
|
||||
detailPanelOpen,
|
||||
previewWorkspaceDocument,
|
||||
documentLink,
|
||||
previewDocumentId,
|
||||
ensureAssetUrl,
|
||||
ensurePreviewData,
|
||||
getDocumentAsset,
|
||||
notifyApiError,
|
||||
closeDocumentPreview,
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
@@ -127,7 +56,7 @@ const DocumentsRouteContent: React.FC = () => {
|
||||
|
||||
const renderSurface = () => {
|
||||
const layoutClass = `documents-main${sidebarHidden ? ' documents-main--sidebar-hidden' : ''}`;
|
||||
const sidebarNode = !sidebarHidden ? <Sidebar {...sidebarPropsWithActions} /> : null;
|
||||
const sidebarNode = !sidebarHidden && sidebarProps ? <Sidebar {...sidebarProps} /> : null;
|
||||
const surfaceDetail = surface && (surface as { detail?: ReactNode }).detail ? (surface as { detail?: ReactNode }).detail : null;
|
||||
const surfaceBody = surface ? surface.content : null;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user