Skip to content

Commit 2b7c6e7

Browse files
♻️ Refactor 'search'
- A nova busca é muito complexa. Sendo assim, foi necessário refatorar o que tinha sido feito anteriormente. Para um melhor entendimento, olhe o código do backend associado a essa mudança feat/filters
1 parent f02c226 commit 2b7c6e7

File tree

4 files changed

+105
-35
lines changed

4 files changed

+105
-35
lines changed

src/hooks/usePaginatedQuery/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ export interface IPaginatedResponse<T = any> {
33
page: number;
44
perPage: number;
55
results: T[];
6+
filters?: any
67
}

src/hooks/useShelters/types.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,13 @@ export interface IUseSheltersDataSupplyData {
1919
supply: { name: string };
2020
priority: number;
2121
}
22+
23+
export interface IUseShelterSearchParams {
24+
priority: number | undefined;
25+
supplies: number[] | undefined;
26+
supplyCategories: number[] | undefined;
27+
search: string | undefined;
28+
filterAvailableShelter: boolean;
29+
filterUnavailableShelter: boolean;
30+
waitingShelterAvailability: boolean;
31+
}

src/hooks/useShelters/useShelters.tsx

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { AxiosRequestConfig } from 'axios';
33

44
import { api } from '@/api';
55
import { IServerResponse } from '@/types';
6-
import { PaginatedQueryPath } from '../usePaginatedQuery/paths';
76
import { IPaginatedResponse } from '../usePaginatedQuery/types';
87
import { IUseSheltersData } from './types';
98

@@ -14,14 +13,40 @@ const useShelters = () => {
1413
page: 1,
1514
perPage: 20,
1615
results: [],
16+
filters: {
17+
search: '',
18+
priority: undefined,
19+
supplies: [],
20+
supplyCategories: [],
21+
filterAvailableShelter: false,
22+
filterUnavailableShelter: false,
23+
waitingShelterAvailability: false
24+
}
1725
});
1826

19-
const refresh = useCallback(
27+
const resetSearch = () => {
28+
const params = {
29+
search: '',
30+
priority: undefined,
31+
supplies: [],
32+
supplyCategories: [],
33+
filterAvailableShelter: false,
34+
filterUnavailableShelter: false,
35+
waitingShelterAvailability: false,
36+
page: 1,
37+
perPage: 20,
38+
}
39+
search({
40+
params: params,
41+
});
42+
}
43+
44+
const search = useCallback(
2045
(config: AxiosRequestConfig<any> = {}, append: boolean = false) => {
2146
if (!append) setLoading(true);
2247
api
23-
.get<IServerResponse<IPaginatedResponse<IUseSheltersData>>>(
24-
PaginatedQueryPath.Shelters,
48+
.get<IServerResponse<any>>(
49+
'/shelters/search',
2550
{
2651
...config,
2752
params: {
@@ -37,23 +62,45 @@ const useShelters = () => {
3762
...prev,
3863
...data.data,
3964
results: [...prev.results, ...data.data.results],
65+
filters: {
66+
search: '',
67+
priority: config.params.priority,
68+
supplies: config.params.supplies ?? [],
69+
supplyCategories: config.params.supplyCategories ?? [],
70+
filterAvailableShelter: config.params.filterAvailableShelter ?? false,
71+
filterUnavailableShelter: config.params.filterUnavailableShelter ?? false,
72+
waitingShelterAvailability: config.params.waitingShelterAvailability ?? false,
73+
}
4074
}));
4175
} else {
42-
setData(data.data);
76+
setData((prev) => ({
77+
...prev,
78+
...data.data,
79+
results: [...data.data.results],
80+
filters: {
81+
search: config.params.search,
82+
priority: config.params.priority,
83+
supplies: config.params.supplies ?? [],
84+
supplyCategories: config.params.supplyCategories ?? [],
85+
filterAvailableShelter: config.params.filterAvailableShelter ?? false,
86+
filterUnavailableShelter: config.params.filterUnavailableShelter ?? false,
87+
waitingShelterAvailability: config.params.waitingShelterAvailability ?? false,
88+
}
89+
}));
4390
}
4491
})
4592
.finally(() => {
46-
if (!append) setLoading(false);
93+
if(!append) setLoading(false);
4794
});
4895
},
4996
[]
5097
);
5198

