"use client"; import type { HTMLAttributes } from "react"; import { useCallback, useEffect, useId, useMemo, useRef, useState } from "react"; import { useI18n } from "@/translations/provider"; const EXIT_ANIMATION_MS = 220; export type OutcomeSelectionSheetProps = Omit< HTMLAttributes, "title" | "onSubmit" > & { closeOnOutside?: boolean; onClose?: () => void; onSubmit?: (status: "success" | "failure") => void; }; export function OutcomeSelectionSheet({ closeOnOutside = true, onClose, onSubmit, className, ...props }: OutcomeSelectionSheetProps) { const { dictionary: t } = useI18n(); const groupId = useId(); const [isVisible, setIsVisible] = useState(true); const [isClosing, setIsClosing] = useState(false); const [selectedStatus, setSelectedStatus] = useState<"success" | "failure">( "success", ); 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]); 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; } const options = [ { value: "success" as const, label: t["We reached an agreement"] }, { value: "failure" as const, label: t["We did not reach an agreement"] }, ]; 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(); } }} >

{t["What was the outcome of your contact?"]}

{t["What was the outcome of your contact?"]}
{options.map((option) => { const checked = selectedStatus === option.value; return ( ); })}
); } export default OutcomeSelectionSheet;