'use client'; import { MouseEventHandler, RefObject, useState } from 'react'; import { Icon } from '@iconify/react'; import Modal from '@/components/Modal'; import Button, { ButtonProps } from '@/components/Button'; import { cn } from '@/lib/helper'; export type IconPosition = 'left' | 'center' | 'right'; export interface ConfirmationModalProps { ref: RefObject; type?: 'info' | 'success' | 'error'; text?: string; subtitleText?: string; closeOnBackdrop?: boolean; primaryButton?: ButtonProps & { text?: string; }; secondaryButton?: ButtonProps & { text?: string; }; className?: { modal?: string; modalBox?: string; }; children?: React.ReactNode; iconSize?: number; iconPosition?: IconPosition; } const iconConfig = { info: { icon: 'material-symbols:info-outline-rounded', iconClassName: 'text-info-content', innerRingClassName: 'bg-info', middleRingClassName: 'bg-info/12', outerRingClassName: 'border-info/12 bg-info/8', }, success: { icon: 'heroicons:check', iconClassName: 'text-white', innerRingClassName: 'bg-success', middleRingClassName: 'bg-success/12', outerRingClassName: 'border-success/12 bg-success/8', }, error: { icon: 'heroicons:exclamation-triangle', iconClassName: 'text-error-content', innerRingClassName: 'bg-error', middleRingClassName: 'bg-error/12', outerRingClassName: 'border-error/12 bg-error/8', }, } as const; const ConfirmationModalIcon = ({ type, size = 16, }: { type: 'info' | 'success' | 'error'; size?: number; }) => { const config = iconConfig[type]; return (
); }; const ConfirmationModal = ({ ref, type = 'info', text, subtitleText, closeOnBackdrop, primaryButton, secondaryButton, className, children, iconSize = 16, iconPosition = 'center', }: ConfirmationModalProps) => { const [isPrimaryButtonLoading, setIsPrimaryButtonLoading] = useState(false); const closeModalHandler = () => { ref.current?.close(); }; const primaryButtonClickHandler: MouseEventHandler< HTMLButtonElement > = async (event) => { setIsPrimaryButtonLoading(true); await primaryButton?.onClick?.(event); setIsPrimaryButtonLoading(false); }; return (
{iconPosition === 'center' ? ( <>

{text ?? 'Apakah anda yakin ingin melakukan hal ini?'}

{subtitleText && (

{subtitleText}

)} ) : (

{text ?? 'Apakah anda yakin ingin melakukan hal ini?'}

{subtitleText && (

{subtitleText}

)}
)} {children &&
{children}
} {(secondaryButton || primaryButton) && (
{secondaryButton && secondaryButton.text && ( )} {primaryButton && primaryButton.text && ( )}
)}
); }; export default ConfirmationModal;