import { useCallback, useState } from "react"; import type { ComponentPropsWithoutRef, ReactNode } from "react"; import type { ButtonProps, GroupProps } from "@mantine/core"; import { Box, Button, Group } from "@mantine/core"; import type { stringOrTranslation, TranslationFunction } from "@homarr/translation"; import { translateIfNecessary } from "@homarr/translation"; import { useI18n } from "@homarr/translation/client"; import { createModal } from "./creator"; type MaybePromise = T | Promise; export interface ConfirmModalProps { title: string; children: ReactNode; onConfirm?: () => MaybePromise; onCancel?: () => MaybePromise; closeOnConfirm?: boolean; closeOnCancel?: boolean; cancelProps?: ButtonProps & ComponentPropsWithoutRef<"button">; confirmProps?: ButtonProps & ComponentPropsWithoutRef<"button">; groupProps?: GroupProps; labels?: { confirm?: stringOrTranslation; cancel?: stringOrTranslation; }; } export const ConfirmModal = createModal>(({ actions, innerProps }) => { const [loading, setLoading] = useState(false); const t = useI18n(); const { children, onConfirm, onCancel, cancelProps, confirmProps, groupProps, labels } = innerProps; const closeOnConfirm = innerProps.closeOnConfirm ?? true; const closeOnCancel = innerProps.closeOnCancel ?? true; const cancelLabel = labels?.cancel ?? ((t: TranslationFunction) => t("common.action.cancel")); const confirmLabel = labels?.confirm ?? ((t: TranslationFunction) => t("common.action.confirm")); const handleCancel = useCallback( async (event: React.MouseEvent) => { if (typeof cancelProps?.onClick === "function") { cancelProps.onClick(event); } if (typeof onCancel === "function") { await onCancel(); } if (closeOnCancel) { actions.closeModal(); } }, [cancelProps, onCancel, closeOnCancel, actions], ); const handleConfirm = useCallback( async (event: React.MouseEvent) => { setLoading(true); if (typeof confirmProps?.onClick === "function") { confirmProps.onClick(event); } if (typeof onConfirm === "function") { await onConfirm(); } if (closeOnConfirm) { actions.closeModal(); } setLoading(false); }, [confirmProps, onConfirm, closeOnConfirm, actions], ); return ( <> {children && {children}} ); }).withOptions({});