|
import { forwardRef } from 'react'; |
|
import type { ForwardedRef } from 'react'; |
|
import { CheckIcon } from 'lucide-react'; |
|
import { DialogButton } from '~/components/ui'; |
|
import { Spinner } from '~/components/svg'; |
|
import type { TDangerButtonProps } from '~/common'; |
|
import { useLocalize } from '~/hooks'; |
|
import { cn } from '~/utils'; |
|
|
|
const DangerButton = (props: TDangerButtonProps, ref: ForwardedRef<HTMLButtonElement>) => { |
|
const { |
|
id, |
|
onClick, |
|
mutation, |
|
disabled, |
|
confirmClear, |
|
infoTextCode, |
|
actionTextCode, |
|
className = '', |
|
showText = true, |
|
dataTestIdInitial, |
|
dataTestIdConfirm, |
|
confirmActionTextCode = 'com_ui_confirm_action', |
|
} = props; |
|
const localize = useLocalize(); |
|
|
|
const renderMutation = (node: React.ReactNode | string) => { |
|
if (mutation && mutation.isLoading) { |
|
return <Spinner className="h-5 w-5" />; |
|
} |
|
return node; |
|
}; |
|
|
|
return ( |
|
<div className="flex items-center justify-between"> |
|
{showText && <div>{localize(infoTextCode)}</div>} |
|
<DialogButton |
|
id={id} |
|
ref={ref} |
|
disabled={disabled} |
|
onClick={onClick} |
|
className={cn( |
|
' btn btn-danger relative border-none bg-red-700 text-white hover:bg-red-800 dark:hover:bg-red-800', |
|
className, |
|
)} |
|
> |
|
{confirmClear ? ( |
|
<div |
|
className="flex w-full items-center justify-center gap-2" |
|
id={`${id}-text`} |
|
data-testid={dataTestIdConfirm} |
|
> |
|
{renderMutation(<CheckIcon className="h-5 w-5" />)} |
|
{mutation && mutation.isLoading ? null : localize(confirmActionTextCode)} |
|
</div> |
|
) : ( |
|
<div |
|
className="flex w-full items-center justify-center gap-2" |
|
id={`${id}-text`} |
|
data-testid={dataTestIdInitial} |
|
> |
|
{renderMutation(localize(actionTextCode))} |
|
</div> |
|
)} |
|
</DialogButton> |
|
</div> |
|
); |
|
}; |
|
|
|
export default forwardRef(DangerButton); |
|
|