"use client" import { zodResolver } from "@hookform/resolvers/zod" import { useCallback, useState } from "react" import { FormProvider, useForm } from "react-hook-form" import { useIntl } from "react-intl" import { Button } from "@scandic-hotels/design-system/Button" import { useEnterDetailsStore } from "@/stores/enter-details" import SpecialRequests from "@/components/HotelReservation/EnterDetails/Details/SpecialRequests" import CountrySelect from "@/components/TempDesignSystem/Form/Country" import Input from "@/components/TempDesignSystem/Form/Input" import Phone from "@/components/TempDesignSystem/Form/Phone" import Footnote from "@/components/TempDesignSystem/Text/Footnote" import { useRoomContext } from "@/contexts/Details/Room" import { trackPaymentSectionOpen } from "@/utils/tracking/booking" import JoinScandicFriendsCard from "./JoinScandicFriendsCard" import MemberPriceModal from "./MemberPriceModal" import { guestDetailsSchema, signedInDetailsSchema } from "./schema" import Signup from "./Signup" import styles from "./details.module.css" import type { DetailsProps, DetailsSchema, } from "@/types/components/hotelReservation/enterDetails/details" const formID = "enter-details" export default function Details({ user }: DetailsProps) { const intl = useIntl() const [isMemberPriceModalOpen, setIsMemberPriceModalOpen] = useState(false) const { canProceedToPayment, lastRoom, isMultiRoom } = useEnterDetailsStore( (state) => ({ canProceedToPayment: state.canProceedToPayment, lastRoom: state.lastRoom, isMultiRoom: state.rooms.length > 1, }) ) const { actions: { updateDetails }, idx, room, roomNr, } = useRoomContext() const initialData = room.guest const memberRate = "member" in room.roomRate ? room.roomRate.member : null const isPaymentNext = idx === lastRoom const showContinueButton = isMultiRoom || !user const methods = useForm({ criteriaMode: "all", mode: "all", resolver: zodResolver(user ? signedInDetailsSchema : guestDetailsSchema), reValidateMode: "onChange", values: { countryCode: user?.address?.countryCode ?? initialData.countryCode, dateOfBirth: "dateOfBirth" in initialData ? initialData.dateOfBirth : undefined, email: user?.email ?? initialData.email, firstName: user?.firstName ?? initialData.firstName, join: initialData.join, lastName: user?.lastName ?? initialData.lastName, membershipNo: initialData.membershipNo, phoneNumber: user?.phoneNumber ?? initialData.phoneNumber, zipCode: "zipCode" in initialData ? initialData.zipCode : undefined, specialRequest: { comment: room.specialRequest.comment, }, }, }) const onSubmit = useCallback( (values: DetailsSchema) => { if ((values.join || values.membershipNo) && memberRate && !user) { setIsMemberPriceModalOpen(true) } updateDetails(values) }, [updateDetails, setIsMemberPriceModalOpen, memberRate, user] ) return (
{user || !memberRate ? null : }
{intl.formatMessage({ defaultMessage: "Guest information", })} {user ? null : (
)}
{showContinueButton ? (
) : null}
) }