react-query-firebase 2.0.0-rc8 → 2.0.2
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.
- package/package.json +1 -1
- package/react-native/analytics/useLogEvent.js +1 -1
- package/react-native/analytics/useLogEvent.ts +1 -1
- package/react-native/analytics/useSetAnalyticsCollectionEnabled.js +1 -1
- package/react-native/analytics/useSetAnalyticsCollectionEnabled.ts +1 -1
- package/react-native/auth/useIdToken.js +4 -4
- package/react-native/auth/useIdToken.ts +4 -4
- package/react-native/context/FirebaseContext.d.ts +1 -2
- package/react-native/context/FirebaseContext.ts +1 -1
- package/react-native/context/FirebaseContextProvider.js +14 -14
- package/react-native/context/FirebaseContextProvider.tsx +15 -18
- package/react-native/firestore/useCompositeFilter.d.ts +3 -2
- package/react-native/firestore/useCompositeFilter.js +4 -8
- package/react-native/firestore/useCompositeFilter.ts +18 -21
- package/react-native/firestore/useDocReferences.js +1 -1
- package/react-native/firestore/useDocReferences.ts +1 -1
- package/react-native/firestore/useGetRealtimeDocData.js +1 -1
- package/react-native/firestore/useGetRealtimeDocData.ts +1 -1
- package/react-native/remoteConfig/useFetchAndActivate.js +1 -1
- package/react-native/remoteConfig/useFetchAndActivate.ts +1 -1
- package/react-native/remoteConfig/useGetValue.js +1 -1
- package/react-native/remoteConfig/useGetValue.ts +1 -1
- package/web/analytics/useLogEvent.js +1 -1
- package/web/analytics/useLogEvent.ts +1 -1
- package/web/analytics/useSetAnalyticsCollectionEnabled.js +1 -1
- package/web/analytics/useSetAnalyticsCollectionEnabled.ts +1 -1
- package/web/auth/useAuthStateReady.js +1 -1
- package/web/auth/useAuthStateReady.ts +1 -1
- package/web/auth/useCurrentUser.js +1 -1
- package/web/auth/useCurrentUser.ts +1 -1
- package/web/auth/useIdToken.js +4 -4
- package/web/auth/useIdToken.ts +4 -4
- package/web/context/FirebaseContextProvider.js +5 -5
- package/web/context/FirebaseContextProvider.tsx +5 -5
- package/web/firestore/useCollectionReference.js +1 -1
- package/web/firestore/useCollectionReference.ts +1 -1
- package/web/firestore/useCompositeFilter.d.ts +4 -3
- package/web/firestore/useCompositeFilter.js +4 -8
- package/web/firestore/useCompositeFilter.ts +14 -31
- package/web/firestore/useDocReference.js +1 -1
- package/web/firestore/useDocReference.ts +1 -1
- package/web/firestore/useDocReferences.js +1 -1
- package/web/firestore/useDocReferences.ts +1 -1
- package/web/firestore/useGetRealtimeDocData.js +1 -1
- package/web/firestore/useGetRealtimeDocData.ts +1 -1
- package/web/remoteConfig/useFetchAndActivate.js +1 -1
- package/web/remoteConfig/useFetchAndActivate.ts +1 -1
- package/web/remoteConfig/useGetValue.js +1 -1
- package/web/remoteConfig/useGetValue.ts +1 -1
package/package.json
CHANGED
|
@@ -14,7 +14,7 @@ export const useLogEvent = ({ eventName, eventParams }) => {
|
|
|
14
14
|
if (analytics) {
|
|
15
15
|
logEvent(analytics, eventName, eventParams);
|
|
16
16
|
}
|
|
17
|
-
}, [eventName, eventParams]);
|
|
17
|
+
}, [eventName, eventParams, analytics]);
|
|
18
18
|
return useMemo(() => ({
|
|
19
19
|
logEvent: logEventCallback
|
|
20
20
|
}), [logEventCallback]);
|
|
@@ -23,7 +23,7 @@ export const useLogEvent = ({ eventName, eventParams }: UseLogEventOptions) => {
|
|
|
23
23
|
if (analytics) {
|
|
24
24
|
logEvent(analytics, eventName, eventParams);
|
|
25
25
|
}
|
|
26
|
-
}, [eventName, eventParams]);
|
|
26
|
+
}, [eventName, eventParams, analytics]);
|
|
27
27
|
|
|
28
28
|
return useMemo(
|
|
29
29
|
() => ({
|
|
@@ -35,17 +35,17 @@ export const useIdToken = () => {
|
|
|
35
35
|
}
|
|
36
36
|
const idToken = await currentUser.getIdToken();
|
|
37
37
|
setIdToken(idToken);
|
|
38
|
-
}, [currentUser
|
|
38
|
+
}, [currentUser]);
|
|
39
39
|
const refresh = useCallback(async () => {
|
|
40
40
|
if (!currentUser) {
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
43
|
const idToken = await currentUser.getIdToken(true);
|
|
44
44
|
return idToken;
|
|
45
|
-
}, [currentUser
|
|
45
|
+
}, [currentUser]);
|
|
46
46
|
useEffect(() => {
|
|
47
47
|
callback();
|
|
48
|
-
}, [
|
|
48
|
+
}, [callback]);
|
|
49
49
|
useEffect(() => {
|
|
50
50
|
const unsubscribe = onIdTokenChanged(auth, (user) => {
|
|
51
51
|
if (user) {
|
|
@@ -58,7 +58,7 @@ export const useIdToken = () => {
|
|
|
58
58
|
}
|
|
59
59
|
});
|
|
60
60
|
return () => unsubscribe();
|
|
61
|
-
}, [
|
|
61
|
+
}, [auth]);
|
|
62
62
|
return {
|
|
63
63
|
idToken,
|
|
64
64
|
refresh
|
|
@@ -47,7 +47,7 @@ export const useIdToken = (): UseIdTokenResult => {
|
|
|
47
47
|
|
|
48
48
|
const idToken = await currentUser.getIdToken();
|
|
49
49
|
setIdToken(idToken);
|
|
50
|
-
}, [currentUser
|
|
50
|
+
}, [currentUser]);
|
|
51
51
|
|
|
52
52
|
const refresh = useCallback(async () => {
|
|
53
53
|
if (!currentUser) {
|
|
@@ -56,11 +56,11 @@ export const useIdToken = (): UseIdTokenResult => {
|
|
|
56
56
|
|
|
57
57
|
const idToken = await currentUser.getIdToken(true);
|
|
58
58
|
return idToken;
|
|
59
|
-
}, [currentUser
|
|
59
|
+
}, [currentUser]);
|
|
60
60
|
|
|
61
61
|
useEffect(() => {
|
|
62
62
|
callback();
|
|
63
|
-
}, [
|
|
63
|
+
}, [callback]);
|
|
64
64
|
|
|
65
65
|
useEffect(() => {
|
|
66
66
|
const unsubscribe = onIdTokenChanged(auth, (user: FirebaseAuthTypes.User) => {
|
|
@@ -74,7 +74,7 @@ export const useIdToken = (): UseIdTokenResult => {
|
|
|
74
74
|
});
|
|
75
75
|
|
|
76
76
|
return () => unsubscribe();
|
|
77
|
-
}, [
|
|
77
|
+
}, [auth]);
|
|
78
78
|
|
|
79
79
|
return {
|
|
80
80
|
idToken,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { firebase } from "@react-native-firebase/auth";
|
|
2
|
-
type FirebaseContextValue = {
|
|
2
|
+
export type FirebaseContextValue = {
|
|
3
3
|
auth: ReturnType<typeof firebase.auth>;
|
|
4
4
|
analytics: ReturnType<typeof firebase.analytics>;
|
|
5
5
|
firebase: ReturnType<typeof firebase.app>;
|
|
@@ -12,4 +12,3 @@ type FirebaseContextValue = {
|
|
|
12
12
|
* @internal
|
|
13
13
|
*/
|
|
14
14
|
export declare const FirebaseContext: import("react").Context<FirebaseContextValue>;
|
|
15
|
-
export {};
|
|
@@ -4,7 +4,7 @@ import { createContext } from "react";
|
|
|
4
4
|
|
|
5
5
|
import { firebase } from "@react-native-firebase/auth";
|
|
6
6
|
|
|
7
|
-
type FirebaseContextValue = {
|
|
7
|
+
export type FirebaseContextValue = {
|
|
8
8
|
auth: ReturnType<typeof firebase.auth>;
|
|
9
9
|
analytics: ReturnType<typeof firebase.analytics>;
|
|
10
10
|
firebase: ReturnType<typeof firebase.app>;
|
|
@@ -3,7 +3,7 @@ import { FirebaseContext } from "./FirebaseContext";
|
|
|
3
3
|
import { connectAuthEmulator } from "@react-native-firebase/auth";
|
|
4
4
|
import { setAnalyticsCollectionEnabled, setConsent } from "@react-native-firebase/analytics";
|
|
5
5
|
import { connectFirestoreEmulator } from "@react-native-firebase/firestore";
|
|
6
|
-
import firebase
|
|
6
|
+
import firebase from "@react-native-firebase/app";
|
|
7
7
|
/**
|
|
8
8
|
* FirebaseContextProvider component configures and provides Firebase services to its children.
|
|
9
9
|
* Initializes Firebase app and enables optional Firebase services such as Firestore, Auth, Analytics,
|
|
@@ -27,10 +27,8 @@ import firebase, { initializeApp } from "@react-native-firebase/app";
|
|
|
27
27
|
* };
|
|
28
28
|
* ```
|
|
29
29
|
*/
|
|
30
|
-
export const FirebaseContextProvider = ({
|
|
31
|
-
const internalFirebase = useMemo(() =>
|
|
32
|
-
return platform === "Web" ? initializeApp(options) : firebase;
|
|
33
|
-
}, [options]);
|
|
30
|
+
export const FirebaseContextProvider = ({ emulators, options, children, authEnabled = true, firestoreEnabled = true, analyticsEnabled = true, consentSettings = {}, remoteConfigEnabled = true, remoteConfigSettings, remoteConfigDefaults = {}, firestoreSettings }) => {
|
|
31
|
+
const internalFirebase = useMemo(() => firebase, []);
|
|
34
32
|
useEffect(() => {
|
|
35
33
|
setConsent(firebase.analytics(), {
|
|
36
34
|
ad_personalization: false,
|
|
@@ -42,16 +40,20 @@ export const FirebaseContextProvider = ({ platform, emulators, options, children
|
|
|
42
40
|
security_storage: false,
|
|
43
41
|
...consentSettings
|
|
44
42
|
});
|
|
45
|
-
}, [consentSettings
|
|
43
|
+
}, [consentSettings]);
|
|
46
44
|
const internalFirestore = useMemo(() => {
|
|
47
45
|
if (firestoreEnabled) {
|
|
48
46
|
if (emulators?.firestore?.host && emulators?.firestore?.port) {
|
|
49
47
|
connectFirestoreEmulator(internalFirebase.firestore(), emulators.firestore.host, emulators.firestore.port);
|
|
50
48
|
}
|
|
51
|
-
|
|
49
|
+
const localFirestore = internalFirebase.firestore();
|
|
50
|
+
if (firestoreSettings) {
|
|
51
|
+
localFirestore.settings(firestoreSettings);
|
|
52
|
+
}
|
|
53
|
+
return localFirestore;
|
|
52
54
|
}
|
|
53
55
|
return null;
|
|
54
|
-
}, [
|
|
56
|
+
}, [emulators?.firestore, firestoreEnabled, internalFirebase, firestoreSettings]);
|
|
55
57
|
const internalAuth = useMemo(() => {
|
|
56
58
|
if (authEnabled) {
|
|
57
59
|
const localAuth = internalFirebase.auth();
|
|
@@ -65,15 +67,13 @@ export const FirebaseContextProvider = ({ platform, emulators, options, children
|
|
|
65
67
|
return null;
|
|
66
68
|
}, [emulators?.auth, authEnabled, internalFirebase]);
|
|
67
69
|
const internalAnalytics = useMemo(() => {
|
|
68
|
-
if (analyticsEnabled &&
|
|
69
|
-
options.measurementId &&
|
|
70
|
-
(typeof window !== "undefined" || platform === "ReactNative")) {
|
|
70
|
+
if (analyticsEnabled && options.measurementId) {
|
|
71
71
|
return internalFirebase.analytics();
|
|
72
72
|
}
|
|
73
73
|
return null;
|
|
74
74
|
}, [analyticsEnabled, options.measurementId, internalFirebase]);
|
|
75
75
|
const internalRemoteConfig = useMemo(() => {
|
|
76
|
-
if (remoteConfigEnabled
|
|
76
|
+
if (remoteConfigEnabled) {
|
|
77
77
|
const localRemoteConfig = internalFirebase.remoteConfig();
|
|
78
78
|
if (remoteConfigSettings) {
|
|
79
79
|
localRemoteConfig.settings.fetchTimeMillis = remoteConfigSettings.fetchTimeMillis;
|
|
@@ -83,7 +83,7 @@ export const FirebaseContextProvider = ({ platform, emulators, options, children
|
|
|
83
83
|
return localRemoteConfig;
|
|
84
84
|
}
|
|
85
85
|
return null;
|
|
86
|
-
}, [remoteConfigEnabled, remoteConfigSettings, internalFirebase]);
|
|
86
|
+
}, [remoteConfigEnabled, remoteConfigSettings, internalFirebase, remoteConfigDefaults]);
|
|
87
87
|
const contextValue = useMemo(() => ({
|
|
88
88
|
firebase: internalFirebase,
|
|
89
89
|
auth: internalAuth,
|
|
@@ -95,6 +95,6 @@ export const FirebaseContextProvider = ({ platform, emulators, options, children
|
|
|
95
95
|
if (contextValue.analytics) {
|
|
96
96
|
setAnalyticsCollectionEnabled(contextValue.analytics, !!consentSettings?.analytics_storage);
|
|
97
97
|
}
|
|
98
|
-
}, [consentSettings]);
|
|
98
|
+
}, [consentSettings, contextValue.analytics]);
|
|
99
99
|
return (React.createElement(FirebaseContext.Provider, { value: contextValue }, children));
|
|
100
100
|
};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import React, { PropsWithChildren, useEffect, useMemo } from "react";
|
|
2
|
-
import { FirebaseContext } from "./FirebaseContext";
|
|
2
|
+
import { FirebaseContext, FirebaseContextValue } from "./FirebaseContext";
|
|
3
3
|
import { connectAuthEmulator } from "@react-native-firebase/auth";
|
|
4
4
|
import { FirebaseAnalyticsTypes, setAnalyticsCollectionEnabled, setConsent } from "@react-native-firebase/analytics";
|
|
5
5
|
import { FirebaseRemoteConfigTypes } from "@react-native-firebase/remote-config";
|
|
6
6
|
import { connectFirestoreEmulator } from "@react-native-firebase/firestore";
|
|
7
|
-
import firebase, { ReactNativeFirebase
|
|
7
|
+
import firebase, { ReactNativeFirebase } from "@react-native-firebase/app";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* @inline
|
|
@@ -150,7 +150,6 @@ export type FirebaseContextProviderProps = PropsWithChildren & {
|
|
|
150
150
|
* ```
|
|
151
151
|
*/
|
|
152
152
|
export const FirebaseContextProvider: React.FC<FirebaseContextProviderProps> = ({
|
|
153
|
-
platform,
|
|
154
153
|
emulators,
|
|
155
154
|
options,
|
|
156
155
|
children,
|
|
@@ -163,9 +162,7 @@ export const FirebaseContextProvider: React.FC<FirebaseContextProviderProps> = (
|
|
|
163
162
|
remoteConfigDefaults = {},
|
|
164
163
|
firestoreSettings
|
|
165
164
|
}) => {
|
|
166
|
-
const internalFirebase = useMemo(() =>
|
|
167
|
-
return platform === "Web" ? initializeApp(options) : firebase;
|
|
168
|
-
}, [options]);
|
|
165
|
+
const internalFirebase = useMemo(() => firebase, []);
|
|
169
166
|
|
|
170
167
|
useEffect(() => {
|
|
171
168
|
setConsent(firebase.analytics(), {
|
|
@@ -178,7 +175,7 @@ export const FirebaseContextProvider: React.FC<FirebaseContextProviderProps> = (
|
|
|
178
175
|
security_storage: false,
|
|
179
176
|
...consentSettings
|
|
180
177
|
});
|
|
181
|
-
}, [consentSettings
|
|
178
|
+
}, [consentSettings]);
|
|
182
179
|
|
|
183
180
|
const internalFirestore = useMemo(() => {
|
|
184
181
|
if (firestoreEnabled) {
|
|
@@ -190,11 +187,15 @@ export const FirebaseContextProvider: React.FC<FirebaseContextProviderProps> = (
|
|
|
190
187
|
);
|
|
191
188
|
}
|
|
192
189
|
|
|
193
|
-
|
|
190
|
+
const localFirestore = internalFirebase.firestore();
|
|
191
|
+
if (firestoreSettings) {
|
|
192
|
+
localFirestore.settings(firestoreSettings);
|
|
193
|
+
}
|
|
194
|
+
return localFirestore;
|
|
194
195
|
}
|
|
195
196
|
|
|
196
197
|
return null;
|
|
197
|
-
}, [
|
|
198
|
+
}, [emulators?.firestore, firestoreEnabled, internalFirebase, firestoreSettings]);
|
|
198
199
|
|
|
199
200
|
const internalAuth = useMemo(() => {
|
|
200
201
|
if (authEnabled) {
|
|
@@ -210,18 +211,14 @@ export const FirebaseContextProvider: React.FC<FirebaseContextProviderProps> = (
|
|
|
210
211
|
}, [emulators?.auth, authEnabled, internalFirebase]);
|
|
211
212
|
|
|
212
213
|
const internalAnalytics = useMemo(() => {
|
|
213
|
-
if (
|
|
214
|
-
analyticsEnabled &&
|
|
215
|
-
options.measurementId &&
|
|
216
|
-
(typeof window !== "undefined" || platform === "ReactNative")
|
|
217
|
-
) {
|
|
214
|
+
if (analyticsEnabled && options.measurementId) {
|
|
218
215
|
return internalFirebase.analytics();
|
|
219
216
|
}
|
|
220
217
|
return null;
|
|
221
218
|
}, [analyticsEnabled, options.measurementId, internalFirebase]);
|
|
222
219
|
|
|
223
220
|
const internalRemoteConfig = useMemo(() => {
|
|
224
|
-
if (remoteConfigEnabled
|
|
221
|
+
if (remoteConfigEnabled) {
|
|
225
222
|
const localRemoteConfig = internalFirebase.remoteConfig();
|
|
226
223
|
if (remoteConfigSettings) {
|
|
227
224
|
localRemoteConfig.settings.fetchTimeMillis = remoteConfigSettings.fetchTimeMillis;
|
|
@@ -231,7 +228,7 @@ export const FirebaseContextProvider: React.FC<FirebaseContextProviderProps> = (
|
|
|
231
228
|
return localRemoteConfig;
|
|
232
229
|
}
|
|
233
230
|
return null;
|
|
234
|
-
}, [remoteConfigEnabled, remoteConfigSettings, internalFirebase]);
|
|
231
|
+
}, [remoteConfigEnabled, remoteConfigSettings, internalFirebase, remoteConfigDefaults]);
|
|
235
232
|
|
|
236
233
|
const contextValue = useMemo(
|
|
237
234
|
() => ({
|
|
@@ -248,10 +245,10 @@ export const FirebaseContextProvider: React.FC<FirebaseContextProviderProps> = (
|
|
|
248
245
|
if (contextValue.analytics) {
|
|
249
246
|
setAnalyticsCollectionEnabled(contextValue.analytics, !!consentSettings?.analytics_storage);
|
|
250
247
|
}
|
|
251
|
-
}, [consentSettings]);
|
|
248
|
+
}, [consentSettings, contextValue.analytics]);
|
|
252
249
|
|
|
253
250
|
return (
|
|
254
|
-
<FirebaseContext.Provider value={contextValue as
|
|
251
|
+
<FirebaseContext.Provider value={contextValue as unknown as FirebaseContextValue}>
|
|
255
252
|
{children}
|
|
256
253
|
</FirebaseContext.Provider>
|
|
257
254
|
);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { FirebaseFirestoreTypes } from "@react-native-firebase/firestore";
|
|
2
2
|
type CompositeFilterDocumentData = FirebaseFirestoreTypes.DocumentData;
|
|
3
|
-
export type QueryElement<DbModelType extends CompositeFilterDocumentData = CompositeFilterDocumentData> =
|
|
3
|
+
export type QueryElement<DbModelType extends CompositeFilterDocumentData = CompositeFilterDocumentData> = {
|
|
4
|
+
operator: "OR" | "AND";
|
|
4
5
|
children?: QueryElement[];
|
|
5
6
|
field?: keyof (DbModelType & {
|
|
6
7
|
documentId?: string[];
|
|
@@ -9,7 +10,7 @@ export type QueryElement<DbModelType extends CompositeFilterDocumentData = Compo
|
|
|
9
10
|
op?: FirebaseFirestoreTypes.WhereFilterOp;
|
|
10
11
|
};
|
|
11
12
|
export type CompositeFilter<DbModelType extends CompositeFilterDocumentData = CompositeFilterDocumentData> = {
|
|
12
|
-
operator:
|
|
13
|
+
operator: "OR" | "AND";
|
|
13
14
|
children: QueryElement<DbModelType & {
|
|
14
15
|
documentId?: string[];
|
|
15
16
|
}>[];
|
|
@@ -9,19 +9,15 @@ import { useMemo } from "react";
|
|
|
9
9
|
*/
|
|
10
10
|
const buildCompositeQuery = (query) => {
|
|
11
11
|
if (query.children) {
|
|
12
|
-
const queryConstraints = query.children
|
|
13
|
-
.map((subQuery) => {
|
|
14
|
-
if (subQuery.field && subQuery.op) {
|
|
15
|
-
return where(query.field === "documentId" ? firebase.FieldPath.documentId() : query.field, subQuery.op, query.value);
|
|
16
|
-
}
|
|
17
|
-
return buildCompositeQuery(subQuery);
|
|
18
|
-
})
|
|
19
|
-
.filter((constraint) => !!constraint);
|
|
12
|
+
const queryConstraints = query.children.map(buildCompositeQuery).filter((constraint) => !!constraint);
|
|
20
13
|
if (queryConstraints.length <= 0) {
|
|
21
14
|
return null;
|
|
22
15
|
}
|
|
23
16
|
return query.operator === "OR" ? or(...queryConstraints) : and(...queryConstraints);
|
|
24
17
|
}
|
|
18
|
+
if (query.field && query.op) {
|
|
19
|
+
return where(query.field === "documentId" ? firebase.FieldPath.documentId() : query.field, query.op, query.value);
|
|
20
|
+
}
|
|
25
21
|
return null;
|
|
26
22
|
};
|
|
27
23
|
/**
|
|
@@ -3,16 +3,16 @@ import { useMemo } from "react";
|
|
|
3
3
|
|
|
4
4
|
type CompositeFilterDocumentData = FirebaseFirestoreTypes.DocumentData;
|
|
5
5
|
|
|
6
|
-
export type QueryElement<DbModelType extends CompositeFilterDocumentData = CompositeFilterDocumentData> =
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
export type QueryElement<DbModelType extends CompositeFilterDocumentData = CompositeFilterDocumentData> = {
|
|
7
|
+
operator: "OR" | "AND";
|
|
8
|
+
children?: QueryElement[];
|
|
9
|
+
field?: keyof (DbModelType & { documentId?: string[] });
|
|
10
|
+
value?: DbModelType[keyof DbModelType];
|
|
11
|
+
op?: FirebaseFirestoreTypes.WhereFilterOp;
|
|
12
|
+
};
|
|
13
13
|
|
|
14
14
|
export type CompositeFilter<DbModelType extends CompositeFilterDocumentData = CompositeFilterDocumentData> = {
|
|
15
|
-
operator:
|
|
15
|
+
operator: "OR" | "AND";
|
|
16
16
|
children: QueryElement<DbModelType & { documentId?: string[] }>[];
|
|
17
17
|
};
|
|
18
18
|
|
|
@@ -30,20 +30,9 @@ export type UseCompositeFilter<DbModelType extends CompositeFilterDocumentData =
|
|
|
30
30
|
|
|
31
31
|
const buildCompositeQuery = <DbModelType extends CompositeFilterDocumentData = CompositeFilterDocumentData>(
|
|
32
32
|
query: QueryElement<DbModelType>
|
|
33
|
-
): FirebaseFirestoreTypes.
|
|
33
|
+
): FirebaseFirestoreTypes.QueryFilterConstraint | null => {
|
|
34
34
|
if (query.children) {
|
|
35
|
-
const queryConstraints = query.children
|
|
36
|
-
.map((subQuery) => {
|
|
37
|
-
if (subQuery.field && subQuery.op) {
|
|
38
|
-
return where(
|
|
39
|
-
query.field === "documentId" ? firebase.FieldPath.documentId() : (query.field as string),
|
|
40
|
-
subQuery.op,
|
|
41
|
-
query.value
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
return buildCompositeQuery(subQuery);
|
|
45
|
-
})
|
|
46
|
-
.filter((constraint) => !!constraint);
|
|
35
|
+
const queryConstraints = query.children.map(buildCompositeQuery).filter((constraint) => !!constraint);
|
|
47
36
|
|
|
48
37
|
if (queryConstraints.length <= 0) {
|
|
49
38
|
return null;
|
|
@@ -52,6 +41,14 @@ const buildCompositeQuery = <DbModelType extends CompositeFilterDocumentData = C
|
|
|
52
41
|
return (query as CompositeFilter).operator === "OR" ? or(...queryConstraints) : and(...queryConstraints);
|
|
53
42
|
}
|
|
54
43
|
|
|
44
|
+
if (query.field && query.op) {
|
|
45
|
+
return where(
|
|
46
|
+
query.field === "documentId" ? firebase.FieldPath.documentId() : (query.field as string),
|
|
47
|
+
query.op,
|
|
48
|
+
query.value
|
|
49
|
+
) as unknown as FirebaseFirestoreTypes.QueryFilterConstraint;
|
|
50
|
+
}
|
|
51
|
+
|
|
55
52
|
return null;
|
|
56
53
|
};
|
|
57
54
|
|
|
@@ -23,7 +23,7 @@ export const useFetchAndActivate = () => {
|
|
|
23
23
|
setIsFetched(true);
|
|
24
24
|
console.log(`Cannot read remote config: ${e?.message}`);
|
|
25
25
|
}
|
|
26
|
-
}, [
|
|
26
|
+
}, [remoteConfig]);
|
|
27
27
|
return useMemo(() => ({
|
|
28
28
|
fetchAndActivate: fetchAndActivateCallback,
|
|
29
29
|
isFetched
|
|
@@ -14,7 +14,7 @@ export const useLogEvent = ({ eventName, eventParams }) => {
|
|
|
14
14
|
if (analytics) {
|
|
15
15
|
logEvent(analytics, eventName, eventParams);
|
|
16
16
|
}
|
|
17
|
-
}, [eventName, eventParams]);
|
|
17
|
+
}, [eventName, eventParams, analytics]);
|
|
18
18
|
return useMemo(() => ({
|
|
19
19
|
logEvent: logEventCallback
|
|
20
20
|
}), [logEventCallback]);
|
|
@@ -23,7 +23,7 @@ export const useLogEvent = ({ eventName, eventParams }: UseLogEventOptions) => {
|
|
|
23
23
|
if (analytics) {
|
|
24
24
|
logEvent(analytics, eventName, eventParams);
|
|
25
25
|
}
|
|
26
|
-
}, [eventName, eventParams]);
|
|
26
|
+
}, [eventName, eventParams, analytics]);
|
|
27
27
|
|
|
28
28
|
return useMemo(
|
|
29
29
|
() => ({
|
|
@@ -11,7 +11,7 @@ export const useAuthStateReady = () => {
|
|
|
11
11
|
const callback = useCallback(async () => {
|
|
12
12
|
await firebaseAuth.authStateReady();
|
|
13
13
|
setIsAuthStateReady(true);
|
|
14
|
-
}, [
|
|
14
|
+
}, [firebaseAuth]);
|
|
15
15
|
useEffect(() => {
|
|
16
16
|
callback();
|
|
17
17
|
}, [callback]);
|
package/web/auth/useIdToken.js
CHANGED
|
@@ -35,17 +35,17 @@ export const useIdToken = () => {
|
|
|
35
35
|
}
|
|
36
36
|
const idToken = await currentUser.getIdToken();
|
|
37
37
|
setIdToken(idToken);
|
|
38
|
-
}, [currentUser
|
|
38
|
+
}, [currentUser]);
|
|
39
39
|
const refresh = useCallback(async () => {
|
|
40
40
|
if (!currentUser) {
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
43
|
const idToken = await currentUser.getIdToken(true);
|
|
44
44
|
return idToken;
|
|
45
|
-
}, [currentUser
|
|
45
|
+
}, [currentUser]);
|
|
46
46
|
useEffect(() => {
|
|
47
47
|
callback();
|
|
48
|
-
}, [
|
|
48
|
+
}, [callback]);
|
|
49
49
|
useEffect(() => {
|
|
50
50
|
const unsubscribe = onIdTokenChanged(auth, (user) => {
|
|
51
51
|
if (user) {
|
|
@@ -58,7 +58,7 @@ export const useIdToken = () => {
|
|
|
58
58
|
}
|
|
59
59
|
});
|
|
60
60
|
return () => unsubscribe();
|
|
61
|
-
}, [
|
|
61
|
+
}, [setIdToken, auth]);
|
|
62
62
|
return {
|
|
63
63
|
idToken,
|
|
64
64
|
refresh
|
package/web/auth/useIdToken.ts
CHANGED
|
@@ -47,7 +47,7 @@ export const useIdToken = (): UseIdTokenResult => {
|
|
|
47
47
|
|
|
48
48
|
const idToken = await currentUser.getIdToken();
|
|
49
49
|
setIdToken(idToken);
|
|
50
|
-
}, [currentUser
|
|
50
|
+
}, [currentUser]);
|
|
51
51
|
|
|
52
52
|
const refresh = useCallback(async () => {
|
|
53
53
|
if (!currentUser) {
|
|
@@ -56,11 +56,11 @@ export const useIdToken = (): UseIdTokenResult => {
|
|
|
56
56
|
|
|
57
57
|
const idToken = await currentUser.getIdToken(true);
|
|
58
58
|
return idToken;
|
|
59
|
-
}, [currentUser
|
|
59
|
+
}, [currentUser]);
|
|
60
60
|
|
|
61
61
|
useEffect(() => {
|
|
62
62
|
callback();
|
|
63
|
-
}, [
|
|
63
|
+
}, [callback]);
|
|
64
64
|
|
|
65
65
|
useEffect(() => {
|
|
66
66
|
const unsubscribe = onIdTokenChanged(auth, (user) => {
|
|
@@ -74,7 +74,7 @@ export const useIdToken = (): UseIdTokenResult => {
|
|
|
74
74
|
});
|
|
75
75
|
|
|
76
76
|
return () => unsubscribe();
|
|
77
|
-
}, [
|
|
77
|
+
}, [setIdToken, auth]);
|
|
78
78
|
|
|
79
79
|
return {
|
|
80
80
|
idToken,
|
|
@@ -53,7 +53,7 @@ export const FirebaseContextProvider = ({ emulators, options, children, authEnab
|
|
|
53
53
|
return localFirestore;
|
|
54
54
|
}
|
|
55
55
|
return null;
|
|
56
|
-
}, [firestoreSettings, emulators?.firestore, firestoreEnabled]);
|
|
56
|
+
}, [firestoreSettings, emulators?.firestore, firestoreEnabled, firebase]);
|
|
57
57
|
const auth = useMemo(() => {
|
|
58
58
|
if (authEnabled) {
|
|
59
59
|
const localAuth = getAuth(firebase);
|
|
@@ -65,13 +65,13 @@ export const FirebaseContextProvider = ({ emulators, options, children, authEnab
|
|
|
65
65
|
return localAuth;
|
|
66
66
|
}
|
|
67
67
|
return null;
|
|
68
|
-
}, [emulators?.auth, authEnabled]);
|
|
68
|
+
}, [emulators?.auth, authEnabled, firebase]);
|
|
69
69
|
const analytics = useMemo(() => {
|
|
70
70
|
if (analyticsEnabled && options.measurementId && typeof window !== "undefined") {
|
|
71
71
|
return getAnalytics(firebase);
|
|
72
72
|
}
|
|
73
73
|
return null;
|
|
74
|
-
}, [analyticsEnabled, options.measurementId]);
|
|
74
|
+
}, [analyticsEnabled, options.measurementId, firebase]);
|
|
75
75
|
const remoteConfig = useMemo(() => {
|
|
76
76
|
if (remoteConfigEnabled && typeof window !== "undefined") {
|
|
77
77
|
const localRemoteConfig = getRemoteConfig(firebase);
|
|
@@ -83,7 +83,7 @@ export const FirebaseContextProvider = ({ emulators, options, children, authEnab
|
|
|
83
83
|
return localRemoteConfig;
|
|
84
84
|
}
|
|
85
85
|
return null;
|
|
86
|
-
}, [remoteConfigEnabled]);
|
|
86
|
+
}, [remoteConfigEnabled, firebase, remoteConfigDefaults, remoteConfigSettings]);
|
|
87
87
|
const contextValue = useMemo(() => ({
|
|
88
88
|
firebase,
|
|
89
89
|
auth,
|
|
@@ -95,6 +95,6 @@ export const FirebaseContextProvider = ({ emulators, options, children, authEnab
|
|
|
95
95
|
if (contextValue.analytics) {
|
|
96
96
|
setAnalyticsCollectionEnabled(contextValue.analytics, consentSettings?.analytics_storage === "granted");
|
|
97
97
|
}
|
|
98
|
-
}, [consentSettings]);
|
|
98
|
+
}, [consentSettings?.analytics_storage, contextValue.analytics]);
|
|
99
99
|
return (React.createElement(FirebaseContext.Provider, { value: contextValue }, children));
|
|
100
100
|
};
|
|
@@ -171,7 +171,7 @@ export const FirebaseContextProvider: React.FC<FirebaseContextProviderProps> = (
|
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
return null;
|
|
174
|
-
}, [firestoreSettings, emulators?.firestore, firestoreEnabled]);
|
|
174
|
+
}, [firestoreSettings, emulators?.firestore, firestoreEnabled, firebase]);
|
|
175
175
|
|
|
176
176
|
const auth = useMemo(() => {
|
|
177
177
|
if (authEnabled) {
|
|
@@ -184,14 +184,14 @@ export const FirebaseContextProvider: React.FC<FirebaseContextProviderProps> = (
|
|
|
184
184
|
return localAuth;
|
|
185
185
|
}
|
|
186
186
|
return null;
|
|
187
|
-
}, [emulators?.auth, authEnabled]);
|
|
187
|
+
}, [emulators?.auth, authEnabled, firebase]);
|
|
188
188
|
|
|
189
189
|
const analytics = useMemo(() => {
|
|
190
190
|
if (analyticsEnabled && options.measurementId && typeof window !== "undefined") {
|
|
191
191
|
return getAnalytics(firebase);
|
|
192
192
|
}
|
|
193
193
|
return null;
|
|
194
|
-
}, [analyticsEnabled, options.measurementId]);
|
|
194
|
+
}, [analyticsEnabled, options.measurementId, firebase]);
|
|
195
195
|
|
|
196
196
|
const remoteConfig = useMemo(() => {
|
|
197
197
|
if (remoteConfigEnabled && typeof window !== "undefined") {
|
|
@@ -204,7 +204,7 @@ export const FirebaseContextProvider: React.FC<FirebaseContextProviderProps> = (
|
|
|
204
204
|
return localRemoteConfig;
|
|
205
205
|
}
|
|
206
206
|
return null;
|
|
207
|
-
}, [remoteConfigEnabled]);
|
|
207
|
+
}, [remoteConfigEnabled, firebase, remoteConfigDefaults, remoteConfigSettings]);
|
|
208
208
|
|
|
209
209
|
const contextValue = useMemo(
|
|
210
210
|
() => ({
|
|
@@ -221,7 +221,7 @@ export const FirebaseContextProvider: React.FC<FirebaseContextProviderProps> = (
|
|
|
221
221
|
if (contextValue.analytics) {
|
|
222
222
|
setAnalyticsCollectionEnabled(contextValue.analytics, consentSettings?.analytics_storage === "granted");
|
|
223
223
|
}
|
|
224
|
-
}, [consentSettings]);
|
|
224
|
+
}, [consentSettings?.analytics_storage, contextValue.analytics]);
|
|
225
225
|
|
|
226
226
|
return (
|
|
227
227
|
<FirebaseContext.Provider value={contextValue as React.ContextType<typeof FirebaseContext>}>
|
|
@@ -20,5 +20,5 @@ export const useCollectionReference = ({ path, reference, pathSegments }) => {
|
|
|
20
20
|
: reference.type === "collection"
|
|
21
21
|
? collection(reference, path, ...(pathSegments || []))
|
|
22
22
|
: collection(reference, path, ...(pathSegments || []));
|
|
23
|
-
}, [path, reference
|
|
23
|
+
}, [path, reference, pathSegments, db]);
|
|
24
24
|
};
|
|
@@ -33,5 +33,5 @@ export const useCollectionReference = <AppModelType, DbModelType extends Documen
|
|
|
33
33
|
: reference.type === "collection"
|
|
34
34
|
? collection(reference, path, ...(pathSegments || []))
|
|
35
35
|
: collection(reference, path, ...(pathSegments || []));
|
|
36
|
-
}, [path, reference
|
|
36
|
+
}, [path, reference, pathSegments, db]);
|
|
37
37
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { DocumentData, WhereFilterOp
|
|
1
|
+
import { DocumentData, WhereFilterOp } from "firebase/firestore";
|
|
2
2
|
type CompositeFilterDocumentData = DocumentData;
|
|
3
|
-
export type QueryElement<DbModelType extends CompositeFilterDocumentData = CompositeFilterDocumentData> =
|
|
3
|
+
export type QueryElement<DbModelType extends CompositeFilterDocumentData = CompositeFilterDocumentData> = {
|
|
4
|
+
operator: "OR" | "AND";
|
|
4
5
|
children?: QueryElement[];
|
|
5
6
|
field?: keyof (DbModelType & {
|
|
6
7
|
documentId?: string[];
|
|
@@ -27,5 +28,5 @@ export type UseCompositeFilter<DbModelType extends CompositeFilterDocumentData =
|
|
|
27
28
|
*
|
|
28
29
|
* @returns {(Function|undefined)} A composite query filter constraint function formed by combining subqueries or undefined if there are no valid constraints.
|
|
29
30
|
*/
|
|
30
|
-
export declare const useCompositeFilter: <DbModelType extends CompositeFilterDocumentData = CompositeFilterDocumentData>({ query }: UseCompositeFilter<DbModelType>) => QueryCompositeFilterConstraint | undefined;
|
|
31
|
+
export declare const useCompositeFilter: <DbModelType extends CompositeFilterDocumentData = CompositeFilterDocumentData>({ query }: UseCompositeFilter<DbModelType>) => import("@firebase/firestore").QueryCompositeFilterConstraint | undefined;
|
|
31
32
|
export {};
|
|
@@ -9,19 +9,15 @@ import { useMemo } from "react";
|
|
|
9
9
|
*/
|
|
10
10
|
const buildCompositeQuery = (query) => {
|
|
11
11
|
if (query.children) {
|
|
12
|
-
const queryConstraints = query.children
|
|
13
|
-
.map((subQuery) => {
|
|
14
|
-
if (subQuery.field && subQuery.op) {
|
|
15
|
-
return where(query.field === "documentId" ? documentId() : query.field, subQuery.op, query.value);
|
|
16
|
-
}
|
|
17
|
-
return buildCompositeQuery(subQuery);
|
|
18
|
-
})
|
|
19
|
-
.filter((constraint) => !!constraint);
|
|
12
|
+
const queryConstraints = query.children.map(buildCompositeQuery).filter((constraint) => !!constraint);
|
|
20
13
|
if (queryConstraints.length <= 0) {
|
|
21
14
|
return null;
|
|
22
15
|
}
|
|
23
16
|
return query.operator === "OR" ? or(...queryConstraints) : and(...queryConstraints);
|
|
24
17
|
}
|
|
18
|
+
if (query.field && query.op) {
|
|
19
|
+
return where(query.field === "documentId" ? documentId() : query.field, query.op, query.value);
|
|
20
|
+
}
|
|
25
21
|
return null;
|
|
26
22
|
};
|
|
27
23
|
/**
|
|
@@ -1,25 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DocumentData,
|
|
3
|
-
QueryFilterConstraint,
|
|
4
|
-
QueryFieldFilterConstraint,
|
|
5
|
-
WhereFilterOp,
|
|
6
|
-
QueryCompositeFilterConstraint,
|
|
7
|
-
documentId,
|
|
8
|
-
and,
|
|
9
|
-
or,
|
|
10
|
-
where
|
|
11
|
-
} from "firebase/firestore";
|
|
1
|
+
import { DocumentData, QueryFilterConstraint, WhereFilterOp, documentId, and, or, where } from "firebase/firestore";
|
|
12
2
|
import { useMemo } from "react";
|
|
13
3
|
|
|
14
4
|
type CompositeFilterDocumentData = DocumentData;
|
|
15
5
|
|
|
16
|
-
export type QueryElement<DbModelType extends CompositeFilterDocumentData = CompositeFilterDocumentData> =
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
6
|
+
export type QueryElement<DbModelType extends CompositeFilterDocumentData = CompositeFilterDocumentData> = {
|
|
7
|
+
operator: "OR" | "AND";
|
|
8
|
+
children?: QueryElement[];
|
|
9
|
+
field?: keyof (DbModelType & { documentId?: string[] });
|
|
10
|
+
value?: DbModelType[keyof DbModelType];
|
|
11
|
+
op?: WhereFilterOp;
|
|
12
|
+
};
|
|
23
13
|
|
|
24
14
|
export type CompositeFilter<DbModelType extends CompositeFilterDocumentData = CompositeFilterDocumentData> = {
|
|
25
15
|
operator: "OR" | "AND";
|
|
@@ -40,20 +30,9 @@ export type UseCompositeFilter<DbModelType extends CompositeFilterDocumentData =
|
|
|
40
30
|
|
|
41
31
|
const buildCompositeQuery = <DbModelType extends CompositeFilterDocumentData = CompositeFilterDocumentData>(
|
|
42
32
|
query: QueryElement<DbModelType>
|
|
43
|
-
):
|
|
33
|
+
): QueryFilterConstraint | null => {
|
|
44
34
|
if (query.children) {
|
|
45
|
-
const queryConstraints = query.children
|
|
46
|
-
.map((subQuery) => {
|
|
47
|
-
if (subQuery.field && subQuery.op) {
|
|
48
|
-
return where(
|
|
49
|
-
query.field === "documentId" ? documentId() : (query.field as string),
|
|
50
|
-
subQuery.op,
|
|
51
|
-
query.value
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
return buildCompositeQuery(subQuery);
|
|
55
|
-
})
|
|
56
|
-
.filter((constraint) => !!constraint);
|
|
35
|
+
const queryConstraints = query.children.map(buildCompositeQuery).filter((constraint) => !!constraint);
|
|
57
36
|
|
|
58
37
|
if (queryConstraints.length <= 0) {
|
|
59
38
|
return null;
|
|
@@ -62,6 +41,10 @@ const buildCompositeQuery = <DbModelType extends CompositeFilterDocumentData = C
|
|
|
62
41
|
return (query as CompositeFilter).operator === "OR" ? or(...queryConstraints) : and(...queryConstraints);
|
|
63
42
|
}
|
|
64
43
|
|
|
44
|
+
if (query.field && query.op) {
|
|
45
|
+
return where(query.field === "documentId" ? documentId() : (query.field as string), query.op, query.value);
|
|
46
|
+
}
|
|
47
|
+
|
|
65
48
|
return null;
|
|
66
49
|
};
|
|
67
50
|
|
|
@@ -40,6 +40,6 @@ export const useDocReference = ({ path, reference, pathSegments }) => {
|
|
|
40
40
|
const ref = useRef(getDocReference(db, { path, pathSegments, reference }));
|
|
41
41
|
useEffect(() => {
|
|
42
42
|
ref.current = getDocReference(db, { path, pathSegments, reference });
|
|
43
|
-
}, [path, reference, pathSegments]);
|
|
43
|
+
}, [path, reference, pathSegments, db]);
|
|
44
44
|
return ref.current;
|
|
45
45
|
};
|
|
@@ -62,7 +62,7 @@ export const useDocReference = <AppModelType, DbModelType extends DocumentData =
|
|
|
62
62
|
|
|
63
63
|
useEffect(() => {
|
|
64
64
|
ref.current = getDocReference(db, { path, pathSegments, reference });
|
|
65
|
-
}, [path, reference, pathSegments]);
|
|
65
|
+
}, [path, reference, pathSegments, db]);
|
|
66
66
|
|
|
67
67
|
return ref.current;
|
|
68
68
|
};
|
|
@@ -23,7 +23,7 @@ export const useFetchAndActivate = () => {
|
|
|
23
23
|
setIsFetched(true);
|
|
24
24
|
console.log(`Cannot read remote config: ${e?.message}`);
|
|
25
25
|
}
|
|
26
|
-
}, [
|
|
26
|
+
}, [remoteConfig]);
|
|
27
27
|
return useMemo(() => ({
|
|
28
28
|
fetchAndActivate: fetchAndActivateCallback,
|
|
29
29
|
isFetched
|