import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@repo/shadcn-ui/components"; import { cn } from "@repo/shadcn-ui/lib/utils"; import { ArrowLeftIcon, CopyIcon, EyeIcon, MoreHorizontalIcon, RotateCcwIcon, Trash2Icon, } from "lucide-react"; import { useFormContext } from "react-hook-form"; import { CancelFormButton, CancelFormButtonProps } from "./cancel-form-button"; import { SubmitButtonProps, SubmitFormButton } from "./submit-form-button"; type Align = "start" | "center" | "end" | "between"; type GroupSubmitButtonProps = Omit; export type FormCommitButtonGroupProps = { className?: string; align?: Align; // default "end" gap?: string; // default "gap-2" reverseOrderOnMobile?: boolean; // default true (Cancel debajo en móvil) isLoading?: boolean; disabled?: boolean; preventDoubleSubmit?: boolean; // Evita múltiples submits mientras loading cancel?: CancelFormButtonProps & { show?: boolean }; submit?: GroupSubmitButtonProps; // props directas a SubmitButton onReset?: () => void; onDelete?: () => void; onPreview?: () => void; onDuplicate?: () => void; onBack?: () => void; }; const alignToJustify: Record = { start: "justify-start", center: "justify-center", end: "justify-end", between: "justify-between", }; export const FormCommitButtonGroup = ({ className, align = "end", gap = "gap-2", reverseOrderOnMobile = true, isLoading, disabled = false, preventDoubleSubmit = true, cancel, submit, onReset, onDelete, onPreview, onDuplicate, onBack, }: FormCommitButtonGroupProps) => { const showCancel = cancel?.show ?? true; const hasSecondaryActions = onReset || onPreview || onDuplicate || onBack || onDelete; // ⛳️ RHF opcional: auto-detectar isSubmitting si no se pasó isLoading let rhfIsSubmitting = false; try { const ctx = useFormContext(); rhfIsSubmitting = !!ctx?.formState?.isSubmitting; } catch { // No hay provider de RHF; ignorar } const busy = isLoading ?? rhfIsSubmitting; const computedDisabled = !!(disabled || (preventDoubleSubmit && busy)); return (
{submit && } {showCancel && } {/* Menú de acciones adicionales */} {hasSecondaryActions && ( {onReset && ( Deshacer cambios )} {onPreview && ( Vista previa )} {onDuplicate && ( Duplicar )} {onBack && ( Volver )} {onDelete && ( <> Eliminar )} )}
); };