5299
useEffect(() => {
53-
refresh();
54-
}, [refresh]);
100+
resetSearch();
101+
}, []);
55102

56-
return { data, loading, refresh };
103+
return { data, loading, search, resetSearch };
57104
};
58105

59106
export { useShelters };

src/pages/Home/Home.tsx

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,81 @@
11
import { Fragment, useCallback, useContext, useMemo, useState } from 'react';
2-
import {
3-
RotateCw,
4-
CircleAlert,
5-
Search,
6-
Loader,
7-
LogOutIcon,
8-
Heart,
9-
} from 'lucide-react';
2+
import { RotateCw, CircleAlert, Search, Loader, ListFilter, LogOutIcon, Heart } from 'lucide-react';
103

114
import { Alert, Header, NoFoundSearch, ShelterListItem } from '@/components';
125
import { Input } from '@/components/ui/input';
136
import { useShelters, useThrottle } from '@/hooks';
147
import { Button } from '@/components/ui/button';
158
import { SessionContext } from '@/contexts';
9+
import { IUseShelterSearchParams } from '@/hooks/useShelters/types';
1610

1711
const alertDescription =
1812
'Você pode consultar a lista de abrigos disponíveis. Ver e editar os itens que necessitam de doações.';
1913

2014
const Home = () => {
21-
const { data: shelters, loading, refresh } = useShelters();
15+
const { data: shelters, loading, search, resetSearch } = useShelters();
2216
const {
2317
loading: loadingSession,
2418
refreshSession,
2519
session,
2620
} = useContext(SessionContext);
2721
const [searchValue, setSearchValue] = useState<string>('');
22+
const [isModalOpen, setOpenModal] = useState<boolean>(false);
2823
const [, setSearch] = useThrottle<string>(
2924
{
3025
throttle: 400,
3126
callback: (v) => {
3227
const params = {
33-
search: `address:contains:${v},name:contains:${v}`,
34-
or: 'true',
28+
...shelters.filters,
29+
search: v ? v : '',
30+
page: shelters.page,
31+
perPage: shelters.perPage,
3532
};
36-
refresh({
37-
params: v ? params : {},
33+
34+
search({
35+
params: params,
3836
});
3937
},
4038
},
4139
[]
4240
);
41+
42+
const clearSearch = () => {
43+
setSearchValue('');
44+
resetSearch();
45+
}
46+
4347
const hasMore = useMemo(
4448
() => shelters.page * shelters.perPage < shelters.count,
4549
[shelters.page, shelters.perPage, shelters.count]
4650
);
4751

52+
const closeModal = () => {
53+
setOpenModal(false);
54+
}
55+
56+
const handleSearch = (values: IUseShelterSearchParams) => {
57+
setOpenModal(false);
58+
setSearchValue(values.search ?? '');
59+
search({
60+
params: {
61+
...values
62+
}
63+
});
64+
}
65+
4866
const handleFetchMore = useCallback(() => {
4967
const params = {
68+
...shelters.filters,
5069
page: shelters.page + 1,
5170
perPage: shelters.perPage,
71+
search: searchValue ? searchValue : '',
5272
};
5373

54-
if (searchValue)
55-
Object.assign(params, {
56-
search: `address:contains:${searchValue},name:contains:${searchValue}`,
57-
or: 'true',
58-
});
74+
search({
75+
params: params,
76+
}, true);
5977

60-
refresh(
61-
{
62-
params,
63-
},
64-
true
65-
);
66-
}, [refresh, searchValue, shelters.page, shelters.perPage]);
78+
}, [search, shelters.filters, shelters.page, shelters.perPage]);
6779

6880
return (
6981
<div className="flex flex-col h-screen items-center">
@@ -80,7 +92,7 @@ const Home = () => {
8092
loading={loading}
8193
variant="ghost"
8294
size="sm"
83-
onClick={() => refresh()}
95+
onClick={() => search()}
8496
className="disabled:bg-red-500 hover:bg-red-400"
8597
>
8698
<RotateCw size={20} className="stroke-white" />

0 commit comments

Comments
 (0)