react-query-firebase 2.3.3 → 2.4.1

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 (133) hide show
  1. package/package.json +1 -1
  2. package/react-native/firestore/index.d.ts +5 -0
  3. package/react-native/firestore/index.js +5 -0
  4. package/react-native/firestore/index.ts +5 -0
  5. package/react-native/firestore/useAddDocMutation.d.ts +38 -9
  6. package/react-native/firestore/useAddDocMutation.js +25 -11
  7. package/react-native/firestore/useAddDocMutation.ts +43 -13
  8. package/react-native/firestore/useBatchWrite.d.ts +31 -7
  9. package/react-native/firestore/useBatchWrite.js +22 -4
  10. package/react-native/firestore/useBatchWrite.ts +31 -7
  11. package/react-native/firestore/useCollectionReference.d.ts +30 -9
  12. package/react-native/firestore/useCollectionReference.js +15 -7
  13. package/react-native/firestore/useCollectionReference.ts +34 -25
  14. package/react-native/firestore/useCompositeFilter.d.ts +1 -46
  15. package/react-native/firestore/useCompositeFilter.js +2 -45
  16. package/react-native/firestore/useCompositeFilter.ts +2 -74
  17. package/react-native/firestore/useCountQuery.d.ts +1 -1
  18. package/react-native/firestore/useCountQuery.ts +1 -1
  19. package/react-native/firestore/useDeleteDocMutation.d.ts +39 -10
  20. package/react-native/firestore/useDeleteDocMutation.js +22 -5
  21. package/react-native/firestore/useDeleteDocMutation.ts +38 -15
  22. package/react-native/firestore/useDocReference.d.ts +22 -14
  23. package/react-native/firestore/useDocReference.js +20 -26
  24. package/react-native/firestore/useDocReference.ts +34 -47
  25. package/react-native/firestore/useDocReferences.d.ts +23 -18
  26. package/react-native/firestore/useDocReferences.js +18 -19
  27. package/react-native/firestore/useDocReferences.ts +26 -34
  28. package/react-native/firestore/useFirestore.d.ts +4 -3
  29. package/react-native/firestore/useFirestore.js +4 -3
  30. package/react-native/firestore/useFirestore.ts +4 -3
  31. package/react-native/firestore/useGetDocData.d.ts +33 -14
  32. package/react-native/firestore/useGetDocData.js +21 -6
  33. package/react-native/firestore/useGetDocData.ts +34 -22
  34. package/react-native/firestore/useInfiniteQuery.d.ts +1 -1
  35. package/react-native/firestore/useInfiniteQuery.ts +1 -1
  36. package/react-native/firestore/useQuery.d.ts +1 -1
  37. package/react-native/firestore/useQuery.ts +1 -1
  38. package/react-native/firestore/useQueryConstraints.d.ts +0 -21
  39. package/react-native/firestore/useQueryConstraints.js +1 -39
  40. package/react-native/firestore/useQueryConstraints.ts +2 -51
  41. package/react-native/firestore/useRunTransaction.d.ts +33 -9
  42. package/react-native/firestore/useRunTransaction.js +20 -4
  43. package/react-native/firestore/useRunTransaction.ts +35 -16
  44. package/react-native/firestore/useSetDocMutation.d.ts +43 -11
  45. package/react-native/firestore/useSetDocMutation.js +28 -11
  46. package/react-native/firestore/useSetDocMutation.ts +49 -28
  47. package/react-native/firestore/useUpdateDocMutation.d.ts +40 -18
  48. package/react-native/firestore/useUpdateDocMutation.js +18 -13
  49. package/react-native/firestore/useUpdateDocMutation.ts +40 -31
  50. package/react-native/firestore/utils/buildCompositeFilter.d.ts +47 -0
  51. package/react-native/firestore/utils/buildCompositeFilter.js +45 -0
  52. package/react-native/firestore/utils/buildCompositeFilter.ts +75 -0
  53. package/react-native/firestore/utils/buildQueryConstraint.d.ts +23 -0
  54. package/react-native/firestore/utils/buildQueryConstraint.js +41 -0
  55. package/react-native/firestore/utils/buildQueryConstraint.ts +54 -0
  56. package/react-native/firestore/utils/getDocData.d.ts +11 -11
  57. package/react-native/firestore/utils/getDocData.js +5 -8
  58. package/react-native/firestore/utils/getDocData.ts +12 -16
  59. package/react-native/firestore/utils/getDocRef.d.ts +12 -9
  60. package/react-native/firestore/utils/getDocRef.js +9 -10
  61. package/react-native/firestore/utils/getDocRef.ts +14 -15
  62. package/react-native/firestore/utils/getDocSnap.d.ts +11 -13
  63. package/react-native/firestore/utils/getDocSnap.js +5 -10
  64. package/react-native/firestore/utils/getDocSnap.ts +12 -17
  65. package/types/AppModel.d.ts +4 -1
  66. package/types/AppModel.ts +4 -1
  67. package/web/firestore/index.d.ts +5 -0
  68. package/web/firestore/index.js +5 -0
  69. package/web/firestore/index.ts +5 -0
  70. package/web/firestore/useAddDocMutation.d.ts +41 -13
  71. package/web/firestore/useAddDocMutation.js +27 -14
  72. package/web/firestore/useAddDocMutation.ts +49 -37
  73. package/web/firestore/useBatchWrite.d.ts +34 -7
  74. package/web/firestore/useBatchWrite.js +22 -4
  75. package/web/firestore/useBatchWrite.ts +34 -7
  76. package/web/firestore/useCollectionReference.d.ts +32 -11
  77. package/web/firestore/useCollectionReference.js +15 -7
  78. package/web/firestore/useCollectionReference.ts +34 -13
  79. package/web/firestore/useCompositeFilter.d.ts +2 -47
  80. package/web/firestore/useCompositeFilter.js +2 -42
  81. package/web/firestore/useCompositeFilter.ts +2 -72
  82. package/web/firestore/useCountQuery.d.ts +4 -4
  83. package/web/firestore/useCountQuery.ts +5 -5
  84. package/web/firestore/useDeleteDocMutation.d.ts +41 -11
  85. package/web/firestore/useDeleteDocMutation.js +24 -7
  86. package/web/firestore/useDeleteDocMutation.ts +45 -23
  87. package/web/firestore/useDocReference.d.ts +23 -15
  88. package/web/firestore/useDocReference.js +16 -31
  89. package/web/firestore/useDocReference.ts +28 -46
  90. package/web/firestore/useDocReferences.d.ts +23 -18
  91. package/web/firestore/useDocReferences.js +18 -21
  92. package/web/firestore/useDocReferences.ts +26 -30
  93. package/web/firestore/useFirestore.d.ts +4 -3
  94. package/web/firestore/useFirestore.js +4 -3
  95. package/web/firestore/useFirestore.ts +4 -3
  96. package/web/firestore/useGetDocData.d.ts +32 -13
  97. package/web/firestore/useGetDocData.js +21 -6
  98. package/web/firestore/useGetDocData.ts +34 -23
  99. package/web/firestore/useGetRealtimeDocData.js +2 -2
  100. package/web/firestore/useGetRealtimeDocData.ts +2 -2
  101. package/web/firestore/useInfiniteQuery.d.ts +1 -1
  102. package/web/firestore/useInfiniteQuery.js +1 -1
  103. package/web/firestore/useInfiniteQuery.ts +2 -2
  104. package/web/firestore/useQuery.d.ts +1 -1
  105. package/web/firestore/useQuery.js +1 -1
  106. package/web/firestore/useQuery.ts +2 -2
  107. package/web/firestore/useQueryConstraints.d.ts +0 -21
  108. package/web/firestore/useQueryConstraints.js +1 -39
  109. package/web/firestore/useQueryConstraints.ts +2 -51
  110. package/web/firestore/useRunTransaction.d.ts +33 -8
  111. package/web/firestore/useRunTransaction.js +20 -4
  112. package/web/firestore/useRunTransaction.ts +35 -10
  113. package/web/firestore/useSetDocMutation.d.ts +45 -12
  114. package/web/firestore/useSetDocMutation.js +28 -11
  115. package/web/firestore/useSetDocMutation.ts +51 -26
  116. package/web/firestore/useUpdateDocMutation.d.ts +42 -20
  117. package/web/firestore/useUpdateDocMutation.js +20 -15
  118. package/web/firestore/useUpdateDocMutation.ts +45 -41
  119. package/web/firestore/utils/buildCompositeFilter.d.ts +47 -0
  120. package/web/firestore/utils/buildCompositeFilter.js +42 -0
  121. package/web/firestore/utils/buildCompositeFilter.ts +73 -0
  122. package/web/firestore/utils/buildQueryConstraint.d.ts +23 -0
  123. package/web/firestore/utils/buildQueryConstraint.js +41 -0
  124. package/web/firestore/utils/buildQueryConstraint.ts +55 -0
  125. package/web/firestore/utils/getDocData.d.ts +13 -11
  126. package/web/firestore/utils/getDocData.js +6 -9
  127. package/web/firestore/utils/getDocData.ts +14 -20
  128. package/web/firestore/utils/getDocRef.d.ts +14 -11
  129. package/web/firestore/utils/getDocRef.js +9 -10
  130. package/web/firestore/utils/getDocRef.ts +21 -24
  131. package/web/firestore/utils/getDocSnap.d.ts +11 -13
  132. package/web/firestore/utils/getDocSnap.js +5 -10
  133. package/web/firestore/utils/getDocSnap.ts +14 -21
