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.
Files changed (49) hide show
  1. package/package.json +1 -1
  2. package/react-native/analytics/useLogEvent.js +1 -1
  3. package/react-native/analytics/useLogEvent.ts +1 -1
  4. package/react-native/analytics/useSetAnalyticsCollectionEnabled.js +1 -1
  5. package/react-native/analytics/useSetAnalyticsCollectionEnabled.ts +1 -1
  6. package/react-native/auth/useIdToken.js +4 -4
  7. package/react-native/auth/useIdToken.ts +4 -4
  8. package/react-native/context/FirebaseContext.d.ts +1 -2
  9. package/react-native/context/FirebaseContext.ts +1 -1
  10. package/react-native/context/FirebaseContextProvider.js +14 -14
  11. package/react-native/context/FirebaseContextProvider.tsx +15 -18
  12. package/react-native/firestore/useCompositeFilter.d.ts +3 -2
  13. package/react-native/firestore/useCompositeFilter.js +4 -8
  14. package/react-native/firestore/useCompositeFilter.ts +18 -21
  15. package/react-native/firestore/useDocReferences.js +1 -1
  16. package/react-native/firestore/useDocReferences.ts +1 -1
  17. package/react-native/firestore/useGetRealtimeDocData.js +1 -1
  18. package/react-native/firestore/useGetRealtimeDocData.ts +1 -1
  19. package/react-native/remoteConfig/useFetchAndActivate.js +1 -1
  20. package/react-native/remoteConfig/useFetchAndActivate.ts +1 -1
  21. package/react-native/remoteConfig/useGetValue.js +1 -1
  22. package/react-native/remoteConfig/useGetValue.ts +1 -1
  23. package/web/analytics/useLogEvent.js +1 -1
  24. package/web/analytics/useLogEvent.ts +1 -1
  25. package/web/analytics/useSetAnalyticsCollectionEnabled.js +1 -1
  26. package/web/analytics/useSetAnalyticsCollectionEnabled.ts +1 -1
  27. package/web/auth/useAuthStateReady.js +1 -1
  28. package/web/auth/useAuthStateReady.ts +1 -1
  29. package/web/auth/useCurrentUser.js +1 -1
  30. package/web/auth/useCurrentUser.ts +1 -1
  31. package/web/auth/useIdToken.js +4 -4
  32. package/web/auth/useIdToken.ts +4 -4
  33. package/web/context/FirebaseContextProvider.js +5 -5
  34. package/web/context/FirebaseContextProvider.tsx +5 -5
  35. package/web/firestore/useCollectionReference.js +1 -1
  36. package/web/firestore/useCollectionReference.ts +1 -1
  37. package/web/firestore/useCompositeFilter.d.ts +4 -3
  38. package/web/firestore/useCompositeFilter.js +4 -8
  39. package/web/firestore/useCompositeFilter.ts +14 -31
  40. package/web/firestore/useDocReference.js +1 -1
  41. package/web/firestore/useDocReference.ts +1 -1
  42. package/web/firestore/useDocReferences.js +1 -1
  43. package/web/firestore/useDocReferences.ts +1 -1
  44. package/web/firestore/useGetRealtimeDocData.js +1 -1
  45. package/web/firestore/useGetRealtimeDocData.ts +1 -1
  46. package/web/remoteConfig/useFetchAndActivate.js +1 -1
  47. package/web/remoteConfig/useFetchAndActivate.ts +1 -1
  48. package/web/remoteConfig/useGetValue.js +1 -1
  49. package/web/remoteConfig/useGetValue.ts +1 -1
package/package.json CHANGED
@@ -73,5 +73,5 @@
73
73
  "docs:build": "vitepress build docs",
74
74
  "docs:preview": "vitepress preview docs"
75
75
  },
76
- "version": "2.0.0-rc8"
76
+ "version": "2.0.2"
77
77
  }
@@ -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
  () => ({
@@ -12,5 +12,5 @@ export const useSetAnalyticsCollectionEnabled = ({ enabled = false }) => {
12
12
  if (analytics) {
13
13
  setAnalyticsCollectionEnabled(analytics, enabled);
14
14
  }
15
- }, [analytics]);
15
+ }, [analytics, enabled]);
16
16
  };
