"use client"; import { useEffect, useRef, useState } from "react"; type ConfirmSlideModalProps = { isOpen: boolean; title: string; description?: string; confirmLabel?: string; onClose: () => void; onConfirm: () => void; }; export default function ConfirmSlideModal({ isOpen, title, description, confirmLabel = "Confirm", onClose, onConfirm }: ConfirmSlideModalProps) { const trackRef = useRef(null); const [dragX, setDragX] = useState(0); const [dragging, setDragging] = useState(false); const handleSize = 44; function handlePointerDown(event: React.PointerEvent) { event.preventDefault(); setDragging(true); (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId); } function handlePointerMove(event: React.PointerEvent) { if (!dragging) return; const track = trackRef.current; if (!track) return; const rect = track.getBoundingClientRect(); const next = Math.min(Math.max(0, event.clientX - rect.left - handleSize / 2), rect.width - handleSize); setDragX(next); } function handlePointerUp(event: React.PointerEvent) { if (!dragging) return; setDragging(false); (event.currentTarget as HTMLElement).releasePointerCapture(event.pointerId); const track = trackRef.current; if (!track) return; const threshold = (track.clientWidth - handleSize) * 0.8; if (dragX >= threshold) { setDragX(0); onConfirm(); } else { setDragX(0); } } useEffect(() => { if (!isOpen) return; function handleKeyDown(event: KeyboardEvent) { if (event.key === "Escape") onClose(); } window.addEventListener("keydown", handleKeyDown); return () => window.removeEventListener("keydown", handleKeyDown); }, [isOpen, onClose]); if (!isOpen) return null; return (
event.stopPropagation()}>
{title}
{description ?

{description}

: null}
Slide to confirm
{confirmLabel}
); }