"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 { trpc } from "@/lib/trpc/client" import { DiamondIcon, EditIcon } from "@/components/Icons" import MembershipLevelIcon from "@/components/Levels/Icon" import Modal from "@/components/Modal" import { ModalContentWithActions } from "@/components/Modal/ModalContentWithActions" import Button from "@/components/TempDesignSystem/Button" import Body from "@/components/TempDesignSystem/Text/Body" import Caption from "@/components/TempDesignSystem/Text/Caption" import { toast } from "@/components/TempDesignSystem/Toasts" import useLang from "@/hooks/useLang" import ModifyContact from "../ModifyContact" import styles from "./room.module.css" import { type ModifyContactSchema, modifyContactSchema, } from "@/types/components/hotelReservation/myStay/modifyContact" import { MODAL_STEPS } from "@/types/components/hotelReservation/myStay/myStay" import type { BookingConfirmation } from "@/types/trpc/routers/booking/confirmation" import type { User } from "@/types/user" interface GuestDetailsProps { user: User | null booking: BookingConfirmation["booking"] isMobile?: boolean } export default function GuestDetails({ user, booking, isMobile = false, }: GuestDetailsProps) { const intl = useIntl() const lang = useLang() const router = useRouter() const [currentStep, setCurrentStep] = useState(MODAL_STEPS.INITIAL) const [isLoading, setIsLoading] = useState(false) const [guestDetails, setGuestDetails] = useState< BookingConfirmation["booking"]["guest"] >(booking.guest) const [isModifyGuestDetailsOpen, setIsModifyGuestDetailsOpen] = useState(false) const isFirstStep = currentStep === MODAL_STEPS.INITIAL 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 containerClass = isMobile ? styles.guestDetailsMobile : styles.guestDetailsDesktop const isMemberBooking = booking.guest.membershipNumber === user?.membership?.membershipNumber const updateGuest = trpc.booking.update.useMutation({ onMutate: () => setIsLoading(true), onSuccess: () => { setIsLoading(false) toast.success(intl.formatMessage({ id: "Guest details updated" })) setIsModifyGuestDetailsOpen(false) }, onError: () => { setIsLoading(false) toast.error(intl.formatMessage({ id: "Failed to update guest details" })) }, }) async function onSubmit(data: ModifyContactSchema) { if (booking.confirmationNumber) { updateGuest.mutate({ confirmationNumber: booking.confirmationNumber, guest: { email: data.email, phoneNumber: data.phoneNumber, countryCode: data.countryCode, }, }) setGuestDetails({ ...guestDetails, ...data }) } } function handleModifyMemberDetails() { const expirationTime = Date.now() + 10 * 60 * 1000 sessionStorage.setItem( "myStayReturnRoute", JSON.stringify({ path: window.location.pathname, expiry: expirationTime, }) ) router.push(`/${lang}/scandic-friends/my-pages/profile/edit`) } return (
{isMemberBooking && (
{intl.formatMessage({ id: "Your member tier" })}
{isMobile && (
)} {intl.formatMessage({ id: "Total points" })} {user.membership!.currentPoints}
)}
{guestDetails.firstName} {guestDetails.lastName} {isMemberBooking && ( {intl.formatMessage({ id: "Member no." })}{" "} {user.membership!.membershipNumber} )} {guestDetails.email} {guestDetails.phoneNumber}
{isMemberBooking ? ( ) : ( <> {({ close }) => ( setIsModifyGuestDetailsOpen(false)} content={ } 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) }, }} /> )} )}
) }