"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 && }
;
}