"use client" import { AnimatePresence, motion } from "motion/react" import { useCallback, useEffect, useRef, useState } from "react" import { Dialog, Modal, ModalOverlay } from "react-aria-components" import { useIntl } from "react-intl" import { Button } from "@scandic-hotels/design-system/Button" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import ScandicLogoIcon from "@scandic-hotels/design-system/Icons/ScandicLogoIcon" import { Typography } from "@scandic-hotels/design-system/Typography" import { trpc } from "@scandic-hotels/trpc/client" import { useUpdateProfilingConsent } from "@/hooks/useUpdateProfilingConsent" import { profilingConsentOpenEvent, readDismissed, setDismissed as persistDismissed, } from "@/utils/profilingConsent" import { trackConsentAction } from "@/utils/tracking/profilingConsent" import ProfilingConsentAccordion from "../Accordion" import { GetMainIconByCSIdentifier } from "../utils" import BenefitCards from "./BenefitCards" import styles from "./profilingConsentModal.module.css" import type { ProfilingConsentModal as ProfilingConsentModalType } from "@scandic-hotels/trpc/types/profilingConsent" type ProfilingConsentModalProps = { memberKey?: string content: ProfilingConsentModalType iconIdentifier: string readOnly?: boolean } const MotionModal = motion.create(Modal) function usePromptInitialization(memberKey: string | undefined) { const utils = trpc.useUtils() const updateConsentPromptDate = trpc.user.profilingConsentPromptDate.update.useMutation({ onSuccess: () => utils.user.get.invalidate(), }) const mutationRef = useRef(updateConsentPromptDate) // eslint-disable-next-line react-hooks/refs mutationRef.current = updateConsentPromptDate const [shouldOpenInitially, setShouldOpenInitially] = useState(false) const hasSentPromptDate = useRef(false) const sendPromptDate = useCallback((date: string) => { mutationRef.current.mutate({ profilingConsentPromptDate: date, }) }, []) useEffect(() => { if (!memberKey) return const dismissed = readDismissed(memberKey) const firstOpen = !dismissed setShouldOpenInitially(firstOpen) if (firstOpen && !hasSentPromptDate.current) { hasSentPromptDate.current = true sendPromptDate(new Date().toISOString()) } }, [memberKey, sendPromptDate]) return shouldOpenInitially } function useModalEvents(setOpen: (s: boolean) => void) { useEffect(() => { const handleOpen: EventListener = () => setOpen(true) window.addEventListener(profilingConsentOpenEvent, handleOpen) return () => window.removeEventListener(profilingConsentOpenEvent, handleOpen) }, [setOpen]) } export default function ProfilingConsentModal({ memberKey, content, iconIdentifier, readOnly = false, }: ProfilingConsentModalProps) { const intl = useIntl() const [open, setOpen] = useState(false) const [activeChoice, setActiveChoice] = useState(null) const shouldOpenInitially = usePromptInitialization(memberKey) const { initiateUpdateConsent, isLoading, isSuccess } = useUpdateProfilingConsent() useEffect(() => { // eslint-disable-next-line react-hooks/set-state-in-effect if (shouldOpenInitially) setOpen(true) }, [shouldOpenInitially]) useModalEvents(setOpen) const onClose = useCallback(() => { if (memberKey) { persistDismissed(memberKey) } setOpen(false) }, [memberKey]) useEffect(() => { // eslint-disable-next-line react-hooks/set-state-in-effect if (isSuccess) onClose() }, [isSuccess, onClose]) if (!memberKey && !readOnly) return null const handleConsentClick = (consent: boolean) => { setActiveChoice(consent) initiateUpdateConsent(consent) } return ( !state && onClose()} isKeyboardDismissDisabled isDismissable={false} > {open && (

{content.header}

{content.sub_header}

{intl.formatMessage({ id: "profilingConsent.personalization&privacy", defaultMessage: "Personalization & privacy", })}

{intl.formatMessage({ id: "profilingConsent.byAcceptingThisIConsent", defaultMessage: "By accepting this I consent to Scandic using my information to give me even more personalized travel inspiration and offers from Scandic and trusted Scandic Friends partners. This means Scandic may use information about my interactions with Scandic Friends partners, and share details of my interactions with Scandic with those partners, to make the experience even more relevant to me.", })}

{!readOnly && ( )}
)}
) }