"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 { type Room } from "@/stores/my-stay/myStayRoomDetailsStore" 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 { User } from "@/types/user" interface GuestDetailsProps { user: User | null booking: Room updateRoom: (room: Room) => void } export default function GuestDetails({ user, booking, updateRoom, }: GuestDetailsProps) { const intl = useIntl() const lang = useLang() const router = useRouter() 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) { toast.error( intl.formatMessage({ id: "Failed to update guest details" }) ) return } updateRoom({ ...booking, guest: { ...booking.guest, email: data.guest.email, phoneNumber: data.guest.phoneNumber, countryCode: data.guest.countryCode, }, }) toast.success(intl.formatMessage({ id: "Guest details updated" })) setIsModifyGuestDetailsOpen(false) setCurrentStep(MODAL_STEPS.INITIAL) }, onError: () => { toast.error(intl.formatMessage({ id: "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({ id: "Your member tier" })}

{intl.formatMessage({ id: "Total points" })}

{user.membership.currentPoints}

)}

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

{isMemberBooking && user.membership && (

{intl.formatMessage( { id: "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({ id: "Save updates" }) : intl.formatMessage({ id: "Confirm" }), onClick: isFirstStep ? () => setCurrentStep(MODAL_STEPS.CONFIRMATION) : () => form.handleSubmit(onSubmit)(), disabled: !form.formState.isValid || isLoading, intent: isFirstStep ? "secondary" : "primary", }} secondaryAction={{ label: isFirstStep ? intl.formatMessage({ id: "Back" }) : intl.formatMessage({ id: "Cancel" }), onClick: () => { close() setCurrentStep(MODAL_STEPS.INITIAL) }, }} /> )} )} )}
) }