import { Button, Group, Stack, Text, TextInput } from "@mantine/core"; import { clientApi } from "@homarr/api/client"; import type { MaybePromise } from "@homarr/common/types"; import { useZodForm } from "@homarr/form"; import { showErrorNotification, showSuccessNotification } from "@homarr/notifications"; import { useI18n } from "@homarr/translation/client"; import { boardDuplicateSchema } from "@homarr/validation/board"; import { createModal } from "../../../modals/src/creator"; import { useBoardNameStatus } from "./add-board-modal"; interface InnerProps { board: { id: string; name: string; }; onSuccess: () => MaybePromise; } export const DuplicateBoardModal = createModal(({ actions, innerProps }) => { const t = useI18n(); const form = useZodForm(boardDuplicateSchema.omit({ id: true }), { mode: "controlled", initialValues: { name: innerProps.board.name, }, }); const boardNameStatus = useBoardNameStatus(form.values.name); const { mutateAsync, isPending } = clientApi.board.duplicateBoard.useMutation(); return (
{ // Prevent submit before name availability check if (!boardNameStatus.canSubmit) return; await mutateAsync( { ...values, id: innerProps.board.id, }, { async onSuccess() { actions.closeModal(); showSuccessNotification({ title: t("board.action.duplicate.notification.success.title"), message: t("board.action.duplicate.notification.success.message"), }); await innerProps.onSuccess(); }, onError() { showErrorNotification({ title: t("board.action.duplicate.notification.error.title"), message: t("board.action.duplicate.notification.error.message"), }); }, }, ); })} > {t("board.action.duplicate.message", { name: innerProps.board.name })} {boardNameStatus.description.icon ? : null} {boardNameStatus.description.label} ) : null } withAsterisk />
); }).withOptions({ defaultTitle(t) { return t("board.action.duplicate.title"); }, });