react-query-firebase 2.3.2 → 2.4.0

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 +2 -2
  35. package/react-native/firestore/useInfiniteQuery.ts +3 -3
  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 +2 -22
  39. package/react-native/firestore/useQueryConstraints.js +1 -39
  40. package/react-native/firestore/useQueryConstraints.ts +3 -43
  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 +7 -8
  61. package/react-native/firestore/utils/getDocRef.ts +12 -13
  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 +2 -2
  102. package/web/firestore/useInfiniteQuery.js +1 -1
  103. package/web/firestore/useInfiniteQuery.ts +4 -4
  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 +7 -8
  130. package/web/firestore/utils/getDocRef.ts +16 -19
  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,53 @@
1
1
  import { UseMutationOptions } from "@tanstack/react-query";
2
- import { DocumentData, DocumentReference, WithFieldValue } from "firebase/firestore";
2
+ import { DocumentReference, WithFieldValue } from "firebase/firestore";
3
3
  import { FirebaseError } from "firebase/app";
4
- export type UseSetDocMutationValues<AppModelType> = {
4
+ import { AppModel } from "../../types";
5
+ /**
6
+ * @inline
7
+ */
8
+ export type UseSetDocMutationValues<AppModelType extends AppModel = AppModel> = {
9
+ /**
10
+ * Data to write
11
+ */
5
12
  data: WithFieldValue<AppModelType>;
6
13
  };
7
- export type UseSetDocMutationOptions<AppModelType = unknown, DbModelType extends DocumentData = DocumentData, TContext = unknown> = {
8
- reference: DocumentReference<AppModelType, DbModelType> | null;
9
- options?: Omit<UseMutationOptions<void, FirebaseError, UseSetDocMutationValues<AppModelType>, TContext>, "mutationFn" | "mutationKey">;
14
+ /**
15
+ * @inline
16
+ */
17
+ export type UseSetDocMutationOptions<AppModelType extends AppModel = AppModel, TContext = unknown> = {
18
+ /**
19
+ * Reference to a document that must be written
20
+ */
21
+ reference: DocumentReference<AppModelType, AppModelType> | null;
22
+ /**
23
+ * Options for useMutation hook excluding mutationFn.
24
+ */
25
+ options?: Omit<UseMutationOptions<AppModelType, FirebaseError, UseSetDocMutationValues<AppModelType>, TContext>, "mutationFn">;
10
26
  };
11
27
  /**
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.
28
+ * Executes a mutation and returns added document
29
+ *
30
+ * @group Hook
31
+ *
32
+ * @param {UseSetDocMutationOptions<AppModelType>} options - Configuration options for mutation.
33
+ *
34
+ * @returns {UseMutationResult<AppModelType, Error, UseAddDocMutationValues<AppModelType>, TContext>} A mutation result
35
+ *
36
+ * @example
37
+ * ```jsx
38
+ * export const MyComponent = () => {
39
+ * const {mutate} = useSetDocMutation({
40
+ * options: {
41
+ * },
42
+ * reference: collection().doc(),
43
+ * });
14
44
  *
15
- * @param {UseSetDocMutationOptions<AppModelType, DbModelType, 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.
45
+ * // ....
46
+ * mutate({data: {test: 'value'}});
47
+ * // ....
48
+ * };
49
+ * ```
19
50
  */
20
- export declare const useSetDocMutation: <AppModelType = unknown, DbModelType extends DocumentData = DocumentData, TContext = unknown>({ reference, options }: UseSetDocMutationOptions<AppModelType, DbModelType, TContext>) => import("@tanstack/react-query").UseMutationResult<void, FirebaseError, UseSetDocMutationValues<AppModelType>, TContext>;
51
+ export declare const useSetDocMutation: <AppModelType extends AppModel = AppModel, TContext = unknown>({ reference, options }: UseSetDocMutationOptions<AppModelType, TContext>) => import("@tanstack/react-query").UseMutationResult<AppModelType & {
52
+ uid: string;
53
+ }, FirebaseError, UseSetDocMutationValues<AppModelType>, TContext>;
@@ -1,25 +1,42 @@
1
1
  import { useMutation } from "@tanstack/react-query";
2
- import { setDoc } from "firebase/firestore";
2
+ import { getDoc, setDoc } from "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, DbModelType, 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,52 +1,77 @@
1
1
  import { useMutation, UseMutationOptions } from "@tanstack/react-query";
2
- import { DocumentData, DocumentReference, setDoc, WithFieldValue } from "firebase/firestore";
2
+ import { DocumentReference, getDoc, setDoc, WithFieldValue } from "firebase/firestore";
3
3
 
4
4
  import { FirebaseError } from "firebase/app";
5
5
  import { useMemo } from "react";
6
+ import { AppModel } from "../../types";
6
7
 
7
- export type UseSetDocMutationValues<AppModelType> = {
8
+ /**
9
+ * @inline
10
+ */
11
+ export type UseSetDocMutationValues<AppModelType extends AppModel = AppModel> = {
12
+ /**
13
+ * Data to write
14
+ */
8
15
  data: WithFieldValue<AppModelType>;
9
16
  };
10
17
 
11
- export type UseSetDocMutationOptions<
12
- AppModelType = unknown,
13
- DbModelType extends DocumentData = DocumentData,
14
- TContext = unknown
15
- > = {
16
- reference: DocumentReference<AppModelType, DbModelType> | null;
18
+ /**
19
+ * @inline
20
+ */
21
+ export type UseSetDocMutationOptions<AppModelType extends AppModel = AppModel, TContext = unknown> = {
22
+ /**
23
+ * Reference to a document that must be written
24
+ */
25
+ reference: DocumentReference<AppModelType, AppModelType> | null;
26
+ /**
27
+ * Options for useMutation hook excluding mutationFn.
28
+ */
17
29
  options?: Omit<
18
- UseMutationOptions<void, FirebaseError, UseSetDocMutationValues<AppModelType>, TContext>,
19
- "mutationFn" | "mutationKey"
30
+ UseMutationOptions<AppModelType, FirebaseError, UseSetDocMutationValues<AppModelType>, TContext>,
31
+ "mutationFn"
20
32
  >;
21
33
  };
22
34
 
23
35
  /**
24
- * Custom hook to create a mutation for setting a document in a Firestore-like database.
25
- * The mutation can be configured with options and reference to specific document path.
36
+ * Executes a mutation and returns added document
37
+ *
38
+ * @group Hook
39
+ *
40
+ * @param {UseSetDocMutationOptions<AppModelType>} options - Configuration options for mutation.
41
+ *
42
+ * @returns {UseMutationResult<AppModelType, Error, UseAddDocMutationValues<AppModelType>, TContext>} A mutation result
43
+ *
44
+ * @example
45
+ * ```jsx
46
+ * export const MyComponent = () => {
47
+ * const {mutate} = useSetDocMutation({
48
+ * options: {
49
+ * },
50
+ * reference: collection().doc(),
51
+ * });
26
52
  *
27
- * @param {UseSetDocMutationOptions<AppModelType, DbModelType, TContext>} param0 - The options for configuring the mutation, including the document reference and additional mutation options.
28
- * @param {Object} param0.reference - The reference object that contains the path to the document.
29
- * @param {Object} param0.options - Additional options for the mutation, can configure aspects like onSuccess or onError callbacks.
30
- * @returns {MutationResult} The result of the mutation operation, which includes states like isLoading, isSuccess, isError, and methods to control the mutation process.
53
+ * // ....
54
+ * mutate({data: {test: 'value'}});
55
+ * // ....
56
+ * };
57
+ * ```
31
58
  */
32
- export const useSetDocMutation = <
33
- AppModelType = unknown,
34
- DbModelType extends DocumentData = DocumentData,
35
- TContext = unknown
36
- >({
59
+ export const useSetDocMutation = <AppModelType extends AppModel = AppModel, TContext = unknown>({
37
60
  reference,
38
61
  options
39
- }: UseSetDocMutationOptions<AppModelType, DbModelType, TContext>) => {
62
+ }: UseSetDocMutationOptions<AppModelType, TContext>) => {
40
63
  const mutationKey = useMemo(() => [reference?.path], [reference?.path]);
41
64
 
42
65
  return useMutation({
43
66
  ...options,
44
- mutationFn: ({ data }) => {
67
+ mutationKey,
68
+ mutationFn: async ({ data }) => {
45
69
  if (!reference) {
46
70
  throw new Error("Reference is undefined");
47
71
  }
48
- return setDoc<AppModelType, DbModelType>(reference, data);
49
- },
50
- mutationKey
72
+ await setDoc<AppModelType, AppModelType>(reference, data);
73
+ const docSnap = await getDoc(reference);
74
+ return { ...(docSnap.data() as AppModelType), uid: docSnap.id };
75
+ }
51
76
  });
52
77
  };
@@ -1,31 +1,53 @@
1
1
  import { UseMutationOptions } from "@tanstack/react-query";
2
- import { DocumentData, FirestoreDataConverter, DocumentReference, UpdateData } from "firebase/firestore";
2
+ import { DocumentReference, UpdateData } from "firebase/firestore";
3
3
  import { FirebaseError } from "firebase/app";
4
- export type UseUpdateDocMutationValues<DbModelType> = {
5
- data: UpdateData<DbModelType>;
4
+ import { AppModel } from "../../types";
5
+ /**
6
+ * @inline
7
+ */
8
+ export type UseUpdateDocMutationValues<AppModelType extends AppModel = AppModel> = {
9
+ /**
10
+ * Data to write
11
+ */
12
+ data: UpdateData<AppModelType>;
6
13
  };
7
- export type UseUpdateDocMutationOptions<AppModelType extends DocumentData = DocumentData, DbModelType extends DocumentData = DocumentData, TContext = unknown> = {
8
- reference: DocumentReference<AppModelType, DbModelType> | null;
9
- converter?: FirestoreDataConverter<AppModelType, DbModelType>;
10
- options?: Omit<UseMutationOptions<AppModelType, FirebaseError, UseUpdateDocMutationValues<DbModelType>, TContext>, "mutationFn" | "mutationKey">;
14
+ /**
15
+ * @inline
16
+ */
17
+ export type UseUpdateDocMutationOptions<AppModelType extends AppModel = AppModel, TContext = unknown> = {
18
+ /**
19
+ * Reference to a document that must be updated
20
+ */
21
+ reference: DocumentReference<AppModelType, AppModelType> | null;
22
+ /**
23
+ * Options for useMutation hook excluding mutationFn.
24
+ */
25
+ options?: Omit<UseMutationOptions<AppModelType, FirebaseError, UseUpdateDocMutationValues<AppModelType>, TContext>, "mutationFn">;
11
26
  };
12
27
  /**
13
- * Custom hook that sets up a mutation for updating a document in a Firestore database.
14
- *
15
- * This hook utilizes `useMutation` for performing asynchronous operations to update the document
16
- * and retrieve the latest data snapshot. The update functionality can be configured with a custom
17
- * converter if needed.
28
+ * Executes a mutation and returns updated document
18
29
  *
19
- * @param {UseUpdateDocMutationOptions<AppModelType, DbModelType, TContext>} options - Configuration options for the mutation,
20
- * including Firestore reference, an optional Firestore data converter, and additional mutation options.
30
+ * @group Hook
21
31
  *
22
- * `reference` - The Firestore document reference that identifies the document to be updated.
32
+ * @param {UseUpdateDocMutationOptions<AppModelType>} options - Configuration options for mutation.
23
33
  *
24
- * `converter` - An optional Firestore converter for transforming the database response into a custom type.
34
+ * @returns {UseMutationResult<AppModelType, Error, UseAddDocMutationValues<AppModelType>, TContext>} A mutation result
25
35
  *
26
- * `options` - Additional options that customize the mutation's behavior.
36
+ * @example
37
+ * ```jsx
38
+ * export const MyComponent = () => {
39
+ * const {mutate} = useUpdateDocMutation({
40
+ * options: {
41
+ * },
42
+ * reference: collection().doc(),
43
+ * });
27
44
  *
28
- * @returns {UseMutationResult<AppModelType, Error, {data: AppModelType}, TContext>} An object returned by `useMutation`
29
- * which includes functions to start the mutation and properties that represent the different states of the mutation.
45
+ * // ....
46
+ * mutate({data: {test: 'value'}});
47
+ * // ....
48
+ * };
49
+ * ```
30
50
  */
31
- export declare const useUpdateDocMutation: <AppModelType extends DocumentData = DocumentData, DbModelType extends DocumentData = DocumentData, TContext = unknown>({ reference, converter, options }: UseUpdateDocMutationOptions<AppModelType, DbModelType, TContext>) => import("@tanstack/react-query").UseMutationResult<AppModelType, FirebaseError, UseUpdateDocMutationValues<DbModelType>, TContext>;
51
+ export declare const useUpdateDocMutation: <AppModelType extends AppModel = AppModel, TContext = unknown>({ reference, options }: UseUpdateDocMutationOptions<AppModelType, TContext>) => import("@tanstack/react-query").UseMutationResult<AppModelType & {
52
+ uid: string;
53
+ }, FirebaseError, UseUpdateDocMutationValues<AppModelType>, TContext>;
@@ -2,25 +2,30 @@ import { useMutation } from "@tanstack/react-query";
2
2
  import { updateDoc, getDoc } from "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, DbModelType, 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
- export const useUpdateDocMutation = ({ reference, converter, options = {} }) => {
28
+ export const useUpdateDocMutation = ({ reference, options = {} }) => {
24
29
  const mutationKey = useMemo(() => [reference?.path], [reference?.path]);
25
30
  return useMutation({
26
31
  ...options,
@@ -29,8 +34,8 @@ export const useUpdateDocMutation = ({ reference, converter, options = {} }) =>
29
34
  throw new Error("Reference is undefined");
30
35
  }
31
36
  await updateDoc(reference, data);
32
- const docSnap = await getDoc(converter ? reference.withConverter(converter) : reference);
33
- return docSnap.data();
37
+ const docSnap = await getDoc(reference);
38
+ return { ...docSnap.data(), uid: docSnap.id };
34
39
  },
35
40
  mutationKey
36
41
  });
@@ -1,61 +1,65 @@
1
1
  import { useMutation, UseMutationOptions } from "@tanstack/react-query";
2
- import {
3
- DocumentData,
4
- updateDoc,
5
- getDoc,
6
- FirestoreDataConverter,
7
- DocumentReference,
8
- UpdateData
9
- } from "firebase/firestore";
2
+ import { updateDoc, getDoc, DocumentReference, UpdateData } from "firebase/firestore";
10
3
 
11
4
  import { FirebaseError } from "firebase/app";
12
5
  import { useMemo } from "react";
6
+ import { AppModel } from "../../types";
13
7
 
14
- export type UseUpdateDocMutationValues<DbModelType> = {
15
- data: UpdateData<DbModelType>;
8
+ /**
9
+ * @inline
10
+ */
11
+ export type UseUpdateDocMutationValues<AppModelType extends AppModel = AppModel> = {
12
+ /**
13
+ * Data to write
14
+ */
15
+ data: UpdateData<AppModelType>;
16
16
  };
17
17
 
18
- export type UseUpdateDocMutationOptions<
19
- AppModelType extends DocumentData = DocumentData,
20
- DbModelType extends DocumentData = DocumentData,
21
- TContext = unknown
22
- > = {
23
- reference: DocumentReference<AppModelType, DbModelType> | null;
24
- converter?: FirestoreDataConverter<AppModelType, DbModelType>;
18
+ /**
19
+ * @inline
20
+ */
21
+ export type UseUpdateDocMutationOptions<AppModelType extends AppModel = AppModel, TContext = unknown> = {
22
+ /**
23
+ * Reference to a document that must be updated
24
+ */
25
+ reference: DocumentReference<AppModelType, AppModelType> | null;
26
+ /**
27
+ * Options for useMutation hook excluding mutationFn.
28
+ */
25
29
  options?: Omit<
26
- UseMutationOptions<AppModelType, FirebaseError, UseUpdateDocMutationValues<DbModelType>, TContext>,
27
- "mutationFn" | "mutationKey"
30
+ UseMutationOptions<AppModelType, FirebaseError, UseUpdateDocMutationValues<AppModelType>, TContext>,
31
+ "mutationFn"
28
32
  >;
29
33
  };
30
34
 
31
35
  /**
32
- * Custom hook that sets up a mutation for updating a document in a Firestore database.
33
- *
34
- * This hook utilizes `useMutation` for performing asynchronous operations to update the document
35
- * and retrieve the latest data snapshot. The update functionality can be configured with a custom
36
- * converter if needed.
36
+ * Executes a mutation and returns updated document
37
37
  *
38
- * @param {UseUpdateDocMutationOptions<AppModelType, DbModelType, TContext>} options - Configuration options for the mutation,
39
- * including Firestore reference, an optional Firestore data converter, and additional mutation options.
38
+ * @group Hook
40
39
  *
41
- * `reference` - The Firestore document reference that identifies the document to be updated.
40
+ * @param {UseUpdateDocMutationOptions<AppModelType>} options - Configuration options for mutation.
42
41
  *
43
- * `converter` - An optional Firestore converter for transforming the database response into a custom type.
42
+ * @returns {UseMutationResult<AppModelType, Error, UseAddDocMutationValues<AppModelType>, TContext>} A mutation result
44
43
  *
45
- * `options` - Additional options that customize the mutation's behavior.
44
+ * @example
45
+ * ```jsx
46
+ * export const MyComponent = () => {
47
+ * const {mutate} = useUpdateDocMutation({
48
+ * options: {
49
+ * },
50
+ * reference: collection().doc(),
51
+ * });
46
52
  *
47
- * @returns {UseMutationResult<AppModelType, Error, {data: AppModelType}, TContext>} An object returned by `useMutation`
48
- * which includes functions to start the mutation and properties that represent the different states of the mutation.
53
+ * // ....
54
+ * mutate({data: {test: 'value'}});
55
+ * // ....
56
+ * };
57
+ * ```
49
58
  */
50
- export const useUpdateDocMutation = <
51
- AppModelType extends DocumentData = DocumentData,
52
- DbModelType extends DocumentData = DocumentData,
53
- TContext = unknown
54
- >({
59
+ export const useUpdateDocMutation = <AppModelType extends AppModel = AppModel, TContext = unknown>({
55
60
  reference,
56
- converter,
57
61
  options = {}
58
- }: UseUpdateDocMutationOptions<AppModelType, DbModelType, TContext>) => {
62
+ }: UseUpdateDocMutationOptions<AppModelType, TContext>) => {
59
63
  const mutationKey = useMemo(() => [reference?.path], [reference?.path]);
60
64
 
61
65
  return useMutation({
@@ -65,9 +69,9 @@ export const useUpdateDocMutation = <
65
69
  throw new Error("Reference is undefined");
66
70
  }
67
71
 
68
- await updateDoc<AppModelType, DbModelType>(reference, data);
69
- const docSnap = await getDoc(converter ? reference.withConverter(converter) : reference);
70
- return docSnap.data() as AppModelType;
72
+ await updateDoc<AppModelType, AppModelType>(reference, data);
73
+ const docSnap = await getDoc(reference);
74
+ return { ...(docSnap.data() as AppModelType), uid: docSnap.id };
71
75
  },
72
76
  mutationKey
73
77
  });
@@ -0,0 +1,47 @@
1
+ import { QueryFilterConstraint as FBQueryFilterConstraint, QueryCompositeFilterConstraint as FBQueryCompositeFilterConstraint, WhereFilterOp } from "firebase/firestore";
2
+ import { AppModel } from "../../../types/AppModel";
3
+ export type QueryFilterConstraint = FBQueryFilterConstraint | FBQueryCompositeFilterConstraint;
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?: 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,42 @@
1
+ import { or, and, where, documentId } from "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
+ return query.operator === "OR" ? or(...queryConstraints) : and(...queryConstraints);
37
+ }
38
+ if (query.field && query.op) {
39
+ return where(query.field === "documentId" ? documentId() : query.field, query.op, query.value);
40
+ }
41
+ return null;
42
+ };
@@ -0,0 +1,73 @@
1
+ import {
2
+ QueryFilterConstraint as FBQueryFilterConstraint,
3
+ QueryCompositeFilterConstraint as FBQueryCompositeFilterConstraint,
4
+ WhereFilterOp,
5
+ or,
6
+ and,
7
+ where,
8
+ documentId
9
+ } from "firebase/firestore";
10
+ import { AppModel } from "../../../types/AppModel";
11
+
12
+ export type QueryFilterConstraint = FBQueryFilterConstraint | FBQueryCompositeFilterConstraint;
13
+
14
+ export type QueryElement<AppModelType extends AppModel = AppModel> = {
15
+ operator?: "OR" | "AND";
16
+ children?: QueryElement[];
17
+ field?: keyof (AppModelType & { documentId?: string[] });
18
+ value?: AppModelType[keyof AppModelType];
19
+ op?: WhereFilterOp;
20
+ };
21
+
22
+ export type CompositeFilter<AppModelType extends AppModel = AppModel> = {
23
+ operator: "OR" | "AND";
24
+ children: QueryElement<AppModelType & { documentId?: string[] }>[];
25
+ };
26
+ /**
27
+ * Constructs a composite or where query filter based on the provided query structure.
28
+ * It recursively builds query constraints using logical "or" or "and" operators.
29
+ *
30
+ * @group Utility
31
+ *
32
+ * @param {QueryElement<AppModelType>} query
33
+ *
34
+ * @returns {QueryFilterConstraint | null}
35
+ *
36
+ * @example
37
+ * ```jsx
38
+ * export const MyComponent = () => {
39
+ * const filter = buildCompositeFilter({
40
+ * operator: "AND",
41
+ * children: [
42
+ * {
43
+ * field: "field",
44
+ * value: "value",
45
+ * op: "=="
46
+ * },
47
+ * ...(query ? [query] : [])
48
+ * ]
49
+ * });
50
+ * console.log(filter);
51
+ * };
52
+ * ```
53
+ */
54
+
55
+ export const buildCompositeFilter = <AppModelType extends AppModel = AppModel>(
56
+ query: QueryElement<AppModelType>
57
+ ): QueryFilterConstraint | null => {
58
+ if (query.children) {
59
+ const queryConstraints = query.children.map(buildCompositeFilter).filter((constraint) => !!constraint);
60
+
61
+ if (queryConstraints.length <= 0) {
62
+ return null;
63
+ }
64
+
65
+ return (query as CompositeFilter).operator === "OR" ? or(...queryConstraints) : and(...queryConstraints);
66
+ }
67
+
68
+ if (query.field && query.op) {
69
+ return where(query.field === "documentId" ? documentId() : (query.field as string), query.op, query.value);
70
+ }
71
+
72
+ return null;
73
+ };
@@ -0,0 +1,23 @@
1
+ import { QueryNonFilterConstraint } from "firebase/firestore";
2
+ import { AppModel, 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 {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;