diff --git a/remix/app/components/ImageEditModal.tsx b/remix/app/components/ImageEditModal.tsx index 654addd..9c404f1 100644 --- a/remix/app/components/ImageEditModal.tsx +++ b/remix/app/components/ImageEditModal.tsx @@ -11,11 +11,11 @@ import { import { ChangeEvent, useEffect, useState } from "react" import FocalPointPicker from "~/shared-components/FocalPointPicker" -import type { FocalPoint, InsertResponse } from "~/types/imagevault" +import type { FocalPoint, ImageVaultAsset } from "~/types/imagevault" type ImageEditModalProps = { - fieldData: InsertResponse - setData: (data: InsertResponse) => void + fieldData: ImageVaultAsset + setData: (data: ImageVaultAsset) => void closeModal: () => void } @@ -28,47 +28,33 @@ export default function ImageEditModal({ const [caption, setCaption] = useState("") const [focalPoint, setFocalPoint] = useState({ x: 50, y: 50 }) - const assetUrl = fieldData.MediaConversions[0].Url + const assetUrl = fieldData.url useEffect(() => { - if (fieldData.Metadata && fieldData.Metadata.length) { - const altText = fieldData.Metadata.find((meta) => - meta.Name.includes("AltText_") - )?.Value - - const caption = fieldData.Metadata.find((meta) => - meta.Name.includes("Title_") - )?.Value - - setAltText(altText ?? "") - setCaption(caption ?? "") + if (fieldData.meta.alt) { + setAltText(fieldData.meta.alt) } - }, [fieldData.Metadata]) + if (fieldData.meta.caption) { + setCaption(fieldData.meta.caption) + } + }, [fieldData.meta]) useEffect(() => { - if (fieldData.FocalPoint) { - setFocalPoint(fieldData.FocalPoint) + if (fieldData.focalPoint) { + setFocalPoint(fieldData.focalPoint) } - }, [fieldData.FocalPoint]) + }, [fieldData.focalPoint]) function handleSave() { - const metaData = fieldData.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 - }) - - setData({ + const newData = { ...fieldData, - Metadata: newMetadata, - FocalPoint: focalPoint, - }) + meta: { + alt: altText, + caption, + }, + focalPoint, + } + setData(newData) closeModal() } @@ -132,7 +118,11 @@ export default function ImageEditModal({ Imagevault Id - + diff --git a/remix/app/components/ImageVaultDAM.tsx b/remix/app/components/ImageVaultDAM.tsx index 9cf72d0..196264c 100644 --- a/remix/app/components/ImageVaultDAM.tsx +++ b/remix/app/components/ImageVaultDAM.tsx @@ -7,12 +7,16 @@ import { FieldLabel, cbModal, } from "@contentstack/venus-components" -import { isInsertResponse, openImageVault } from "~/utils/imagevault" +import { + getImageVaultAssetFromData, + isInsertResponse, + openImageVault, +} from "~/utils/imagevault" import ImageEditModal from "./ImageEditModal" import type UiLocation from "@contentstack/app-sdk/dist/src/uiLocation" import type { CbModalProps } from "@contentstack/venus-components/build/components/Modal/Modal" -import type { InsertResponse } from "~/types/imagevault" +import type { ImageVaultAsset, InsertResponse } from "~/types/imagevault" import type { Lang } from "~/types/lang" import type { EntryDataPublishDetails, @@ -23,7 +27,7 @@ import FullSizeImage from "./FullSizeImage" export type ImageVaultDAMProps = { sdk: UiLocation config: ImageVaultDAMConfig - initialData: InsertResponse | null + initialData: ImageVaultAsset | InsertResponse | null } type DAMButtonProps = { onClick: () => void } @@ -47,30 +51,26 @@ function DAMButton({ onClick }: DAMButtonProps) { } type MediaProps = { - media: InsertResponse + media: ImageVaultAsset onDelete: () => void onEdit: () => void } function Media({ media, onDelete, onEdit }: MediaProps) { - // MediaConversions is an array but will only contain one object - const { Url, Height, FormatHeight, Width, FormatWidth, Name, AspectRatio } = - media.MediaConversions[0] + const { url, meta, dimensions } = media + const { width, height, aspectRatio } = dimensions + const assetUrl = media.url + const assetTitle = `Id: ${media.imageVaultId} - ${media.fileName}` - const assetUrl = Url - const title = `Id: ${media.Id} - ${media.Name}` - const width = FormatWidth || Width - const height = FormatHeight || Height - const alt = - media.Metadata?.find((meta) => meta.Name.includes("AltText_"))?.Value || - Name + const alt = meta.alt || meta.caption || "" + const title = meta.caption || meta.alt || "" return ( -
+
) }, @@ -117,7 +117,8 @@ export default function ImageVaultDAM({ config, initialData, }: ImageVaultDAMProps) { - const [media, setMedia] = useState(initialData) + const imageVaultAsset = getImageVaultAssetFromData(initialData) + const [media, setMedia] = useState(imageVaultAsset) const field = sdk.location.CustomField?.field const frame = sdk.location.CustomField?.frame @@ -133,12 +134,10 @@ export default function ImageVaultDAM({ }, [frame]) const handleMedia = useCallback( - (result?: InsertResponse) => { + (asset?: ImageVaultAsset) => { if (field) { flushSync(() => { - const data = result - ? { ...result, FocalPoint: result.FocalPoint || { x: 50, y: 50 } } - : null + const data = asset || null setMedia(data) field.setData(data) document.body.style.overflow = "hidden" @@ -150,13 +149,9 @@ export default function ImageVaultDAM({ [field, updateFrameHeight] ) - useEffect(() => { - updateFrameHeight() - }, [updateFrameHeight]) - const handleEdit = useCallback(() => { - const fieldData = field?.getData() as InsertResponse - if (isInsertResponse(fieldData)) { + const fieldData = field?.getData() + if (fieldData) { cbModal({ // @ts-expect-error: Component is badly typed component: (compProps) => ( @@ -177,6 +172,18 @@ export default function ImageVaultDAM({ } }, [field, handleMedia]) + useEffect(() => { + updateFrameHeight() + }, [updateFrameHeight]) + + // The existing data might still be in InsertResponse format if the user has not edited it yet. + // We'll convert it to ImageVaultAsset when the user edits the the emtry. + useEffect(() => { + if (isInsertResponse(initialData) && imageVaultAsset) { + handleMedia(imageVaultAsset) + } + }, [initialData, imageVaultAsset, handleMedia]) + if (!field || !frame || !entry || !stack) { return

Initializing custom field...

} diff --git a/rte/components/ImageEditModal.tsx b/rte/components/ImageEditModal.tsx index 38b62a7..05ede35 100644 --- a/rte/components/ImageEditModal.tsx +++ b/rte/components/ImageEditModal.tsx @@ -1,154 +1,65 @@ import { Button, ButtonGroup, - Field, + Field as FieldComponent, 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 type { IRteElementType } 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", - }, -] +import type { FocalPoint, ImageVaultAsset } from "~/types/imagevault" type ImageEditModalProps = { element: IRteElementType & { - attrs: InsertResponse + attrs: ImageVaultAsset } - rte: IRteParam + setData: (data: ImageVaultAsset) => void closeModal: () => void - path: Path } export default function ImageEditModal({ element, + setData, closeModal, - path, - rte, }: ImageEditModalProps) { - const [alignment, setAlignment] = useState({ - label: "None", - value: DropdownValues.none, - type: "select", - }) + const imageVaultAsset: ImageVaultAsset = element.attrs const [altText, setAltText] = useState("") const [caption, setCaption] = useState("") const [focalPoint, setFocalPoint] = useState({ x: 50, y: 50 }) - const assetUrl = element.attrs.MediaConversions[0].Url + const assetUrl = imageVaultAsset.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 ?? "") + if (imageVaultAsset.meta.alt) { + setAltText(imageVaultAsset.meta.alt) } - }, [element.attrs.Metadata]) + if (imageVaultAsset.meta.caption) { + setCaption(imageVaultAsset.meta.caption) + } + }, [imageVaultAsset.meta]) useEffect(() => { - if (element.attrs.FocalPoint) { - setFocalPoint(element.attrs.FocalPoint) + if (imageVaultAsset.focalPoint) { + setFocalPoint(imageVaultAsset.focalPoint) } - }, [element.attrs.FocalPoint]) + }, [imageVaultAsset.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, - }, + const newData = { + ...imageVaultAsset, + meta: { + alt: altText, + caption, }, - { at: path } - ) - + focalPoint, + } + setData(newData) closeModal() } @@ -177,18 +88,7 @@ export default function ImageEditModal({ onChange={changeFocalPoint} />
- - {/* @ts-expect-error: Type incompatibility with Venus components */} -