Skip to content

Commit 25b64b4

Browse files
GorlemZfederico-ercoles
authored andcommitted
fix fetching on submit
1 parent b8d4b04 commit 25b64b4

File tree

8 files changed

+97
-48
lines changed

8 files changed

+97
-48
lines changed

Diff for: .npmrc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
auto-install-peers=true

Diff for: package.json

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
},
1212
"dependencies": {
1313
"@buildo/bento-design-system": "^0.20.4",
14+
"@buildo/formo": "^2.0.2",
1415
"@tanstack/react-query": "^4.36.1",
1516
"i18next": "^23.5.1",
1617
"react": "^18.2.0",

Diff for: pnpm-lock.yaml

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/api.tsx

+18-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,24 @@ import { apiSecret } from "./models";
22

33
const apiKey = import.meta.env.VITE_API_KEY;
44

5-
export const getRestaurantList = async (range: number) => {
6-
const uri = `/api/search?sort_by=best_match&limit=${range}&location=Milano`;
5+
export const getRestaurantList = async ({
6+
prices,
7+
location,
8+
radius,
9+
}: {
10+
prices: boolean[];
11+
location: string;
12+
radius: number;
13+
}) => {
14+
const priceParamsString: string = prices
15+
.map((price, index) => {
16+
if (price) {
17+
return `price=${index + 1}`;
18+
}
19+
})
20+
.filter((price) => price !== "")
21+
.join("&");
22+
const uri = `/api/search?sort_by=best_match&location=${location}&radius=${radius}000&${priceParamsString}`;
723
const apik = apiSecret.safeParse(apiKey);
824

925
if (apik.success) {

Diff for: src/components/RestaurantPreview.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ function RestaurantPreview(props: PreviewProp) {
2222
return (
2323
<Card elevation="small" borderRadius={8} padding={16} paddingTop={24}>
2424
<Stack space={8} align={"center"}>
25-
<img src={imagePrev} width="70%" height="100%" />
25+
<img
26+
src={imagePrev}
27+
style={{ height: "200px", width: "100%", objectFit: "scale-down" }}
28+
/>
2629
<Title size="medium">{props.name}</Title>
2730
<Body size="medium">
2831
{props.address}

Diff for: src/hooks.tsx

+12-6
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
import { useQuery } from "@tanstack/react-query";
22
import { getRestaurantList } from "./api";
33
import { fromJsonToProp } from "./utils";
4+
import { PreviewList } from "./models";
45

5-
function useGetRestaurantList(range: number) {
6-
return useQuery({
7-
queryKey: ["retrieve-list", range],
8-
queryFn: async () => {
9-
const prom: JSON = await getRestaurantList(range);
6+
function useGetRestaurantList(filtersParams: {
7+
prices: boolean[];
8+
location: string;
9+
radius: number;
10+
}) {
11+
return useQuery(
12+
["restaurantList"],
13+
async (): Promise<PreviewList> => {
14+
const prom: JSON = await getRestaurantList(filtersParams);
1015
return fromJsonToProp(prom);
1116
},
12-
});
17+
{ enabled: false }
18+
);
1319
}
1420

1521
export default useGetRestaurantList;

Diff for: src/models.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ export const previewList = z.object({
2929
export type PreviewList = z.infer<typeof previewList>;
3030

3131
export const filterParams = z.object({
32-
range: z.number(),
32+
prices: z.array(z.boolean()),
33+
location: z.string(),
34+
radius: z.number(),
3335
});
3436
export type FiltersParams = z.infer<typeof filterParams>;

Diff for: src/pages/Home.tsx

+47-38
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,43 @@ import {
88
AreaLoader,
99
Inset,
1010
Tiles,
11+
TextField,
12+
SliderField,
1113
} from "@buildo/bento-design-system";
14+
import useGetRestaurantList from "../hooks";
1215
import RestaurantPreview from "../components/RestaurantPreview";
13-
import PriceFilter from "../components/PriceFilter";
14-
import LocationFilter from "../components/LocationFilter";
15-
import RangeDistanceFilter from "../components/RangeDistanceFilter";
1616
import { useTranslation } from "react-i18next";
17-
import React from "react";
18-
import useGetRestaurantList from "../hooks";
17+
import { validators, useFormo, success } from "@buildo/formo";
18+
import { useEffect } from "react";
1919

2020
function Home() {
2121
const { t } = useTranslation();
22-
const { isLoading, isError, data } = useGetRestaurantList(10);
22+
const initialValues = {
23+
prices: [true, true, true, true],
24+
location: "Milan",
25+
radius: 0,
26+
};
27+
28+
const { fieldProps, handleSubmit, values } = useFormo(
29+
{
30+
initialValues,
31+
fieldValidators: () => ({
32+
location: validators.minLength(2, "City name is too short"),
33+
}),
34+
},
35+
{
36+
onSubmit: async (values) => {
37+
refetch();
38+
return success(values);
39+
},
40+
}
41+
);
42+
43+
useEffect(() => {
44+
refetch();
45+
}, []); // eslint-disable-line react-hooks/exhaustive-deps
46+
47+
const { isLoading, isError, data, refetch } = useGetRestaurantList(values);
2348

2449
if (isLoading) {
2550
return <AreaLoader message="Loading..."></AreaLoader>;
@@ -36,30 +61,6 @@ function Home() {
3661
);
3762
}
3863

39-
const [filters, setFilters] = React.useState({
40-
prices: [false, false, false, false],
41-
location: "",
42-
range: 0,
43-
});
44-
45-
const setPricesFilter = (prices: boolean[]) =>
46-
setFilters({
47-
...filters,
48-
prices,
49-
});
50-
51-
const setRangeFilter = (range: number) =>
52-
setFilters({
53-
...filters,
54-
range,
55-
});
56-
57-
const setLocationFilter = (location: string) =>
58-
setFilters({
59-
...filters,
60-
location,
61-
});
62-
6364
const cards = data?.businesses.map((element) => {
6465
return <RestaurantPreview key={"home-" + element.alias} {...element} />;
6566
});
@@ -71,25 +72,33 @@ function Home() {
7172
>
7273
<Box height="full" padding={24}>
7374
<Stack space={16} align="left">
74-
<PriceFilter price={filters.prices} setPrice={setPricesFilter} />
75+
{/* price filters */}
76+
7577
<Divider />
76-
<LocationFilter
77-
location={filters.location}
78-
setLocation={setLocationFilter}
78+
{/* location filters */}
79+
<TextField
80+
{...fieldProps("location")}
81+
label={t("Location.Label")}
82+
placeholder={t("Location.Placeholder")}
7983
/>
8084
<Divider />
85+
{/* range filters */}
8186
<Box width="full">
82-
<RangeDistanceFilter
83-
distance={filters.range}
84-
setDistance={setRangeFilter}
87+
<SliderField
88+
type="single"
89+
label={t("RangeDistance.Label")}
90+
minValue={0}
91+
maxValue={10}
92+
step={1}
93+
{...fieldProps("radius")}
8594
/>
8695
</Box>
8796
<Divider />
8897
<Button
8998
kind="solid"
9099
hierarchy="primary"
91100
label={t("SearchButton")}
92-
onPress={() => window.alert("" + filters.location)}
101+
onPress={handleSubmit}
93102
/>
94103
</Stack>
95104
</Box>

0 commit comments

Comments
 (0)