| import React, { useState, useCallback } from 'react'; |
|
|
| export interface ConfirmModalInfo { |
| isOpen: boolean; |
| title: string; |
| message: string | React.ReactNode; |
| onConfirmAction: () => void; |
| isDestructive?: boolean; |
| confirmText?: string; |
| cancelText?: string; |
| } |
|
|
| const initialConfirmModalState: ConfirmModalInfo = { |
| isOpen: false, |
| title: '', |
| message: '', |
| onConfirmAction: () => {}, |
| isDestructive: false, |
| confirmText: 'Confirm', |
| cancelText: 'Cancel', |
| }; |
|
|
| export interface ConfirmModalHook { |
| confirmModalInfo: ConfirmModalInfo; |
| requestConfirmation: ( |
| title: string, |
| message: string | React.ReactNode, |
| onConfirm: () => void, |
| options?: { |
| isDestructive?: boolean; |
| confirmText?: string; |
| cancelText?: string; |
| } |
| ) => void; |
| closeConfirmModal: () => void; |
| } |
|
|
| export const useConfirmModal = (): ConfirmModalHook => { |
| const [confirmModalInfo, setConfirmModalInfo] = useState<ConfirmModalInfo>(initialConfirmModalState); |
|
|
| const requestConfirmation = useCallback( |
| ( |
| title: string, |
| message: string | React.ReactNode, |
| onConfirm: () => void, |
| options: { |
| isDestructive?: boolean; |
| confirmText?: string; |
| cancelText?: string; |
| } = {} |
| ) => { |
| setConfirmModalInfo({ |
| isOpen: true, |
| title, |
| message, |
| onConfirmAction: () => { |
| onConfirm(); |
| setConfirmModalInfo(prev => ({ ...prev, isOpen: false })); |
| }, |
| isDestructive: options.isDestructive ?? false, |
| confirmText: options.confirmText ?? 'Confirm', |
| cancelText: options.cancelText ?? 'Cancel', |
| }); |
| }, |
| [] |
| ); |
|
|
| const closeConfirmModal = useCallback(() => { |
| setConfirmModalInfo(prev => ({ ...prev, isOpen: false })); |
| }, []); |
|
|
| return { confirmModalInfo, requestConfirmation, closeConfirmModal }; |
| }; |
|
|