simplify
This commit is contained in:
@@ -40,7 +40,7 @@ const DocumentsInner: React.FC<{
|
||||
|
||||
const handleOpenSidepanel = useCallback((docId: string) => {
|
||||
if (openDetailPanel) {
|
||||
openDetailPanel({ documentIds: [docId] });
|
||||
openDetailPanel(docId);
|
||||
}
|
||||
}, [openDetailPanel]);
|
||||
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user