feat(SW-718) refactor filter submit

This commit is contained in:
Pontus Dreij
2025-01-28 13:49:34 +01:00
parent b42f92b121
commit ba20ce2696

View File

@@ -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