"use client"; import Image from "next/image"; import type { HTMLAttributes, ReactNode } from "react"; import { useCallback, useEffect, useRef, useState } from "react"; import { useHardwareBackHandler } from "@/hooks/use-hardware-back-handler"; import { useI18n } from "@/translations/provider"; const EXIT_ANIMATION_MS = 200; export type FemaleConsentSheetProps = Omit< HTMLAttributes, "children" | "title" > & { title: ReactNode; description?: ReactNode; buttons?: ReactNode | ((controls: { close: () => void }) => ReactNode); closeOnOutside?: boolean; onClose?: () => void; }; export function FemaleConsentSheet({ title, description, buttons, closeOnOutside = true, onClose, className, ...props }: FemaleConsentSheetProps) { const { dictionary: t } = useI18n(); const [isVisible, setIsVisible] = useState(true); const [isClosing, setIsClosing] = useState(false); const isMountedRef = useRef(true); useEffect(() => { isMountedRef.current = true; return () => { isMountedRef.current = false; }; }, []); const closeSheet = useCallback(() => { if (isClosing) return; setIsClosing(true); window.setTimeout(() => { if (isMountedRef.current) { setIsVisible(false); } onClose?.(); }, EXIT_ANIMATION_MS); }, [isClosing, onClose]); useHardwareBackHandler(closeSheet, isVisible && !isClosing); const controls = { close: closeSheet }; const resolvedButtons = typeof buttons === "function" ? buttons(controls) : buttons; useEffect(() => { if (!isVisible) { return; } const previousBodyOverflow = document.body.style.overflow; const previousHtmlOverflow = document.documentElement.style.overflow; document.body.style.overflow = "hidden"; document.documentElement.style.overflow = "hidden"; return () => { document.body.style.overflow = previousBodyOverflow; document.documentElement.style.overflow = previousHtmlOverflow; }; }, [isVisible]); if (!isVisible) { return null; } return (
{ if (closeOnOutside && event.target === event.currentTarget) { closeSheet(); } }} onKeyDown={(event) => { if ( closeOnOutside && event.target === event.currentTarget && (event.key === "Escape" || event.key === "Enter" || event.key === " ") ) { event.preventDefault(); closeSheet(); } }} >

{title}

{description ? (
{description}
) : null} {resolvedButtons ?
{resolvedButtons}
: null}
); } export default FemaleConsentSheet;