react-query-firebase 2.2.0 → 2.3.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/useCompositeFilter.d.ts +62 -20
- package/react-native/firestore/useCompositeFilter.js +51 -11
- package/react-native/firestore/useCompositeFilter.ts +70 -25
- package/react-native/firestore/useCountQuery.d.ts +35 -9
- package/react-native/firestore/useCountQuery.js +15 -6
- package/react-native/firestore/useCountQuery.ts +38 -14
- package/react-native/firestore/useInfiniteQuery.d.ts +39 -7
- package/react-native/firestore/useInfiniteQuery.js +19 -4
- package/react-native/firestore/useInfiniteQuery.ts +47 -8
- package/react-native/firestore/useQuery.d.ts +37 -12
- package/react-native/firestore/useQuery.js +17 -9
- package/react-native/firestore/useQuery.ts +40 -14
- package/types/index.d.ts +2 -0
- package/types/index.js +2 -0
- package/web/firestore/useCompositeFilter.d.ts +63 -21
- package/web/firestore/useCompositeFilter.js +48 -9
- package/web/firestore/useCompositeFilter.ts +73 -23
- package/web/firestore/useCountQuery.d.ts +37 -11
- package/web/firestore/useCountQuery.js +16 -7
- package/web/firestore/useCountQuery.ts +44 -19
- package/web/firestore/useInfiniteQuery.d.ts +41 -10
- package/web/firestore/useInfiniteQuery.js +21 -6
- package/web/firestore/useInfiniteQuery.ts +51 -23
- package/web/firestore/useQuery.d.ts +39 -15
- package/web/firestore/useQuery.js +19 -11
- package/web/firestore/useQuery.ts +49 -27
package/package.json
CHANGED
|
@@ -1,40 +1,82 @@
|
|
|
1
1
|
import { FirebaseFirestoreTypes } from "@react-native-firebase/firestore";
|
|
2
|
-
|
|
3
|
-
export type
|
|
2
|
+
import { AppModel } from "../../types";
|
|
3
|
+
export type QueryFilterConstraint = FirebaseFirestoreTypes.QueryCompositeFilterConstraint | FirebaseFirestoreTypes.QueryFilterConstraint;
|
|
4
|
+
export type QueryElement<AppModelType extends AppModel = AppModel> = {
|
|
4
5
|
operator?: "OR" | "AND";
|
|
5
6
|
children?: QueryElement[];
|
|
6
|
-
field?: keyof (
|
|
7
|
+
field?: keyof (AppModelType & {
|
|
7
8
|
documentId?: string[];
|
|
8
9
|
});
|
|
9
|
-
value?:
|
|
10
|
+
value?: AppModelType[keyof AppModelType];
|
|
10
11
|
op?: FirebaseFirestoreTypes.WhereFilterOp;
|
|
11
12
|
};
|
|
12
|
-
export type CompositeFilter<
|
|
13
|
+
export type CompositeFilter<AppModelType extends AppModel = AppModel> = {
|
|
13
14
|
operator: "OR" | "AND";
|
|
14
|
-
children: QueryElement<
|
|
15
|
+
children: QueryElement<AppModelType & {
|
|
15
16
|
documentId?: string[];
|
|
16
17
|
}>[];
|
|
17
18
|
};
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
/**
|
|
20
|
+
* @inline
|
|
21
|
+
*/
|
|
22
|
+
export type UseCompositeFilter<AppModelType extends AppModel = AppModel> = {
|
|
23
|
+
query?: CompositeFilter<AppModelType>;
|
|
20
24
|
};
|
|
21
25
|
/**
|
|
22
|
-
* Constructs a composite query filter based on the provided query structure.
|
|
26
|
+
* Constructs a composite or where query filter based on the provided query structure.
|
|
23
27
|
* It recursively builds query constraints using logical "or" or "and" operators.
|
|
24
28
|
*
|
|
25
|
-
* @
|
|
26
|
-
*
|
|
29
|
+
* @group Utility
|
|
30
|
+
*
|
|
31
|
+
* @param {QueryElement<AppModelType>} query
|
|
32
|
+
*
|
|
33
|
+
* @returns {QueryFilterConstraint | null}
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```jsx
|
|
37
|
+
* export const MyComponent = () => {
|
|
38
|
+
* const filter = buildCompositeFilter({
|
|
39
|
+
* operator: "AND",
|
|
40
|
+
* children: [
|
|
41
|
+
* {
|
|
42
|
+
* field: "field",
|
|
43
|
+
* value: "value",
|
|
44
|
+
* op: "=="
|
|
45
|
+
* },
|
|
46
|
+
* ...(query ? [query] : [])
|
|
47
|
+
* ]
|
|
48
|
+
* });
|
|
49
|
+
* console.log(filter);
|
|
50
|
+
* };
|
|
51
|
+
* ```
|
|
27
52
|
*/
|
|
28
|
-
export declare const buildCompositeFilter: <
|
|
53
|
+
export declare const buildCompositeFilter: <AppModelType extends AppModel = AppModel>(query: QueryElement<AppModelType>) => QueryFilterConstraint | null;
|
|
29
54
|
/**
|
|
30
|
-
* A custom hook that
|
|
31
|
-
* It
|
|
55
|
+
* A custom hook that constructs a composite or where query filter based on the provided query structure.
|
|
56
|
+
* It recursively builds query constraints using logical "or" or "and" operators.
|
|
57
|
+
*
|
|
58
|
+
* @group Hook
|
|
59
|
+
*
|
|
60
|
+
* @param {QueryElement<AppModelType>} query
|
|
32
61
|
*
|
|
33
|
-
* @
|
|
34
|
-
* @param {string} query.type - The type of composite operation ('or'/'and').
|
|
35
|
-
* @param {Array} query.children - An array of subqueries that will be processed to form the composite filter.
|
|
62
|
+
* @returns {QueryFilterConstraint | null}
|
|
36
63
|
*
|
|
37
|
-
* @
|
|
64
|
+
* @example
|
|
65
|
+
* ```jsx
|
|
66
|
+
* export const MyComponent = () => {
|
|
67
|
+
* const filter = useCompositeFilter({
|
|
68
|
+
* operator: "AND",
|
|
69
|
+
* children: [
|
|
70
|
+
* {
|
|
71
|
+
* field: "field",
|
|
72
|
+
* value: "value",
|
|
73
|
+
* op: "=="
|
|
74
|
+
* },
|
|
75
|
+
* ...(query ? [query] : [])
|
|
76
|
+
* ]
|
|
77
|
+
* });
|
|
78
|
+
* console.log(filter);
|
|
79
|
+
* };
|
|
80
|
+
* ```
|
|
38
81
|
*/
|
|
39
|
-
export declare const useCompositeFilter: <
|
|
40
|
-
export {};
|
|
82
|
+
export declare const useCompositeFilter: <AppModelType extends AppModel = AppModel>({ query }: UseCompositeFilter<AppModelType>) => QueryFilterConstraint | undefined;
|
|
@@ -1,11 +1,32 @@
|
|
|
1
1
|
import firebase, { and, or, where } from "@react-native-firebase/firestore";
|
|
2
2
|
import { useMemo } from "react";
|
|
3
3
|
/**
|
|
4
|
-
* Constructs a composite query filter based on the provided query structure.
|
|
4
|
+
* Constructs a composite or where query filter based on the provided query structure.
|
|
5
5
|
* It recursively builds query constraints using logical "or" or "and" operators.
|
|
6
6
|
*
|
|
7
|
-
* @
|
|
8
|
-
*
|
|
7
|
+
* @group Utility
|
|
8
|
+
*
|
|
9
|
+
* @param {QueryElement<AppModelType>} query
|
|
10
|
+
*
|
|
11
|
+
* @returns {QueryFilterConstraint | null}
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```jsx
|
|
15
|
+
* export const MyComponent = () => {
|
|
16
|
+
* const filter = buildCompositeFilter({
|
|
17
|
+
* operator: "AND",
|
|
18
|
+
* children: [
|
|
19
|
+
* {
|
|
20
|
+
* field: "field",
|
|
21
|
+
* value: "value",
|
|
22
|
+
* op: "=="
|
|
23
|
+
* },
|
|
24
|
+
* ...(query ? [query] : [])
|
|
25
|
+
* ]
|
|
26
|
+
* });
|
|
27
|
+
* console.log(filter);
|
|
28
|
+
* };
|
|
29
|
+
* ```
|
|
9
30
|
*/
|
|
10
31
|
export const buildCompositeFilter = (query) => {
|
|
11
32
|
if (query.children) {
|
|
@@ -24,19 +45,38 @@ export const buildCompositeFilter = (query) => {
|
|
|
24
45
|
return null;
|
|
25
46
|
};
|
|
26
47
|
/**
|
|
27
|
-
* A custom hook that
|
|
28
|
-
* It
|
|
48
|
+
* A custom hook that constructs a composite or where query filter based on the provided query structure.
|
|
49
|
+
* It recursively builds query constraints using logical "or" or "and" operators.
|
|
50
|
+
*
|
|
51
|
+
* @group Hook
|
|
52
|
+
*
|
|
53
|
+
* @param {QueryElement<AppModelType>} query
|
|
29
54
|
*
|
|
30
|
-
* @
|
|
31
|
-
* @param {string} query.type - The type of composite operation ('or'/'and').
|
|
32
|
-
* @param {Array} query.children - An array of subqueries that will be processed to form the composite filter.
|
|
55
|
+
* @returns {QueryFilterConstraint | null}
|
|
33
56
|
*
|
|
34
|
-
* @
|
|
57
|
+
* @example
|
|
58
|
+
* ```jsx
|
|
59
|
+
* export const MyComponent = () => {
|
|
60
|
+
* const filter = useCompositeFilter({
|
|
61
|
+
* operator: "AND",
|
|
62
|
+
* children: [
|
|
63
|
+
* {
|
|
64
|
+
* field: "field",
|
|
65
|
+
* value: "value",
|
|
66
|
+
* op: "=="
|
|
67
|
+
* },
|
|
68
|
+
* ...(query ? [query] : [])
|
|
69
|
+
* ]
|
|
70
|
+
* });
|
|
71
|
+
* console.log(filter);
|
|
72
|
+
* };
|
|
73
|
+
* ```
|
|
35
74
|
*/
|
|
36
75
|
export const useCompositeFilter = ({ query }) => {
|
|
37
76
|
return useMemo(() => {
|
|
38
|
-
const queryConstraints =
|
|
39
|
-
?.
|
|
77
|
+
const queryConstraints = query?.children
|
|
78
|
+
?.map?.((subQuery) => buildCompositeFilter(subQuery))
|
|
79
|
+
?.filter?.((constraint) => !!constraint) ?? [];
|
|
40
80
|
if (queryConstraints.length <= 0) {
|
|
41
81
|
return undefined;
|
|
42
82
|
}
|
|
@@ -1,36 +1,62 @@
|
|
|
1
1
|
import firebase, { FirebaseFirestoreTypes, and, or, where } from "@react-native-firebase/firestore";
|
|
2
2
|
import { useMemo } from "react";
|
|
3
|
+
import { AppModel } from "../../types";
|
|
3
4
|
|
|
4
|
-
type
|
|
5
|
+
export type QueryFilterConstraint =
|
|
6
|
+
| FirebaseFirestoreTypes.QueryCompositeFilterConstraint
|
|
7
|
+
| FirebaseFirestoreTypes.QueryFilterConstraint;
|
|
5
8
|
|
|
6
|
-
export type QueryElement<
|
|
9
|
+
export type QueryElement<AppModelType extends AppModel = AppModel> = {
|
|
7
10
|
operator?: "OR" | "AND";
|
|
8
11
|
children?: QueryElement[];
|
|
9
|
-
field?: keyof (
|
|
10
|
-
value?:
|
|
12
|
+
field?: keyof (AppModelType & { documentId?: string[] });
|
|
13
|
+
value?: AppModelType[keyof AppModelType];
|
|
11
14
|
op?: FirebaseFirestoreTypes.WhereFilterOp;
|
|
12
15
|
};
|
|
13
16
|
|
|
14
|
-
export type CompositeFilter<
|
|
17
|
+
export type CompositeFilter<AppModelType extends AppModel = AppModel> = {
|
|
15
18
|
operator: "OR" | "AND";
|
|
16
|
-
children: QueryElement<
|
|
19
|
+
children: QueryElement<AppModelType & { documentId?: string[] }>[];
|
|
17
20
|
};
|
|
18
21
|
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
/**
|
|
23
|
+
* @inline
|
|
24
|
+
*/
|
|
25
|
+
export type UseCompositeFilter<AppModelType extends AppModel = AppModel> = {
|
|
26
|
+
query?: CompositeFilter<AppModelType>;
|
|
21
27
|
};
|
|
22
28
|
|
|
23
29
|
/**
|
|
24
|
-
* Constructs a composite query filter based on the provided query structure.
|
|
30
|
+
* Constructs a composite or where query filter based on the provided query structure.
|
|
25
31
|
* It recursively builds query constraints using logical "or" or "and" operators.
|
|
26
32
|
*
|
|
27
|
-
* @
|
|
28
|
-
*
|
|
33
|
+
* @group Utility
|
|
34
|
+
*
|
|
35
|
+
* @param {QueryElement<AppModelType>} query
|
|
36
|
+
*
|
|
37
|
+
* @returns {QueryFilterConstraint | null}
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```jsx
|
|
41
|
+
* export const MyComponent = () => {
|
|
42
|
+
* const filter = buildCompositeFilter({
|
|
43
|
+
* operator: "AND",
|
|
44
|
+
* children: [
|
|
45
|
+
* {
|
|
46
|
+
* field: "field",
|
|
47
|
+
* value: "value",
|
|
48
|
+
* op: "=="
|
|
49
|
+
* },
|
|
50
|
+
* ...(query ? [query] : [])
|
|
51
|
+
* ]
|
|
52
|
+
* });
|
|
53
|
+
* console.log(filter);
|
|
54
|
+
* };
|
|
55
|
+
* ```
|
|
29
56
|
*/
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
): FirebaseFirestoreTypes.QueryFilterConstraint | null => {
|
|
57
|
+
export const buildCompositeFilter = <AppModelType extends AppModel = AppModel>(
|
|
58
|
+
query: QueryElement<AppModelType>
|
|
59
|
+
): QueryFilterConstraint | null => {
|
|
34
60
|
if (query.children) {
|
|
35
61
|
const queryConstraints = query.children.map(buildCompositeFilter).filter((constraint) => !!constraint);
|
|
36
62
|
|
|
@@ -57,22 +83,41 @@ export const buildCompositeFilter = <DbModelType extends CompositeFilterDocument
|
|
|
57
83
|
};
|
|
58
84
|
|
|
59
85
|
/**
|
|
60
|
-
* A custom hook that
|
|
61
|
-
* It
|
|
86
|
+
* A custom hook that constructs a composite or where query filter based on the provided query structure.
|
|
87
|
+
* It recursively builds query constraints using logical "or" or "and" operators.
|
|
88
|
+
*
|
|
89
|
+
* @group Hook
|
|
90
|
+
*
|
|
91
|
+
* @param {QueryElement<AppModelType>} query
|
|
62
92
|
*
|
|
63
|
-
* @
|
|
64
|
-
* @param {string} query.type - The type of composite operation ('or'/'and').
|
|
65
|
-
* @param {Array} query.children - An array of subqueries that will be processed to form the composite filter.
|
|
93
|
+
* @returns {QueryFilterConstraint | null}
|
|
66
94
|
*
|
|
67
|
-
* @
|
|
95
|
+
* @example
|
|
96
|
+
* ```jsx
|
|
97
|
+
* export const MyComponent = () => {
|
|
98
|
+
* const filter = useCompositeFilter({
|
|
99
|
+
* operator: "AND",
|
|
100
|
+
* children: [
|
|
101
|
+
* {
|
|
102
|
+
* field: "field",
|
|
103
|
+
* value: "value",
|
|
104
|
+
* op: "=="
|
|
105
|
+
* },
|
|
106
|
+
* ...(query ? [query] : [])
|
|
107
|
+
* ]
|
|
108
|
+
* });
|
|
109
|
+
* console.log(filter);
|
|
110
|
+
* };
|
|
111
|
+
* ```
|
|
68
112
|
*/
|
|
69
|
-
export const useCompositeFilter = <
|
|
113
|
+
export const useCompositeFilter = <AppModelType extends AppModel = AppModel>({
|
|
70
114
|
query
|
|
71
|
-
}: UseCompositeFilter<
|
|
115
|
+
}: UseCompositeFilter<AppModelType>): QueryFilterConstraint | undefined => {
|
|
72
116
|
return useMemo(() => {
|
|
73
117
|
const queryConstraints =
|
|
74
|
-
query?.children
|
|
75
|
-
?.
|
|
118
|
+
query?.children
|
|
119
|
+
?.map?.((subQuery) => buildCompositeFilter(subQuery))
|
|
120
|
+
?.filter?.((constraint) => !!constraint) ?? [];
|
|
76
121
|
|
|
77
122
|
if (queryConstraints.length <= 0) {
|
|
78
123
|
return undefined;
|
|
@@ -1,23 +1,49 @@
|
|
|
1
1
|
import { FirebaseFirestoreTypes, QueryConstraint, QueryNonFilterConstraint } from "@react-native-firebase/firestore";
|
|
2
2
|
import { UseQueryResult, UseQueryOptions as UseReactQueryOptions } from "@tanstack/react-query";
|
|
3
|
-
|
|
3
|
+
import { QueryFilterConstraint } from "./useCompositeFilter";
|
|
4
|
+
import { AppModel } from "../../types";
|
|
5
|
+
/**
|
|
6
|
+
* @inline
|
|
7
|
+
*/
|
|
8
|
+
type UseCountQueryOptions<AppModelType extends AppModel = AppModel> = {
|
|
9
|
+
/**
|
|
10
|
+
* Reqct-query options that must include queryKey and shall not define queryFn
|
|
11
|
+
*/
|
|
4
12
|
options: Omit<UseReactQueryOptions<number, Error, number>, "queryFn"> & Required<Pick<UseReactQueryOptions<number, Error, number>, "queryKey">>;
|
|
13
|
+
/**
|
|
14
|
+
* Reference to a Firestore collection
|
|
15
|
+
*/
|
|
5
16
|
collectionReference: FirebaseFirestoreTypes.CollectionReference<AppModelType>;
|
|
17
|
+
/**
|
|
18
|
+
* Non composite filter constraints such as limit, order, where
|
|
19
|
+
*/
|
|
6
20
|
queryConstraints?: QueryConstraint[] | QueryNonFilterConstraint[];
|
|
7
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Composite filter
|
|
23
|
+
*/
|
|
24
|
+
compositeFilter?: QueryFilterConstraint;
|
|
8
25
|
};
|
|
9
26
|
/**
|
|
10
27
|
* Executes a query with specified constraints and returns the count of matched documents.
|
|
11
28
|
*
|
|
12
|
-
*
|
|
13
|
-
* that match the provided query constraints and an optional composite filter.
|
|
29
|
+
* @group Hook
|
|
14
30
|
*
|
|
15
31
|
* @param {UseCountQueryOptions<AppModelType>} options - Configuration options for the query.
|
|
16
|
-
*
|
|
17
|
-
* @param {unknown} [options.query] - Reference to the query object to be executed.
|
|
18
|
-
* @param {unknown[]} [options.queryConstraints=[]] - An array of constraints to apply to the query.
|
|
19
|
-
* @param {unknown} [options.compositeFilter] - An optional composite filter to apply to the query.
|
|
32
|
+
*
|
|
20
33
|
* @returns {UseQueryResult<number>} An object containing the number of documents that match the query.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```jsx
|
|
37
|
+
* export const MyComponent = () => {
|
|
38
|
+
* const count = useCountQuery({
|
|
39
|
+
* options: {
|
|
40
|
+
* queryKey: ['key']
|
|
41
|
+
* },
|
|
42
|
+
* collectionReference: collection(),
|
|
43
|
+
* });
|
|
44
|
+
* console.log(count);
|
|
45
|
+
* };
|
|
46
|
+
* ```
|
|
21
47
|
*/
|
|
22
|
-
export declare const useCountQuery: <AppModelType extends
|
|
48
|
+
export declare const useCountQuery: <AppModelType extends AppModel = AppModel>({ options, collectionReference, queryConstraints, compositeFilter }: UseCountQueryOptions<AppModelType>) => UseQueryResult<number>;
|
|
23
49
|
export {};
|
|
@@ -3,15 +3,24 @@ import { useQuery as useReactQuery } from "@tanstack/react-query";
|
|
|
3
3
|
/**
|
|
4
4
|
* Executes a query with specified constraints and returns the count of matched documents.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* that match the provided query constraints and an optional composite filter.
|
|
6
|
+
* @group Hook
|
|
8
7
|
*
|
|
9
8
|
* @param {UseCountQueryOptions<AppModelType>} options - Configuration options for the query.
|
|
10
|
-
*
|
|
11
|
-
* @param {unknown} [options.query] - Reference to the query object to be executed.
|
|
12
|
-
* @param {unknown[]} [options.queryConstraints=[]] - An array of constraints to apply to the query.
|
|
13
|
-
* @param {unknown} [options.compositeFilter] - An optional composite filter to apply to the query.
|
|
9
|
+
*
|
|
14
10
|
* @returns {UseQueryResult<number>} An object containing the number of documents that match the query.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```jsx
|
|
14
|
+
* export const MyComponent = () => {
|
|
15
|
+
* const count = useCountQuery({
|
|
16
|
+
* options: {
|
|
17
|
+
* queryKey: ['key']
|
|
18
|
+
* },
|
|
19
|
+
* collectionReference: collection(),
|
|
20
|
+
* });
|
|
21
|
+
* console.log(count);
|
|
22
|
+
* };
|
|
23
|
+
* ```
|
|
15
24
|
*/
|
|
16
25
|
export const useCountQuery = ({ options, collectionReference, queryConstraints = [], compositeFilter }) => {
|
|
17
26
|
return useReactQuery({
|
|
@@ -11,34 +11,58 @@ import {
|
|
|
11
11
|
useQuery as useReactQuery,
|
|
12
12
|
UseQueryOptions as UseReactQueryOptions
|
|
13
13
|
} from "@tanstack/react-query";
|
|
14
|
+
import { QueryFilterConstraint } from "./useCompositeFilter";
|
|
15
|
+
import { AppModel } from "../../types";
|
|
14
16
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
/**
|
|
18
|
+
* @inline
|
|
19
|
+
*/
|
|
20
|
+
type UseCountQueryOptions<AppModelType extends AppModel = AppModel> = {
|
|
21
|
+
/**
|
|
22
|
+
* Reqct-query options that must include queryKey and shall not define queryFn
|
|
23
|
+
*/
|
|
18
24
|
options: Omit<UseReactQueryOptions<number, Error, number>, "queryFn"> &
|
|
19
25
|
Required<Pick<UseReactQueryOptions<number, Error, number>, "queryKey">>;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Reference to a Firestore collection
|
|
29
|
+
*/
|
|
20
30
|
collectionReference: FirebaseFirestoreTypes.CollectionReference<AppModelType>;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Non composite filter constraints such as limit, order, where
|
|
34
|
+
*/
|
|
21
35
|
queryConstraints?: QueryConstraint[] | QueryNonFilterConstraint[];
|
|
22
|
-
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Composite filter
|
|
39
|
+
*/
|
|
40
|
+
compositeFilter?: QueryFilterConstraint;
|
|
23
41
|
};
|
|
24
42
|
|
|
25
43
|
/**
|
|
26
44
|
* Executes a query with specified constraints and returns the count of matched documents.
|
|
27
45
|
*
|
|
28
|
-
*
|
|
29
|
-
* that match the provided query constraints and an optional composite filter.
|
|
46
|
+
* @group Hook
|
|
30
47
|
*
|
|
31
48
|
* @param {UseCountQueryOptions<AppModelType>} options - Configuration options for the query.
|
|
32
|
-
*
|
|
33
|
-
* @param {unknown} [options.query] - Reference to the query object to be executed.
|
|
34
|
-
* @param {unknown[]} [options.queryConstraints=[]] - An array of constraints to apply to the query.
|
|
35
|
-
* @param {unknown} [options.compositeFilter] - An optional composite filter to apply to the query.
|
|
49
|
+
*
|
|
36
50
|
* @returns {UseQueryResult<number>} An object containing the number of documents that match the query.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```jsx
|
|
54
|
+
* export const MyComponent = () => {
|
|
55
|
+
* const count = useCountQuery({
|
|
56
|
+
* options: {
|
|
57
|
+
* queryKey: ['key']
|
|
58
|
+
* },
|
|
59
|
+
* collectionReference: collection(),
|
|
60
|
+
* });
|
|
61
|
+
* console.log(count);
|
|
62
|
+
* };
|
|
63
|
+
* ```
|
|
37
64
|
*/
|
|
38
|
-
|
|
39
|
-
export const useCountQuery = <
|
|
40
|
-
AppModelType extends FirebaseFirestoreTypes.DocumentData = FirebaseFirestoreTypes.DocumentData
|
|
41
|
-
>({
|
|
65
|
+
export const useCountQuery = <AppModelType extends AppModel = AppModel>({
|
|
42
66
|
options,
|
|
43
67
|
collectionReference,
|
|
44
68
|
queryConstraints = [],
|
|
@@ -1,17 +1,49 @@
|
|
|
1
1
|
import { FirebaseFirestoreTypes, QueryConstraint, QueryNonFilterConstraint } from "@react-native-firebase/firestore";
|
|
2
2
|
import { UseInfiniteQueryOptions as UseReactInfiniteQueryOptions, QueryKey, UseInfiniteQueryResult, InfiniteData } from "@tanstack/react-query";
|
|
3
|
-
|
|
3
|
+
import { QueryFilterConstraint } from "./useCompositeFilter";
|
|
4
|
+
import { AppModel } from "../../types";
|
|
5
|
+
/**
|
|
6
|
+
* @inline
|
|
7
|
+
*/
|
|
8
|
+
type UseInfiniteQueryOptions<AppModelType extends AppModel = AppModel, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown> = {
|
|
9
|
+
/**
|
|
10
|
+
* Reqct-query options that must include queryKey and shall not define queryFn
|
|
11
|
+
*/
|
|
4
12
|
options: Omit<UseReactInfiniteQueryOptions<AppModelType[], Error, InfiniteData<AppModelType[]>, AppModelType[], TQueryKey, TPageParam>, "queryFn"> & Required<Pick<UseReactInfiniteQueryOptions<AppModelType[], Error, InfiniteData<AppModelType[]>, AppModelType[], TQueryKey, TPageParam>, "queryKey">>;
|
|
13
|
+
/**
|
|
14
|
+
* Reference to a Firestore collection
|
|
15
|
+
*/
|
|
5
16
|
collectionReference: FirebaseFirestoreTypes.CollectionReference<AppModelType>;
|
|
17
|
+
/**
|
|
18
|
+
* Non composite filter constraints such as limit, order, where
|
|
19
|
+
*/
|
|
6
20
|
queryConstraints?: QueryConstraint[] | QueryNonFilterConstraint[];
|
|
7
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Composite filter
|
|
23
|
+
*/
|
|
24
|
+
compositeFilter?: QueryFilterConstraint;
|
|
8
25
|
};
|
|
9
26
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
27
|
+
* Executes an infinite query on a Firestore data source and returns the resulting documents as an array.
|
|
28
|
+
*
|
|
29
|
+
* @group Hook
|
|
30
|
+
*
|
|
31
|
+
* @param {UseInfiniteQueryOptions<AppModelType, TQueryKey>} options - Configuration options for the query.
|
|
32
|
+
*
|
|
33
|
+
* @returns {UseInfiniteQueryResult<InfiniteData<AppModelType[]>>} An object containing documents that match the query.
|
|
12
34
|
*
|
|
13
|
-
* @
|
|
14
|
-
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```jsx
|
|
37
|
+
* export const MyComponent = () => {
|
|
38
|
+
* const docs = useInfiniteQuery({
|
|
39
|
+
* options: {
|
|
40
|
+
* queryKey: ['key']
|
|
41
|
+
* },
|
|
42
|
+
* collectionReference: collection(),
|
|
43
|
+
* });
|
|
44
|
+
* console.log(docs);
|
|
45
|
+
* };
|
|
46
|
+
* ```
|
|
15
47
|
*/
|
|
16
|
-
export declare const useInfiniteQuery: <AppModelType extends
|
|
48
|
+
export declare const useInfiniteQuery: <AppModelType extends AppModel = AppModel, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown>({ options, collectionReference, queryConstraints, compositeFilter }: UseInfiniteQueryOptions<AppModelType, TQueryKey, TPageParam>) => UseInfiniteQueryResult<InfiniteData<AppModelType[]>>;
|
|
17
49
|
export {};
|
|
@@ -1,11 +1,26 @@
|
|
|
1
1
|
import { getDocs, query } from "@react-native-firebase/firestore";
|
|
2
2
|
import { useInfiniteQuery as useInfiniteReactQuery } from "@tanstack/react-query";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
* It fetches data in pages and can load more as required.
|
|
4
|
+
* Executes an infinite query on a Firestore data source and returns the resulting documents as an array.
|
|
6
5
|
*
|
|
7
|
-
* @
|
|
8
|
-
*
|
|
6
|
+
* @group Hook
|
|
7
|
+
*
|
|
8
|
+
* @param {UseInfiniteQueryOptions<AppModelType, TQueryKey>} options - Configuration options for the query.
|
|
9
|
+
*
|
|
10
|
+
* @returns {UseInfiniteQueryResult<InfiniteData<AppModelType[]>>} An object containing documents that match the query.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```jsx
|
|
14
|
+
* export const MyComponent = () => {
|
|
15
|
+
* const docs = useInfiniteQuery({
|
|
16
|
+
* options: {
|
|
17
|
+
* queryKey: ['key']
|
|
18
|
+
* },
|
|
19
|
+
* collectionReference: collection(),
|
|
20
|
+
* });
|
|
21
|
+
* console.log(docs);
|
|
22
|
+
* };
|
|
23
|
+
* ```
|
|
9
24
|
*/
|
|
10
25
|
export const useInfiniteQuery = ({ options, collectionReference, queryConstraints = [], compositeFilter }) => {
|
|
11
26
|
return useInfiniteReactQuery({
|