feat(SW-718) refactor filter submit
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
"use client"
|
||||
|
||||
import { zodResolver } from "@hookform/resolvers/zod"
|
||||
import { useCallback, useEffect, useMemo, useRef, useState } from "react"
|
||||
import { useEffect, useState } from "react"
|
||||
import { FormProvider, useForm } from "react-hook-form"
|
||||
import { useIntl } from "react-intl"
|
||||
import { useMediaQuery } from "usehooks-ts"
|
||||
@@ -30,15 +30,7 @@ export default function RoomFilter({
|
||||
}: RoomFilterProps) {
|
||||
const isTabletAndUp = useMediaQuery("(min-width: 768px)")
|
||||
const [isAboveMobile, setIsAboveMobile] = useState(false)
|
||||
const onFilterRef = useRef(onFilter)
|
||||
|
||||
useEffect(() => {
|
||||
onFilterRef.current = onFilter
|
||||
}, [onFilter])
|
||||
|
||||
useEffect(() => {
|
||||
onFilterRef.current(initialFilterValues)
|
||||
}, [initialFilterValues])
|
||||
const [isInitialized, setIsInitialized] = useState(false)
|
||||
|
||||
const intl = useIntl()
|
||||
const methods = useForm<FilterValues>({
|
||||
@@ -48,7 +40,7 @@ export default function RoomFilter({
|
||||
resolver: zodResolver(z.object({})),
|
||||
})
|
||||
|
||||
const { watch, getValues, handleSubmit } = methods
|
||||
const { watch, getValues } = methods
|
||||
const petFriendly = watch(RoomPackageCodeEnum.PET_ROOM)
|
||||
const allergyFriendly = watch(RoomPackageCodeEnum.ALLERGY_ROOM)
|
||||
|
||||
@@ -57,19 +49,25 @@ export default function RoomFilter({
|
||||
const tooltipText = intl.formatMessage({
|
||||
id: "Pet-friendly rooms have an additional fee of 20 EUR per stay",
|
||||
})
|
||||
const submitFilter = useCallback(
|
||||
(data: FilterValues) => {
|
||||
onFilter(data)
|
||||
},
|
||||
[onFilter]
|
||||
)
|
||||
|
||||
useEffect(() => {
|
||||
const subscription = watch((_, { name }) => {
|
||||
if (name) submitFilter(getValues())
|
||||
if (!initialFilterValues || isInitialized) return
|
||||
|
||||
onFilter(initialFilterValues)
|
||||
setIsInitialized(true)
|
||||
}, [initialFilterValues, onFilter, isInitialized])
|
||||
|
||||
// Watch for filter changes
|
||||
useEffect(() => {
|
||||
const subscription = watch((value, { name }) => {
|
||||
if (!name || !isInitialized) return
|
||||
|
||||
const currentValues = getValues()
|
||||
onFilter(currentValues)
|
||||
})
|
||||
|
||||
return () => subscription.unsubscribe()
|
||||
}, [watch, submitFilter, getValues])
|
||||
}, [watch, getValues, onFilter, isInitialized])
|
||||
|
||||
useEffect(() => {
|
||||
setIsAboveMobile(isTabletAndUp)
|
||||
@@ -127,7 +125,7 @@ export default function RoomFilter({
|
||||
</Caption>
|
||||
</div>
|
||||
<FormProvider {...methods}>
|
||||
<form onSubmit={handleSubmit(submitFilter)}>
|
||||
<form>
|
||||
<div className={styles.roomsFilter}>
|
||||
{filterOptions.map((option) => {
|
||||
const { code, description, itemCode } = option
|
||||
|
||||
Reference in New Issue
Block a user