1
1
import { useState , useMemo , useEffect , useCallback } from 'react' ;
2
2
import { IAdvertising , IBreeder , IPoultry , IPoultryRegister } from '@cig-platform/types' ;
3
3
import { useRouter } from 'next/router' ;
4
- import { useDebouncedEffect } from '@cig-platform/hooks ' ;
4
+ import { useData } from '@cig-platform/data-helper ' ;
5
5
6
6
import { useAppDispatch , useAppSelector } from '@Contexts/AppContext/AppContext' ;
7
- import { setError , setIsLoading } from '@Contexts/AppContext/appActions' ;
7
+ import { setIsLoading } from '@Contexts/AppContext/appActions' ;
8
8
import ContentSearchService from '@Services/ContentSearchService' ;
9
9
import useUser from '@Hooks/useUser' ;
10
10
import { selectIsLoading } from '@Contexts/AppContext/appSelectors' ;
@@ -25,14 +25,18 @@ export interface PoultryData {
25
25
}
26
26
}
27
27
28
+ export type Data = {
29
+ advertisings : PoultryData [ ] ;
30
+ pages : number ;
31
+ }
32
+
28
33
export default function useSearchAdvertisngs ( { initialData = [ ] , initialPages = 0 } : {
29
34
initialData ?: PoultryData [ ] ,
30
35
initialPages ?: number ;
31
36
} ) {
32
37
const [ advertisingsData , setAdvertisingsData ] = useState < PoultryData [ ] > ( initialData ) ;
33
38
const [ page , setPage ] = useState ( 0 ) ;
34
39
const [ totalPages , setTotalPages ] = useState ( initialPages ) ;
35
- const [ isFirstAccess , setIsFirstAccess ] = useState ( false ) ;
36
40
37
41
const isLoading = useAppSelector ( selectIsLoading ) ;
38
42
@@ -57,14 +61,13 @@ export default function useSearchAdvertisngs({ initialData = [], initialPages =
57
61
setAdvertisingsData ( [ ] ) ;
58
62
setPage ( 0 ) ;
59
63
} , [ ] ) ;
60
-
64
+
61
65
const handlePaginate = useCallback ( ( ) => {
62
66
const documentHeight = document . body . scrollHeight ;
63
67
const currentScroll = window . scrollY + window . innerHeight ;
64
68
const modifier = 200 ;
65
69
66
70
if ( currentScroll + modifier > documentHeight && page < totalPages - 1 && ! isLoading ) {
67
- setIsFirstAccess ( false ) ;
68
71
setPage ( page + 1 ) ;
69
72
dispatch ( setIsLoading ( true ) ) ;
70
73
}
@@ -76,7 +79,6 @@ export default function useSearchAdvertisngs({ initialData = [], initialPages =
76
79
77
80
if ( hasFilterOnQueryParams && needsToClearResults ) {
78
81
handleClear ( ) ;
79
- setIsFirstAccess ( false ) ;
80
82
}
81
83
} , [ sort , handleClear , crest , dewlap , gender , genderCategory , tail , type , keyword , prices ] ) ;
82
84
@@ -85,50 +87,61 @@ export default function useSearchAdvertisngs({ initialData = [], initialPages =
85
87
86
88
return ( ) => document . removeEventListener ( 'scroll' , handlePaginate ) ;
87
89
} , [ handlePaginate ] ) ;
88
-
89
- useDebouncedEffect ( ( ) => {
90
- if ( isFirstAccess ) return ;
91
-
92
- ( async ( ) => {
93
- try {
94
- dispatch ( setIsLoading ( true ) ) ;
95
-
96
- const { advertisings, pages } = await ContentSearchService . getSearch ( {
97
- crest,
98
- dewlap,
99
- gender,
100
- genderCategory,
101
- keyword,
102
- prices,
103
- sort,
104
- tail,
105
- type,
106
- favoriteExternalId,
107
- page
108
- } ) ;
109
-
110
- setAdvertisingsData ( prevAdvertisings => [ ...prevAdvertisings , ...advertisings ] ) ;
111
- setTotalPages ( pages ) ;
112
- } catch ( error ) {
113
- dispatch ( setError ( error ) ) ;
114
- } finally {
115
- dispatch ( setIsLoading ( false ) ) ;
90
+
91
+ const { data, isLoading : isLoadingGetSearchRequest } = useData < Data > (
92
+ 'getSearch' ,
93
+ ( ) => ContentSearchService . getSearch ( {
94
+ crest,
95
+ dewlap,
96
+ gender,
97
+ genderCategory,
98
+ keyword,
99
+ prices,
100
+ sort,
101
+ tail,
102
+ type,
103
+ favoriteExternalId,
104
+ page
105
+ } ) ,
106
+ [
107
+ crest ,
108
+ dewlap ,
109
+ gender ,
110
+ genderCategory ,
111
+ keyword ,
112
+ prices ,
113
+ sort ,
114
+ tail ,
115
+ type ,
116
+ favoriteExternalId ,
117
+ page
118
+ ] . filter ( Boolean ) ,
119
+ {
120
+ initialData : {
121
+ advertisings : initialData ,
122
+ pages : initialPages
116
123
}
117
- } ) ( ) ;
118
- } , 1000 , [
119
- isFirstAccess ,
120
- crest ,
121
- dewlap ,
122
- gender ,
123
- genderCategory ,
124
- keyword ,
125
- prices ,
126
- sort ,
127
- tail ,
128
- type ,
129
- page ,
130
- favoriteExternalId ,
131
- ] ) ;
124
+ }
125
+ ) ;
126
+
127
+ useEffect ( ( ) => {
128
+ if ( ! data ?. advertisings ?. length ) return ;
129
+
130
+ setAdvertisingsData ( prevAdvertisings => [
131
+ ...prevAdvertisings ,
132
+ ...data ?. advertisings ?. filter ( a =>
133
+ prevAdvertisings . every ( pA => pA . advertising . id !== a . advertising . id )
134
+ ) ?? [ ]
135
+ ] ) ;
136
+ } , [ data ?. advertisings ] ) ;
137
+
138
+ useEffect ( ( ) => {
139
+ dispatch ( setIsLoading ( isLoadingGetSearchRequest ) ) ;
140
+ } , [ isLoadingGetSearchRequest , dispatch ] ) ;
141
+
142
+ useEffect ( ( ) => {
143
+ setTotalPages ( data ?. pages ?? 0 ) ;
144
+ } , [ data ?. pages ] ) ;
132
145
133
146
return useMemo ( ( ) => ( advertisingsData ) ?. map ( ( poultryData : PoultryData ) =>
134
147
poultryDataToSearchAdvertising ( poultryData , favorites )
0 commit comments