@@ -18,5 +18,5 @@ export const useSetAnalyticsCollectionEnabled = ({ enabled = false }: UseSetAnal
18
18
  if (analytics) {
19
19
  setAnalyticsCollectionEnabled(analytics, enabled);
20
20
  }
21
- }, [analytics]);
21
+ }, [analytics, enabled]);
22
22
  };
@@ -35,17 +35,17 @@ export const useIdToken = () => {
35
35
  }
36
36
  const idToken = await currentUser.getIdToken();
37
37
  setIdToken(idToken);
38
- }, [currentUser, idToken]);
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, idToken]);
45
+ }, [currentUser]);
46
46
  useEffect(() => {
47
47
  callback();
48
- }, [currentUser?.uid ?? ""]);
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
- }, [idToken]);
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, idToken]);
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, idToken]);
59
+ }, [currentUser]);
60
60
 
61
61
  useEffect(() => {
62
62
  callback();
63
- }, [currentUser?.uid ?? ""]);
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
- }, [idToken]);
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, { initializeApp } from "@react-native-firebase/app";
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 = ({ platform, emulators, options, children, authEnabled = true, firestoreEnabled = true, analyticsEnabled = true, consentSettings = {}, remoteConfigEnabled = true, remoteConfigSettings, remoteConfigDefaults = {}, firestoreSettings }) => {
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, firebase]);
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
- return internalFirebase.firestore();
49
+ const localFirestore = internalFirebase.firestore();
50
+ if (firestoreSettings) {
51
+ localFirestore.settings(firestoreSettings);
52
+ }
53
+ return localFirestore;
52
54
  }
53
55
  return null;
54
- }, [firestoreSettings, emulators?.firestore, firestoreEnabled, internalFirebase]);
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 && (typeof window !== "undefined" || platform === "ReactNative")) {
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, initializeApp } from "@react-native-firebase/app";
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, firebase]);
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
- return internalFirebase.firestore();
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
- }, [firestoreSettings, emulators?.firestore, firestoreEnabled, internalFirebase]);
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 && (typeof window !== "undefined" || platform === "ReactNative")) {
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 React.ContextType<typeof FirebaseContext>}>
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> = Partial<FirebaseFirestoreTypes.QueryCompositeFilterConstraint> & {
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: FirebaseFirestoreTypes.QueryFilterType;
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
- Partial<FirebaseFirestoreTypes.QueryCompositeFilterConstraint> & {
8
- children?: QueryElement[];
9
- field?: keyof (DbModelType & { documentId?: string[] });
10
- value?: DbModelType[keyof DbModelType];
11
- op?: FirebaseFirestoreTypes.WhereFilterOp;
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: FirebaseFirestoreTypes.QueryFilterType;
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.QueryFieldFilterConstraint | FirebaseFirestoreTypes.QueryCompositeFilterConstraint | null => {
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
 
@@ -25,5 +25,5 @@ export const useDocReferences = (references) => {
25
25
  ? doc(db, path || "", ...(pathSegments || []))
26
26
  : doc(reference, path, ...(pathSegments || [])));
27
27
  });
28
- }, [references]);
28
+ }, [references, db]);
29
29
  };
@@ -44,5 +44,5 @@ export const useDocReferences = <
44
44
  : doc(reference, path, ...(pathSegments || []))
45
45
  ) as FirebaseFirestoreTypes.DocumentReference<AppModelType>;
46
46
  });
47
- }, [references]);
47
+ }, [references, db]);
48
48
  };
@@ -52,5 +52,5 @@ export const useGetRealtimeDocData = ({ path, pathSegments, reference, onError }
52
52
  isError,
53
53
  isFetching,
54
54
  error
55
- }), [doc, isError, error]);
55
+ }), [doc, isError, error, isFetching]);
56
56
  };
@@ -105,6 +105,6 @@ export const useGetRealtimeDocData = <
105
105
  isFetching,
106
106
  error
107
107
  }),
108
- [doc, isError, error]
108
+ [doc, isError, error, isFetching]
109
109
  );
