import { useUIState } from "src/useUIState"; import { BlockProps } from "./Block"; import { useMemo } from "react"; import { focusElement, AsyncValueInput } from "components/Input"; import { useEntitySetContext } from "components/EntitySetProvider"; import { useEntity, useReplicache } from "src/replicache"; import { v7 } from "uuid"; import { elementId } from "src/utils/elementId"; import { CloseTiny } from "components/Icons/CloseTiny"; import { useLeafletPublicationData } from "components/PageSWRDataProvider"; import { PubLeafletBlocksPoll, PubLeafletDocument, PubLeafletPagesLinearDocument, } from "lexicons/api"; import { ids } from "lexicons/api/lexicons"; /** * PublicationPollBlock is used for editing polls in publication documents. * It allows adding/editing options when the poll hasn't been published yet, * but disables adding new options once the poll record exists (indicated by pollUri). */ export const PublicationPollBlock = (props: BlockProps) => { let { data: publicationData } = useLeafletPublicationData(); let isSelected = useUIState((s) => s.selectedBlocks.find((b) => b.value === props.entityID), ); // Check if this poll has been published in a publication document const isPublished = useMemo(() => { if (!publicationData?.documents?.data) return false; const docRecord = publicationData.documents .data as PubLeafletDocument.Record; // Search through all pages and blocks to find if this poll entity has been published for (const page of docRecord.pages || []) { if (page.$type === "pub.leaflet.pages.linearDocument") { const linearPage = page as PubLeafletPagesLinearDocument.Main; for (const blockWrapper of linearPage.blocks || []) { if (blockWrapper.block?.$type === ids.PubLeafletBlocksPoll) { const pollBlock = blockWrapper.block as PubLeafletBlocksPoll.Main; // Check if this poll's rkey matches our entity ID const rkey = pollBlock.pollRef.uri.split("/").pop(); if (rkey === props.entityID) { return true; } } } } } return false; }, [publicationData, props.entityID]); return (