import React, { useEffect, useMemo, useRef, useState } from 'react'; import { useDisclosure, Button, ModalBody, ModalFooter, type ImageProps } from '@chakra-ui/react'; import { useTranslation } from 'next-i18next'; import MyModal from '../components/common/MyModal'; import { useMemoizedFn } from 'ahooks'; export const useConfirm = (props?: { title?: string; iconSrc?: string | ''; content?: string; showCancel?: boolean; type?: 'common' | 'delete'; hideFooter?: boolean; iconColor?: ImageProps['color']; }) => { const { t } = useTranslation(); const map = useMemo(() => { const map = { common: { title: t('common:action_confirm'), variant: 'primary', iconSrc: 'common/confirm/commonTip' }, delete: { title: t('common:delete_warning'), variant: 'dangerFill', iconSrc: 'common/confirm/deleteTip' } }; if (props?.type && map[props.type]) return map[props.type]; return map.common; }, [props?.type, t]); const { title = map?.title || t('common:Warning'), iconSrc = map?.iconSrc, iconColor, content, showCancel = true, hideFooter = false } = props || {}; const [customContent, setCustomContent] = useState(content); const { isOpen, onOpen, onClose } = useDisclosure(); const confirmCb = useRef(); const cancelCb = useRef(); const openConfirm = useMemoizedFn( (confirm?: Function, cancel?: any, customContent?: string | React.ReactNode) => { confirmCb.current = confirm; cancelCb.current = cancel; customContent && setCustomContent(customContent); return onOpen; } ); const ConfirmModal = useMemoizedFn( ({ closeText = t('common:Cancel'), confirmText = t('common:Confirm'), isLoading, bg, countDown = 0 }: { closeText?: string; confirmText?: string; isLoading?: boolean; bg?: string; countDown?: number; }) => { const timer = useRef(); const [countDownAmount, setCountDownAmount] = useState(countDown); const [requesting, setRequesting] = useState(false); useEffect(() => { if (isOpen) { setCountDownAmount(countDown); timer.current = setInterval(() => { setCountDownAmount((val) => { if (val <= 0) { clearInterval(timer.current); } return val - 1; }); }, 1000); return () => { clearInterval(timer.current); }; } }, [isOpen]); return ( {customContent} {!hideFooter && ( {showCancel && ( )} )} ); } ); return { openConfirm, onClose, ConfirmModal }; };