import { Suspense, lazy, useEffect, useState } from "react"; import { useScript } from "usehooks-ts"; import useApp from "~/hooks/useApp"; import Disclaimer from "~/components/Disclaimer"; import InvalidConfig from "~/components/InvalidConfig"; import { isImageVaultDAMConfig } from "~/utils/imagevault"; import type { InsertResponse } from "~/types/imagevault"; const ImageVaultDAM = lazy(() => import("~/components/ImageVaultDAM")); export default function Field() { const { sdk, config } = useApp(); const ivStatus = useScript( "/scripts/imagevault-insert-media/insertmediawindow.min.js" ); const [showDisclaimer, setShowDisclaimer] = useState(false); const [fieldData, setFieldData] = useState(); const entry = sdk?.location.CustomField?.entry; const field = sdk?.location.CustomField?.field; useEffect(() => { // If we can get field data from the SDK that means the entry has been // saved at least once. If this is true, we are guaranteed entry UID. // Entry that has not been saved does not have a entry UID and therefore // cannot be referred to by ImageVault. Entry title is also required by us. try { if (field && entry) { const data = field.getData(); const title = entry.getField("title").getData().toString(); if (data && title) { setFieldData(data as InsertResponse); } else { throw new Error("Missing data or title for entry"); } } } catch (e) { setShowDisclaimer(true); } }, [entry, field]); if (showDisclaimer) { return ; } const loaded = !!(fieldData && ivStatus === "ready" && sdk && config); const initialData = fieldData && Object.keys(fieldData).length > 0 ? fieldData : null; if (!loaded) { return

Loading dependecies...

; } return (
{isImageVaultDAMConfig(config) ? ( Loading field...

}>
) : ( )}
); }