Skip to content

Commit 9423cda

Browse files
committed
fix: improve types for useDataQuery
1 parent fbcbaa9 commit 9423cda

3 files changed

Lines changed: 46 additions & 10 deletions

File tree

services/data/src/engine/types/Query.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,16 @@ export interface ResolvedResourceQuery extends ResourceQuery {
2121
export type Query = Record<string, ResourceQuery>
2222
export type QueryResult = JsonMap
2323

24+
export type DataResultForQuery<TQuery = Query> = {
25+
[key in keyof TQuery]: JsonMap
26+
}
27+
28+
export type GetModelTypesForQuery<TQuery extends Query, Models> = {
29+
[K in keyof TQuery]: TQuery[K]['resource'] extends keyof Models
30+
? Models[TQuery[K]['resource']]
31+
: JsonMap
32+
}
33+
2434
export interface QueryOptions {
2535
variables?: QueryVariables
2636
onComplete?: (data: QueryResult) => void

services/data/src/react/hooks/useDataQuery.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
1+
import {
2+
DataResultForQuery,
3+
QueryResultForQuery,
4+
} from './../../engine/types/Query'
15
import { useState, useRef, useCallback, useDebugValue } from 'react'
26
import { useQuery, setLogger } from 'react-query'
37
import type {
48
Query,
59
QueryOptions,
610
QueryResult,
11+
QueryResultForQuery,
712
QueryVariables,
813
} from '../../engine'
914
import type { FetchError } from '../../engine/types/FetchError'
10-
import type { QueryRenderInput, QueryRefetchFunction } from '../../types'
15+
import type {
16+
QueryRenderInput,
17+
QueryRefetchFunction,
18+
UseDataQueryResult,
19+
UseDataQueryResultWithModels,
20+
} from '../../types'
1121
import { mergeAndCompareVariables } from './mergeAndCompareVariables'
1222
import { useDataEngine } from './useDataEngine'
1323
import { useStaticInput } from './useStaticInput'
@@ -33,16 +43,19 @@ type QueryState = {
3343
refetchCallback?: (data: any) => void
3444
}
3545

36-
export const useDataQuery = <TQueryResult = QueryResult>(
37-
query: Query,
46+
export const useDataQuery = <
47+
TQuery extends Query,
48+
TDataResult extends DataResultForQuery<TQuery> = DataResultForQuery<TQuery>
49+
>(
50+
query: TQuery,
3851
{
3952
onComplete: userOnSuccess,
4053
onError: userOnError,
4154
variables: initialVariables = {},
4255
lazy: initialLazy = false,
4356
}: QueryOptions = {}
44-
): QueryRenderInput<TQueryResult> => {
45-
const [staticQuery] = useStaticInput<Query>(query, {
57+
): UseDataQueryResult<TDataResult> => {
58+
const [staticQuery] = useStaticInput<TQuery>(query, {
4659
warn: true,
4760
name: 'query',
4861
})

services/data/src/types.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@ import DataEngine from './engine/DataEngine'
22
import { QueryExecuteOptions } from './engine/types/ExecuteOptions'
33
import { FetchError } from './engine/types/FetchError'
44
import { JsonValue } from './engine/types/JsonValue'
5-
import { QueryVariables, QueryResult } from './engine/types/Query'
5+
import {
6+
Query,
7+
QueryVariables,
8+
QueryResult,
9+
DataResultForQuery,
10+
GetModelTypesForQuery,
11+
} from './engine/types/Query'
612

713
export interface ContextType {
814
engine: DataEngine
@@ -40,20 +46,27 @@ export interface ExecuteHookResult<ReturnType> {
4046
data?: ReturnType
4147
}
4248

43-
export interface QueryState<TQueryResult> {
49+
export interface QueryState<Data = QueryResult> {
4450
called: boolean
4551
loading: boolean
4652
fetching: boolean
4753
error?: FetchError
48-
data?: TQueryResult
54+
data?: Data
4955
}
5056

51-
export interface QueryRenderInput<TQueryResult = QueryResult>
52-
extends QueryState<TQueryResult> {
57+
export interface QueryRenderInput<DataResult = QueryResult>
58+
extends QueryState<DataResult> {
5359
engine: DataEngine
5460
refetch: QueryRefetchFunction
5561
}
5662

63+
export type UseDataQueryResult<DataResult> = QueryRenderInput<DataResult>
64+
65+
export type UseDataQueryResultWithModels<
66+
TQuery extends Query,
67+
Models
68+
> = QueryRenderInput<GetModelTypesForQuery<TQuery, Models>>
69+
5770
export interface MutationState {
5871
engine: DataEngine
5972
called: boolean

0 commit comments

Comments
 (0)