Skip to content

Commit 25fb1a5

Browse files
fix: use-dataloader types improvement (#880)
1 parent c201bcc commit 25fb1a5

File tree

6 files changed

+51
-41
lines changed

6 files changed

+51
-41
lines changed

packages/use-dataloader/src/DataLoaderProvider.tsx

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ import { OnErrorFn, PromiseType } from './types'
1717

1818
type CachedData = Record<string, unknown>
1919
type Reloads = Record<string, () => Promise<void | unknown>>
20-
type Requests = Record<string, DataLoader>
20+
type Requests = Record<string, DataLoader<unknown, unknown>>
2121

22-
type UseDataLoaderInitializerArgs<T = unknown> = {
23-
method: () => PromiseType<T>
22+
type UseDataLoaderInitializerArgs<ResultType = unknown> = {
23+
method: () => PromiseType<ResultType>
2424
/**
2525
* Max time before data from previous success is considered as outdated (in millisecond)
2626
*/
@@ -38,19 +38,24 @@ type GetReloadsFn = {
3838
(key?: string): (() => Promise<void | unknown>) | undefined
3939
}
4040

41-
export interface IDataLoaderContext {
42-
addRequest: (key: string, args: UseDataLoaderInitializerArgs) => DataLoader
43-
getOrAddRequest: <T>(
41+
export type IDataLoaderContext = {
42+
addRequest: <ResultType, ErrorType>(
4443
key: string,
45-
args: UseDataLoaderInitializerArgs<T>,
46-
) => DataLoader<T>
44+
args: UseDataLoaderInitializerArgs<ResultType>,
45+
) => DataLoader<ResultType, ErrorType>
46+
getOrAddRequest: <ResultType, ErrorType>(
47+
key: string,
48+
args: UseDataLoaderInitializerArgs<ResultType>,
49+
) => DataLoader<ResultType, ErrorType>
4750
cacheKeyPrefix?: string
4851
onError?: (error: Error) => void | Promise<void>
4952
clearAllCachedData: () => void
5053
clearCachedData: (key: string) => void
5154
getCachedData: GetCachedDataFn
5255
getReloads: GetReloadsFn
53-
getRequest: (key: string) => DataLoader
56+
getRequest: <ResultType, ErrorType>(
57+
key: string,
58+
) => DataLoader<ResultType, ErrorType>
5459
reload: (key?: string) => Promise<void>
5560
reloadAll: () => Promise<void>
5661
}

packages/use-dataloader/src/__tests__/useDataLoader.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { UseDataLoaderConfig } from '../types'
77
import useDataLoader from '../useDataLoader'
88

99
type UseDataLoaderHookProps = {
10-
config: UseDataLoaderConfig<unknown>
10+
config: UseDataLoaderConfig<unknown, unknown>
1111
key: string
1212
method: () => Promise<unknown>
1313
children?: ReactNode

packages/use-dataloader/src/dataloader.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { DEFAULT_MAX_CONCURRENT_REQUESTS, StatusEnum } from './constants'
22
import { PromiseType } from './types'
33

4-
export type DataLoaderConstructorArgs<T = unknown> = {
4+
export type DataLoaderConstructorArgs<ResultType> = {
55
key: string
6-
method: () => PromiseType<T>
6+
method: () => PromiseType<ResultType>
77
enabled?: boolean
88
notifyChanges?: () => void
99
}
1010

11-
class DataLoader<ResultType = unknown, ErrorType = unknown> {
11+
class DataLoader<ResultType, ErrorType> {
1212
public static maxConcurrent = DEFAULT_MAX_CONCURRENT_REQUESTS
1313

1414
public static started = 0

packages/use-dataloader/src/types.ts

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@ export class PromiseType<T = unknown> extends Promise<T> {
22
public cancel?: () => void
33
}
44

5-
export type OnErrorFn = ((err: Error) => void | Promise<void>) | undefined
6-
export type OnSuccessFn<T = unknown> =
7-
| ((result: T) => void | Promise<void>)
5+
export type OnErrorFn<ErrorType = Error> =
6+
| ((err: ErrorType) => void | Promise<void>)
7+
| undefined
8+
export type OnSuccessFn<ResultType> =
9+
| ((result: ResultType) => void | Promise<void>)
810
| undefined
911
export type OnCancelFn = (() => void | Promise<void>) | undefined
10-
export type NeedPollingType<T = unknown> = boolean | ((data?: T) => boolean)
12+
export type NeedPollingType<ResultType> =
13+
| boolean
14+
| ((data?: ResultType) => boolean)
1115

1216
/**
1317
* @typedef {Object} UseDataLoaderConfig
@@ -20,15 +24,15 @@ export type NeedPollingType<T = unknown> = boolean | ((data?: T) => boolean)
2024
* @property {number} [dataLifetime=undefined] Time before data from previous success is considered as outdated (in millisecond)
2125
* @property {NeedPollingType} [needPolling=true] When pollingInterval is set you can set a set a custom callback to know if polling is enabled
2226
*/
23-
export interface UseDataLoaderConfig<T = unknown> {
27+
export interface UseDataLoaderConfig<ResultType, ErrorType> {
2428
enabled?: boolean
25-
initialData?: T
29+
initialData?: ResultType
2630
keepPreviousData?: boolean
27-
onError?: OnErrorFn
28-
onSuccess?: OnSuccessFn
31+
onError?: OnErrorFn<ErrorType>
32+
onSuccess?: OnSuccessFn<ResultType>
2933
pollingInterval?: number
3034
dataLifetime?: number
31-
needPolling?: NeedPollingType<T>
35+
needPolling?: NeedPollingType<ResultType>
3236
}
3337

3438
/**
@@ -43,15 +47,15 @@ export interface UseDataLoaderConfig<T = unknown> {
4347
* @property {string} error the error occured during the request
4448
* @property {Function} reload reload the data
4549
*/
46-
export interface UseDataLoaderResult<T = unknown, ErrorType = Error> {
47-
data?: T
50+
export interface UseDataLoaderResult<ResultType, ErrorType> {
51+
data?: ResultType
4852
error?: ErrorType
4953
isError: boolean
5054
isIdle: boolean
5155
isLoading: boolean
5256
isPolling: boolean
5357
isSuccess: boolean
54-
previousData?: T
58+
previousData?: ResultType
5559
reload: () => Promise<void>
5660
}
5761

@@ -63,16 +67,16 @@ export type UsePaginatedDataLoaderMethodParams = {
6367
perPage: number
6468
}
6569

66-
export type UsePaginatedDataLoaderConfig<T = unknown> =
67-
UseDataLoaderConfig<T> & {
70+
export type UsePaginatedDataLoaderConfig<ResultType, ErrorType> =
71+
UseDataLoaderConfig<ResultType, ErrorType> & {
6872
initialPage?: number
6973
perPage?: number
7074
}
7175

72-
export type UsePaginatedDataLoaderResult<T = unknown> = {
73-
pageData?: T
74-
data?: Record<number, T | undefined>
75-
error?: Error
76+
export type UsePaginatedDataLoaderResult<ResultType, ErrorType> = {
77+
pageData?: ResultType
78+
data?: Record<number, ResultType | undefined>
79+
error?: ErrorType
7680
isError: boolean
7781
isIdle: boolean
7882
isLoading: boolean

packages/use-dataloader/src/useDataLoader.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
22
import { useDataLoaderContext } from './DataLoaderProvider'
33
import { StatusEnum } from './constants'
4-
import DataLoader from './dataloader'
54
import { PromiseType, UseDataLoaderConfig, UseDataLoaderResult } from './types'
65

7-
function useDataLoader<ResultType, ErrorType = Error>(
6+
function useDataLoader<ResultType = unknown, ErrorType = Error>(
87
fetchKey: string,
98
method: () => PromiseType<ResultType>,
109
{
@@ -16,7 +15,7 @@ function useDataLoader<ResultType, ErrorType = Error>(
1615
pollingInterval,
1716
initialData,
1817
dataLifetime,
19-
}: UseDataLoaderConfig<ResultType> = {},
18+
}: UseDataLoaderConfig<ResultType, ErrorType> = {},
2019
): UseDataLoaderResult<ResultType, ErrorType> {
2120
const { getOrAddRequest, onError: onGlobalError } = useDataLoaderContext()
2221
const methodRef = useRef(method)
@@ -28,10 +27,10 @@ function useDataLoader<ResultType, ErrorType = Error>(
2827
setCounter(current => current + 1)
2928
}, [])
3029

31-
const request = getOrAddRequest(fetchKey, {
30+
const request = getOrAddRequest<ResultType, ErrorType>(fetchKey, {
3231
enabled,
3332
method: methodRef.current,
34-
}) as DataLoader<ResultType, ErrorType>
33+
})
3534

3635
useEffect(() => {
3736
request.addObserver(forceRerender)

packages/use-dataloader/src/usePaginatedDataLoader.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@ import useDataLoader from './useDataLoader'
1414
* @param {useDataLoaderConfig} config hook configuration
1515
* @returns {useDataLoaderResult} hook result containing data, request state, and method to reload the data
1616
*/
17-
const usePaginatedDataLoader = <T>(
17+
const usePaginatedDataLoader = <ResultType, ErrorType>(
1818
baseFetchKey: string,
19-
method: (params: UsePaginatedDataLoaderMethodParams) => PromiseType<T>,
19+
method: (
20+
params: UsePaginatedDataLoaderMethodParams,
21+
) => PromiseType<ResultType>,
2022
{
2123
enabled = true,
2224
initialData,
@@ -28,13 +30,13 @@ const usePaginatedDataLoader = <T>(
2830
needPolling,
2931
initialPage,
3032
perPage = 1,
31-
}: UsePaginatedDataLoaderConfig<T> = {},
32-
): UsePaginatedDataLoaderResult<T> => {
33+
}: UsePaginatedDataLoaderConfig<ResultType, ErrorType> = {},
34+
): UsePaginatedDataLoaderResult<ResultType, ErrorType> => {
3335
if (typeof baseFetchKey !== 'string') {
3436
throw new Error(KEY_IS_NOT_STRING_ERROR)
3537
}
3638

37-
const [data, setData] = useState<Record<number, T | undefined>>({})
39+
const [data, setData] = useState<Record<number, ResultType | undefined>>({})
3840
const [page, setPage] = useState<number>(initialPage ?? 1)
3941

4042
const pageMethod = useCallback(

0 commit comments

Comments
 (0)