Skip to content

Commit ab51eb1

Browse files
maneeshtEhesp
andauthored
fix(react): Fix issue where initialData wasn't respected (#177)
* Fix react typings * Fixed issue with initialData * Fixed race condition in test * Removed extra newline --------- Co-authored-by: Elliot Hesp <[email protected]>
1 parent 6767228 commit ab51eb1

File tree

2 files changed

+34
-13
lines changed

2 files changed

+34
-13
lines changed

packages/react/src/data-connect/useDataConnectQuery.test.tsx

+21-5
Original file line numberDiff line numberDiff line change
@@ -110,16 +110,15 @@ describe("useDataConnectQuery", () => {
110110
});
111111

112112
test("returns the correct data properties", async () => {
113-
const { result } = renderHook(() => useDataConnectQuery(listMoviesRef()), {
114-
wrapper,
115-
});
116-
117113
await createMovie({
118114
title: "tanstack query firebase",
119115
genre: "library",
120116
imageUrl: "https://invertase.io/",
121117
});
122-
118+
const { result } = renderHook(() => useDataConnectQuery(listMoviesRef()), {
119+
wrapper,
120+
});
121+
123122
await waitFor(() => expect(result.current.isSuccess).toBe(true));
124123

125124
result.current.data?.movies.forEach((i) => {
@@ -214,6 +213,23 @@ describe("useDataConnectQuery", () => {
214213
expect(result.current.dataConnectResult).toHaveProperty("source");
215214
expect(result.current.dataConnectResult).toHaveProperty("fetchTime");
216215
});
216+
test("avails the data immediately when initialData is passed", async () => {
217+
const queryResult = await executeQuery(listMoviesRef());
218+
219+
const { result } = renderHook(() => useDataConnectQuery(listMoviesRef(), { initialData: queryResult.data }), {
220+
wrapper,
221+
});
222+
223+
// Should not enter a loading state
224+
expect(result.current.isLoading).toBe(false);
225+
expect(result.current.isPending).toBe(false);
226+
227+
expect(result.current.isSuccess).toBe(true);
228+
229+
expect(result.current.data).toBeDefined();
230+
expect(result.current.data).to.deep.eq(queryResult.data);
231+
expect(result.current.dataConnectResult).toHaveProperty("ref");
232+
});
217233

218234
test("a query with no variables has null as the second query key argument", async () => {
219235
const queryClient = new DataConnectQueryClient();

packages/react/src/data-connect/useDataConnectQuery.ts

+13-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { type UseQueryOptions, useQuery } from "@tanstack/react-query";
1+
import { InitialDataFunction, type UseQueryOptions, useQuery } from "@tanstack/react-query";
22
import type { FirebaseError } from "firebase/app";
33
import {
44
type CallerSdkType,
@@ -20,20 +20,25 @@ export type useDataConnectQueryOptions<
2020
> = PartialBy<Omit<UseQueryOptions<TData, TError>, "queryFn">, "queryKey">;
2121

2222
export function useDataConnectQuery<Data = unknown, Variables = unknown>(
23-
refOrResult: QueryRef<Data, Variables> | QueryResult<Data, Variables>,
24-
options?: useDataConnectQueryOptions<Data, FirebaseError>,
25-
_callerSdkType: CallerSdkType = CallerSdkTypeEnum.TanstackReactCore,
23+
refOrResult: QueryRef<Data, Variables>
24+
| QueryResult<Data, Variables>,
25+
options?: useDataConnectQueryOptions<
26+
Data,
27+
FirebaseError
28+
>,
29+
_callerSdkType: CallerSdkType = CallerSdkTypeEnum.TanstackReactCore
2630
): UseDataConnectQueryResult<Data, Variables> {
27-
const [dataConnectResult, setDataConnectResult] = useState<
28-
QueryResultRequiredRef<Data, Variables>
29-
>("ref" in refOrResult ? refOrResult : { ref: refOrResult });
30-
let initialData: Data | undefined;
31+
const [dataConnectResult, setDataConnectResult] = useState<QueryResultRequiredRef<Data, Variables>>('ref' in refOrResult ? refOrResult : { ref: refOrResult });
32+
// TODO(mtewani): in the future we should allow for users to pass in `QueryResult` objects into `initialData`.
33+
let initialData: Data | InitialDataFunction<Data> | undefined;
3134
const { ref } = dataConnectResult;
3235

3336
if ("ref" in refOrResult) {
3437
initialData = {
3538
...refOrResult.data,
3639
};
40+
} else {
41+
initialData = options?.initialData;
3742
}
3843

3944
// @ts-expect-error function is hidden under `DataConnect`.

0 commit comments

Comments
 (0)