This commit is contained in:
2025-12-04 14:37:09 +01:00
parent 34230cda21
commit dd521f9f1d
5 changed files with 51 additions and 149 deletions
+1 -1
View File
@@ -40,7 +40,7 @@ const DocumentsInner: React.FC<{
const handleOpenSidepanel = useCallback((docId: string) => {
if (openDetailPanel) {
openDetailPanel({ documentIds: [docId] });
openDetailPanel(docId);
}
}, [openDetailPanel]);
+15 -67
View File
@@ -1,97 +1,46 @@
import { useCallback, useEffect, useRef, useState } from 'react';
import { useCallback, useEffect, useState } from 'react';
import type { Identifier } from '../types/identifiers';
interface DetailDocument {
id?: string;
id?: Identifier;
[key: string]: unknown;
}
interface UseDetailPanelOptions {
documentLookup: Map<string, DetailDocument>;
orderedSelectedDocuments: DetailDocument[];
}
interface OpenDetailPanelArgs {
documentId?: string;
document?: DetailDocument | null;
documentIds?: Array<string>;
documents?: DetailDocument[];
documentLookup: Map<Identifier, DetailDocument>;
}
export const useDetailPanel = ({
documentLookup,
orderedSelectedDocuments,
}: UseDetailPanelOptions) => {
const [detailPanelOpen, setDetailPanelOpen] = useState(false);
const [detailPanelDocId, setDetailPanelDocId] = useState<string | null>(null);
const [detailPanelDocId, setDetailPanelDocId] = useState<Identifier | null>(null);
const [detailPanelDocument, setDetailPanelDocument] = useState<DetailDocument | null>(null);
const latestOrderedDocsRef = useRef<DetailDocument[]>([]);
useEffect(() => {
latestOrderedDocsRef.current = orderedSelectedDocuments;
if (detailPanelOpen && orderedSelectedDocuments.length) {
const nextDoc = orderedSelectedDocuments[orderedSelectedDocuments.length - 1];
if (nextDoc?.id) {
setDetailPanelDocId(nextDoc.id);
setDetailPanelDocument(nextDoc);
}
}
}, [orderedSelectedDocuments, detailPanelOpen]);
const detailPanelOpen = detailPanelDocId !== null;
useEffect(() => {
if (!detailPanelDocId) {
if (!detailPanelOpen) {
setDetailPanelDocument(null);
}
setDetailPanelDocument(null);
return;
}
const resolved = documentLookup.get(detailPanelDocId);
if (resolved && resolved !== detailPanelDocument) {
const resolved = documentLookup.get(detailPanelDocId) ?? null;
if (resolved !== detailPanelDocument) {
setDetailPanelDocument(resolved);
}
}, [detailPanelDocId, documentLookup, detailPanelDocument, detailPanelOpen]);
}, [detailPanelDocId, documentLookup, detailPanelDocument]);
const openDetailPanel = useCallback(
({ documentId, document, documentIds, documents }: OpenDetailPanelArgs = {}) => {
let targetDoc = document || null;
let targetId = documentId ?? document?.id ?? null;
if (!targetDoc && Array.isArray(documents) && documents.length) {
targetDoc = documents[documents.length - 1];
targetId = targetDoc?.id ?? targetId;
}
if (!targetDoc && Array.isArray(documentIds) && documentIds.length) {
targetId = documentIds[documentIds.length - 1];
}
if (!targetDoc && targetId != null) {
targetDoc = documentLookup.get(String(targetId)) || null;
}
if (!targetDoc) {
const fallbackDocs = latestOrderedDocsRef.current;
const fallbackDoc = Array.isArray(fallbackDocs) && fallbackDocs.length
? fallbackDocs[fallbackDocs.length - 1]
: null;
if (fallbackDoc) {
targetDoc = fallbackDoc;
targetId = fallbackDoc.id;
}
}
if (!targetDoc && targetId == null) {
(documentId: Identifier) => {
if (!documentId) {
return;
}
setDetailPanelDocId(targetDoc?.id ?? targetId ?? null);
setDetailPanelDocument(targetDoc || null);
setDetailPanelOpen(Boolean(targetDoc || targetId));
setDetailPanelDocId(documentId);
},
[documentLookup],
[],
);
const closeDetailPanel = useCallback(() => {
setDetailPanelOpen(false);
setDetailPanelDocId(null);
}, []);
return {
@@ -99,6 +48,5 @@ export const useDetailPanel = ({
detailPanelDocument,
openDetailPanel,
closeDetailPanel,
setDetailPanelOpen,
};
};
+1 -1
View File
@@ -7,7 +7,7 @@ import type { UseWorkspaceSurfaceArgs } from './useWorkspaceSurface';
import type { Identifier } from '../types/identifiers';
type WorkspaceSurfaceConfig = Omit<UseWorkspaceSurfaceArgs, 'sidebarHidden' | 'onExpandSidebar'> & {
openDetailPanel?: (args: { documentIds?: Identifier[] }) => void;
openDetailPanel?: (documentId: Identifier) => void;
closeDetailPanel?: () => void;
};