// Lightweight two-click confirm for a destructive-but-recoverable button // ("mark all read", "mark done") — deliberately NOT the old modal system // (@hive/shared/modal.js's `themedConfirm`, itself built on the // shadow-DOM `` custom element): a full backdrop+dialog is // more machinery than a "did you mean to click that" nudge needs, and // mara's ask for this rewrite was real Preact components, not a port of // the old widget family. First click arms the button (caller renders a // distinct "sure? click again" label off `armed`); a second click within // `resetMs` fires `onConfirm`; anything else (timeout, blur) disarms. import { useEffect, useRef, useState } from 'preact/hooks'; export function useConfirmClick(onConfirm: () => void, resetMs = 2500) { const [armed, setArmed] = useState(false); const timerRef = useRef | null>(null); useEffect( () => () => { if (timerRef.current) clearTimeout(timerRef.current); }, [], ); function trigger() { if (armed) { if (timerRef.current) clearTimeout(timerRef.current); setArmed(false); onConfirm(); return; } setArmed(true); timerRef.current = setTimeout(() => setArmed(false), resetMs); } return { armed, trigger }; }