'use client';
import { HTMLProps, useEffect, useRef } from 'react';
import { useFormStatus } from 'react-dom';
import { SpinnerColor } from './Spinner';
import { clsx } from 'clsx/lite';
import { toastSuccess } from '@/toast';
import LoaderButton from '@/admin/LoaderButton';
interface Props extends HTMLProps {
icon?: JSX.Element
styleAsLink?: boolean
spinnerColor?: SpinnerColor
onFormStatusChange?: (pending: boolean) => void
onFormSubmitToastMessage?: string
onFormSubmit?: () => void
primary?: boolean
}
export default function SubmitButtonWithStatus({
icon,
styleAsLink,
spinnerColor,
onFormStatusChange,
onFormSubmitToastMessage,
onFormSubmit,
children,
disabled,
className,
primary,
type: _type,
...buttonProps
}: Props) {
const { pending } = useFormStatus();
const pendingPrevious = useRef(pending);
useEffect(() => {
if (pending && !pendingPrevious.current) {
if (onFormSubmitToastMessage) {
toastSuccess(onFormSubmitToastMessage);
}
onFormSubmit?.();
}
pendingPrevious.current = pending;
}, [pending, onFormSubmitToastMessage, onFormSubmit]);
useEffect(() => {
onFormStatusChange?.(pending);
}, [onFormStatusChange, pending]);
return (
{children}
);
};