feat: optimize frontend document panel rendering and folder creation.
This commit is contained in:
@@ -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(() => {
|
||||||
|
|||||||
@@ -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'],
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user