import React, { MouseEvent, useEffect, useState } from "react"; import copyToClipboard from "../../lib/copyToClipboard"; import useToastStore from "../../stores/useToastStore"; import * as Drag from "../../types/Drag"; import * as Images from "../../types/Images"; import { Locale } from "../../types"; import { useDraggable } from "../drag"; import EditableImage from "../EditableImage"; import Placeholder from "./Placeholder"; interface Props { draggable: Drag.Draggable; attributeName: string; locale: string; locales: { [index: string]: Locale }; placeholder: boolean; enablePrimary: boolean; showEmbed: boolean; primary: boolean; position: number; deleteImage: () => void; startDrag: ( evt: MouseEvent, draggable: Drag.Draggable ) => void; onUpdate: (newImage: Images.Resource, src: string) => void; } export default function GridImage(props: Props) { const { attributeName, draggable } = props; const record = draggable.record; const image = record.image; const notice = useToastStore((state) => state.notice); const [src, setSrc] = useState(record.src || null); const dragAttrs = useDraggable(draggable, props.startDrag); useEffect(() => { if ("file" in record && record.file) { const reader = new FileReader(); reader.onload = () => setSrc(reader.result as string); reader.readAsDataURL(record.file); } }, []); const copyEmbed = (evt: MouseEvent) => { evt.preventDefault(); copyToClipboard(`[image:${image.id}]`); notice("Embed code copied to clipboard"); }; const deleteImage = (evt: MouseEvent) => { evt.preventDefault(); if (props.deleteImage) { props.deleteImage(); } }; const classes = ["grid-image"]; if (props.placeholder) { classes.push("placeholder"); } if ("file" in record) { classes.push("uploading"); } return (
{props.enablePrimary && ( )} {!image && } {image && ( <>
{props.showEmbed && } {props.deleteImage && }
)}
); }