"use client";
import React from "react";
import { useUIState } from "src/useUIState";
import { useSearchParams } from "next/navigation";
import { focusBlock } from "src/utils/focusBlock";
import { elementId } from "src/utils/elementId";
import { Replicache } from "replicache";
import { Fact, ReplicacheMutators, useEntity } from "src/replicache";
import { scanIndex } from "src/replicache/utils";
import { CardThemeProvider } from "../ThemeManager/ThemeProvider";
import { scrollIntoViewIfNeeded } from "src/utils/scrollIntoViewIfNeeded";
import { useCardBorderHidden } from "./useCardBorderHidden";
import { BookendSpacer, SandwichSpacer } from "components/LeafletLayout";
import { LeafletSidebar } from "app/[leaflet_id]/Sidebar";
import { Page } from "./Page";
export function Pages(props: { rootPage: string }) {
let rootPage = useEntity(props.rootPage, "root/page")[0];
let pages = useUIState((s) => s.openPages);
let params = useSearchParams();
let queryRoot = params.get("page");
let firstPage = queryRoot || rootPage?.data.value || props.rootPage;
let cardBorderHidden = useCardBorderHidden(rootPage.id);
let firstPageIsCanvas = useEntity(firstPage, "page/type");
let fullPageScroll =
!!cardBorderHidden && pages.length === 0 && !firstPageIsCanvas;
return (
<>
{!fullPageScroll && (
{
e.currentTarget === e.target && blurPage();
}}
/>
)}
{pages.map((page) => (
{
e.currentTarget === e.target && blurPage();
}}
/>
))}
{!fullPageScroll && (
{
e.currentTarget === e.target && blurPage();
}}
/>
)}
>
);
}
export async function focusPage(
pageID: string,
rep: Replicache,
focusFirstBlock?: "focusFirstBlock",
) {
// if this page is already focused,
let focusedBlock = useUIState.getState().focusedEntity;
// else set this page as focused
useUIState.setState(() => ({
focusedEntity: {
entityType: "page",
entityID: pageID,
},
}));
setTimeout(async () => {
//scroll to page
scrollIntoViewIfNeeded(
document.getElementById(elementId.page(pageID).container),
false,
"smooth",
);
// if we asked that the function focus the first block, focus the first block
if (focusFirstBlock === "focusFirstBlock") {
let firstBlock = await rep.query(async (tx) => {
let type = await scanIndex(tx).eav(pageID, "page/type");
let blocks = await scanIndex(tx).eav(
pageID,
type[0]?.data.value === "canvas" ? "canvas/block" : "card/block",
);
let firstBlock = blocks[0];
if (!firstBlock) {
return null;
}
let blockType = (
await tx
.scan<
Fact<"block/type">
>({ indexName: "eav", prefix: `${firstBlock.data.value}-block/type` })
.toArray()
)[0];
if (!blockType) return null;
return {
value: firstBlock.data.value,
type: blockType.data.value,
parent: firstBlock.entity,
position: firstBlock.data.position,
};
});
if (firstBlock) {
setTimeout(() => {
focusBlock(firstBlock, { type: "start" });
}, 500);
}
}
}, 50);
}
export const blurPage = () => {
useUIState.setState(() => ({
focusedEntity: null,
selectedBlocks: [],
}));
};