"use client";
import { useEntity, useReplicache } from "src/replicache";
import { BlockProps, BlockLayout } from "./Block";
import { useUIState } from "src/useUIState";
import Image from "next/image";
import { v7 } from "uuid";
import { useEntitySetContext } from "components/EntitySetProvider";
import { generateKeyBetween } from "fractional-indexing";
import { addImage, localImages } from "src/utils/addImage";
import { elementId } from "src/utils/elementId";
import { createContext, useContext, useEffect, useState } from "react";
import { BlockImageSmall } from "components/Icons/BlockImageSmall";
import { Popover } from "components/Popover";
import { theme } from "tailwind.config";
import { EditTiny } from "components/Icons/EditTiny";
import { AsyncValueAutosizeTextarea } from "components/utils/AutosizeTextarea";
import { set } from "colorjs.io/fn";
import { ImageAltSmall } from "components/Icons/ImageAlt";
import { useLeafletPublicationData } from "components/PageSWRDataProvider";
import { useSubscribe } from "src/replicache/useSubscribe";
import {
ImageCoverImage,
ImageCoverImageRemove,
} from "components/Icons/ImageCoverImage";
import {
ButtonPrimary,
ButtonSecondary,
ButtonTertiary,
} from "components/Buttons";
import { CheckTiny } from "components/Icons/CheckTiny";
export function ImageBlock(props: BlockProps & { preview?: boolean }) {
let { rep } = useReplicache();
let image = useEntity(props.value, "block/image");
let entity_set = useEntitySetContext();
let isSelected = useUIState((s) =>
s.selectedBlocks.find((b) => b.value === props.value),
);
let isFullBleed = useEntity(props.value, "image/full-bleed")?.data.value;
let isFirst = props.previousBlock === null;
let isLast = props.nextBlock === null;
let altText = useEntity(props.value, "image/alt")?.data.value;
let nextIsFullBleed = useEntity(
props.nextBlock && props.nextBlock.value,
"image/full-bleed",
)?.data.value;
let prevIsFullBleed = useEntity(
props.previousBlock && props.previousBlock.value,
"image/full-bleed",
)?.data.value;
useEffect(() => {
if (props.preview) return;
let input = document.getElementById(elementId.block(props.entityID).input);
if (isSelected) {
input?.focus();
} else {
input?.blur();
}
}, [isSelected, props.preview, props.entityID]);
const handleImageUpload = async (file: File) => {
if (!rep) return;
let entity = props.entityID;
if (!entity) {
entity = v7();
await rep?.mutate.addBlock({
parent: props.parent,
factID: v7(),
permission_set: entity_set.set,
type: "text",
position: generateKeyBetween(props.position, props.nextPosition),
newEntityID: entity,
});
}
await rep.mutate.assertFact({
entity,
attribute: "block/type",
data: { type: "block-type-union", value: "image" },
});
await addImage(file, rep, {
entityID: entity,
attribute: "block/image",
});
};
if (!image) {
if (!entity_set.permissions.write) return null;
return (
) : (