"use client" import { zodResolver } from "@hookform/resolvers/zod" import { useEffect, useMemo } 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 JoinScandicFriendsCard from "./JoinScandicFriendsCard" import { getMultiroomDetailsSchema } from "./schema" import styles from "./details.module.css" import type { MultiroomDetailsSchema } from "@/types/components/hotelReservation/enterDetails/details" const formID = "enter-details" export default function Details() { const intl = useIntl() const { canProceedToPayment, lastRoom, rooms } = useEnterDetailsStore( (state) => ({ canProceedToPayment: state.canProceedToPayment, lastRoom: state.lastRoom, rooms: state.rooms, }) ) const { actions: { updateDetails }, idx, room, roomNr, } = useRoomContext() const initialData = room.guest /** * The data that each room needs from each other to do validations * across the rooms */ const crossValidationData = useMemo( () => rooms .filter((_, i) => i !== idx) .map((room) => ({ firstName: room.room.guest.firstName, lastName: room.room.guest.lastName, membershipNo: room.room.guest.membershipNo, })), [idx, rooms] ) const isPaymentNext = idx === lastRoom const methods = useForm({ criteriaMode: "all", mode: "all", resolver: zodResolver(getMultiroomDetailsSchema(crossValidationData)), reValidateMode: "onChange", values: { countryCode: initialData.countryCode, email: initialData.email, firstName: initialData.firstName, join: initialData.join, lastName: initialData.lastName, membershipNo: initialData.membershipNo, phoneNumber: initialData.phoneNumber, specialRequest: { comment: room.specialRequest.comment, }, }, }) // Trigger validation of the room manually when another room changes its data. // Only do it if the field has a value, to avoid error states before the user // has filled anything in. useEffect(() => { const { firstName, lastName, membershipNo } = methods.getValues() if (firstName) { methods.trigger("firstName") } if (lastName) { methods.trigger("lastName") } if (membershipNo) { methods.trigger("membershipNo") } }, [crossValidationData, methods]) const guestIsGoingToJoin = methods.watch("join") const guestIsMember = methods.watch("membershipNo") return (
{guestIsMember ? null : }
{intl.formatMessage({ defaultMessage: "Guest information", })} {guestIsGoingToJoin ? null : ( )}
) }