Skip to content

Commit

Permalink
Fix useAllPaginated query C-2980 (#3924)
Browse files Browse the repository at this point in the history
Co-authored-by: Nikki Kang <kangaroo233@gmail.com>
  • Loading branch information
nicoback2 and nicoback committed Aug 22, 2023
1 parent 21eb35c commit 4e0c480
Showing 1 changed file with 34 additions and 11 deletions.
45 changes: 34 additions & 11 deletions packages/common/src/audius-query/hooks/usePaginatedQuery.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { useCallback, useEffect, useState } from 'react'
import { useCallback, useState } from 'react'

import { isEqual } from 'lodash'
import { useCustomCompareEffect } from 'react-use'

import { Status } from 'models/Status'
import { Status, statusIsNotFinalized } from 'models/Status'

import { QueryHookOptions, QueryHookResults } from '../types'

Expand Down Expand Up @@ -55,6 +55,7 @@ export const useAllPaginatedQuery = <
baseArgs: Omit<ArgsType, 'limit' | 'offset'>,
options: { pageSize: number } & QueryHookOptions
) => {
const [loadingMore, setLoadingMore] = useState(false)
const { pageSize, ...queryHookOptions } = options
const [page, setPage] = useState(0)
const [allData, setAllData] = useState<Data[]>([])
Expand All @@ -64,28 +65,50 @@ export const useAllPaginatedQuery = <
offset: page * pageSize
} as ArgsType
const result = useQueryHook(args, queryHookOptions)
useEffect(() => {
if (result.status !== Status.SUCCESS) return
setAllData((allData) => [...allData, ...result.data])
}, [result.status, result.data])

useCustomCompareEffect(
() => {
setAllData([])
setLoadingMore(false)
},
[baseArgs],
isEqual
)

useCustomCompareEffect(
() => {
if (!statusIsNotFinalized(result.status)) {
setLoadingMore(false)
}
if (result.status !== Status.SUCCESS) return
setAllData((allData) => [...allData, ...result.data])
},
[result.status, args],
isEqual
)

const notError = result.status !== Status.ERROR
const notStarted = result.status === Status.IDLE && allData.length === 0
const hasNotFetched = !result.data && result.status !== Status.SUCCESS
const fetchedFullPreviousPage = result.data?.length === pageSize

const hasMore =
notError && (notStarted || hasNotFetched || fetchedFullPreviousPage)

const loadMore = useCallback(() => {
if (loadingMore) {
return
}
setLoadingMore(true)
setPage(page + 1)
}, [loadingMore, page])

return {
...result,
// TODO: add another status for reloading
status: allData?.length > 0 ? Status.SUCCESS : result.status,
data: allData,
loadMore: () => setPage(page + 1),
hasMore:
result.status === Status.IDLE ||
(!result.data && result.status === Status.LOADING) ||
result.data?.length === pageSize
loadMore,
hasMore
}
}

0 comments on commit 4e0c480

Please sign in to comment.