import { currentPageIdAtom, currentWorkspaceAtom, deleteLayoutAtom, pushLayoutAtom, } from '@affine/sdk/entry'; import { TOCNotesPanel } from '@blocksuite/blocks'; import { assertExists } from '@blocksuite/global/utils'; import { RightSidebarIcon } from '@blocksuite/icons'; import { IconButton } from '@toeverything/components/button'; import { Tooltip } from '@toeverything/components/tooltip'; import { useAtomValue, useSetAtom } from 'jotai'; import type { ComponentType, PropsWithChildren } from 'react'; import { useCallback, useRef, useState } from 'react'; import { createRoot } from 'react-dom/client'; const Outline = () => { const tocPanelRef = useRef(null); const currentPageId = useAtomValue(currentPageIdAtom); assertExists(currentPageId, 'current page id'); const currentWorkspace = useAtomValue(currentWorkspaceAtom); const currentPage = currentWorkspace.getPage(currentPageId); assertExists(currentPage, 'current page'); if (!tocPanelRef.current) { tocPanelRef.current = new TOCNotesPanel(); } if (currentPage !== tocPanelRef.current?.page) { (tocPanelRef.current as TOCNotesPanel).page = currentPage; } return (
{ if (container) { assertExists(tocPanelRef.current); container.appendChild(tocPanelRef.current); } }, [])} /> ); }; export const HeaderItem = ({ Provider, }: { Provider: ComponentType; }) => { const [open, setOpen] = useState(false); const pushLayout = useSetAtom(pushLayoutAtom); const deleteLayout = useSetAtom(deleteLayoutAtom); const [container, setContainer] = useState(null); return ( { if (!open) { setOpen(true); pushLayout( '@affine/outline-plugin', div => { const root = createRoot(div); div.style.height = '100%'; root.render( ); return () => { root.unmount(); }; }, { maxWidth: [undefined, 300], } ); } else { setOpen(false); deleteLayout('@affine/outline-plugin'); } }, [Provider, deleteLayout, open, pushLayout])} > ); };