@teamkeel/client-react-query 0.365.5 → 0.365.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +3 -2
  2. package/src/index.ts +108 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teamkeel/client-react-query",
3
- "version": "0.365.5",
3
+ "version": "0.365.7",
4
4
  "description": "Typed React-Query Hooks for Keel clients",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -24,6 +24,7 @@
24
24
  "typescript": "5.1.6"
25
25
  },
26
26
  "files": [
27
- "dist"
27
+ "dist",
28
+ "src"
28
29
  ]
29
30
  }
package/src/index.ts ADDED
@@ -0,0 +1,108 @@
1
+ import {
2
+ QueryKey,
3
+ UseInfiniteQueryOptions,
4
+ UseMutationOptions,
5
+ UseQueryOptions,
6
+ useInfiniteQuery,
7
+ useMutation,
8
+ useQuery,
9
+ } from "@tanstack/react-query";
10
+
11
+ type FunctionTypes = "queries" | "mutations";
12
+
13
+ export const keelQuery = <T extends (...args: any) => any>(useKeel: T) => {
14
+ type KeelType = ReturnType<typeof useKeel>;
15
+
16
+ type QueryKeys<F extends FunctionTypes> = keyof KeelType["api"][F];
17
+ type QueryArgs<F extends FunctionTypes, K extends QueryKeys<F>> = Parameters<
18
+ KeelType["api"][F][K]
19
+ >[0];
20
+ type QueryResult<
21
+ F extends FunctionTypes,
22
+ K extends QueryKeys<F>
23
+ > = ReturnType<KeelType["api"][F][K]>;
24
+
25
+ type Result<F extends FunctionTypes, K extends QueryKeys<F>> = Exclude<
26
+ Awaited<QueryResult<F, K>>["data"],
27
+ undefined
28
+ >;
29
+ type Error<F extends FunctionTypes, K extends QueryKeys<F>> = Exclude<
30
+ Awaited<QueryResult<F, K>>["error"],
31
+ undefined
32
+ >;
33
+
34
+ return {
35
+ useKeelQuery: <F extends "queries", K extends QueryKeys<"queries">>(
36
+ key: K,
37
+ args: QueryArgs<F, K>,
38
+ options?: Omit<UseQueryOptions<Result<F, K>, Error<F, K>>, "queryFn">
39
+ ) => {
40
+ const keel = useKeel();
41
+ return useQuery<Result<F, K>, Error<F, K>>(
42
+ queryKeys(key, args),
43
+ async () => {
44
+ const res = await keel["api"][key](args);
45
+ if (res.error) {
46
+ return Promise.reject(res.error);
47
+ }
48
+ return res.data;
49
+ },
50
+ options
51
+ );
52
+ },
53
+ useInfiniteKeelQuery: <F extends "queries", K extends QueryKeys<"queries">>(
54
+ key: K,
55
+ args: QueryArgs<F, K>,
56
+ options?: Omit<
57
+ UseInfiniteQueryOptions<Result<F, K>, Error<F, K>>,
58
+ "queryFn"
59
+ >
60
+ ) => {
61
+ const keel = useKeel();
62
+ return useInfiniteQuery<Result<F, K>, Error<F, K>>(
63
+ queryKeys(key, args),
64
+ async () => {
65
+ const res = await keel["api"][key](args);
66
+ if (res.error) {
67
+ return Promise.reject(res.error);
68
+ }
69
+ return res.data;
70
+ },
71
+ options
72
+ );
73
+ },
74
+ useKeelMutation: <F extends "mutations", K extends QueryKeys<"mutations">>(
75
+ key: K,
76
+ options?: Omit<
77
+ UseMutationOptions<Result<F, K>, Error<F, K>, QueryArgs<F, K>>,
78
+ "queryFn"
79
+ >
80
+ ) => {
81
+ const keel = useKeel();
82
+ return useMutation<Result<F, K>, Error<F, K>, QueryArgs<F, K>>(
83
+ [key],
84
+ async (args) => {
85
+ const res = await keel["api"][key](args);
86
+ if (res.error) {
87
+ return Promise.reject(res.error);
88
+ }
89
+ return res.data;
90
+ },
91
+ options
92
+ );
93
+ },
94
+ };
95
+ };
96
+
97
+ const queryKeys = (key: any, args?: any): QueryKey => {
98
+ // Query key is either ["action name", {args}] or ["action name", "id", {args}]
99
+ const queryKey = [key];
100
+ if (args && args.id) {
101
+ queryKey.push(args.id);
102
+ }
103
+ if (args) {
104
+ queryKey.push(args);
105
+ }
106
+
107
+ return queryKey;
108
+ };