fix page tree api atom (#1391)

- The tree api atom state is not always set, which makes it impossble to create new pages since the buttons rely on it.
- this should fix it.
This commit is contained in:
Philip Okugbe
2025-07-21 05:02:40 +01:00
committed by GitHub
parent 4dfed2b2af
commit f8dc9845a7

View File

@ -90,8 +90,14 @@ export default function SpaceTree({ spaceId, readOnly }: SpaceTreeProps) {
const treeApiRef = useRef<TreeApi<SpaceTreeNode>>(); const treeApiRef = useRef<TreeApi<SpaceTreeNode>>();
const [openTreeNodes, setOpenTreeNodes] = useAtom<OpenMap>(openTreeNodesAtom); const [openTreeNodes, setOpenTreeNodes] = useAtom<OpenMap>(openTreeNodesAtom);
const rootElement = useRef<HTMLDivElement>(); const rootElement = useRef<HTMLDivElement>();
const [isRootReady, setIsRootReady] = useState(false);
const { ref: sizeRef, width, height } = useElementSize(); const { ref: sizeRef, width, height } = useElementSize();
const mergedRef = useMergedRef(rootElement, sizeRef); const mergedRef = useMergedRef((element) => {
rootElement.current = element;
if (element && !isRootReady) {
setIsRootReady(true);
}
}, sizeRef);
const [isDataLoaded, setIsDataLoaded] = useState(false); const [isDataLoaded, setIsDataLoaded] = useState(false);
const { data: currentPage } = usePageQuery({ const { data: currentPage } = usePageQuery({
pageId: extractPageSlugId(pageSlug), pageId: extractPageSlugId(pageSlug),
@ -199,16 +205,17 @@ export default function SpaceTree({ spaceId, readOnly }: SpaceTreeProps) {
} }
}, [currentPage?.id]); }, [currentPage?.id]);
// Clean up tree API on unmount
useEffect(() => { useEffect(() => {
if (treeApiRef.current) { return () => {
// @ts-ignore // @ts-ignore
setTreeApi(treeApiRef.current); setTreeApi(null);
} };
}, [treeApiRef.current]); }, [setTreeApi]);
return ( return (
<div ref={mergedRef} className={classes.treeContainer}> <div ref={mergedRef} className={classes.treeContainer}>
{rootElement.current && ( {isRootReady && rootElement.current && (
<Tree <Tree
data={data.filter((node) => node?.spaceId === spaceId)} data={data.filter((node) => node?.spaceId === spaceId)}
disableDrag={readOnly} disableDrag={readOnly}
@ -217,7 +224,13 @@ export default function SpaceTree({ spaceId, readOnly }: SpaceTreeProps) {
{...controllers} {...controllers}
width={width} width={width}
height={rootElement.current.clientHeight} height={rootElement.current.clientHeight}
ref={treeApiRef} ref={(ref) => {
treeApiRef.current = ref;
if (ref) {
//@ts-ignore
setTreeApi(ref);
}
}}
openByDefault={false} openByDefault={false}
disableMultiSelection={true} disableMultiSelection={true}
className={classes.tree} className={classes.tree}