import { useDrag } from "@use-gesture/react"; import { X } from "lucide-react"; import { useCallback, useEffect, useRef, useState } from "react"; import { useTranslation } from "@/contexts/i18n-context"; import { useFocusTrap } from "@/hooks/use-focus-trap"; interface BottomSheetProps { open: boolean; onClose: () => void; title?: string; children: React.ReactNode; maxHeight?: string; } export function BottomSheet({ open, onClose, title, children, maxHeight = "70dvh", }: BottomSheetProps) { const { t } = useTranslation(); const sheetRef = useRef(null); useFocusTrap(sheetRef, open); const [translateY, setTranslateY] = useState(0); // Close on Escape key useEffect(() => { if (!open) return; const handler = (e: KeyboardEvent) => { if (e.key === "Escape") onClose(); }; window.addEventListener("keydown", handler); return () => window.removeEventListener("keydown", handler); }, [open, onClose]); // Reset translation when opened useEffect(() => { if (open) setTranslateY(0); }, [open]); const handleDismiss = useCallback(() => { setTranslateY(0); onClose(); }, [onClose]); const bind = useDrag( ({ movement: [, my], last, cancel }) => { // Only allow downward dragging if (my < 0) { setTranslateY(0); return; } if (last) { if (my > 100) { handleDismiss(); } else { setTranslateY(0); } return; } setTranslateY(my); }, { axis: "y", filterTaps: true }, ); if (!open) return null; return ( <> {/* Backdrop */}