import React from "react" import { useQuery, useQueryClient } from "@tanstack/react-query" import { useForm } from "react-hook-form" import { deserialize } from "next-drupal" import classNames from "classnames" import { FormItem } from "components/form-item" import { Section } from "components/section" import { Node } from "components/node" const filters = { location: "All", status: "All", beds: "1", baths: "1" } async function fetchView(url, params) { const _url = new URL(url) _url.search = new URLSearchParams(params).toString() const result = await fetch(_url.toString()) if (!result.ok) { throw new Error(result.statusText) } const data = await result.json() return { results: deserialize(data), meta: data.meta, links: data.links, } } export function ViewPropertiesListing({ view: initialView, ...props }) { const [page, setPage] = React.useState(0) const queryClient = useQueryClient() const [display, setDisplay] = React.useState<"grid" | "list">("grid") const { register, handleSubmit, getValues, formState, reset } = useForm({ defaultValues: filters, }) const [locations, setLocations] = React.useState([]) const { data: view, isLoading, isPreviousData, } = useQuery( [initialView.name, page], async () => { // Build params from form values. const values = getValues() const params = { page: page + "", include: "field_location,field_images.field_media_image", } for (const filter of Object.keys(filters)) { if (values[filter]) { params[`views-filter[${filter}]`] = values[filter] } } return fetchView(initialView.links.self.href.split("?")[0], params) }, { initialData: initialView, keepPreviousData: true, } ) // Build locations dropdown from view results. React.useEffect(() => { const allLocations: { name: string id: string }[] = view.results.map((result) => ({ name: result.field_location.name, id: result.field_location.drupal_internal__tid, })) setLocations( Array.from(new Map(allLocations.map((item) => [item.id, item])).values()) ) }, []) async function submitForm() { setPage(0) await queryClient.invalidateQueries(view.name) } async function resetForm() { reset() submitForm() } return (

Find your place



{view.results.length ? ( <>

Found {view.meta?.count} properties.

{view.results.map((node) => ( ))}

) : (

No properties found.

)}
) }