"use client" import { zodResolver } from "@hookform/resolvers/zod" import { useRouter } from "next/navigation" import { useState } from "react" import { Dialog } 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 { Typography } from "@scandic-hotels/design-system/Typography" import { trpc } from "@/lib/trpc/client" import MembershipLevelIcon from "@/components/Levels/Icon" import Modal from "@/components/Modal" import { ModalContentWithActions } from "@/components/Modal/ModalContentWithActions" import Button from "@/components/TempDesignSystem/Button" import { toast } from "@/components/TempDesignSystem/Toasts" import useLang from "@/hooks/useLang" import ModifyContact from "../ModifyContact" import styles from "./guestDetails.module.css" import { type ModifyContactSchema, modifyContactSchema, } from "@/types/components/hotelReservation/myStay/modifyContact" import { MODAL_STEPS } from "@/types/components/hotelReservation/myStay/myStay" import type { Room } from "@/types/stores/my-stay" import type { SafeUser } from "@/types/user" interface DetailsProps { booking: Room user: SafeUser } export default function Details({ booking, user }: DetailsProps) { const intl = useIntl() const lang = useLang() const router = useRouter() const utils = trpc.useUtils() const [currentStep, setCurrentStep] = useState(MODAL_STEPS.INITIAL) const [isLoading, setIsLoading] = useState(false) const [isModifyGuestDetailsOpen, setIsModifyGuestDetailsOpen] = useState(false) const form = useForm({ resolver: zodResolver(modifyContactSchema), defaultValues: { firstName: booking.guest.firstName, lastName: booking.guest.lastName, email: booking.guest.email, phoneNumber: booking.guest.phoneNumber, countryCode: booking.guest.countryCode, }, }) const isFirstStep = currentStep === MODAL_STEPS.INITIAL const isMemberBooking = booking.guest.membershipNumber === user?.membership?.membershipNumber const updateGuest = trpc.booking.update.useMutation({ onMutate: () => setIsLoading(true), onSuccess: (data) => { if (data) { utils.booking.get.invalidate({ confirmationNumber: data.confirmationNumber, }) toast.success( intl.formatMessage({ defaultMessage: "Guest details updated", }) ) setIsModifyGuestDetailsOpen(false) setCurrentStep(MODAL_STEPS.INITIAL) } else { toast.error( intl.formatMessage({ defaultMessage: "Failed to update guest details", }) ) } }, onError: () => { toast.error( intl.formatMessage({ defaultMessage: "Failed to update guest details", }) ) }, onSettled: () => { setIsLoading(false) }, }) async function onSubmit(data: ModifyContactSchema) { updateGuest.mutate({ confirmationNumber: booking.confirmationNumber, guest: { email: data.email, phoneNumber: data.phoneNumber, countryCode: data.countryCode, }, }) } function handleModifyMemberDetails() { const expirationTime = Date.now() + 10 * 60 * 1000 sessionStorage.setItem( "myStayReturnRoute", JSON.stringify({ path: window.location.href, expiry: expirationTime, }) ) router.push(`/${lang}/scandic-friends/my-pages/profile/edit`) } return (
{isMemberBooking && user.membership && (

{intl.formatMessage({ defaultMessage: "Your member tier", })}

{intl.formatMessage({ defaultMessage: "Total points", })}

{user.membership.currentPoints}

)}

{booking.guest.firstName} {booking.guest.lastName}

{isMemberBooking && user.membership && (

{intl.formatMessage( { defaultMessage: "Member no. {nr}", }, { nr: user.membership.membershipNumber, } )}

)}

{booking.guest.email}

{booking.guest.phoneNumber}

{booking.guest.email}

{booking.guest.phoneNumber}

{isMemberBooking ? ( ) : ( <> {isModifyGuestDetailsOpen && ( {({ close }) => ( setIsModifyGuestDetailsOpen(false)} content={ booking.guest && ( ) } primaryAction={{ label: isFirstStep ? intl.formatMessage({ defaultMessage: "Save updates", }) : intl.formatMessage({ defaultMessage: "Confirm", }), onClick: isFirstStep ? () => setCurrentStep(MODAL_STEPS.CONFIRMATION) : () => form.handleSubmit(onSubmit)(), disabled: !form.formState.isValid || isLoading, intent: isFirstStep ? "secondary" : "primary", }} secondaryAction={{ label: isFirstStep ? intl.formatMessage({ defaultMessage: "Back", }) : intl.formatMessage({ defaultMessage: "Cancel", }), onClick: () => { close() setCurrentStep(MODAL_STEPS.INITIAL) }, }} /> )} )} )}
) }