import { useRef, useState } from "react" import { useTranslation } from "react-i18next" import { useDrag } from "@use-gesture/react" import { Trash2 } from "lucide-react" import { Button } from "@/components/ui/button" import { ConfirmDialog } from "@/components/confirm-dialog" import { hapticMedium } from "@/lib/haptics" type SwipeToDeleteProps = { onDelete: () => void confirmTitle?: string confirmDescription?: string children: React.ReactNode } export function SwipeToDelete({ onDelete, confirmTitle, confirmDescription, children, }: SwipeToDeleteProps) { const { t } = useTranslation() const [offsetX, setOffsetX] = useState(0) const [revealed, setRevealed] = useState(false) const [confirmOpen, setConfirmOpen] = useState(false) const ref = useRef(null) const bind = useDrag( ({ movement: [mx], active, event }) => { if (active) { event.stopPropagation() setOffsetX(Math.min(0, Math.max(mx, -100))) } else { if (mx < -60) { hapticMedium() setRevealed(true) setOffsetX(-80) } else { setRevealed(false) setOffsetX(0) } } }, { axis: "x", filterTaps: true }, ) function handleDeleteTap() { setConfirmOpen(true) } function handleConfirm() { setConfirmOpen(false) setOffsetX(-300) setTimeout(() => { onDelete() setRevealed(false) setOffsetX(0) }, 200) } function handleTapContent(e: React.MouseEvent) { if (revealed) { e.preventDefault() e.stopPropagation() setRevealed(false) setOffsetX(0) } } return (
{children}
) }