"use client";
import React from "react";
import { useUIState } from "src/useUIState";
import { elementId } from "src/utils/elementId";
import { useEntity, useReferenceToEntity, useReplicache } from "src/replicache";
import { DesktopPageFooter } from "../DesktopFooter";
import { Canvas } from "../Canvas";
import { Blocks } from "components/Blocks";
import { PublicationMetadata } from "./PublicationMetadata";
import { useCardBorderHidden } from "./useCardBorderHidden";
import { focusPage } from ".";
import { PageOptions } from "./PageOptions";
import { CardThemeProvider } from "components/ThemeManager/ThemeProvider";
import { useDrawerOpen } from "app/lish/[did]/[publication]/[rkey]/Interactions/InteractionDrawer";
export function Page(props: {
entityID: string;
first?: boolean;
fullPageScroll: boolean;
}) {
let { rep } = useReplicache();
let isFocused = useUIState((s) => {
let focusedElement = s.focusedEntity;
let focusedPageID =
focusedElement?.entityType === "page"
? focusedElement.entityID
: focusedElement?.parent;
return focusedPageID === props.entityID;
});
let pageType = useEntity(props.entityID, "page/type")?.data.value || "doc";
let cardBorderHidden = useCardBorderHidden(props.entityID);
let drawerOpen = useDrawerOpen(props.entityID);
return (
{
if (e.defaultPrevented) return;
if (rep) {
if (isFocused) return;
focusPage(props.entityID, rep);
}
}}
id={elementId.page(props.entityID).container}
drawerOpen={!!drawerOpen}
cardBorderHidden={!!cardBorderHidden}
isFocused={isFocused}
fullPageScroll={props.fullPageScroll}
pageType={pageType}
pageOptions={
}
>
{props.first && (
<>
>
)}
);
}
export const PageWrapper = (props: {
id: string;
children: React.ReactNode;
pageOptions?: React.ReactNode;
cardBorderHidden: boolean;
fullPageScroll: boolean;
isFocused?: boolean;
onClickAction?: (e: React.MouseEvent) => void;
pageType: "canvas" | "doc";
drawerOpen: boolean | undefined;
}) => {
return (
// this div wraps the contents AND the page options.
// it needs to be its own div because this container does NOT scroll, and therefore doesn't clip the absolutely positioned pageOptions
{/*
this div is the scrolling container that wraps only the contents div.
it needs to be a separate div so that the user can scroll from anywhere on the page if there isn't a card border
*/}
{props.children}
{props.pageType === "doc" &&
}
{props.pageOptions}
);
};
const PageContent = (props: { entityID: string; first?: boolean }) => {
let pageType = useEntity(props.entityID, "page/type")?.data.value || "doc";
if (pageType === "doc") return ;
return ;
};
const DocContent = (props: { entityID: string }) => {
let { rootEntity } = useReplicache();
let cardBorderHidden = useCardBorderHidden(props.entityID);
let rootBackgroundImage = useEntity(
rootEntity,
"theme/card-background-image",
);
let rootBackgroundRepeat = useEntity(
rootEntity,
"theme/card-background-image-repeat",
);
let rootBackgroundOpacity = useEntity(
rootEntity,
"theme/card-background-image-opacity",
);
let cardBackgroundImage = useEntity(
props.entityID,
"theme/card-background-image",
);
let cardBackgroundImageRepeat = useEntity(
props.entityID,
"theme/card-background-image-repeat",
);
let cardBackgroundImageOpacity = useEntity(
props.entityID,
"theme/card-background-image-opacity",
);
let backgroundImage = cardBackgroundImage || rootBackgroundImage;
let backgroundImageRepeat = cardBackgroundImage
? cardBackgroundImageRepeat?.data?.value
: rootBackgroundRepeat?.data.value;
let backgroundImageOpacity = cardBackgroundImage
? cardBackgroundImageOpacity?.data.value
: rootBackgroundOpacity?.data.value || 1;
return (
<>
{!cardBorderHidden ? (
) : null}
{/* we handle page bg in this sepate div so that
we can apply an opacity the background image
without affecting the opacity of the rest of the page */}
>
);
};