import { Fragment, useEffect, useState } from "react"; import { Dialog, Transition } from "@headlessui/react"; import clsx from "clsx"; import { useApp } from "../../../hooks"; export type ActionResultDto = { success?: ResultMessageDto; error?: ResultMessageDto }; type ResultMessageDto = { title?: string; description: string; closeText?: string }; interface Props { actionResult?: ActionResultDto; className?: string; actionData?: { error?: string; success?: string } | null; showSuccess?: boolean; showError?: boolean; onClosed?: () => void; } export default function ActionResultModal({ actionResult, className, actionData, showSuccess = true, showError = true, onClosed }: Props) { const { t } = useApp(); const [data, setData] = useState(); const [open, setOpen] = useState(false); const [status, setStatus] = useState(actionResult); useEffect(() => { setStatus(actionResult); }, [actionResult]); useEffect(() => { if (actionData?.error && showError) { setStatus({ error: { description: actionData.error } }); } else if (actionData?.success && showSuccess) { setStatus({ success: { description: actionData.success } }); } }, [actionData, showError, showSuccess]); useEffect(() => { if (status?.success) { setData({ title: status.success.title ?? t("shared.success"), description: status.success.description, closeText: status.success.closeText ?? t("shared.close"), }); setOpen(true); } else if (status?.error) { setData({ title: status.error.title ?? t("shared.error"), description: status.error.description, closeText: status.error.closeText ?? t("shared.close"), }); setOpen(true); } }, [status, t]); return ( setOpen(false)}>
{/* This element is to trick the browser into centering the modal contents. */}
{status?.success && (
)} {status?.error && (
)}
{t(data?.title ?? "")}

{t(data?.description ?? "")}

); }