import React, { forwardRef, Ref, useCallback, useEffect, useState } from "react"; import { Box, ButtonBase, Dialog, FormHelperText, Grid2 as Grid, Stack, Typography, Zoom, } from "@mui/material"; import { useCardContext } from "../../contexts/CardContext"; import { useI18n } from "../../contexts/I18nContext"; import { CardFieldBaseProps } from "./shared"; export interface ImageDisplayProps { src: string; alt: string; } export const ImageDisplay: React.FC = ({ src, alt }) => { const [openLightbox, setOpenLightbox] = useState(false); const Transition = forwardRef(function Transition( props: { children: React.ReactElement }, ref: Ref, ) { return ; }); return ( <> setOpenLightbox((open) => !open)} > {openLightbox && ( setOpenLightbox(false)} > setOpenLightbox(false)} /> )} ); }; export interface CardFieldImageProps extends Omit, React.PropsWithChildren { type: "image"; value?: string; } export const CardFieldImage: React.FC> = ({ fallback, label, formName, value: defaultValue, required = false, isDisabled = false, size = "grow", isReadable = true, helperText, }) => { const { isCompact, isEditing } = useCardContext(); const { t } = useI18n(); const [selectedFile, setSelectedFile] = useState(); const [preview, setPreview] = useState(); useEffect(() => { if (selectedFile == null) { setPreview(undefined); return; } const objectUrl = URL.createObjectURL(selectedFile); setPreview(objectUrl); return () => URL.revokeObjectURL(objectUrl); }, [selectedFile]); const handleFileChange = useCallback( ({ target: { files } }: React.ChangeEvent) => { if (!files || files.length === 0) { setSelectedFile(undefined); return; } if (files.length === 1) { setSelectedFile(files[0]); } else { console.error("[CARD_FIELD_IMAGE]", t("Multiple files selected, this is not supported.")); setSelectedFile(undefined); } }, [setSelectedFile, t], ); return ( {isEditing ? ( {label} {preview && } {helperText != null && {helperText}} ) : ( isReadable && ( {label} {typeof defaultValue === "string" ? ( ) : ( {fallback ?? t("No image available")} )} ) )} ); }; export default CardFieldImage;