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