@@ -1,20 +1,52 @@
1
1
  import { UseMutationOptions } from "@tanstack/react-query";
2
2
  import { FirebaseFirestoreTypes, WithFieldValue } from "@react-native-firebase/firestore";
3
- import { ReactNativeFirebase } from "@react-native-firebase/app";
4
- export type UseSetDocMutationValues<AppModelType> = {
3
+ import { AppModel } from "../../types";
4
+ /**
5
+ * @inline
6
+ */
7
+ export type UseSetDocMutationValues<AppModelType extends AppModel = AppModel> = {
8
+ /**
9
+ * Data to write
10
+ */
5
11
  data: WithFieldValue<AppModelType>;
6
12
  };
7
- export type UseSetDocMutationOptions<AppModelType extends FirebaseFirestoreTypes.DocumentData = FirebaseFirestoreTypes.DocumentData, TContext = unknown> = {
13
+ /**
14
+ * @inline
15
+ */
16
+ export type UseSetDocMutationOptions<AppModelType extends AppModel = AppModel, TContext = unknown> = {
17
+ /**
18
+ * Reference to a document that must be written
19
+ */
8
20
  reference: FirebaseFirestoreTypes.DocumentReference<AppModelType> | null;
9
- options?: Omit<UseMutationOptions<void, ReactNativeFirebase.NativeFirebaseError, UseSetDocMutationValues<AppModelType>, TContext>, "mutationFn" | "mutationKey">;
21
+ /**
22
+ * Options for useMutation hook excluding mutationFn.
23
+ */
24
+ options?: Omit<UseMutationOptions<AppModelType, Error, UseSetDocMutationValues<AppModelType>, TContext>, "mutationFn">;
10
25
  };
11
26
  /**
12
- * Custom hook to create a mutation for setting a document in a Firestore-like database.
13
- * The mutation can be configured with options and reference to specific document path.
27
+ * Executes a mutation and returns added document
28
+ *
29
+ * @group Hook
30
+ *
31
+ * @param {UseSetDocMutationOptions<AppModelType>} options - Configuration options for mutation.
32
+ *
33
+ * @returns {UseMutationResult<AppModelType, Error, UseAddDocMutationValues<AppModelType>, TContext>} A mutation result
34
+ *
35
+ * @example
36
+ * ```jsx
37
+ * export const MyComponent = () => {
38
+ * const {mutate} = useSetDocMutation({
39
+ * options: {
40
+ * },
41
+ * reference: collection().doc(),
42
+ * });
14
43
  *
15
- * @param {UseSetDocMutationOptions<AppModelType, TContext>} param0 - The options for configuring the mutation, including the document reference and additional mutation options.
16
- * @param {Object} param0.reference - The reference object that contains the path to the document.
17
- * @param {Object} param0.options - Additional options for the mutation, can configure aspects like onSuccess or onError callbacks.
18
- * @returns {MutationResult} The result of the mutation operation, which includes states like isLoading, isSuccess, isError, and methods to control the mutation process.
44
+ * // ....
45
+ * mutate({data: {test: 'value'}});
46
+ * // ....
47
+ * };
48
+ * ```
19
49
  */
20
- export declare const useSetDocMutation: <AppModelType extends FirebaseFirestoreTypes.DocumentData = FirebaseFirestoreTypes.DocumentData, TContext = unknown>({ reference, options }: UseSetDocMutationOptions<AppModelType, TContext>) => import("@tanstack/react-query").UseMutationResult<void, ReactNativeFirebase.NativeFirebaseError, UseSetDocMutationValues<AppModelType>, TContext>;
50
+ export declare const useSetDocMutation: <AppModelType extends AppModel = AppModel, TContext = unknown>({ reference, options }: UseSetDocMutationOptions<AppModelType, TContext>) => import("@tanstack/react-query").UseMutationResult<AppModelType & {
51
+ uid: string;
52
+ }, Error, UseSetDocMutationValues<AppModelType>, TContext>;
@@ -1,25 +1,42 @@
1
1
  import { useMutation } from "@tanstack/react-query";
2
- import { setDoc } from "@react-native-firebase/firestore";
2
+ import { getDoc, setDoc } from "@react-native-firebase/firestore";
3
3
  import { useMemo } from "react";
4
4
  /**
5
- * Custom hook to create a mutation for setting a document in a Firestore-like database.
6
- * The mutation can be configured with options and reference to specific document path.
5
+ * Executes a mutation and returns added document
7
6
  *
8
- * @param {UseSetDocMutationOptions<AppModelType, TContext>} param0 - The options for configuring the mutation, including the document reference and additional mutation options.
9
- * @param {Object} param0.reference - The reference object that contains the path to the document.
10
- * @param {Object} param0.options - Additional options for the mutation, can configure aspects like onSuccess or onError callbacks.
11
- * @returns {MutationResult} The result of the mutation operation, which includes states like isLoading, isSuccess, isError, and methods to control the mutation process.
7
+ * @group Hook
8
+ *
9
+ * @param {UseSetDocMutationOptions<AppModelType>} options - Configuration options for mutation.
10
+ *
11
+ * @returns {UseMutationResult<AppModelType, Error, UseAddDocMutationValues<AppModelType>, TContext>} A mutation result
12
+ *
13
+ * @example
14
+ * ```jsx
15
+ * export const MyComponent = () => {
16
+ * const {mutate} = useSetDocMutation({
17
+ * options: {
18
+ * },
19
+ * reference: collection().doc(),
20
+ * });
21
+ *
22
+ * // ....
23
+ * mutate({data: {test: 'value'}});
24
+ * // ....
25
+ * };
26
+ * ```
12
27
  */
13
28
  export const useSetDocMutation = ({ reference, options }) => {
14
29
  const mutationKey = useMemo(() => [reference?.path], [reference?.path]);
15
30
  return useMutation({
16
31
  ...options,
17
- mutationFn: ({ data }) => {
32
+ mutationKey,
33
+ mutationFn: async ({ data }) => {
18
34
  if (!reference) {
19
35
  throw new Error("Reference is undefined");
20
36
  }
21
- return setDoc(reference, data);
22
- },
23
- mutationKey
37
+ await setDoc(reference, data);
38
+ const docSnap = await getDoc(reference);
39
+ return { ...docSnap.data(), uid: docSnap.id };
40
+ }
24
41
  });
25
42
  };
@@ -1,42 +1,61 @@
1
1
  import { useMutation, UseMutationOptions } from "@tanstack/react-query";
2
- import { FirebaseFirestoreTypes, setDoc, WithFieldValue } from "@react-native-firebase/firestore";
2
+ import { FirebaseFirestoreTypes, getDoc, setDoc, WithFieldValue } from "@react-native-firebase/firestore";
3
3
 
4
- import { ReactNativeFirebase } from "@react-native-firebase/app";
5
4
  import { useMemo } from "react";
5
+ import { AppModel } from "../../types";
6
6
 
7
- export type UseSetDocMutationValues<AppModelType> = {
7
+ /**
8
+ * @inline
9
+ */
10
+ export type UseSetDocMutationValues<AppModelType extends AppModel = AppModel> = {
11
+ /**
12
+ * Data to write
13
+ */
8
14
  data: WithFieldValue<AppModelType>;
9
15
  };
10
16
 
11
- export type UseSetDocMutationOptions<
12
- AppModelType extends FirebaseFirestoreTypes.DocumentData = FirebaseFirestoreTypes.DocumentData,
13
- TContext = unknown
14
- > = {
17
+ /**
18
+ * @inline
19
+ */
20
+ export type UseSetDocMutationOptions<AppModelType extends AppModel = AppModel, TContext = unknown> = {
21
+ /**
22
+ * Reference to a document that must be written
23
+ */
15
24
  reference: FirebaseFirestoreTypes.DocumentReference<AppModelType> | null;
25
+ /**
26
+ * Options for useMutation hook excluding mutationFn.
27
+ */
16
28
  options?: Omit<
17
- UseMutationOptions<
18
- void,
19
- ReactNativeFirebase.NativeFirebaseError,
20
- UseSetDocMutationValues<AppModelType>,
21
- TContext
22
- >,
23
- "mutationFn" | "mutationKey"
29
+ UseMutationOptions<AppModelType, Error, UseSetDocMutationValues<AppModelType>, TContext>,
30
+ "mutationFn"
24
31
  >;
25
32
  };
26
33
 
27
34
  /**
28
- * Custom hook to create a mutation for setting a document in a Firestore-like database.
29
- * The mutation can be configured with options and reference to specific document path.
35
+ * Executes a mutation and returns added document
36
+ *
37
+ * @group Hook
38
+ *
39
+ * @param {UseSetDocMutationOptions<AppModelType>} options - Configuration options for mutation.
40
+ *
41
+ * @returns {UseMutationResult<AppModelType, Error, UseAddDocMutationValues<AppModelType>, TContext>} A mutation result
42
+ *
43
+ * @example
44
+ * ```jsx
45
+ * export const MyComponent = () => {
46
+ * const {mutate} = useSetDocMutation({
47
+ * options: {
48
+ * },
49
+ * reference: collection().doc(),
50
+ * });
30
51
  *
31
- * @param {UseSetDocMutationOptions<AppModelType, TContext>} param0 - The options for configuring the mutation, including the document reference and additional mutation options.
32
- * @param {Object} param0.reference - The reference object that contains the path to the document.
33
- * @param {Object} param0.options - Additional options for the mutation, can configure aspects like onSuccess or onError callbacks.
34
- * @returns {MutationResult} The result of the mutation operation, which includes states like isLoading, isSuccess, isError, and methods to control the mutation process.
52
+ * // ....
53
+ * mutate({data: {test: 'value'}});
54
+ * // ....
55
+ * };
56
+ * ```
35
57
  */
36
- export const useSetDocMutation = <
37
- AppModelType extends FirebaseFirestoreTypes.DocumentData = FirebaseFirestoreTypes.DocumentData,
38
- TContext = unknown
39
- >({
58
+ export const useSetDocMutation = <AppModelType extends AppModel = AppModel, TContext = unknown>({
40
59
  reference,
41
60
  options
42
61
  }: UseSetDocMutationOptions<AppModelType, TContext>) => {
@@ -44,12 +63,14 @@ export const useSetDocMutation = <
44
63
 
45
64
  return useMutation({
46
65
  ...options,
47
- mutationFn: ({ data }) => {
66
+ mutationKey,
67
+ mutationFn: async ({ data }) => {
48
68
  if (!reference) {
49
69
  throw new Error("Reference is undefined");
50
70
  }
51
- return setDoc<AppModelType>(reference, data);
52
- },
53
- mutationKey
71
+ await setDoc<AppModelType>(reference, data);
72
+ const docSnap = await getDoc(reference);
73
+ return { ...(docSnap.data() as AppModelType), uid: docSnap.id };
74
+ }
54
75
  });
55
76
  };
@@ -1,30 +1,52 @@
1
1
  import { UseMutationOptions } from "@tanstack/react-query";
2
2
  import { FirebaseFirestoreTypes, UpdateData } from "@react-native-firebase/firestore";
3
- import { ReactNativeFirebase } from "@react-native-firebase/app";
4
- export type UseUpdateDocMutationValues<DbModelType> = {
5
- data: UpdateData<DbModelType>;
3
+ import { AppModel } from "../../types";
4
+ /**
5
+ * @inline
6
+ */
7
+ export type UseUpdateDocMutationValues<AppModelType extends AppModel = AppModel> = {
8
+ /**
9
+ * Data to write
10
+ */
11
+ data: UpdateData<AppModelType>;
6
12
  };
7
- export type UseUpdateDocMutationOptions<AppModelType extends FirebaseFirestoreTypes.DocumentData = FirebaseFirestoreTypes.DocumentData, TContext = unknown> = {
13
+ /**
14
+ * @inline
15
+ */
16
+ export type UseUpdateDocMutationOptions<AppModelType extends AppModel = AppModel, TContext = unknown> = {
17
+ /**
18
+ * Reference to a document that must be updated
19
+ */
8
20
  reference: FirebaseFirestoreTypes.DocumentReference<AppModelType> | null;
9
- options?: Omit<UseMutationOptions<AppModelType, ReactNativeFirebase.NativeFirebaseError, UseUpdateDocMutationValues<AppModelType>, TContext>, "mutationFn" | "mutationKey">;
21
+ /**
22
+ * Options for useMutation hook excluding mutationFn.
23
+ */
24
+ options?: Omit<UseMutationOptions<AppModelType, Error, UseUpdateDocMutationValues<AppModelType>, TContext>, "mutationFn">;
10
25
  };
11
26
  /**
12
- * Custom hook that sets up a mutation for updating a document in a Firestore database.
13
- *
14
- * This hook utilizes `useMutation` for performing asynchronous operations to update the document
15
- * and retrieve the latest data snapshot. The update functionality can be configured with a custom
16
- * converter if needed.
27
+ * Executes a mutation and returns updated document
17
28
  *
18
- * @param {UseUpdateDocMutationOptions<AppModelType, TContext>} options - Configuration options for the mutation,
19
- * including Firestore reference, an optional Firestore data converter, and additional mutation options.
29
+ * @group Hook
20
30
  *
21
- * `reference` - The Firestore document reference that identifies the document to be updated.
31
+ * @param {UseUpdateDocMutationOptions<AppModelType>} options - Configuration options for mutation.
22
32
  *
23
- * `converter` - An optional Firestore converter for transforming the database response into a custom type.
33
+ * @returns {UseMutationResult<AppModelType, Error, UseAddDocMutationValues<AppModelType>, TContext>} A mutation result
24
34
  *
25
- * `options` - Additional options that customize the mutation's behavior.
35
+ * @example
36
+ * ```jsx
37
+ * export const MyComponent = () => {
38
+ * const {mutate} = useUpdateDocMutation({
39
+ * options: {
40
+ * },
41
+ * reference: collection().doc(),
42
+ * });
26
43
  *
27
- * @returns {UseMutationResult<AppModelType, Error, {data: AppModelType}, TContext>} An object returned by `useMutation`
28
- * which includes functions to start the mutation and properties that represent the different states of the mutation.
44
+ * // ....
45
+ * mutate({data: {test: 'value'}});
46
+ * // ....
47
+ * };
48
+ * ```
29
49
  */
30
- export declare const useUpdateDocMutation: <AppModelType extends FirebaseFirestoreTypes.DocumentData = FirebaseFirestoreTypes.DocumentData, TContext = unknown>({ reference, options }: UseUpdateDocMutationOptions<AppModelType, TContext>) => import("@tanstack/react-query").UseMutationResult<AppModelType, ReactNativeFirebase.NativeFirebaseError, UseUpdateDocMutationValues<AppModelType>, TContext>;
50
+ export declare const useUpdateDocMutation: <AppModelType extends AppModel = AppModel, TContext = unknown>({ reference, options }: UseUpdateDocMutationOptions<AppModelType, TContext>) => import("@tanstack/react-query").UseMutationResult<AppModelType & {
51
+ uid: string;
52
+ }, Error, UseUpdateDocMutationValues<AppModelType>, TContext>;
@@ -2,23 +2,28 @@ import { useMutation } from "@tanstack/react-query";
2
2
  import { updateDoc, getDoc } from "@react-native-firebase/firestore";
3
3
  import { useMemo } from "react";
4
4
  /**
5
- * Custom hook that sets up a mutation for updating a document in a Firestore database.
5
+ * Executes a mutation and returns updated document
6
6
  *
7
- * This hook utilizes `useMutation` for performing asynchronous operations to update the document
8
- * and retrieve the latest data snapshot. The update functionality can be configured with a custom
9
- * converter if needed.
7
+ * @group Hook
10
8
  *
11
- * @param {UseUpdateDocMutationOptions<AppModelType, TContext>} options - Configuration options for the mutation,
12
- * including Firestore reference, an optional Firestore data converter, and additional mutation options.
9
+ * @param {UseUpdateDocMutationOptions<AppModelType>} options - Configuration options for mutation.
13
10
  *
14
- * `reference` - The Firestore document reference that identifies the document to be updated.
11
+ * @returns {UseMutationResult<AppModelType, Error, UseAddDocMutationValues<AppModelType>, TContext>} A mutation result
15
12
  *
16
- * `converter` - An optional Firestore converter for transforming the database response into a custom type.
13
+ * @example
14
+ * ```jsx
15
+ * export const MyComponent = () => {
16
+ * const {mutate} = useUpdateDocMutation({
17
+ * options: {
18
+ * },
19
+ * reference: collection().doc(),
20
+ * });
17
21
  *
18
- * `options` - Additional options that customize the mutation's behavior.
19
- *
20
- * @returns {UseMutationResult<AppModelType, Error, {data: AppModelType}, TContext>} An object returned by `useMutation`
21
- * which includes functions to start the mutation and properties that represent the different states of the mutation.
22
+ * // ....
23
+ * mutate({data: {test: 'value'}});
24
+ * // ....
25
+ * };
26
+ * ```
22
27
  */
23
28
  export const useUpdateDocMutation = ({ reference, options = {} }) => {
24
29
  const mutationKey = useMemo(() => [reference?.path], [reference?.path]);
@@ -30,7 +35,7 @@ export const useUpdateDocMutation = ({ reference, options = {} }) => {
30
35
  }
31
36
  await updateDoc(reference, data);
32
37
  const docSnap = await getDoc(reference);
33
- return docSnap.data();
38
+ return { ...docSnap.data(), uid: docSnap.id };
34
39
  },
35
40
  mutationKey
36
41
  });
@@ -1,52 +1,61 @@
1
1
  import { useMutation, UseMutationOptions } from "@tanstack/react-query";
2
2
  import { FirebaseFirestoreTypes, updateDoc, getDoc, UpdateData } from "@react-native-firebase/firestore";
3
3
 
4
- import { ReactNativeFirebase } from "@react-native-firebase/app";
5
4
  import { useMemo } from "react";
5
+ import { AppModel } from "../../types";
6
6
 
7
- export type UseUpdateDocMutationValues<DbModelType> = {
8
- data: UpdateData<DbModelType>;
7
+ /**
8
+ * @inline
9
+ */
10
+ export type UseUpdateDocMutationValues<AppModelType extends AppModel = AppModel> = {
11
+ /**
12
+ * Data to write
13
+ */
14
+ data: UpdateData<AppModelType>;
9
15
  };
10
16
 
11
- export type UseUpdateDocMutationOptions<
12
- AppModelType extends FirebaseFirestoreTypes.DocumentData = FirebaseFirestoreTypes.DocumentData,
13
- TContext = unknown
14
- > = {
17
+ /**
18
+ * @inline
19
+ */
20
+ export type UseUpdateDocMutationOptions<AppModelType extends AppModel = AppModel, TContext = unknown> = {
21
+ /**
22
+ * Reference to a document that must be updated
23
+ */
15
24
  reference: FirebaseFirestoreTypes.DocumentReference<AppModelType> | null;
25
+ /**
26
+ * Options for useMutation hook excluding mutationFn.
27
+ */
16
28
  options?: Omit<
17
- UseMutationOptions<
18
- AppModelType,
19
- ReactNativeFirebase.NativeFirebaseError,
20
- UseUpdateDocMutationValues<AppModelType>,
21
- TContext
22
- >,
23
- "mutationFn" | "mutationKey"
29
+ UseMutationOptions<AppModelType, Error, UseUpdateDocMutationValues<AppModelType>, TContext>,
30
+ "mutationFn"
24
31
  >;
25
32
  };
26
33
 
27
34
  /**
28
- * Custom hook that sets up a mutation for updating a document in a Firestore database.
29
- *
30
- * This hook utilizes `useMutation` for performing asynchronous operations to update the document
31
- * and retrieve the latest data snapshot. The update functionality can be configured with a custom
32
- * converter if needed.
35
+ * Executes a mutation and returns updated document
33
36
  *
34
- * @param {UseUpdateDocMutationOptions<AppModelType, TContext>} options - Configuration options for the mutation,
35
- * including Firestore reference, an optional Firestore data converter, and additional mutation options.
37
+ * @group Hook
36
38
  *
37
- * `reference` - The Firestore document reference that identifies the document to be updated.
39
+ * @param {UseUpdateDocMutationOptions<AppModelType>} options - Configuration options for mutation.
38
40
  *
39
- * `converter` - An optional Firestore converter for transforming the database response into a custom type.
41
+ * @returns {UseMutationResult<AppModelType, Error, UseAddDocMutationValues<AppModelType>, TContext>} A mutation result
40
42
  *
41
- * `options` - Additional options that customize the mutation's behavior.
43
+ * @example
44
+ * ```jsx
45
+ * export const MyComponent = () => {
46
+ * const {mutate} = useUpdateDocMutation({
47
+ * options: {
48
+ * },
49
+ * reference: collection().doc(),
50
+ * });
42
51
  *
43
- * @returns {UseMutationResult<AppModelType, Error, {data: AppModelType}, TContext>} An object returned by `useMutation`
44
- * which includes functions to start the mutation and properties that represent the different states of the mutation.
52
+ * // ....
53
+ * mutate({data: {test: 'value'}});
54
+ * // ....
55
+ * };
56
+ * ```
45
57
  */
46
- export const useUpdateDocMutation = <
47
- AppModelType extends FirebaseFirestoreTypes.DocumentData = FirebaseFirestoreTypes.DocumentData,
48
- TContext = unknown
49
- >({
58
+ export const useUpdateDocMutation = <AppModelType extends AppModel = AppModel, TContext = unknown>({
50
59
  reference,
51
60
  options = {}
52
61
  }: UseUpdateDocMutationOptions<AppModelType, TContext>) => {
@@ -61,7 +70,7 @@ export const useUpdateDocMutation = <
61
70
 
62
71
  await updateDoc<AppModelType>(reference, data);
63
72
  const docSnap = await getDoc(reference);
64
- return docSnap.data() as AppModelType;
73
+ return { ...(docSnap.data() as AppModelType), uid: docSnap.id };
65
74
  },
66
75
  mutationKey
67
76
  });
@@ -0,0 +1,47 @@
1
+ import { FirebaseFirestoreTypes } from "@react-native-firebase/firestore";
2
+ import { AppModel } from "../../../types";
3
+ export type QueryFilterConstraint = FirebaseFirestoreTypes.QueryCompositeFilterConstraint | FirebaseFirestoreTypes.QueryFilterConstraint;
4
+ export type QueryElement<AppModelType extends AppModel = AppModel> = {
5
+ operator?: "OR" | "AND";
6
+ children?: QueryElement[];
7
+ field?: keyof (AppModelType & {
8
+ documentId?: string[];
9
+ });
10
+ value?: AppModelType[keyof AppModelType];
11
+ op?: FirebaseFirestoreTypes.WhereFilterOp;
12
+ };
13
+ export type CompositeFilter<AppModelType extends AppModel = AppModel> = {
14
+ operator: "OR" | "AND";
15
+ children: QueryElement<AppModelType & {
16
+ documentId?: string[];
17
+ }>[];
18
+ };
19
+ /**
20
+ * Constructs a composite or where query filter based on the provided query structure.
21
+ * It recursively builds query constraints using logical "or" or "and" operators.
22
+ *
23
+ * @group Utility
24
+ *
25
+ * @param {QueryElement<AppModelType>} query
26
+ *
27
+ * @returns {QueryFilterConstraint | null}
28
+ *
29
+ * @example
30
+ * ```jsx
31
+ * export const MyComponent = () => {
32
+ * const filter = buildCompositeFilter({
33
+ * operator: "AND",
34
+ * children: [
35
+ * {
36
+ * field: "field",
37
+ * value: "value",
38
+ * op: "=="
39
+ * },
40
+ * ...(query ? [query] : [])
41
+ * ]
42
+ * });
43
+ * console.log(filter);
44
+ * };
45
+ * ```
46
+ */
47
+ export declare const buildCompositeFilter: <AppModelType extends AppModel = AppModel>(query: QueryElement<AppModelType>) => QueryFilterConstraint | null;
@@ -0,0 +1,45 @@
1
+ import firebase, { and, or, where } from "@react-native-firebase/firestore";
2
+ /**
3
+ * Constructs a composite or where query filter based on the provided query structure.
4
+ * It recursively builds query constraints using logical "or" or "and" operators.
5
+ *
6
+ * @group Utility
7
+ *
8
+ * @param {QueryElement<AppModelType>} query
9
+ *
10
+ * @returns {QueryFilterConstraint | null}
11
+ *
12
+ * @example
13
+ * ```jsx
14
+ * export const MyComponent = () => {
15
+ * const filter = buildCompositeFilter({
16
+ * operator: "AND",
17
+ * children: [
18
+ * {
19
+ * field: "field",
20
+ * value: "value",
21
+ * op: "=="
22
+ * },
23
+ * ...(query ? [query] : [])
24
+ * ]
25
+ * });
26
+ * console.log(filter);
27
+ * };
28
+ * ```
29
+ */
30
+ export const buildCompositeFilter = (query) => {
31
+ if (query.children) {
32
+ const queryConstraints = query.children.map(buildCompositeFilter).filter((constraint) => !!constraint);
33
+ if (queryConstraints.length <= 0) {
34
+ return null;
35
+ }
36
+ if (queryConstraints.length <= 1) {
37
+ return queryConstraints[0];
38
+ }
39
+ return query.operator === "OR" ? or(...queryConstraints) : and(...queryConstraints);
40
+ }
41
+ if (query.field && query.op) {
42
+ return where(query.field === "documentId" ? firebase.FieldPath.documentId() : query.field, query.op, query.value);
43
+ }
44
+ return null;
45
+ };
@@ -0,0 +1,75 @@
1
+ import firebase, { FirebaseFirestoreTypes, and, or, where } from "@react-native-firebase/firestore";
2
+ import { AppModel } from "../../../types";
3
+
4
+ export type QueryFilterConstraint =
5
+ | FirebaseFirestoreTypes.QueryCompositeFilterConstraint
6
+ | FirebaseFirestoreTypes.QueryFilterConstraint;
7
+
8
+ export type QueryElement<AppModelType extends AppModel = AppModel> = {
9
+ operator?: "OR" | "AND";
10
+ children?: QueryElement[];
11
+ field?: keyof (AppModelType & { documentId?: string[] });
12
+ value?: AppModelType[keyof AppModelType];
13
+ op?: FirebaseFirestoreTypes.WhereFilterOp;
14
+ };
15
+
16
+ export type CompositeFilter<AppModelType extends AppModel = AppModel> = {
17
+ operator: "OR" | "AND";
18
+ children: QueryElement<AppModelType & { documentId?: string[] }>[];
19
+ };
20
+
21
+ /**
22
+ * Constructs a composite or where query filter based on the provided query structure.
23
+ * It recursively builds query constraints using logical "or" or "and" operators.
24
+ *
25
+ * @group Utility
26
+ *
27
+ * @param {QueryElement<AppModelType>} query
28
+ *
29
+ * @returns {QueryFilterConstraint | null}
30
+ *
31
+ * @example
32
+ * ```jsx
33
+ * export const MyComponent = () => {
34
+ * const filter = buildCompositeFilter({
35
+ * operator: "AND",
36
+ * children: [
37
+ * {
38
+ * field: "field",
39
+ * value: "value",
40
+ * op: "=="
41
+ * },
42
+ * ...(query ? [query] : [])
43
+ * ]
44
+ * });
45
+ * console.log(filter);
46
+ * };
47
+ * ```
48
+ */
49
+ export const buildCompositeFilter = <AppModelType extends AppModel = AppModel>(
50
+ query: QueryElement<AppModelType>
51
+ ): QueryFilterConstraint | null => {
52
+ if (query.children) {
53
+ const queryConstraints = query.children.map(buildCompositeFilter).filter((constraint) => !!constraint);
54
+
55
+ if (queryConstraints.length <= 0) {
56
+ return null;
57
+ }
58
+
59
+ if (queryConstraints.length <= 1) {
60
+ return queryConstraints[0];
61
+ }
62
+
63
+ return (query as CompositeFilter).operator === "OR" ? or(...queryConstraints) : and(...queryConstraints);
64
+ }
65
+
66
+ if (query.field && query.op) {
67
+ return where(
68
+ query.field === "documentId" ? firebase.FieldPath.documentId() : (query.field as string),
69
+ query.op,
70
+ query.value
71
+ ) as unknown as FirebaseFirestoreTypes.QueryFilterConstraint;
72
+ }
73
+
74
+ return null;
75
+ };
@@ -0,0 +1,23 @@
1
+ import { type QueryNonFilterConstraint } from "@react-native-firebase/firestore";
2
+ import { AppModel, type NonFilterQueryConstraint } from "../../../types";
3
+ /**
4
+ * A generic mothod to build query constraints for firebase
5
+ *
6
+ * @group Utility
7
+ *
8
+ * @param {NonFilterQueryConstraint<AppModelType>} constraint
9
+ *
10
+ * @returns {FirebaseFirestoreTypes.QueryNonFilterConstraint}
11
+ *
12
+ * @example
13
+ * ```jsx
14
+ * const firebaseConfig = {};
15
+ * export const constraint = useMemo(() => {
16
+ * return buildQueryConstraint({
17
+ * type: 'limit',
18
+ * limit: 1
19
+ * });
20
+ * };
21
+ * ```
22
+ */
23
+ export declare const buildQueryConstraint: <AppModelType extends AppModel = AppModel>(constraint: NonFilterQueryConstraint<AppModelType>) => QueryNonFilterConstraint;