"use client" import Link from "next/link" import { useParams } from "next/navigation" import { useContext, useState } from "react" import { I18nProvider, Slider, SliderOutput, SliderStateContext, SliderThumb, SliderTrack, TextField, } from "react-aria-components" import { FormProvider, useForm } from "react-hook-form" import { useIntl } from "react-intl" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import Image from "@scandic-hotels/design-system/Image" import { Input } from "@scandic-hotels/design-system/Input" import Modal from "@scandic-hotels/design-system/Modal" import { OldDSButton as Button } from "@scandic-hotels/design-system/OldDSButton" import { Typography } from "@scandic-hotels/design-system/Typography" import { SAS_TRANSFER_POINT_KEY } from "@scandic-hotels/trpc/constants/partnerSAS" import styles from "./transferPoints.module.css" import type { Lang } from "@scandic-hotels/common/constants/language" import type { LangParams } from "@/types/params" type TransferPointsFormClientProps = { sasPoints: number | null exchangeRate: number | null lang: Lang } export function TransferPointsFormClient({ sasPoints, exchangeRate, lang, }: TransferPointsFormClientProps) { const intl = useIntl() const formMethods = useForm() const [pointState, setPointState] = useState(0) const selectedPoints = pointState ?? 0 const disabled = !exchangeRate const parsedPoints = Math.min(selectedPoints, sasPoints ?? 0) const calculatedPoints = parsedPoints * (exchangeRate ?? 0) const handleUpdatePoints = (points: number | null) => { setPointState(points ? Math.min(Math.max(points, 0), sasPoints ?? 0) : null) } const hasNoSasPoints = !sasPoints || sasPoints === 0 return (
{ const value = parseInt(e.target.value, 10) handleUpdatePoints(isNaN(value) ? null : value) }} onBlur={() => { handleUpdatePoints(parsedPoints) }} />

{/* TODO maybe dynamic string based on exchange rate */} {intl.formatMessage({ id: "partnerSas.conversionRateInfo", defaultMessage: "1 EuroBonus point = 2 Scandic Friends points", })}

{intl.formatMessage({ id: "partnerSas.sfPointsToReceive", defaultMessage: "SF points to receive", })}

{intl.formatNumber(calculatedPoints)}

) } function SliderFill() { const state = useContext(SliderStateContext)! return (
) } type ConfirmModalProps = { sasPoints: number scandicPoints: number disabled?: boolean } function ConfirmModal({ sasPoints, scandicPoints, disabled, }: ConfirmModalProps) { const { lang } = useParams() const [isOpen, setIsOpen] = useState(false) const intl = useIntl() const handleToggle = (open: boolean) => { setIsOpen(open) if (open) { const expireIn15Minutes = new Date( Date.now() + 15 * 60 * 1000 ).toUTCString() document.cookie = `${SAS_TRANSFER_POINT_KEY}=${JSON.stringify(sasPoints)};path=/;expires=${expireIn15Minutes}` } else { document.cookie = `${SAS_TRANSFER_POINT_KEY}=;path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT` } } return ( <>

{intl.formatMessage({ id: "partnerSas.proceedWithPointExchange", defaultMessage: "Proceed with point exchange?", })}

{intl.formatMessage({ id: "partnerSas.youAreAboutToExchange", defaultMessage: "You are about to exchange:", })}

{intl.formatMessage( { id: "partnerSas.exchangePointsDetails", defaultMessage: "{sasPoints, number} EuroBonus points to {scandicPoints, number} Scandic Friends points", }, { sasPoints, scandicPoints, bold: (text) => ( {text} ), } )}

{intl.formatMessage({ id: "partnerSas.exchangePointsExpiry", defaultMessage: "Your exchanged points will retain their original expiry date with a maximum validity of 12 months.", })}

) }