import { Button, ButtonGroup, Field, FieldLabel, ModalBody, ModalFooter, ModalHeader, Select, TextInput, } from "@contentstack/venus-components" import React, { ChangeEvent, useEffect, useState } from "react" import { Path } from "slate" import type { IRteElementType, IRteParam, } from "@contentstack/app-sdk/dist/src/RTE/types" import FocalPointPicker from "~/shared-components/FocalPointPicker" import type { FocalPoint, InsertResponse } from "~/types/imagevault" enum DropdownValues { center = "center", left = "left", right = "right", none = "none", } type DropDownItem = { label: string value: DropdownValues type: string } const dropdownList: DropDownItem[] = [ { label: "None", value: DropdownValues.none, type: "select", }, { label: "Center", value: DropdownValues.center, type: "select", }, { label: "Left", value: DropdownValues.left, type: "select", }, { label: "Right", value: DropdownValues.right, type: "select", }, ] type ImageEditModalProps = { element: IRteElementType & { attrs: InsertResponse } rte: IRteParam closeModal: () => void path: Path } export default function ImageEditModal({ element, closeModal, path, rte, }: ImageEditModalProps) { const [alignment, setAlignment] = useState({ label: "None", value: DropdownValues.none, type: "select", }) const [altText, setAltText] = useState("") const [caption, setCaption] = useState("") const [focalPoint, setFocalPoint] = useState({ x: 50, y: 50 }) const assetUrl = element.attrs.MediaConversions[0].Url useEffect(() => { if (element.attrs.Metadata && element.attrs.Metadata.length) { const altText = element.attrs.Metadata.find((meta) => meta.Name.includes("AltText_") )?.Value const caption = element.attrs.Metadata.find((meta) => meta.Name.includes("Title_") )?.Value setAltText(altText ?? "") setCaption(caption ?? "") } }, [element.attrs.Metadata]) useEffect(() => { if (element.attrs.FocalPoint) { setFocalPoint(element.attrs.FocalPoint) } }, [element.attrs.FocalPoint]) function handleSave() { let newStyle switch (alignment.value) { case DropdownValues.center: case DropdownValues.left: case DropdownValues.right: newStyle = { textAlign: alignment.value, maxWidth: element.attrs.width ? `${element.attrs.width}px` : undefined, } break case DropdownValues.none: default: newStyle = {} break } const metaData = element.attrs.Metadata ?? [] const newMetadata = metaData.map((meta) => { if (meta.Name.includes("AltText_")) { return { ...meta, Value: altText } } if (meta.Name.includes("Title_")) { return { ...meta, Value: caption } } return meta }) rte._adv.Transforms?.setNodes( rte._adv.editor, { attrs: { ...element.attrs, Metadata: newMetadata, position: alignment.value, style: { ...element.attrs.style, ...newStyle }, FocalPoint: focalPoint, }, }, { at: path } ) closeModal() } function changeFocalPoint(focalPoint: FocalPoint) { setFocalPoint(focalPoint) } return ( <>
{/* @ts-expect-error: Type incompatibility with Venus components */}