Skip to content

Commit d448a72

Browse files
committed
chore: fixes for 1.0.0-beta.1
1 parent 27b4e0e commit d448a72

File tree

3 files changed

+95
-38
lines changed

3 files changed

+95
-38
lines changed

src/createLoader.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const createUseLoader = <
1414
A = never
1515
>(
1616
createUseLoaderArgs: Types.CreateUseLoaderArgs<Q, D, E, R, A>
17-
): Types.UseLoader<A, R> => {
17+
): Types.UseLoader<A, R, Q, D, E> => {
1818
const useLoader = (...args: Types.OptionalGenericArg<A>) => {
1919
const loaderRes = createUseLoaderArgs.useQueries(...args);
2020
const queriesList = loaderRes.queries
@@ -46,6 +46,8 @@ export const createUseLoader = <
4646

4747
return aggregatedQuery as Types.UseQueryResult<R>;
4848
};
49+
50+
useLoader.original_args = createUseLoaderArgs;
4951
return useLoader;
5052
};
5153

@@ -81,8 +83,8 @@ export const createLoader = <
8183
createLoaderArgs.loaderComponent ?? RTKLoader,
8284
extend: function <
8385
Qb extends Types._Q,
84-
Db extends Types._D = Types._D,
85-
Eb extends Types._E = Types._E,
86+
Db extends Types._D,
87+
Eb extends Types._E,
8688
Pb extends unknown = P,
8789
Rb = Qb extends unknown
8890
? R
@@ -115,6 +117,13 @@ export const createLoader = <
115117
transform,
116118
});
117119
extendedLoader.useLoader = newUseLoader;
120+
} else if (transform) {
121+
const newUseLoader = createUseLoader({
122+
useQueries:
123+
extendedLoader.useLoader.original_args.useQueries,
124+
transform,
125+
});
126+
extendedLoader.useLoader = newUseLoader;
118127
}
119128

120129
return extendedLoader;

src/types.ts

Lines changed: 12 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ export type ResolveDataShape<
7777
? { queries: Q }
7878
: { queries: Q; payload: E }
7979
: E extends never
80-
? { queries: Q; deferredQueries: D }
80+
? D extends never
81+
? { queries: Q }
82+
: { queries: Q; deferredQueries: D }
8183
: { queries: Q; deferredQueries: D; payload: E };
8284

8385
/** Use: `(...args: OptionalGenericArg<T>) => void;`
@@ -118,10 +120,10 @@ export type CreateUseLoaderArgs<
118120
) => R;
119121
};
120122

121-
export type UseLoader<A, R> = (
122-
...args: OptionalGenericArg<A>
123-
) => UseQueryResult<R>;
124-
123+
export type UseLoader<A, R, Q extends _Q, D extends _D, E> = {
124+
(...args: OptionalGenericArg<A>): UseQueryResult<R>;
125+
original_args: CreateUseLoaderArgs<Q, D, E, R, A>;
126+
};
125127
export type ComponentWithLoaderData<
126128
P extends Record<string, any>,
127129
R extends unknown
@@ -212,9 +214,9 @@ export type CreateLoaderArgs<
212214

213215
export type CreateLoader<
214216
P extends unknown,
215-
Q extends _Q,
216-
D extends _D,
217-
E extends _E,
217+
Q extends _Q = never,
218+
D extends _D = never,
219+
E extends _E = never,
218220
R extends unknown = MakeDataRequired<Q>,
219221
A = never
220222
> = (
@@ -230,7 +232,7 @@ export type Loader<
230232
A = never
231233
> = {
232234
/** A hook that runs all queries and returns aggregated result */
233-
useLoader: UseLoader<A, R>;
235+
useLoader: UseLoader<A, R, Q, D, E>;
234236
/** Generates an argument for the `queries` based on component props */
235237
queriesArg?: (props: P) => A;
236238
/** Determines what to render while loading (with no data to fallback on) */
@@ -266,32 +268,7 @@ export type Loader<
266268
Ab = A
267269
>(
268270
newLoader: Partial<CreateLoaderArgs<Pb, Qb, Db, Eb, Rb, Ab>>
269-
) => Loader<
270-
Pb,
271-
Rb,
272-
Qb extends Q
273-
? Db extends D
274-
? Eb extends E
275-
? Q
276-
: Qb
277-
: Qb
278-
: Qb,
279-
Qb extends Q
280-
? Db extends D
281-
? Eb extends E
282-
? D
283-
: Db
284-
: Db
285-
: Db,
286-
Qb extends Q
287-
? Db extends D
288-
? Eb extends E
289-
? E
290-
: Eb
291-
: Eb
292-
: Eb,
293-
Ab
294-
>;
271+
) => Loader<Pb, Rb, Qb, Db, Eb, Ab>;
295272
/** The component to use to switch between rendering the different query states. */
296273
LoaderComponent: Component<CustomLoaderProps>;
297274
};

testing-app/src/tests.test.tsx

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,5 +542,76 @@ describe("withLoader", () => {
542542
expect(screen.getByText("loaded-deferred")).toBeVisible()
543543
);
544544
});
545+
546+
test("Can extend many times", async () => {
547+
const Component = withLoader(
548+
(props, loader) => {
549+
return (
550+
<div>
551+
<div>{loader.queries.pokemon.data.name}</div>
552+
<button
553+
onClick={() => loader.payload.setName("error")}
554+
>
555+
error
556+
</button>
557+
</div>
558+
);
559+
},
560+
createLoader({
561+
onLoading: () => <div>Loading</div>,
562+
})
563+
.extend({
564+
useQueries: () => {
565+
const [name, setName] = useState("charizard");
566+
return {
567+
queries: {
568+
pokemon: useGetPokemonByNameQuery(name),
569+
},
570+
payload: {
571+
name,
572+
setName,
573+
},
574+
};
575+
},
576+
})
577+
.extend({
578+
onLoading: () => <div>Extended Loading</div>,
579+
})
580+
.extend({
581+
onError: () => <div>Extended Error</div>,
582+
})
583+
);
584+
585+
render(<Component />);
586+
expect(screen.getByText("Extended Loading")).toBeVisible();
587+
await waitFor(() =>
588+
expect(screen.getByText("charizard")).toBeVisible()
589+
);
590+
await userEvent.click(screen.getByRole("button"));
591+
await waitFor(() =>
592+
expect(screen.getByText("Extended Error")).toBeVisible()
593+
);
594+
});
595+
596+
test("Can extend with only transform", async () => {
597+
const Component = withLoader(
598+
(props, pokemon) => {
599+
return <div>{pokemon.name}</div>;
600+
},
601+
createLoader({
602+
useQueries: () => ({
603+
queries: {
604+
pokemon: useGetPokemonByNameQuery("charizard"),
605+
},
606+
}),
607+
}).extend({
608+
transform: (data) => data.queries.pokemon.data,
609+
})
610+
);
611+
render(<Component />);
612+
await waitFor(() =>
613+
expect(screen.getByText("charizard")).toBeVisible()
614+
);
615+
});
545616
});
546617
});

0 commit comments

Comments
 (0)