"use client" import { useCallback, useEffect, useRef } from "react" import { useFormContext } from "react-hook-form" import { useIntl } from "react-intl" import { Stepper } from "@scandic-hotels/design-system/Stepper" import { Typography } from "@scandic-hotels/design-system/Typography" import ChildInfoSelector from "./ChildInfoSelector" import styles from "./child-selector.module.css" import type { Child } from "@scandic-hotels/trpc/types/child" type ChildSelectorProps = { roomIndex: number currentAdults: number currentChildren: Child[] childrenInAdultsBed: number containerRef?: React.RefObject roomsDividerRef?: React.RefObject } export default function ChildSelector({ roomIndex = 0, currentAdults, childrenInAdultsBed, currentChildren, containerRef, }: ChildSelectorProps) { const intl = useIntl() const childRefs = useRef<(HTMLDivElement | null)[]>([]) const previousChildCount = useRef(currentChildren.length) const childrenLabel = intl.formatMessage({ id: "bookingwidget.dropdown.children", defaultMessage: "Children (0–12 years)", }) const { setValue } = useFormContext() function increaseChildrenCount(roomIndex: number) { if (currentChildren.length < 5) { setValue( `rooms.${roomIndex}.childrenInRoom.${currentChildren.length}`, { age: undefined, bed: undefined, }, { shouldDirty: true } ) } } function decreaseChildrenCount(roomIndex: number) { if (currentChildren.length > 0) { currentChildren.pop() setValue(`rooms.${roomIndex}.childrenInRoom`, currentChildren, { shouldDirty: true, }) } } const scrollToAgePicker = useCallback(() => { if (!containerRef?.current) return const lastChildIndex = currentChildren.length - 1 const lastChild = childRefs.current[lastChildIndex] if (!lastChild) return const container = containerRef.current const containerRect = container.getBoundingClientRect() const targetRect = lastChild.getBoundingClientRect() const targetOffset = targetRect.top - containerRect.top + container.scrollTop const centerOffset = containerRect.height / 2 - targetRect.height / 2 container.scrollTo({ top: targetOffset - centerOffset, behavior: "smooth", }) }, [containerRef, currentChildren.length]) useEffect(() => { // Only scroll when a child was added if (currentChildren.length > previousChildCount.current) { scrollToAgePicker() } previousChildCount.current = currentChildren.length }, [currentChildren.length, scrollToAgePicker]) return ( <>

{childrenLabel}

{ decreaseChildrenCount(roomIndex) }} handleOnIncrease={() => { increaseChildrenCount(roomIndex) }} disableDecrease={currentChildren.length == 0} disableIncrease={currentChildren.length == 5} />
{currentChildren.map((child, index) => ( { childRefs.current[index] = el }} /> ))} ) }