| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- import { useCallback, useMemo, useState } from 'react'
- import useLatest from '../misc/useLatest'
- export interface ConfirmOnCloseModalProps {
- visible: boolean
- onClose: () => void
- onCancel: () => void
- }
- interface UseConfirmOnCloseProps {
- checkIsDirty: () => boolean
- onClose: () => void
- }
- export const useConfirmOnClose = ({ checkIsDirty, onClose }: UseConfirmOnCloseProps) => {
- const [visible, setVisible] = useState(false)
- const checkIsDirtyRef = useLatest(checkIsDirty)
- const onCloseRef = useLatest(onClose)
- const confirmOnClose = useCallback(() => {
- if (checkIsDirtyRef.current()) {
- setVisible(true)
- } else {
- onCloseRef.current()
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [])
- const handleOpenChange = useCallback(
- (open: boolean) => {
- if (!open) {
- confirmOnClose()
- }
- },
- [confirmOnClose]
- )
- const onConfirm = useCallback(() => {
- setVisible(false)
- onCloseRef.current()
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [])
- const onCancel = useCallback(() => {
- setVisible(false)
- }, [])
- const modalProps: ConfirmOnCloseModalProps = useMemo(
- () => ({
- visible,
- onClose: onConfirm,
- onCancel,
- }),
- [visible, onConfirm, onCancel]
- )
- return useMemo(
- () => ({
- confirmOnClose,
- handleOpenChange,
- modalProps,
- }),
- [confirmOnClose, handleOpenChange, modalProps]
- )
- }
|