"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 "src/utils/focusPage"; import { PageOptions } from "./PageOptions"; import { CardThemeProvider } from "components/ThemeManager/ThemeProvider"; import { useDrawerOpen } from "app/lish/[did]/[publication]/[rkey]/Interactions/InteractionDrawer"; import { usePreserveScroll } from "src/hooks/usePreserveScroll"; import { usePageFootnotes } from "components/Footnotes/usePageFootnotes"; import { FootnoteContext } from "components/Footnotes/FootnoteContext"; import { FootnoteSection } from "components/Footnotes/FootnoteSection"; import { FootnoteSideColumn } from "components/Footnotes/FootnoteSideColumn"; import { FootnotePopover } from "components/Footnotes/FootnotePopover"; 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 drawerOpen = useDrawerOpen(props.entityID); let footnoteData = usePageFootnotes(props.entityID); let isRightmostPage = useUIState((s) => { let pages = s.openPages; if (pages.length === 0) return true; return pages[pages.length - 1] === props.entityID; }); let sideColumnVisible = pageType === "doc" && !drawerOpen && isRightmostPage; return ( { if (e.defaultPrevented) return; if (rep) { if (isFocused) return; focusPage(props.entityID, rep); } }} id={elementId.page(props.entityID).container} drawerOpen={!!drawerOpen} isFocused={isFocused} fullPageScroll={props.fullPageScroll} pageType={pageType} pageOptions={ } footnoteSideColumn={ } > {props.first && pageType === "doc" && ( <> )} ); } export const PageWrapper = (props: { id: string; children: React.ReactNode; pageOptions?: React.ReactNode; footnoteSideColumn?: React.ReactNode; fullPageScroll: boolean; isFocused?: boolean; onClickAction?: (e: React.MouseEvent) => void; pageType: "canvas" | "doc"; drawerOpen: boolean | undefined; fixedWidth?: boolean; }) => { const cardBorderHidden = useCardBorderHidden(); let { ref } = usePreserveScroll(props.id); 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} {props.footnoteSideColumn}
); }; 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 */} ); };