@@ -30,27 +30,35 @@ export type SearchItemType = {
3030 isArchived ?: boolean ,
3131} ;
3232
33+ const LIMIT = 5 ;
34+
3335const USERS = gql `
34- query UserOptions($search: String) {
35- users(filters: { search: $search }, pagination: { limit: 5 , offset: 0 }) {
36+ query UserOptions($search: String, $offset: Int!, $limit: Int! ) {
37+ users(filters: { search: $search }, pagination: { limit: $limit , offset: $offset }) {
3638 items {
39+ id
3740 userId
3841 username
3942 }
4043 count
44+ offset
45+ limit
4146 }
4247}
4348` ;
4449
4550const USER_GROUPS = gql `
46- query UserGroupOptions($search: String) {
47- userGroups(filters: { search: $search }, pagination: { limit: 5 , offset: 0 }) {
51+ query UserGroupOptions($search: String, $offset: Int!, $limit: Int! ) {
52+ userGroups(filters: { search: $search }, pagination: { limit: $limit , offset: $offset }) {
4853 items {
54+ id
4955 isArchived
5056 userGroupId
5157 name
5258 }
5359 count
60+ offset
61+ limit
5462 }
5563}
5664` ;
@@ -135,17 +143,19 @@ function ItemSelectInput<Name extends string>(props: ItemSelectInputProps<Name>)
135143
136144 const [ opened , setOpened ] = useState ( false ) ;
137145 const [ searchText , setSearchText ] = useState < string > ( '' ) ;
138-
139146 const debouncedSearchText = useDebouncedValue ( searchText ) ;
140147
141148 const variables = useMemo ( ( ) => ( {
142149 search : debouncedSearchText ,
150+ offset : 0 ,
151+ limit : LIMIT ,
143152 } ) , [ debouncedSearchText ] ) ;
144153
145154 const {
146155 previousData : previousUserData ,
147156 data : userData = previousUserData ,
148157 loading : userDataLoading ,
158+ fetchMore : fetchMoreUser ,
149159 } = useQuery < UserOptionsQuery , UserOptionsQueryVariables > (
150160 USERS ,
151161 {
@@ -158,6 +168,7 @@ function ItemSelectInput<Name extends string>(props: ItemSelectInputProps<Name>)
158168 previousData : previousUserGroupData ,
159169 data : userGroupData = previousUserGroupData ,
160170 loading : userGroupDataLoading ,
171+ fetchMore : fetchMoreUserGroup ,
161172 } = useQuery < UserGroupOptionsQuery , UserGroupOptionsQueryVariables > (
162173 USER_GROUPS ,
163174 {
@@ -168,8 +179,14 @@ function ItemSelectInput<Name extends string>(props: ItemSelectInputProps<Name>)
168179
169180 const loading = userDataLoading || userGroupDataLoading ;
170181 const count = ( userData ?. users . count ?? 0 ) + ( userGroupData ?. userGroups . count ?? 0 ) ;
171- const usersData = userData ?. users . items ;
172- const userGroupsData = userGroupData ?. userGroups . items ;
182+ const usersData = useMemo (
183+ ( ) => userData ?. users . items ,
184+ [ userData ?. users . items ] ,
185+ ) ;
186+ const userGroupsData = useMemo (
187+ ( ) => userGroupData ?. userGroups . items ,
188+ [ userGroupData ?. userGroups . items ] ,
189+ ) ;
173190
174191 const data : SearchItemType [ ] = useMemo (
175192 ( ) => ( [
@@ -198,7 +215,6 @@ function ItemSelectInput<Name extends string>(props: ItemSelectInputProps<Name>)
198215
199216 const optionRendererParams = useCallback (
200217 ( _ : number | string , option : SearchItemType ) => {
201- // const isActive = key === selectedItem;
202218 const isActive = false ;
203219
204220 return {
@@ -209,32 +225,85 @@ function ItemSelectInput<Name extends string>(props: ItemSelectInputProps<Name>)
209225 } ;
210226 } ,
211227 [ ] ,
212- // [selectedItem],
228+ ) ;
229+
230+ const handleShowMoreClick = useCallback (
231+ ( ) => {
232+ fetchMoreUser ( {
233+ variables : {
234+ offset : ( userData ?. users . offset ?? 0 ) + LIMIT ,
235+ } ,
236+ updateQuery : ( previousResult , { fetchMoreResult } ) => {
237+ const oldUsers = previousResult ;
238+ const newUsers = fetchMoreResult ;
239+
240+ if ( ! newUsers ) {
241+ return previousResult ;
242+ }
243+
244+ return ( {
245+ users : {
246+ ...newUsers . users ,
247+ items : [
248+ ...oldUsers . users ?. items ?? [ ] ,
249+ ...newUsers . users ?. items ?? [ ] ,
250+ ] ,
251+ } ,
252+ } ) ;
253+ } ,
254+ } ) ;
255+ fetchMoreUserGroup ( {
256+ variables : {
257+ offset : ( userGroupData ?. userGroups . offset ?? 0 ) + LIMIT ,
258+ } ,
259+ updateQuery : ( previousResult , { fetchMoreResult } ) => {
260+ const oldUserGroups = previousResult ;
261+ const newUserGroups = fetchMoreResult ;
262+
263+ if ( ! newUserGroups ) {
264+ return previousResult ;
265+ }
266+
267+ return ( {
268+ userGroups : {
269+ ...newUserGroups . userGroups ,
270+ items : [
271+ ...oldUserGroups . userGroups . items ?? [ ] ,
272+ ...newUserGroups . userGroups . items ?? [ ] ,
273+ ] ,
274+ } ,
275+ } ) ;
276+ } ,
277+ } ) ;
278+ } , [
279+ fetchMoreUser ,
280+ fetchMoreUserGroup ,
281+ userData ?. users . offset ,
282+ userGroupData ?. userGroups . offset ,
283+ ] ,
213284 ) ;
214285
215286 return (
216287 < SearchSelectInput
217288 { ...otherProps }
289+ className = { className }
218290 name = "item-select-input"
219291 icons = { (
220292 < IoSearch />
221293 ) }
222294 optionRendererParams = { optionRendererParams }
223295 optionRenderer = { Option }
224296 options = { [ ] }
225- // onOptionsChange={setItemOptions}
226- // value={selectedItem}
227297 value = { undefined }
228298 onChange = { handleSelectItem }
229- // Other props
230- className = { className }
231299 keySelector = { keySelector }
232300 labelSelector = { titleSelector }
233301 onSearchValueChange = { setSearchText }
234302 onShowDropdownChange = { setOpened }
235303 searchOptions = { data }
236304 optionsPending = { loading }
237305 totalOptionsCount = { count }
306+ handleShowMoreClick = { handleShowMoreClick }
238307 />
239308 ) ;
240309}
0 commit comments