110
110
  };
@@ -23,7 +23,7 @@ export const useFetchAndActivate = () => {
23
23
  setIsFetched(true);
24
24
  console.log(`Cannot read remote config: ${e?.message}`);
25
25
  }
26
- }, [isFetched]);
26
+ }, [remoteConfig]);
27
27
  return useMemo(() => ({
28
28
  fetchAndActivate: fetchAndActivateCallback,
29
29
  isFetched
@@ -24,7 +24,7 @@ export const useFetchAndActivate = () => {
24
24
  setIsFetched(true);
25
25
  console.log(`Cannot read remote config: ${(e as Error)?.message}`);
26
26
  }
27
- }, [isFetched]);
27
+ }, [remoteConfig]);
28
28
 
29
29
  return useMemo(
30
30
  () => ({
@@ -11,5 +11,5 @@ export const useGetValue = (key) => {
11
11
  const remoteConfig = useRemoteConfig();
12
12
  return useMemo(() => {
13
13
  return remoteConfig ? getValue(remoteConfig, key) : null;
14
- }, [remoteConfig?.lastFetchStatus, key]);
14
+ }, [remoteConfig, key]);
15
15
  };
@@ -12,5 +12,5 @@ export const useGetValue = (key: string) => {
12
12
  const remoteConfig = useRemoteConfig();
13
13
  return useMemo(() => {
14
14
  return remoteConfig ? getValue(remoteConfig, key) : null;
15
- }, [remoteConfig?.lastFetchStatus, key]);
15
+ }, [remoteConfig, key]);
16
16
  };
@@ -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
  () => ({
@@ -12,5 +12,5 @@ export const useSetAnalyticsCollectionEnabled = ({ enabled = false }) => {
12
12
  if (analytics) {
13
13
  setAnalyticsCollectionEnabled(analytics, enabled);
14
14
  }
15
- }, [analytics]);
15
+ }, [analytics, enabled]);
16
16
  };
@@ -18,5 +18,5 @@ export const useSetAnalyticsCollectionEnabled = ({ enabled = false }: UseSetAnal
18
18
  if (analytics) {
19
19
  setAnalyticsCollectionEnabled(analytics, enabled);
20
20
  }
21
- }, [analytics]);
21
+ }, [analytics, enabled]);
22
22
  };
@@ -11,7 +11,7 @@ export const useAuthStateReady = () => {
11
11
  const callback = useCallback(async () => {
12
12
  await firebaseAuth.authStateReady();
13
13
  setIsAuthStateReady(true);
14
- }, [isAuthStateReady]);
14
+ }, [firebaseAuth]);
15
15
  useEffect(() => {
16
16
  callback();
17
17
  }, [callback]);
@@ -14,7 +14,7 @@ export const useAuthStateReady = () => {
14
14
  const callback = useCallback(async () => {
15
15
  await firebaseAuth.authStateReady();
16
16
  setIsAuthStateReady(true);
17
- }, [isAuthStateReady]);
17
+ }, [firebaseAuth]);
18
18
 
19
19
  useEffect(() => {
20
20
  callback();
@@ -15,6 +15,6 @@ export const useCurrentUser = () => {
15
15
  return () => {
16
16
  unsubscribe();
17
17
  };
18
- }, [currentUser?.uid ?? ""]);
18
+ }, [currentUser?.uid, firebaseAuth]);
19
19
  return currentUser;
20
20
  };
@@ -18,7 +18,7 @@ export const useCurrentUser = () => {
18
18
  return () => {
19
19
  unsubscribe();
20
20
  };
21
- }, [currentUser?.uid ?? ""]);
21
+ }, [currentUser?.uid, firebaseAuth]);
22
22
 
23
23
  return currentUser;
24
24
  };
@@ -35,17 +35,17 @@ export const useIdToken = () => {
35
35
  }
36
36
  const idToken = await currentUser.getIdToken();
37
37
  setIdToken(idToken);
