"use client"; import { BlockProps, ListMarker, Block, BlockLayout } from "./Block"; import { focusBlock } from "src/utils/focusBlock"; import { focusPage } from "src/utils/focusPage"; import { useEntity, useReplicache } from "src/replicache"; import { useUIState } from "src/useUIState"; import { RenderedTextBlock } from "components/Blocks/TextBlock"; import { usePageMetadata } from "src/hooks/queries/usePageMetadata"; import { CSSProperties, useEffect, useRef, useState } from "react"; import { useBlocks } from "src/hooks/queries/useBlocks"; import { Canvas, CanvasBackground, CanvasContent } from "components/Canvas"; import { CardThemeProvider } from "components/ThemeManager/ThemeProvider"; import { useCardBorderHidden } from "components/Pages/useCardBorderHidden"; export function PageLinkBlock( props: BlockProps & { preview?: boolean; areYouSure?: boolean; setAreYouSure?: (value: boolean) => void; }, ) { let page = useEntity(props.entityID, "block/card"); let type = useEntity(page?.data.value || null, "page/type")?.data.value || "doc"; let { rep } = useReplicache(); let isSelected = useUIState((s) => s.selectedBlocks.find((b) => b.value === props.entityID), ); let isOpen = useUIState((s) => s.openPages).includes(page?.data.value || ""); if (!page) return
An error occured, there should be a page linked here!
; return (
{ if (!page) return; if (e.isDefaultPrevented()) return; if (e.shiftKey) return; e.preventDefault(); e.stopPropagation(); useUIState.getState().openPage(props.parent, page.data.value); if (rep) focusPage(page.data.value, rep); }} > {type === "canvas" && page ? ( ) : ( )}
); } export function DocLinkBlock(props: BlockProps & { preview?: boolean }) { let { rep } = useReplicache(); let page = useEntity(props.entityID, "block/card"); let pageEntity = page ? page.data.value : props.entityID; let leafletMetadata = usePageMetadata(pageEntity); return (
<>
{ if (e.isDefaultPrevented()) return; if (e.shiftKey) return; e.preventDefault(); e.stopPropagation(); useUIState.getState().openPage(props.parent, pageEntity); if (rep) focusPage(pageEntity, rep); }} >
{leafletMetadata[0] && (
{leafletMetadata[0].listData && ( )}
)} {leafletMetadata[1] && (
{leafletMetadata[1].listData && ( )}
)} {leafletMetadata[2] && (
{leafletMetadata[2].listData && ( )}
)}
{!props.preview && }
); } export function PagePreview(props: { entityID: string }) { let blocks = useBlocks(props.entityID); let previewRef = useRef(null); 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; let pageWidth = `var(--page-width-unitless)`; return (
{!cardBorderHidden && (
)} {blocks.slice(0, 20).map((b, index, arr) => { return ( ); })}
); } const CanvasLinkBlock = (props: { entityID: string; preview?: boolean }) => { let pageWidth = `var(--page-width-unitless)`; return (
{props.preview ? ( ) : ( )}
); }; export function BlockPreview( b: BlockProps & { previewRef: React.RefObject; }, ) { let ref = useRef(null); let [isVisible, setIsVisible] = useState(true); useEffect(() => { if (!ref.current) return; let observer = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { setIsVisible(true); } else { setIsVisible(false); } }); }, { threshold: 0.01, root: b.previewRef.current }, ); observer.observe(ref.current); return () => observer.disconnect(); }, [b.previewRef]); return
{isVisible && }
; }