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.
- 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 +1 -1
- package/react-native/firestore/useInfiniteQuery.ts +1 -1
- package/react-native/firestore/useQuery.d.ts +1 -1
- package/react-native/firestore/useQuery.ts +1 -1
- package/react-native/firestore/useQueryConstraints.d.ts +0 -21
- package/react-native/firestore/useQueryConstraints.js +1 -39
- package/react-native/firestore/useQueryConstraints.ts +2 -51
- 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 +9 -10
- package/react-native/firestore/utils/getDocRef.ts +14 -15
- 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 +1 -1
- package/web/firestore/useInfiniteQuery.js +1 -1
- package/web/firestore/useInfiniteQuery.ts +2 -2
- 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 +9 -10
- package/web/firestore/utils/getDocRef.ts +21 -24
- 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,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
|
-
*
|
|
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,52 +1,77 @@
|
|
|
1
1
|
import { useMutation, UseMutationOptions } from "@tanstack/react-query";
|
|
2
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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<
|
|
19
|
-
"mutationFn"
|
|
30
|
+
UseMutationOptions<AppModelType, FirebaseError, UseSetDocMutationValues<AppModelType>, TContext>,
|
|
31
|
+
"mutationFn"
|
|
20
32
|
>;
|
|
21
33
|
};
|
|
22
34
|
|
|
23
35
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
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
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
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,
|
|
62
|
+
}: UseSetDocMutationOptions<AppModelType, TContext>) => {
|
|
40
63
|
const mutationKey = useMemo(() => [reference?.path], [reference?.path]);
|
|
41
64
|
|
|
42
65
|
return useMutation({
|
|
43
66
|
...options,
|
|
44
|
-
|
|
67
|
+
mutationKey,
|
|
68
|
+
mutationFn: async ({ data }) => {
|
|
45
69
|
if (!reference) {
|
|
46
70
|
throw new Error("Reference is undefined");
|
|
47
71
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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 {
|
|
2
|
+
import { DocumentReference, UpdateData } from "firebase/firestore";
|
|
3
3
|
import { FirebaseError } from "firebase/app";
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
*
|
|
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
|
-
* @
|
|
20
|
-
* including Firestore reference, an optional Firestore data converter, and additional mutation options.
|
|
30
|
+
* @group Hook
|
|
21
31
|
*
|
|
22
|
-
*
|
|
32
|
+
* @param {UseUpdateDocMutationOptions<AppModelType>} options - Configuration options for mutation.
|
|
23
33
|
*
|
|
24
|
-
*
|
|
34
|
+
* @returns {UseMutationResult<AppModelType, Error, UseAddDocMutationValues<AppModelType>, TContext>} A mutation result
|
|
25
35
|
*
|
|
26
|
-
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```jsx
|
|
38
|
+
* export const MyComponent = () => {
|
|
39
|
+
* const {mutate} = useUpdateDocMutation({
|
|
40
|
+
* options: {
|
|
41
|
+
* },
|
|
42
|
+
* reference: collection().doc(),
|
|
43
|
+
* });
|
|
27
44
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
45
|
+
* // ....
|
|
46
|
+
* mutate({data: {test: 'value'}});
|
|
47
|
+
* // ....
|
|
48
|
+
* };
|
|
49
|
+
* ```
|
|
30
50
|
*/
|
|
31
|
-
export declare const useUpdateDocMutation: <AppModelType extends
|
|
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
|
-
*
|
|
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
|
-
export const useUpdateDocMutation = ({ reference,
|
|
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(
|
|
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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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<
|
|
27
|
-
"mutationFn"
|
|
30
|
+
UseMutationOptions<AppModelType, FirebaseError, UseUpdateDocMutationValues<AppModelType>, TContext>,
|
|
31
|
+
"mutationFn"
|
|
28
32
|
>;
|
|
29
33
|
};
|
|
30
34
|
|
|
31
35
|
/**
|
|
32
|
-
*
|
|
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
|
-
* @
|
|
39
|
-
* including Firestore reference, an optional Firestore data converter, and additional mutation options.
|
|
38
|
+
* @group Hook
|
|
40
39
|
*
|
|
41
|
-
*
|
|
40
|
+
* @param {UseUpdateDocMutationOptions<AppModelType>} options - Configuration options for mutation.
|
|
42
41
|
*
|
|
43
|
-
*
|
|
42
|
+
* @returns {UseMutationResult<AppModelType, Error, UseAddDocMutationValues<AppModelType>, TContext>} A mutation result
|
|
44
43
|
*
|
|
45
|
-
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```jsx
|
|
46
|
+
* export const MyComponent = () => {
|
|
47
|
+
* const {mutate} = useUpdateDocMutation({
|
|
48
|
+
* options: {
|
|
49
|
+
* },
|
|
50
|
+
* reference: collection().doc(),
|
|
51
|
+
* });
|
|
46
52
|
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
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,
|
|
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,
|
|
69
|
-
const docSnap = await getDoc(
|
|
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;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { orderBy, startAt, startAfter, endAt, endBefore, limit, limitToLast } from "firebase/firestore";
|
|
2
|
+
/**
|
|
3
|
+
* A generic mothod to build query constraints for firebase
|
|
4
|
+
*
|
|
5
|
+
* @group Utility
|
|
6
|
+
*
|
|
7
|
+
* @param {NonFilterQueryConstraint<AppModelType>} constraint
|
|
8
|
+
*
|
|
9
|
+
* @returns {QueryNonFilterConstraint}
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```jsx
|
|
13
|
+
* const firebaseConfig = {};
|
|
14
|
+
* export const constraint = useMemo(() => {
|
|
15
|
+
* return buildQueryConstraint({
|
|
16
|
+
* type: 'limit',
|
|
17
|
+
* limit: 1
|
|
18
|
+
* });
|
|
19
|
+
* };
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export const buildQueryConstraint = (constraint) => {
|
|
23
|
+
switch (constraint.type) {
|
|
24
|
+
case "orderBy":
|
|
25
|
+
return orderBy(constraint.fieldPath, constraint.directionStr);
|
|
26
|
+
case "startAt":
|
|
27
|
+
return startAt(...constraint.arguments);
|
|
28
|
+
case "startAfter":
|
|
29
|
+
return startAfter(...constraint.arguments);
|
|
30
|
+
case "endAt":
|
|
31
|
+
return endAt(constraint.value, constraint.key);
|
|
32
|
+
case "endBefore":
|
|
33
|
+
return endBefore(constraint.value, constraint.key);
|
|
34
|
+
case "limit":
|
|
35
|
+
return limit(constraint.limit);
|
|
36
|
+
case "limitToLast":
|
|
37
|
+
return limitToLast(constraint.limit);
|
|
38
|
+
default:
|
|
39
|
+
throw new Error(`Unsupported constaint ${JSON.stringify(constraint)}`);
|
|
40
|
+
}
|
|
41
|
+
};
|