mirror of
https://github.com/tooot-app/app
synced 2025-06-05 22:19:13 +02:00
619 restructure local storage (#628)
* To MMKV migration working * POC migrated font size settings * Moved settings to mmkv * Fix typos * Migrated contexts slice * Migrated app slice * POC instance emoji update * Migrated drafts * Migrated simple instance properties * All migrated! * Re-structure files * Tolerant of undefined settings * Can properly logging in and out including empty state
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
import apiInstance from '@api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
import { QueryFunctionContext, useQuery, UseQueryOptions } from '@tanstack/react-query'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
|
||||
export type QueryKeyAccount = ['Account', { id: Mastodon.Account['id'] }]
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
import apiInstance from '@api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
import {
|
||||
QueryFunctionContext,
|
||||
useMutation,
|
||||
UseMutationOptions,
|
||||
useQuery,
|
||||
UseQueryOptions
|
||||
QueryFunctionContext,
|
||||
useMutation,
|
||||
UseMutationOptions,
|
||||
useQuery,
|
||||
UseQueryOptions
|
||||
} from '@tanstack/react-query'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
|
||||
type QueryKeyAnnouncement = ['Announcements', { showAll?: boolean }]
|
||||
|
||||
|
@ -1,14 +1,14 @@
|
||||
import apiGeneral from '@api/general'
|
||||
import apiInstance from '@api/instance'
|
||||
import {
|
||||
QueryFunctionContext,
|
||||
useMutation,
|
||||
UseMutationOptions,
|
||||
useQuery,
|
||||
UseQueryOptions
|
||||
} from '@tanstack/react-query'
|
||||
import apiGeneral from '@utils/api/general'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
import * as AuthSession from 'expo-auth-session'
|
||||
import {
|
||||
QueryFunctionContext,
|
||||
useMutation,
|
||||
UseMutationOptions,
|
||||
useQuery,
|
||||
UseQueryOptions
|
||||
} from '@tanstack/react-query'
|
||||
|
||||
export type QueryKeyApps = ['Apps']
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import apiInstance from '@api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
import { useQuery, UseQueryOptions } from '@tanstack/react-query'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { getAccountStorage, setAccountStorage } from '@utils/storage/actions'
|
||||
import { AxiosError } from 'axios'
|
||||
|
||||
type QueryKeyEmojis = ['Emojis']
|
||||
|
||||
@ -12,13 +13,30 @@ const queryFunction = async () => {
|
||||
return res.body
|
||||
}
|
||||
|
||||
const useEmojisQuery = ({
|
||||
options
|
||||
}: {
|
||||
options?: UseQueryOptions<Mastodon.Emoji[], AxiosError>
|
||||
}) => {
|
||||
const useEmojisQuery = (params?: { options?: UseQueryOptions<Mastodon.Emoji[], AxiosError> }) => {
|
||||
const queryKey: QueryKeyEmojis = ['Emojis']
|
||||
return useQuery(queryKey, queryFunction, options)
|
||||
return useQuery(queryKey, queryFunction, {
|
||||
...params?.options,
|
||||
staleTime: Infinity,
|
||||
cacheTime: Infinity,
|
||||
onSuccess: data => {
|
||||
if (!data.length) return
|
||||
|
||||
const currEmojis = getAccountStorage.object('emojis_frequent')
|
||||
if (!Array.isArray(currEmojis)) {
|
||||
setAccountStorage([{ key: 'emojis_frequent', value: [] }])
|
||||
} else {
|
||||
setAccountStorage([
|
||||
{
|
||||
key: 'emojis_frequent',
|
||||
value: currEmojis?.filter(emoji =>
|
||||
data.find(e => e.shortcode === emoji.emoji.shortcode)
|
||||
)
|
||||
}
|
||||
])
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export { useEmojisQuery }
|
||||
|
24
src/utils/queryHooks/filters.ts
Normal file
24
src/utils/queryHooks/filters.ts
Normal file
@ -0,0 +1,24 @@
|
||||
import { useQuery, UseQueryOptions } from '@tanstack/react-query'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
|
||||
export type QueryKeyFilters = ['Filters']
|
||||
|
||||
const queryFunction = () =>
|
||||
apiInstance<Mastodon.Filter<'v1'>[]>({
|
||||
method: 'get',
|
||||
url: 'filters'
|
||||
}).then(res => res.body)
|
||||
|
||||
const useFiltersQuery = (params?: {
|
||||
options: UseQueryOptions<Mastodon.Filter<'v1'>[], AxiosError>
|
||||
}) => {
|
||||
const queryKey: QueryKeyFilters = ['Filters']
|
||||
return useQuery(queryKey, queryFunction, {
|
||||
...params?.options,
|
||||
staleTime: Infinity,
|
||||
cacheTime: Infinity
|
||||
})
|
||||
}
|
||||
|
||||
export { useFiltersQuery }
|
21
src/utils/queryHooks/index.ts
Normal file
21
src/utils/queryHooks/index.ts
Normal file
@ -0,0 +1,21 @@
|
||||
import { QueryClient } from '@tanstack/react-query'
|
||||
|
||||
const queryClient = new QueryClient({
|
||||
defaultOptions: {
|
||||
queries: {
|
||||
staleTime: 1000 * 60 * 5,
|
||||
retry: (failureCount, error: any) => {
|
||||
if (error?.status === 404) {
|
||||
return false
|
||||
}
|
||||
if (failureCount <= 3) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
export default queryClient
|
@ -1,36 +1,66 @@
|
||||
import apiGeneral from '@api/general'
|
||||
import { AxiosError } from 'axios'
|
||||
import { QueryFunctionContext, useQuery, UseQueryOptions } from '@tanstack/react-query'
|
||||
import apiGeneral from '@utils/api/general'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { featureCheck } from '@utils/helpers/featureCheck'
|
||||
import { setAccountStorage } from '@utils/storage/actions'
|
||||
import { AxiosError } from 'axios'
|
||||
|
||||
export type QueryKeyInstance = ['Instance', { domain?: string }]
|
||||
export type QueryKeyInstance = ['Instance'] | ['Instance', { domain?: string }]
|
||||
|
||||
const queryFunction = async ({
|
||||
queryKey
|
||||
}: QueryFunctionContext<QueryKeyInstance>) => {
|
||||
const { domain } = queryKey[1]
|
||||
if (!domain) {
|
||||
return Promise.reject()
|
||||
const queryFunction = async ({ queryKey }: QueryFunctionContext<QueryKeyInstance>) => {
|
||||
const domain = queryKey[1]?.domain
|
||||
if (domain) {
|
||||
return await apiGeneral<Mastodon.Instance<'v2'>>({
|
||||
method: 'get',
|
||||
domain,
|
||||
url: 'api/v2/instance'
|
||||
})
|
||||
.then(res => res.body)
|
||||
.catch(
|
||||
async () =>
|
||||
await apiGeneral<Mastodon.Instance<'v1'>>({
|
||||
method: 'get',
|
||||
domain,
|
||||
url: 'api/v1/instance'
|
||||
}).then(res => res.body)
|
||||
)
|
||||
} else {
|
||||
const hasInstanceNewPath = featureCheck('instance_new_path')
|
||||
return hasInstanceNewPath
|
||||
? await apiInstance<Mastodon.Instance<'v2'>>({
|
||||
method: 'get',
|
||||
version: 'v2',
|
||||
url: 'instance'
|
||||
})
|
||||
.then(res => res.body)
|
||||
.catch(
|
||||
async () =>
|
||||
await apiInstance<Mastodon.Instance<'v1'>>({
|
||||
method: 'get',
|
||||
version: 'v1',
|
||||
url: 'instance'
|
||||
}).then(res => res.body)
|
||||
)
|
||||
: await apiInstance<Mastodon.Instance<'v1'>>({
|
||||
method: 'get',
|
||||
version: 'v1',
|
||||
url: 'instance'
|
||||
}).then(res => res.body)
|
||||
}
|
||||
|
||||
const res = await apiGeneral<Mastodon.Instance>({
|
||||
method: 'get',
|
||||
domain: domain,
|
||||
url: `api/v1/instance`
|
||||
})
|
||||
return res.body
|
||||
}
|
||||
|
||||
const useInstanceQuery = ({
|
||||
options,
|
||||
...queryKeyParams
|
||||
}: QueryKeyInstance[1] & {
|
||||
options?: UseQueryOptions<
|
||||
Mastodon.Instance & { publicAllow?: boolean },
|
||||
AxiosError
|
||||
>
|
||||
}) => {
|
||||
const queryKey: QueryKeyInstance = ['Instance', { ...queryKeyParams }]
|
||||
return useQuery(queryKey, queryFunction, options)
|
||||
const useInstanceQuery = (
|
||||
params?: QueryKeyInstance[1] & {
|
||||
options?: UseQueryOptions<Mastodon.Instance<any>, AxiosError>
|
||||
}
|
||||
) => {
|
||||
const queryKey: QueryKeyInstance = params?.domain ? ['Instance', params] : ['Instance']
|
||||
return useQuery(queryKey, queryFunction, {
|
||||
...params?.options,
|
||||
staleTime: Infinity,
|
||||
cacheTime: Infinity,
|
||||
onSuccess: data => setAccountStorage([{ key: 'version', value: data.version }])
|
||||
})
|
||||
}
|
||||
|
||||
export { useInstanceQuery }
|
||||
|
@ -1,15 +1,15 @@
|
||||
import apiInstance from '@api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
import {
|
||||
QueryFunctionContext,
|
||||
useInfiniteQuery,
|
||||
UseInfiniteQueryOptions,
|
||||
useMutation,
|
||||
UseMutationOptions,
|
||||
useQuery,
|
||||
UseQueryOptions
|
||||
QueryFunctionContext,
|
||||
useInfiniteQuery,
|
||||
UseInfiniteQueryOptions,
|
||||
useMutation,
|
||||
UseMutationOptions,
|
||||
useQuery,
|
||||
UseQueryOptions
|
||||
} from '@tanstack/react-query'
|
||||
import { PagedResponse } from '@api/helpers'
|
||||
import { PagedResponse } from '@utils/api/helpers'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
|
||||
export type QueryKeyLists = ['Lists']
|
||||
|
||||
|
27
src/utils/queryHooks/preferences.ts
Normal file
27
src/utils/queryHooks/preferences.ts
Normal file
@ -0,0 +1,27 @@
|
||||
import { useQuery, UseQueryOptions } from '@tanstack/react-query'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { getAccountStorage, setAccountStorage } from '@utils/storage/actions'
|
||||
import { AxiosError } from 'axios'
|
||||
|
||||
export type QueryKeyPreferences = ['Preferences']
|
||||
|
||||
const queryFunction = () =>
|
||||
apiInstance<Mastodon.Preferences>({
|
||||
method: 'get',
|
||||
url: 'preferences'
|
||||
}).then(res => res.body)
|
||||
|
||||
const usePreferencesQuery = (params?: {
|
||||
options: UseQueryOptions<Mastodon.Preferences, AxiosError>
|
||||
}) => {
|
||||
const queryKey: QueryKeyPreferences = ['Preferences']
|
||||
return useQuery(queryKey, queryFunction, {
|
||||
...params?.options,
|
||||
staleTime: Infinity,
|
||||
cacheTime: Infinity,
|
||||
initialData: getAccountStorage.object('preferences'),
|
||||
onSuccess: data => setAccountStorage([{ key: 'preferences', value: data }])
|
||||
})
|
||||
}
|
||||
|
||||
export { usePreferencesQuery }
|
@ -1,12 +1,12 @@
|
||||
import apiInstance from '@api/instance'
|
||||
import haptics from '@components/haptics'
|
||||
import { displayMessage } from '@components/Message'
|
||||
import queryClient from '@helpers/queryClient'
|
||||
import { useMutation, useQuery, UseQueryOptions } from '@tanstack/react-query'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import queryClient from '@utils/queryHooks'
|
||||
import { AxiosError } from 'axios'
|
||||
import i18next from 'i18next'
|
||||
import { RefObject } from 'react'
|
||||
import FlashMessage from 'react-native-flash-message'
|
||||
import { useMutation, useQuery, UseQueryOptions } from '@tanstack/react-query'
|
||||
|
||||
type AccountWithSource = Mastodon.Account & Required<Pick<Mastodon.Account, 'source'>>
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
import apiInstance from '@api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
import {
|
||||
QueryFunctionContext,
|
||||
useMutation,
|
||||
UseMutationOptions,
|
||||
useQuery,
|
||||
UseQueryOptions
|
||||
QueryFunctionContext,
|
||||
useMutation,
|
||||
UseMutationOptions,
|
||||
useQuery,
|
||||
UseQueryOptions
|
||||
} from '@tanstack/react-query'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
|
||||
export type QueryKeyRelationship = ['Relationship', { id: Mastodon.Account['id'] }]
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
import apiInstance from '@api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
import { useQuery, UseQueryOptions } from '@tanstack/react-query'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
|
||||
export type QueryKeyRules = ['Rules']
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
import apiInstance from '@api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
import { QueryFunctionContext, useQuery, UseQueryOptions } from '@tanstack/react-query'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
|
||||
export type QueryKeySearch = [
|
||||
'Search',
|
||||
|
@ -1,6 +1,6 @@
|
||||
import apiInstance from '@api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
import { QueryFunctionContext, useQuery, UseQueryOptions } from '@tanstack/react-query'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
|
||||
export type QueryKeyStatus = ['Status', { id: Mastodon.Status['id'] }]
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
import apiInstance from '@api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
import { QueryFunctionContext, useQuery, UseQueryOptions } from '@tanstack/react-query'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
|
||||
export type QueryKeyStatusesHistory = [
|
||||
'StatusesHistory',
|
||||
|
@ -1,5 +1,3 @@
|
||||
import apiInstance from '@api/instance'
|
||||
import { AxiosError } from 'axios'
|
||||
import {
|
||||
QueryFunctionContext,
|
||||
useInfiniteQuery,
|
||||
@ -9,10 +7,11 @@ import {
|
||||
useQuery,
|
||||
UseQueryOptions
|
||||
} from '@tanstack/react-query'
|
||||
import { PagedResponse } from '@utils/api/helpers'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { featureCheck } from '@utils/helpers/featureCheck'
|
||||
import { AxiosError } from 'axios'
|
||||
import { infinitePageParams } from './utils'
|
||||
import { PagedResponse } from '@api/helpers'
|
||||
import { useSelector } from 'react-redux'
|
||||
import { checkInstanceFeature } from '@utils/slices/instancesSlice'
|
||||
|
||||
export type QueryKeyFollowedTags = ['FollowedTags']
|
||||
const useFollowedTagsQuery = (
|
||||
@ -23,7 +22,7 @@ const useFollowedTagsQuery = (
|
||||
>
|
||||
} | void
|
||||
) => {
|
||||
const canFollowTags = useSelector(checkInstanceFeature('follow_tags'))
|
||||
const canFollowTags = featureCheck('follow_tags')
|
||||
|
||||
const queryKey: QueryKeyFollowedTags = ['FollowedTags']
|
||||
return useInfiniteQuery(
|
||||
|
@ -1,21 +1,21 @@
|
||||
import apiInstance from '@api/instance'
|
||||
import haptics from '@components/haptics'
|
||||
import queryClient from '@helpers/queryClient'
|
||||
import { store } from '@root/store'
|
||||
import { checkInstanceFeature, getInstanceNotificationsFilter } from '@utils/slices/instancesSlice'
|
||||
import {
|
||||
MutationOptions,
|
||||
QueryFunctionContext,
|
||||
useInfiniteQuery,
|
||||
UseInfiniteQueryOptions,
|
||||
useMutation
|
||||
} from '@tanstack/react-query'
|
||||
import { PagedResponse } from '@utils/api/helpers'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { featureCheck } from '@utils/helpers/featureCheck'
|
||||
import queryClient from '@utils/queryHooks'
|
||||
import { getAccountStorage } from '@utils/storage/actions'
|
||||
import { AxiosError } from 'axios'
|
||||
import { uniqBy } from 'lodash'
|
||||
import {
|
||||
MutationOptions,
|
||||
QueryFunctionContext,
|
||||
useInfiniteQuery,
|
||||
UseInfiniteQueryOptions,
|
||||
useMutation
|
||||
} from '@tanstack/react-query'
|
||||
import deleteItem from './timeline/deleteItem'
|
||||
import editItem from './timeline/editItem'
|
||||
import updateStatusProperty from './timeline/updateStatusProperty'
|
||||
import { PagedResponse } from '@api/helpers'
|
||||
|
||||
export type QueryKeyTimeline = [
|
||||
'Timeline',
|
||||
@ -82,7 +82,6 @@ const queryFunction = async ({ queryKey, pageParam }: QueryFunctionContext<Query
|
||||
})
|
||||
|
||||
case 'Local':
|
||||
console.log('local', params)
|
||||
return apiInstance<Mastodon.Status[]>({
|
||||
method: 'get',
|
||||
url: 'timelines/public',
|
||||
@ -100,7 +99,6 @@ const queryFunction = async ({ queryKey, pageParam }: QueryFunctionContext<Query
|
||||
})
|
||||
|
||||
case 'Trending':
|
||||
console.log('trending', params)
|
||||
return apiInstance<Mastodon.Status[]>({
|
||||
method: 'get',
|
||||
url: 'trends/statuses',
|
||||
@ -108,11 +106,8 @@ const queryFunction = async ({ queryKey, pageParam }: QueryFunctionContext<Query
|
||||
})
|
||||
|
||||
case 'Notifications':
|
||||
const rootStore = store.getState()
|
||||
const notificationsFilter = getInstanceNotificationsFilter(rootStore)
|
||||
const usePositiveFilter = checkInstanceFeature('notification_types_positive_filter')(
|
||||
rootStore
|
||||
)
|
||||
const notificationsFilter = getAccountStorage.object('notifications')
|
||||
const usePositiveFilter = featureCheck('notification_types_positive_filter')
|
||||
return apiInstance<Mastodon.Notification[]>({
|
||||
method: 'get',
|
||||
url: 'notifications',
|
||||
|
@ -1,5 +1,5 @@
|
||||
import queryClient from '@helpers/queryClient'
|
||||
import { InfiniteData } from '@tanstack/react-query'
|
||||
import queryClient from '@utils/queryHooks'
|
||||
import { MutationVarsTimelineDeleteItem } from '../timeline'
|
||||
|
||||
const deleteItem = ({
|
||||
|
@ -1,5 +1,5 @@
|
||||
import queryClient from '@helpers/queryClient'
|
||||
import { InfiniteData } from '@tanstack/react-query'
|
||||
import queryClient from '@utils/queryHooks'
|
||||
import { MutationVarsTimelineEditItem } from '../timeline'
|
||||
|
||||
const editItem = ({
|
||||
|
@ -1,5 +1,5 @@
|
||||
import queryClient from '@helpers/queryClient'
|
||||
import { InfiniteData } from '@tanstack/react-query'
|
||||
import queryClient from '@utils/queryHooks'
|
||||
import { MutationVarsTimelineUpdateStatusProperty, TimelineData } from '../timeline'
|
||||
import updateConversation from './update/conversation'
|
||||
import updateNotification from './update/notification'
|
||||
|
@ -1,7 +1,7 @@
|
||||
import apiTooot from '@api/tooot'
|
||||
import haptics from '@components/haptics'
|
||||
import { AxiosError } from 'axios'
|
||||
import { QueryFunctionContext, useQuery, UseQueryOptions } from '@tanstack/react-query'
|
||||
import apiTooot from '@utils/api/tooot'
|
||||
import { AxiosError } from 'axios'
|
||||
|
||||
type Translations =
|
||||
| {
|
||||
|
@ -1,13 +1,12 @@
|
||||
import apiInstance from '@api/instance'
|
||||
import { store } from '@root/store'
|
||||
import { checkInstanceFeature } from '@utils/slices/instancesSlice'
|
||||
import { AxiosError } from 'axios'
|
||||
import { QueryFunctionContext, useQuery, UseQueryOptions } from '@tanstack/react-query'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { featureCheck } from '@utils/helpers/featureCheck'
|
||||
import { AxiosError } from 'axios'
|
||||
|
||||
export type QueryKeyTrends = ['Trends', { type: 'tags' | 'statuses' | 'links' }]
|
||||
|
||||
const queryFunction = ({ queryKey }: QueryFunctionContext<QueryKeyTrends>) => {
|
||||
const trendsNewPath = checkInstanceFeature('trends_new_path')(store.getState())
|
||||
const trendsNewPath = featureCheck('trends_new_path')
|
||||
|
||||
if (!trendsNewPath && queryKey[1].type !== 'tags') {
|
||||
return []
|
||||
|
@ -1,14 +1,14 @@
|
||||
import apiInstance from '@api/instance'
|
||||
import {
|
||||
QueryFunctionContext,
|
||||
useInfiniteQuery,
|
||||
UseInfiniteQueryOptions
|
||||
} from '@tanstack/react-query'
|
||||
import apiGeneral from '@utils/api/general'
|
||||
import { PagedResponse } from '@utils/api/helpers'
|
||||
import apiInstance from '@utils/api/instance'
|
||||
import { getHost } from '@utils/helpers/urlMatcher'
|
||||
import { TabSharedStackParamList } from '@utils/navigation/navigators'
|
||||
import { AxiosError } from 'axios'
|
||||
import {
|
||||
QueryFunctionContext,
|
||||
useInfiniteQuery,
|
||||
UseInfiniteQueryOptions
|
||||
} from '@tanstack/react-query'
|
||||
import apiGeneral from '@api/general'
|
||||
import { PagedResponse } from '@api/helpers'
|
||||
import { getHost } from '@helpers/urlMatcher'
|
||||
|
||||
export type QueryKeyUsers = ['Users', TabSharedStackParamList['Tab-Shared-Users']]
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { PagedResponse } from '@api/helpers'
|
||||
import { PagedResponse } from '@utils/api/helpers'
|
||||
|
||||
export const infinitePageParams = {
|
||||
getPreviousPageParam: (firstPage: PagedResponse<any>) =>
|
||||
|
Reference in New Issue
Block a user