feat(BOOK-101): Added functionality to show active map card when focus is within the hotel card

Approved-by: Bianca Widstam
This commit is contained in:
Erik Tiekstra
2025-11-26 07:40:12 +00:00
parent 7cae720498
commit b41aab56a6
5 changed files with 35 additions and 3 deletions

View File

@@ -221,6 +221,8 @@ export default function HotelCardListing({
), ),
} }
} }
onFocusIn={() => engage(hotel.hotel.name)}
onFocusOut={() => disengage()}
onHover={() => engage(hotel.hotel.name)} onHover={() => engage(hotel.hotel.name)}
onHoverEnd={() => disengage()} onHoverEnd={() => disengage()}
onAddressClick={() => { onAddressClick={() => {

View File

@@ -88,6 +88,8 @@ export const Default: Story = {
onAddressClick: fn, onAddressClick: fn,
onHover: fn, onHover: fn,
onHoverEnd: fn, onHoverEnd: fn,
onFocusIn: fn,
onFocusOut: fn,
}, },
} }

View File

@@ -2,7 +2,8 @@
import { cx } from 'class-variance-authority' import { cx } from 'class-variance-authority'
import { type ReadonlyURLSearchParams, useSearchParams } from 'next/navigation' import { type ReadonlyURLSearchParams, useSearchParams } from 'next/navigation'
import { memo } from 'react' import { memo, useState } from 'react'
import { useFocusWithin } from 'react-aria'
import { useIntl } from 'react-intl' import { useIntl } from 'react-intl'
import { import {
@@ -116,6 +117,8 @@ export type HotelCardProps = {
onHover: () => void onHover: () => void
onHoverEnd: () => void onHoverEnd: () => void
onFocusIn: () => void
onFocusOut: () => void
onAddressClick: () => void onAddressClick: () => void
} }
@@ -139,8 +142,18 @@ export const HotelCard = memo(
onAddressClick, onAddressClick,
onHover, onHover,
onHoverEnd, onHoverEnd,
onFocusIn,
onFocusOut,
}: HotelCardProps) => { }: HotelCardProps) => {
const searchParams = useSearchParams() const searchParams = useSearchParams()
const [isFocusWithin, setIsFocusWithin] = useState(false)
const { focusWithinProps } = useFocusWithin({
onFocusWithin: onFocusIn,
onBlurWithin: onFocusOut,
onFocusWithinChange: (isFocusWithin) => {
setIsFocusWithin(isFocusWithin)
},
})
const intl = useIntl() const intl = useIntl()
@@ -174,11 +187,24 @@ export const HotelCard = memo(
prices?.member?.rateType === RateTypeEnum.PublicPromotion prices?.member?.rateType === RateTypeEnum.PublicPromotion
const showBookingCodeChip = bookingCode || isCampaign const showBookingCodeChip = bookingCode || isCampaign
function onMouseEnter() {
if (!isFocusWithin) {
onHover()
}
}
function onMouseLeave() {
if (!isFocusWithin) {
onHoverEnd()
}
}
return ( return (
<article <article
{...focusWithinProps}
className={classNames} className={classNames}
onMouseEnter={() => onHover()} onMouseEnter={onMouseEnter}
onMouseLeave={() => onHoverEnd()} onMouseLeave={onMouseLeave}
> >
<div> <div>
<div className={styles.imageContainer}> <div className={styles.imageContainer}>

View File

@@ -234,6 +234,7 @@
"@vis.gl/react-google-maps": "^1.5.2", "@vis.gl/react-google-maps": "^1.5.2",
"next": "^15", "next": "^15",
"react": "^19.1.0", "react": "^19.1.0",
"react-aria": "^3.39.0",
"react-aria-components": "^1.8.0", "react-aria-components": "^1.8.0",
"react-dom": "^19.1.0", "react-dom": "^19.1.0",
"react-hook-form": "^7.56.2", "react-hook-form": "^7.56.2",

View File

@@ -5169,6 +5169,7 @@ __metadata:
"@vis.gl/react-google-maps": ^1.5.2 "@vis.gl/react-google-maps": ^1.5.2
next: ^15 next: ^15
react: ^19.1.0 react: ^19.1.0
react-aria: ^3.39.0
react-aria-components: ^1.8.0 react-aria-components: ^1.8.0
react-dom: ^19.1.0 react-dom: ^19.1.0
react-hook-form: ^7.56.2 react-hook-form: ^7.56.2