38
- }, [currentUser, idToken]);
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, idToken]);
45
+ }, [currentUser]);
46
46
  useEffect(() => {
47
47
  callback();
48
- }, [currentUser?.uid ?? ""]);
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
- }, [idToken]);
61
+ }, [setIdToken, 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, idToken]);
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, idToken]);
59
+ }, [currentUser]);
60
60
 
61
61
  useEffect(() => {
62
62
  callback();
63
- }, [currentUser?.uid ?? ""]);
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
- }, [idToken]);
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?.path, pathSegments]);
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?.path, pathSegments]);
36
+ }, [path, reference, pathSegments, db]);
37
37
  };
@@ -1,6 +1,7 @@
1
- import { DocumentData, WhereFilterOp, QueryCompositeFilterConstraint } from "firebase/firestore";
1
+ import { DocumentData, WhereFilterOp } from "firebase/firestore";
2
2
  type CompositeFilterDocumentData = DocumentData;
3
- export type QueryElement<DbModelType extends CompositeFilterDocumentData = CompositeFilterDocumentData> = Partial<QueryCompositeFilterConstraint> & {
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
- Partial<QueryCompositeFilterConstraint> & {
18
- children?: QueryElement[];
19
- field?: keyof (DbModelType & { documentId?: string[] });
20
- value?: DbModelType[keyof DbModelType];
21
- op?: WhereFilterOp;
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
- ): QueryFieldFilterConstraint | QueryCompositeFilterConstraint | null => {
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
  };
@@ -27,5 +27,5 @@ export const useDocReferences = (references) => {
27
27
  ? doc(reference, path, ...(pathSegments || []))
28
28
  : doc(reference, path, ...(pathSegments || [])));
29
29
  });
30
- }, [references]);
30
+ }, [references, db]);
31
31
  };
@@ -40,5 +40,5 @@ export const useDocReferences = <AppModelType, DbModelType extends DocumentData
40
40
  : doc(reference, path, ...(pathSegments || []))
41
41
  ) as DocumentReference<AppModelType, DbModelType>;
42
42
  });
43
- }, [references]);
43
+ }, [references, db]);
44
44
  };
@@ -52,5 +52,5 @@ export const useGetRealtimeDocData = ({ path, pathSegments, reference, onError }
52
52
  isError,
53
53
  isFetching,
54
54
  error
55
- }), [doc, isError, error]);
55
+ }), [doc, isError, error, isFetching]);
56
56
  };
@@ -99,6 +99,6 @@ export const useGetRealtimeDocData = <AppModelType, DbModelType extends Document
99
99
  isFetching,
100
100
  error
101
101
  }),
102
- [doc, isError, error]
102
+ [doc, isError, error, isFetching]
103
103
  );
104
104
  };
@@ -23,7 +23,7 @@ export const useFetchAndActivate = () => {
23
23
  setIsFetched(true);
24
24
  console.log(`Cannot read remote config: ${e?.message}`);
25
25
  }
26
- }, [isFetched]);
26
+ }, [remoteConfig]);
27
27
  return useMemo(() => ({
28
28
  fetchAndActivate: fetchAndActivateCallback,
29
29
  isFetched
@@ -24,7 +24,7 @@ export const useFetchAndActivate = () => {
24
24
  setIsFetched(true);
25
25
  console.log(`Cannot read remote config: ${(e as Error)?.message}`);
26
26
  }
27
- }, [isFetched]);
27
+ }, [remoteConfig]);
28
28
 
29
29
  return useMemo(
30
30
  () => ({
@@ -11,5 +11,5 @@ export const useGetValue = (key) => {
11
11
  const remoteConfig = useRemoteConfig();
12
12
  return useMemo(() => {
13
13
  return remoteConfig ? getValue(remoteConfig, key) : null;
14
- }, [remoteConfig?.lastFetchStatus, key]);
14
+ }, [key, remoteConfig]);
15
15
  };
@@ -12,5 +12,5 @@ export const useGetValue = (key: string) => {
12
12
  const remoteConfig = useRemoteConfig();
13
13
  return useMemo(() => {
14
14
  return remoteConfig ? getValue(remoteConfig, key) : null;
15
- }, [remoteConfig?.lastFetchStatus, key]);
15
+ }, [key, remoteConfig]);
16
16
  };