Skip to content

Commit 4bf888c

Browse files
committed
Fixed issue where signals weren't getting picked up properly
1 parent 1d1ac2e commit 4bf888c

File tree

6 files changed

+169
-133
lines changed

6 files changed

+169
-133
lines changed

dataconnect-sdk/js/default-connector/esm/index.esm.js

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,6 @@ export const connectorConfig = {
66
location: 'us-central1'
77
};
88

9-
export const listMoviesRef = (dc) => {
10-
const { dc: dcInstance} = validateArgs(connectorConfig, dc, undefined);
11-
dcInstance._useGeneratedSdk();
12-
return queryRef(dcInstance, 'ListMovies');
13-
}
14-
listMoviesRef.operationName = 'ListMovies';
15-
16-
export function listMovies(dc) {
17-
return executeQuery(listMoviesRef(dc));
18-
}
19-
20-
export const getMovieByIdRef = (dcOrVars, vars) => {
21-
const { dc: dcInstance, vars: inputVars} = validateArgs(connectorConfig, dcOrVars, vars, true);
22-
dcInstance._useGeneratedSdk();
23-
return queryRef(dcInstance, 'GetMovieById', inputVars);
24-
}
25-
getMovieByIdRef.operationName = 'GetMovieById';
26-
27-
export function getMovieById(dcOrVars, vars) {
28-
return executeQuery(getMovieByIdRef(dcOrVars, vars));
29-
}
30-
31-
export const getMetaRef = (dc) => {
32-
const { dc: dcInstance} = validateArgs(connectorConfig, dc, undefined);
33-
dcInstance._useGeneratedSdk();
34-
return queryRef(dcInstance, 'GetMeta');
35-
}
36-
getMetaRef.operationName = 'GetMeta';
37-
38-
export function getMeta(dc) {
39-
return executeQuery(getMetaRef(dc));
40-
}
41-
429
export const createMovieRef = (dcOrVars, vars) => {
4310
const { dc: dcInstance, vars: inputVars} = validateArgs(connectorConfig, dcOrVars, vars, true);
4411
dcInstance._useGeneratedSdk();
@@ -94,3 +61,36 @@ export function deleteMeta(dcOrVars, vars) {
9461
return executeMutation(deleteMetaRef(dcOrVars, vars));
9562
}
9663

64+
export const listMoviesRef = (dc) => {
65+
const { dc: dcInstance} = validateArgs(connectorConfig, dc, undefined);
66+
dcInstance._useGeneratedSdk();
67+
return queryRef(dcInstance, 'ListMovies');
68+
}
69+
listMoviesRef.operationName = 'ListMovies';
70+
71+
export function listMovies(dc) {
72+
return executeQuery(listMoviesRef(dc));
73+
}
74+
75+
export const getMovieByIdRef = (dcOrVars, vars) => {
76+
const { dc: dcInstance, vars: inputVars} = validateArgs(connectorConfig, dcOrVars, vars, true);
77+
dcInstance._useGeneratedSdk();
78+
return queryRef(dcInstance, 'GetMovieById', inputVars);
79+
}
80+
getMovieByIdRef.operationName = 'GetMovieById';
81+
82+
export function getMovieById(dcOrVars, vars) {
83+
return executeQuery(getMovieByIdRef(dcOrVars, vars));
84+
}
85+
86+
export const getMetaRef = (dc) => {
87+
const { dc: dcInstance} = validateArgs(connectorConfig, dc, undefined);
88+
dcInstance._useGeneratedSdk();
89+
return queryRef(dcInstance, 'GetMeta');
90+
}
91+
getMetaRef.operationName = 'GetMeta';
92+
93+
export function getMeta(dc) {
94+
return executeQuery(getMetaRef(dc));
95+
}
96+

dataconnect-sdk/js/default-connector/index.cjs.js

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -7,42 +7,6 @@ const connectorConfig = {
77
};
88
exports.connectorConfig = connectorConfig;
99

10-
const listMoviesRef = (dc) => {
11-
const { dc: dcInstance} = validateArgs(connectorConfig, dc, undefined);
12-
dcInstance._useGeneratedSdk();
13-
return queryRef(dcInstance, 'ListMovies');
14-
}
15-
listMoviesRef.operationName = 'ListMovies';
16-
exports.listMoviesRef = listMoviesRef;
17-
18-
exports.listMovies = function listMovies(dc) {
19-
return executeQuery(listMoviesRef(dc));
20-
};
21-
22-
const getMovieByIdRef = (dcOrVars, vars) => {
23-
const { dc: dcInstance, vars: inputVars} = validateArgs(connectorConfig, dcOrVars, vars, true);
24-
dcInstance._useGeneratedSdk();
25-
return queryRef(dcInstance, 'GetMovieById', inputVars);
26-
}
27-
getMovieByIdRef.operationName = 'GetMovieById';
28-
exports.getMovieByIdRef = getMovieByIdRef;
29-
30-
exports.getMovieById = function getMovieById(dcOrVars, vars) {
31-
return executeQuery(getMovieByIdRef(dcOrVars, vars));
32-
};
33-
34-
const getMetaRef = (dc) => {
35-
const { dc: dcInstance} = validateArgs(connectorConfig, dc, undefined);
36-
dcInstance._useGeneratedSdk();
37-
return queryRef(dcInstance, 'GetMeta');
38-
}
39-
getMetaRef.operationName = 'GetMeta';
40-
exports.getMetaRef = getMetaRef;
41-
42-
exports.getMeta = function getMeta(dc) {
43-
return executeQuery(getMetaRef(dc));
44-
};
45-
4610
const createMovieRef = (dcOrVars, vars) => {
4711
const { dc: dcInstance, vars: inputVars} = validateArgs(connectorConfig, dcOrVars, vars, true);
4812
dcInstance._useGeneratedSdk();
@@ -102,3 +66,39 @@ exports.deleteMetaRef = deleteMetaRef;
10266
exports.deleteMeta = function deleteMeta(dcOrVars, vars) {
10367
return executeMutation(deleteMetaRef(dcOrVars, vars));
10468
};
69+
70+
const listMoviesRef = (dc) => {
71+
const { dc: dcInstance} = validateArgs(connectorConfig, dc, undefined);
72+
dcInstance._useGeneratedSdk();
73+
return queryRef(dcInstance, 'ListMovies');
74+
}
75+
listMoviesRef.operationName = 'ListMovies';
76+
exports.listMoviesRef = listMoviesRef;
77+
78+
exports.listMovies = function listMovies(dc) {
79+
return executeQuery(listMoviesRef(dc));
80+
};
81+
82+
const getMovieByIdRef = (dcOrVars, vars) => {
83+
const { dc: dcInstance, vars: inputVars} = validateArgs(connectorConfig, dcOrVars, vars, true);
84+
dcInstance._useGeneratedSdk();
85+
return queryRef(dcInstance, 'GetMovieById', inputVars);
86+
}
87+
getMovieByIdRef.operationName = 'GetMovieById';
88+
exports.getMovieByIdRef = getMovieByIdRef;
89+
90+
exports.getMovieById = function getMovieById(dcOrVars, vars) {
91+
return executeQuery(getMovieByIdRef(dcOrVars, vars));
92+
};
93+
94+
const getMetaRef = (dc) => {
95+
const { dc: dcInstance} = validateArgs(connectorConfig, dc, undefined);
96+
dcInstance._useGeneratedSdk();
97+
return queryRef(dcInstance, 'GetMeta');
98+
}
99+
getMetaRef.operationName = 'GetMeta';
100+
exports.getMetaRef = getMetaRef;
101+
102+
exports.getMeta = function getMeta(dc) {
103+
return executeQuery(getMetaRef(dc));
104+
};

dataconnect-sdk/js/default-connector/index.d.ts

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -93,42 +93,6 @@ export interface UpsertMovieVariables {
9393
imageUrl: string;
9494
}
9595

96-
interface ListMoviesRef {
97-
/* Allow users to create refs without passing in DataConnect */
98-
(): QueryRef<ListMoviesData, undefined>;
99-
/* Allow users to pass in custom DataConnect instances */
100-
(dc: DataConnect): QueryRef<ListMoviesData, undefined>;
101-
operationName: string;
102-
}
103-
export const listMoviesRef: ListMoviesRef;
104-
105-
export function listMovies(): QueryPromise<ListMoviesData, undefined>;
106-
export function listMovies(dc: DataConnect): QueryPromise<ListMoviesData, undefined>;
107-
108-
interface GetMovieByIdRef {
109-
/* Allow users to create refs without passing in DataConnect */
110-
(vars: GetMovieByIdVariables): QueryRef<GetMovieByIdData, GetMovieByIdVariables>;
111-
/* Allow users to pass in custom DataConnect instances */
112-
(dc: DataConnect, vars: GetMovieByIdVariables): QueryRef<GetMovieByIdData, GetMovieByIdVariables>;
113-
operationName: string;
114-
}
115-
export const getMovieByIdRef: GetMovieByIdRef;
116-
117-
export function getMovieById(vars: GetMovieByIdVariables): QueryPromise<GetMovieByIdData, GetMovieByIdVariables>;
118-
export function getMovieById(dc: DataConnect, vars: GetMovieByIdVariables): QueryPromise<GetMovieByIdData, GetMovieByIdVariables>;
119-
120-
interface GetMetaRef {
121-
/* Allow users to create refs without passing in DataConnect */
122-
(): QueryRef<GetMetaData, undefined>;
123-
/* Allow users to pass in custom DataConnect instances */
124-
(dc: DataConnect): QueryRef<GetMetaData, undefined>;
125-
operationName: string;
126-
}
127-
export const getMetaRef: GetMetaRef;
128-
129-
export function getMeta(): QueryPromise<GetMetaData, undefined>;
130-
export function getMeta(dc: DataConnect): QueryPromise<GetMetaData, undefined>;
131-
13296
interface CreateMovieRef {
13397
/* Allow users to create refs without passing in DataConnect */
13498
(vars: CreateMovieVariables): MutationRef<CreateMovieData, CreateMovieVariables>;
@@ -189,3 +153,39 @@ export const deleteMetaRef: DeleteMetaRef;
189153
export function deleteMeta(vars: DeleteMetaVariables): MutationPromise<DeleteMetaData, DeleteMetaVariables>;
190154
export function deleteMeta(dc: DataConnect, vars: DeleteMetaVariables): MutationPromise<DeleteMetaData, DeleteMetaVariables>;
191155

156+
interface ListMoviesRef {
157+
/* Allow users to create refs without passing in DataConnect */
158+
(): QueryRef<ListMoviesData, undefined>;
159+
/* Allow users to pass in custom DataConnect instances */
160+
(dc: DataConnect): QueryRef<ListMoviesData, undefined>;
161+
operationName: string;
162+
}
163+
export const listMoviesRef: ListMoviesRef;
164+
165+
export function listMovies(): QueryPromise<ListMoviesData, undefined>;
166+
export function listMovies(dc: DataConnect): QueryPromise<ListMoviesData, undefined>;
167+
168+
interface GetMovieByIdRef {
169+
/* Allow users to create refs without passing in DataConnect */
170+
(vars: GetMovieByIdVariables): QueryRef<GetMovieByIdData, GetMovieByIdVariables>;
171+
/* Allow users to pass in custom DataConnect instances */
172+
(dc: DataConnect, vars: GetMovieByIdVariables): QueryRef<GetMovieByIdData, GetMovieByIdVariables>;
173+
operationName: string;
174+
}
175+
export const getMovieByIdRef: GetMovieByIdRef;
176+
177+
export function getMovieById(vars: GetMovieByIdVariables): QueryPromise<GetMovieByIdData, GetMovieByIdVariables>;
178+
export function getMovieById(dc: DataConnect, vars: GetMovieByIdVariables): QueryPromise<GetMovieByIdData, GetMovieByIdVariables>;
179+
180+
interface GetMetaRef {
181+
/* Allow users to create refs without passing in DataConnect */
182+
(): QueryRef<GetMetaData, undefined>;
183+
/* Allow users to pass in custom DataConnect instances */
184+
(dc: DataConnect): QueryRef<GetMetaData, undefined>;
185+
operationName: string;
186+
}
187+
export const getMetaRef: GetMetaRef;
188+
189+
export function getMeta(): QueryPromise<GetMetaData, undefined>;
190+
export function getMeta(dc: DataConnect): QueryPromise<GetMetaData, undefined>;
191+

packages/angular/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@tanstack-query-firebase/angular",
3-
"version": "1.0.2",
3+
"version": "1.0.3",
44
"description": "TanStack Query bindings for Firebase and Angular",
55
"type": "module",
66
"scripts": {

packages/angular/src/data-connect/index.ts

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {
2+
computed,
23
EnvironmentInjector,
34
type Injector,
45
inject,
@@ -60,36 +61,39 @@ export function injectDataConnectQuery<Data, Variables>(
6061
Partial<QueryResult<Data, Variables>> | undefined
6162
>(undefined);
6263
const finalInjector = injector || inject(EnvironmentInjector);
63-
const queryKey = signal<QueryKey>([]);
64+
const varsSignal = computed(() =>
65+
typeof queryRefOrOptionsFn === "function"
66+
? queryRefOrOptionsFn().queryFn().variables
67+
: queryRefOrOptionsFn.variables,
68+
);
69+
const queryRefSignal = computed(() =>
70+
typeof queryRefOrOptionsFn === "function"
71+
? queryRefOrOptionsFn().queryFn()
72+
: queryRefOrOptionsFn,
73+
);
74+
const optionsSignal = computed(() =>
75+
typeof queryRefOrOptionsFn === "function"
76+
? queryRefOrOptionsFn()
77+
: undefined,
78+
);
6479

65-
function fdcOptionsFn() {
66-
const passedInOptions =
67-
typeof queryRefOrOptionsFn === "function"
68-
? queryRefOrOptionsFn()
69-
: undefined;
70-
71-
const modifiedFn = async (): Promise<Data> => {
72-
const ref: QueryRef<Data, Variables> =
73-
passedInOptions?.queryFn() ||
74-
(queryRefOrOptionsFn as QueryRef<Data, Variables>);
75-
dataConnectResult.set({ ref });
76-
// @ts-expect-error function is hidden under `DataConnect`.
77-
ref.dataConnect._setCallerSdkType(_callerSdkType);
78-
queryKey.set([ref.name, ref.variables]);
79-
const response = await executeQuery(ref);
80-
dataConnectResult.set(response);
81-
return response.data;
82-
};
80+
async function queryFn() {
81+
const queryRef = queryRefSignal();
82+
// @ts-expect-error function is hidden under `DataConnect`.
83+
queryRef.dataConnect._setCallerSdkType(_callerSdkType);
84+
const response = await executeQuery(queryRef);
85+
dataConnectResult.set(response);
86+
return response.data;
87+
}
88+
const injectQueryResult = injectQuery(() => {
8389
return {
84-
queryKey: queryKey(),
85-
...passedInOptions,
86-
queryFn: modifiedFn,
90+
queryKey: [queryRefSignal().name, varsSignal()],
91+
...optionsSignal(),
92+
queryFn: queryFn,
8793
};
88-
}
89-
90-
const originalResult = injectQuery(fdcOptionsFn, finalInjector);
94+
}, finalInjector);
9195
return {
92-
...originalResult,
96+
...injectQueryResult,
9397
dataConnectResult,
9498
};
9599
}

packages/angular/src/data-connect/injectDataConnectQuery.test.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { provideHttpClient } from "@angular/common/http";
2-
import { inject, provideZonelessChangeDetection } from "@angular/core";
2+
import { inject, provideZonelessChangeDetection, signal } from "@angular/core";
33
import { TestBed } from "@angular/core/testing";
44
import { initializeApp, provideFirebaseApp } from "@angular/fire/app";
55
import {
@@ -240,4 +240,36 @@ describe("injectDataConnectQuery", () => {
240240
// // })
241241
// expect(r).toBeDefined();
242242
});
243+
test("signal updates are received", async () => {
244+
const movieData = {
245+
title: "tanstack query firebase",
246+
genre: "library",
247+
imageUrl: "https://invertase.io/",
248+
};
249+
const createdMovie = await createMovie(movieData);
250+
251+
const movieId = createdMovie?.data?.movie_insert?.id;
252+
const movieIdSignal = signal("");
253+
254+
const result = TestBed.runInInjectionContext(() =>
255+
injectDataConnectQuery(() => ({
256+
queryFn: () => getMovieByIdRef({ id: movieIdSignal() }),
257+
retry: false,
258+
})),
259+
);
260+
261+
expect(result.isPending()).toBe(true);
262+
263+
await waitFor(() => expect(result.isPending()).toBe(false));
264+
expect(result.isSuccess()).to.be.false;
265+
expect(result.data()).toBeUndefined();
266+
expect(result.error()).toBeDefined();
267+
268+
movieIdSignal.set(movieId);
269+
await waitFor(() => expect(result.isSuccess()).toBe(true));
270+
expect(result.data()!.movie).to.deep.equal({
271+
id: movieId,
272+
...movieData,
273+
});
274+
});
243275
});

0 commit comments

Comments
 (0)