import {useCallback, useEffect, useRef, useState} from 'react'; interface AdminWriteConfirmOptions { action: string; target: string; } interface PendingConfirm extends AdminWriteConfirmOptions { resolve: (confirmed: boolean) => void; } export function useAdminWriteConfirm() { const [pendingConfirm, setPendingConfirm] = useState(null); const cancelButtonRef = useRef(null); const confirmWrite = useCallback((options: AdminWriteConfirmOptions) => { return new Promise((resolve) => { setPendingConfirm((current) => { if (current) { current.resolve(false); } return {...options, resolve}; }); }); }, []); const closeConfirm = useCallback( (confirmed: boolean) => { const current = pendingConfirm; if (!current) { return; } setPendingConfirm(null); current.resolve(confirmed); }, [pendingConfirm], ); useEffect(() => { if (!pendingConfirm) { return; } cancelButtonRef.current?.focus(); const handleKeyDown = (event: KeyboardEvent) => { if (event.key === 'Escape') { event.preventDefault(); closeConfirm(false); } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [closeConfirm, pendingConfirm]); const confirmDialog = pendingConfirm ? (
{ if (event.target === event.currentTarget) { closeConfirm(false); } }} >

确认操作

{pendingConfirm.action}
操作
{pendingConfirm.action}
对象
{pendingConfirm.target}
该操作会立即影响线上数据
) : null; return { confirmWrite, confirmDialog, isConfirming: pendingConfirm !== null, }; }