|
|
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 }; |
|
|
}; |
|
|
|