import { BlockProps, BlockLayout } from "../Block";
import { useEntity, useReplicache } from "src/replicache";
import { useUIState } from "src/useUIState";
import { Popover } from "components/Popover";
import { Toggle } from "components/Toggle";
import { SettingsTriggerButton } from "../SettingsTriggerButton";
import {
StandardSitePostItem,
WithStandardSitePostPublicationTheme,
type StandardSitePostSize,
} from "./StandardSitePostItem";
import { useStandardSitePost } from "components/StandardSitePostDataProvider";
import { useLeafletPublicationData } from "components/PageSWRDataProvider";
export const StandardSitePostBlock = (
props: BlockProps & { preview?: boolean },
) => {
let isSelected = useUIState((s) =>
s.selectedBlocks.find((b) => b.value === props.entityID),
);
let uri = useEntity(props.entityID, "block/standard-site-post")?.data.value;
let sizeFact = useEntity(props.entityID, "standard-site-post/size");
let size: StandardSitePostSize = sizeFact?.data.value ?? "medium";
let showPubThemeFact = useEntity(
props.entityID,
"standard-site-post/show-publication-theme",
);
let showPubTheme = showPubThemeFact?.data.value !== false;
let editorPub = useLeafletPublicationData();
let currentPublicationUri = editorPub.data?.publications?.uri ?? null;
let { data: post } = useStandardSitePost(uri);
if (!uri) return null;
if (!post)
return (
);
return (
}
>
);
};
function StandardSitePostSettingsButton(props: { entityID: string }) {
let { rep } = useReplicache();
let sizeFact = useEntity(props.entityID, "standard-site-post/size");
let size: StandardSitePostSize = sizeFact?.data.value ?? "medium";
let showPubThemeFact = useEntity(
props.entityID,
"standard-site-post/show-publication-theme",
);
let showPubTheme = showPubThemeFact?.data.value !== false;
let popoverKey = `${props.entityID}-settings`;
let setOpenPopover = useUIState((s) => s.setOpenPopover);
let isOpen = useUIState((s) => s.openPopover === popoverKey);
return (
setOpenPopover(o ? popoverKey : null)}
onOpenAutoFocus={(e) => e.preventDefault()}
trigger={
}
>
Post Size
{(
[
{ value: "small", Icon: SmallIcon },
{ value: "medium", Icon: MedIcon },
{ value: "large", Icon: LargeIcon },
] as {
value: StandardSitePostSize;
Icon: (props: { selected: boolean }) => React.ReactNode;
}[]
).map((option) => {
let selected =
size === option.value ||
(option.value === "medium" &&
size !== "small" &&
size !== "large");
return (
);
})}
{
if (!rep) return;
rep.mutate.assertFact({
entity: props.entityID,
attribute: "standard-site-post/show-publication-theme",
data: { type: "boolean", value: !showPubTheme },
});
}}
>
Use Publication Theme
);
}
function PlaceholderText(size: "sm" | "md" | "lg", width?: string) {
return (
);
}
const SmallIcon = ({ selected }: { selected: boolean }) => {
return (
{PlaceholderText("lg")}
{PlaceholderText("sm", "60%")}
);
};
const MedIcon = ({ selected }: { selected: boolean }) => {
return (
{PlaceholderText("lg")}
{PlaceholderText("md")}
{PlaceholderText("md", "80%")}
{PlaceholderText("sm", "60%")}
);
};
const LargeIcon = ({ selected }: { selected: boolean }) => {
return (
{PlaceholderText("lg")}
{PlaceholderText("md")}
{PlaceholderText("md", "80%")}
{PlaceholderText("sm", "60%")}
);
};