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.
- package/package.json +1 -1
- package/react-native/firestore/index.d.ts +5 -0
- package/react-native/firestore/index.js +5 -0
- package/react-native/firestore/index.ts +5 -0
- package/react-native/firestore/useAddDocMutation.d.ts +38 -9
- package/react-native/firestore/useAddDocMutation.js +25 -11
- package/react-native/firestore/useAddDocMutation.ts +43 -13
- package/react-native/firestore/useBatchWrite.d.ts +31 -7
- package/react-native/firestore/useBatchWrite.js +22 -4
- package/react-native/firestore/useBatchWrite.ts +31 -7
- package/react-native/firestore/useCollectionReference.d.ts +30 -9
- package/react-native/firestore/useCollectionReference.js +15 -7
- package/react-native/firestore/useCollectionReference.ts +34 -25
- package/react-native/firestore/useCompositeFilter.d.ts +1 -46
- package/react-native/firestore/useCompositeFilter.js +2 -45
- package/react-native/firestore/useCompositeFilter.ts +2 -74
- package/react-native/firestore/useCountQuery.d.ts +1 -1
- package/react-native/firestore/useCountQuery.ts +1 -1
- package/react-native/firestore/useDeleteDocMutation.d.ts +39 -10
- package/react-native/firestore/useDeleteDocMutation.js +22 -5
- package/react-native/firestore/useDeleteDocMutation.ts +38 -15
- package/react-native/firestore/useDocReference.d.ts +22 -14
- package/react-native/firestore/useDocReference.js +20 -26
- package/react-native/firestore/useDocReference.ts +34 -47
- package/react-native/firestore/useDocReferences.d.ts +23 -18
- package/react-native/firestore/useDocReferences.js +18 -19
- package/react-native/firestore/useDocReferences.ts +26 -34
- package/react-native/firestore/useFirestore.d.ts +4 -3
- package/react-native/firestore/useFirestore.js +4 -3
- package/react-native/firestore/useFirestore.ts +4 -3
- package/react-native/firestore/useGetDocData.d.ts +33 -14
- package/react-native/firestore/useGetDocData.js +21 -6
- package/react-native/firestore/useGetDocData.ts +34 -22
- package/react-native/firestore/useInfiniteQuery.d.ts +2 -2
- package/react-native/firestore/useInfiniteQuery.ts +3 -3
- package/react-native/firestore/useQuery.d.ts +1 -1
- package/react-native/firestore/useQuery.ts +1 -1
- package/react-native/firestore/useQueryConstraints.d.ts +2 -22
- package/react-native/firestore/useQueryConstraints.js +1 -39
- package/react-native/firestore/useQueryConstraints.ts +3 -43
- package/react-native/firestore/useRunTransaction.d.ts +33 -9
- package/react-native/firestore/useRunTransaction.js +20 -4
- package/react-native/firestore/useRunTransaction.ts +35 -16
- package/react-native/firestore/useSetDocMutation.d.ts +43 -11
- package/react-native/firestore/useSetDocMutation.js +28 -11
- package/react-native/firestore/useSetDocMutation.ts +49 -28
- package/react-native/firestore/useUpdateDocMutation.d.ts +40 -18
- package/react-native/firestore/useUpdateDocMutation.js +18 -13
- package/react-native/firestore/useUpdateDocMutation.ts +40 -31
- package/react-native/firestore/utils/buildCompositeFilter.d.ts +47 -0
- package/react-native/firestore/utils/buildCompositeFilter.js +45 -0
- package/react-native/firestore/utils/buildCompositeFilter.ts +75 -0
- package/react-native/firestore/utils/buildQueryConstraint.d.ts +23 -0
- package/react-native/firestore/utils/buildQueryConstraint.js +41 -0
- package/react-native/firestore/utils/buildQueryConstraint.ts +54 -0
- package/react-native/firestore/utils/getDocData.d.ts +11 -11
- package/react-native/firestore/utils/getDocData.js +5 -8
- package/react-native/firestore/utils/getDocData.ts +12 -16
- package/react-native/firestore/utils/getDocRef.d.ts +12 -9
- package/react-native/firestore/utils/getDocRef.js +7 -8
- package/react-native/firestore/utils/getDocRef.ts +12 -13
- package/react-native/firestore/utils/getDocSnap.d.ts +11 -13
- package/react-native/firestore/utils/getDocSnap.js +5 -10
- package/react-native/firestore/utils/getDocSnap.ts +12 -17
- package/types/AppModel.d.ts +4 -1
- package/types/AppModel.ts +4 -1
- package/web/firestore/index.d.ts +5 -0
- package/web/firestore/index.js +5 -0
- package/web/firestore/index.ts +5 -0
- package/web/firestore/useAddDocMutation.d.ts +41 -13
- package/web/firestore/useAddDocMutation.js +27 -14
- package/web/firestore/useAddDocMutation.ts +49 -37
- package/web/firestore/useBatchWrite.d.ts +34 -7
- package/web/firestore/useBatchWrite.js +22 -4
- package/web/firestore/useBatchWrite.ts +34 -7
- package/web/firestore/useCollectionReference.d.ts +32 -11
- package/web/firestore/useCollectionReference.js +15 -7
- package/web/firestore/useCollectionReference.ts +34 -13
- package/web/firestore/useCompositeFilter.d.ts +2 -47
- package/web/firestore/useCompositeFilter.js +2 -42
- package/web/firestore/useCompositeFilter.ts +2 -72
- package/web/firestore/useCountQuery.d.ts +4 -4
- package/web/firestore/useCountQuery.ts +5 -5
- package/web/firestore/useDeleteDocMutation.d.ts +41 -11
- package/web/firestore/useDeleteDocMutation.js +24 -7
- package/web/firestore/useDeleteDocMutation.ts +45 -23
- package/web/firestore/useDocReference.d.ts +23 -15
- package/web/firestore/useDocReference.js +16 -31
- package/web/firestore/useDocReference.ts +28 -46
- package/web/firestore/useDocReferences.d.ts +23 -18
- package/web/firestore/useDocReferences.js +18 -21
- package/web/firestore/useDocReferences.ts +26 -30
- package/web/firestore/useFirestore.d.ts +4 -3
- package/web/firestore/useFirestore.js +4 -3
- package/web/firestore/useFirestore.ts +4 -3
- package/web/firestore/useGetDocData.d.ts +32 -13
- package/web/firestore/useGetDocData.js +21 -6
- package/web/firestore/useGetDocData.ts +34 -23
- package/web/firestore/useGetRealtimeDocData.js +2 -2
- package/web/firestore/useGetRealtimeDocData.ts +2 -2
- package/web/firestore/useInfiniteQuery.d.ts +2 -2
- package/web/firestore/useInfiniteQuery.js +1 -1
- package/web/firestore/useInfiniteQuery.ts +4 -4
- package/web/firestore/useQuery.d.ts +1 -1
- package/web/firestore/useQuery.js +1 -1
- package/web/firestore/useQuery.ts +2 -2
- package/web/firestore/useQueryConstraints.d.ts +0 -21
- package/web/firestore/useQueryConstraints.js +1 -39
- package/web/firestore/useQueryConstraints.ts +2 -51
- package/web/firestore/useRunTransaction.d.ts +33 -8
- package/web/firestore/useRunTransaction.js +20 -4
- package/web/firestore/useRunTransaction.ts +35 -10
- package/web/firestore/useSetDocMutation.d.ts +45 -12
- package/web/firestore/useSetDocMutation.js +28 -11
- package/web/firestore/useSetDocMutation.ts +51 -26
- package/web/firestore/useUpdateDocMutation.d.ts +42 -20
- package/web/firestore/useUpdateDocMutation.js +20 -15
- package/web/firestore/useUpdateDocMutation.ts +45 -41
- package/web/firestore/utils/buildCompositeFilter.d.ts +47 -0
- package/web/firestore/utils/buildCompositeFilter.js +42 -0
- package/web/firestore/utils/buildCompositeFilter.ts +73 -0
- package/web/firestore/utils/buildQueryConstraint.d.ts +23 -0
- package/web/firestore/utils/buildQueryConstraint.js +41 -0
- package/web/firestore/utils/buildQueryConstraint.ts +55 -0
- package/web/firestore/utils/getDocData.d.ts +13 -11
- package/web/firestore/utils/getDocData.js +6 -9
- package/web/firestore/utils/getDocData.ts +14 -20
- package/web/firestore/utils/getDocRef.d.ts +14 -11
- package/web/firestore/utils/getDocRef.js +7 -8
- package/web/firestore/utils/getDocRef.ts +16 -19
- package/web/firestore/utils/getDocSnap.d.ts +11 -13
- package/web/firestore/utils/getDocSnap.js +5 -10
- 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 {
|
|
4
|
-
|
|
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
|
-
|
|
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
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Options for useMutation hook excluding mutationFn.
|
|
23
|
+
*/
|
|
24
|
+
options?: Omit<UseMutationOptions<AppModelType, Error, UseSetDocMutationValues<AppModelType>, TContext>, "mutationFn">;
|
|
10
25
|
};
|
|
11
26
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
44
|
+
* // ....
|
|
45
|
+
* mutate({data: {test: 'value'}});
|
|
46
|
+
* // ....
|
|
47
|
+
* };
|
|
48
|
+
* ```
|
|
19
49
|
*/
|
|
20
|
-
export declare const useSetDocMutation: <AppModelType extends
|
|
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
|
-
*
|
|
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
|
-
* @
|
|
9
|
-
*
|
|
10
|
-
* @param {
|
|
11
|
-
*
|
|
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
|
-
|
|
32
|
+
mutationKey,
|
|
33
|
+
mutationFn: async ({ data }) => {
|
|
18
34
|
if (!reference) {
|
|
19
35
|
throw new Error("Reference is undefined");
|
|
20
36
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
29
|
-
*
|
|
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
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
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
|
-
|
|
66
|
+
mutationKey,
|
|
67
|
+
mutationFn: async ({ data }) => {
|
|
48
68
|
if (!reference) {
|
|
49
69
|
throw new Error("Reference is undefined");
|
|
50
70
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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 {
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Options for useMutation hook excluding mutationFn.
|
|
23
|
+
*/
|
|
24
|
+
options?: Omit<UseMutationOptions<AppModelType, Error, UseUpdateDocMutationValues<AppModelType>, TContext>, "mutationFn">;
|
|
10
25
|
};
|
|
11
26
|
/**
|
|
12
|
-
*
|
|
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
|
-
* @
|
|
19
|
-
* including Firestore reference, an optional Firestore data converter, and additional mutation options.
|
|
29
|
+
* @group Hook
|
|
20
30
|
*
|
|
21
|
-
*
|
|
31
|
+
* @param {UseUpdateDocMutationOptions<AppModelType>} options - Configuration options for mutation.
|
|
22
32
|
*
|
|
23
|
-
*
|
|
33
|
+
* @returns {UseMutationResult<AppModelType, Error, UseAddDocMutationValues<AppModelType>, TContext>} A mutation result
|
|
24
34
|
*
|
|
25
|
-
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```jsx
|
|
37
|
+
* export const MyComponent = () => {
|
|
38
|
+
* const {mutate} = useUpdateDocMutation({
|
|
39
|
+
* options: {
|
|
40
|
+
* },
|
|
41
|
+
* reference: collection().doc(),
|
|
42
|
+
* });
|
|
26
43
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
44
|
+
* // ....
|
|
45
|
+
* mutate({data: {test: 'value'}});
|
|
46
|
+
* // ....
|
|
47
|
+
* };
|
|
48
|
+
* ```
|
|
29
49
|
*/
|
|
30
|
-
export declare const useUpdateDocMutation: <AppModelType extends
|
|
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
|
-
*
|
|
5
|
+
* Executes a mutation and returns updated document
|
|
6
6
|
*
|
|
7
|
-
*
|
|
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
|
|
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
|
-
*
|
|
11
|
+
* @returns {UseMutationResult<AppModelType, Error, UseAddDocMutationValues<AppModelType>, TContext>} A mutation result
|
|
15
12
|
*
|
|
16
|
-
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```jsx
|
|
15
|
+
* export const MyComponent = () => {
|
|
16
|
+
* const {mutate} = useUpdateDocMutation({
|
|
17
|
+
* options: {
|
|
18
|
+
* },
|
|
19
|
+
* reference: collection().doc(),
|
|
20
|
+
* });
|
|
17
21
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
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
|
-
|
|
8
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
-
* @
|
|
35
|
-
* including Firestore reference, an optional Firestore data converter, and additional mutation options.
|
|
37
|
+
* @group Hook
|
|
36
38
|
*
|
|
37
|
-
*
|
|
39
|
+
* @param {UseUpdateDocMutationOptions<AppModelType>} options - Configuration options for mutation.
|
|
38
40
|
*
|
|
39
|
-
*
|
|
41
|
+
* @returns {UseMutationResult<AppModelType, Error, UseAddDocMutationValues<AppModelType>, TContext>} A mutation result
|
|
40
42
|
*
|
|
41
|
-
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```jsx
|
|
45
|
+
* export const MyComponent = () => {
|
|
46
|
+
* const {mutate} = useUpdateDocMutation({
|
|
47
|
+
* options: {
|
|
48
|
+
* },
|
|
49
|
+
* reference: collection().doc(),
|
|
50
|
+
* });
|
|
42
51
|
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
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;
|