react-query-firebase 3.0.0 → 3.1.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/dist/react-native/firestore/index.d.ts +1 -0
- package/dist/react-native/firestore/index.js +1 -0
- package/dist/react-native/firestore/useFirestoreQueryEngine.d.ts +44 -0
- package/dist/react-native/firestore/useFirestoreQueryEngine.js +47 -0
- package/dist/web/firestore/index.d.ts +1 -0
- package/dist/web/firestore/index.js +1 -0
- package/dist/web/firestore/useFirestoreQueryEngine.d.ts +44 -0
- package/dist/web/firestore/useFirestoreQueryEngine.js +47 -0
- package/package.json +1 -1
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { FirebaseFirestoreTypes } from "@react-native-firebase/firestore";
|
|
2
|
+
import { AppModel } from "../../types/index.js";
|
|
3
|
+
import { type NonFilterQueryConstraint } from "../../types/QueryConstraints.js";
|
|
4
|
+
import { type CompositeFilter } from "./utils/buildCompositeFilter.js";
|
|
5
|
+
/**
|
|
6
|
+
* @inline
|
|
7
|
+
*/
|
|
8
|
+
type UseFirestoreQueryEngineOptions<AppModelType extends AppModel = AppModel> = {
|
|
9
|
+
/**
|
|
10
|
+
* Reference to a Firestore collection
|
|
11
|
+
*/
|
|
12
|
+
collectionReference: FirebaseFirestoreTypes.CollectionReference<AppModelType>;
|
|
13
|
+
/**
|
|
14
|
+
* Non composite filter constraints such as limit, order, where
|
|
15
|
+
*/
|
|
16
|
+
queryConstraints?: NonFilterQueryConstraint<AppModelType>[];
|
|
17
|
+
/**
|
|
18
|
+
* Composite filter
|
|
19
|
+
*/
|
|
20
|
+
compositeFilter?: CompositeFilter<AppModelType>;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Returns an async wrapper around native firestore query engine.
|
|
24
|
+
*
|
|
25
|
+
* @group Hook
|
|
26
|
+
*
|
|
27
|
+
* @returns {(options: UseFirestoreQueryEngineOptions<AppModelType>): Promise<AppModelType[]>} A function to execute firestore query
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```jsx
|
|
31
|
+
* export const MyComponent = () => {
|
|
32
|
+
* const query = useFirestoreQueryEngine();
|
|
33
|
+
* const callback = useCallback(async () => {
|
|
34
|
+
* const docs = await query({
|
|
35
|
+
* collectionReference: collection(),
|
|
36
|
+
* queryConstraints: [],
|
|
37
|
+
* });
|
|
38
|
+
* // do something with docs
|
|
39
|
+
* });
|
|
40
|
+
* };
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare const useFirestoreQueryEngine: <AppModelType extends AppModel = AppModel>() => ((options: UseFirestoreQueryEngineOptions<AppModelType>) => Promise<AppModelType[]>);
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { getDocs, query, or, and } from "@react-native-firebase/firestore";
|
|
2
|
+
import { useCallback } from "react";
|
|
3
|
+
import { buildCompositeFilter } from "./utils/buildCompositeFilter.js";
|
|
4
|
+
import { buildQueryConstraint } from "./utils/buildQueryConstraint.js";
|
|
5
|
+
/**
|
|
6
|
+
* Returns an async wrapper around native firestore query engine.
|
|
7
|
+
*
|
|
8
|
+
* @group Hook
|
|
9
|
+
*
|
|
10
|
+
* @returns {(options: UseFirestoreQueryEngineOptions<AppModelType>): Promise<AppModelType[]>} A function to execute firestore query
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```jsx
|
|
14
|
+
* export const MyComponent = () => {
|
|
15
|
+
* const query = useFirestoreQueryEngine();
|
|
16
|
+
* const callback = useCallback(async () => {
|
|
17
|
+
* const docs = await query({
|
|
18
|
+
* collectionReference: collection(),
|
|
19
|
+
* queryConstraints: [],
|
|
20
|
+
* });
|
|
21
|
+
* // do something with docs
|
|
22
|
+
* });
|
|
23
|
+
* };
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export const useFirestoreQueryEngine = () => {
|
|
27
|
+
return useCallback(async ({ collectionReference, queryConstraints = [], compositeFilter: inputCompositeFilter }) => {
|
|
28
|
+
const compositeFilter = (inputCompositeFilter?.children?.map?.((subQuery) => buildCompositeFilter(subQuery))
|
|
29
|
+
?.filter)?.((constraint) => !!constraint) ?? [];
|
|
30
|
+
const finalCompositeFilter = compositeFilter.length > 0
|
|
31
|
+
? inputCompositeFilter?.operator === "OR"
|
|
32
|
+
? or(...compositeFilter)
|
|
33
|
+
: and(...compositeFilter)
|
|
34
|
+
: undefined;
|
|
35
|
+
const queryToExecute = finalCompositeFilter
|
|
36
|
+
? query(collectionReference, finalCompositeFilter, ...queryConstraints.map(buildQueryConstraint))
|
|
37
|
+
: query(collectionReference, ...queryConstraints.map(buildQueryConstraint));
|
|
38
|
+
const querySnapshot = await getDocs(queryToExecute);
|
|
39
|
+
const docs = [];
|
|
40
|
+
if (querySnapshot) {
|
|
41
|
+
querySnapshot.forEach((doc) => {
|
|
42
|
+
docs.push({ ...doc.data(), uid: doc.id });
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return docs;
|
|
46
|
+
}, []);
|
|
47
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { CollectionReference } from "firebase/firestore";
|
|
2
|
+
import { NonFilterQueryConstraint } from "../../types/QueryConstraints.js";
|
|
3
|
+
import { AppModel } from "../../types/index.js";
|
|
4
|
+
import { CompositeFilter } from "./utils/buildCompositeFilter.js";
|
|
5
|
+
/**
|
|
6
|
+
* @inline
|
|
7
|
+
*/
|
|
8
|
+
type UseFirestoreQueryEngineOptions<AppModelType extends AppModel = AppModel> = {
|
|
9
|
+
/**
|
|
10
|
+
* Reference to a Firestore collection
|
|
11
|
+
*/
|
|
12
|
+
collectionReference: CollectionReference<AppModelType, AppModelType>;
|
|
13
|
+
/**
|
|
14
|
+
* Non composite filter constraints such as limit, order, where
|
|
15
|
+
*/
|
|
16
|
+
queryConstraints: NonFilterQueryConstraint<AppModelType>[];
|
|
17
|
+
/**
|
|
18
|
+
* Composite filter
|
|
19
|
+
*/
|
|
20
|
+
compositeFilter?: CompositeFilter;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Returns an async wrapper around native firestore query engine.
|
|
24
|
+
*
|
|
25
|
+
* @group Hook
|
|
26
|
+
*
|
|
27
|
+
* @returns {(options: UseFirestoreQueryEngineOptions<AppModelType>): Promise<AppModelType[]>} A function to execute firestore query
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```jsx
|
|
31
|
+
* export const MyComponent = () => {
|
|
32
|
+
* const query = useFirestoreQueryEngine();
|
|
33
|
+
* const callback = useCallback(async () => {
|
|
34
|
+
* const docs = await query({
|
|
35
|
+
* collectionReference: collection(),
|
|
36
|
+
* queryConstraints: [],
|
|
37
|
+
* });
|
|
38
|
+
* // do something with docs
|
|
39
|
+
* });
|
|
40
|
+
* };
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare const useFirestoreQueryEngine: <AppModelType extends AppModel = AppModel>() => ((options: UseFirestoreQueryEngineOptions<AppModelType>) => Promise<AppModelType[]>);
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { getDocs, query, or, and } from "firebase/firestore";
|
|
2
|
+
import { useCallback } from "react";
|
|
3
|
+
import { buildCompositeFilter } from "./utils/buildCompositeFilter.js";
|
|
4
|
+
import { buildQueryConstraint } from "./utils/buildQueryConstraint.js";
|
|
5
|
+
/**
|
|
6
|
+
* Returns an async wrapper around native firestore query engine.
|
|
7
|
+
*
|
|
8
|
+
* @group Hook
|
|
9
|
+
*
|
|
10
|
+
* @returns {(options: UseFirestoreQueryEngineOptions<AppModelType>): Promise<AppModelType[]>} A function to execute firestore query
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```jsx
|
|
14
|
+
* export const MyComponent = () => {
|
|
15
|
+
* const query = useFirestoreQueryEngine();
|
|
16
|
+
* const callback = useCallback(async () => {
|
|
17
|
+
* const docs = await query({
|
|
18
|
+
* collectionReference: collection(),
|
|
19
|
+
* queryConstraints: [],
|
|
20
|
+
* });
|
|
21
|
+
* // do something with docs
|
|
22
|
+
* });
|
|
23
|
+
* };
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export const useFirestoreQueryEngine = () => {
|
|
27
|
+
return useCallback(async ({ collectionReference, queryConstraints = [], compositeFilter: inputCompositeFilter }) => {
|
|
28
|
+
const compositeFilter = (inputCompositeFilter?.children?.map?.((subQuery) => buildCompositeFilter(subQuery))
|
|
29
|
+
?.filter)?.((constraint) => !!constraint) ?? [];
|
|
30
|
+
const finalCompositeFilter = compositeFilter.length > 0
|
|
31
|
+
? inputCompositeFilter?.operator === "OR"
|
|
32
|
+
? or(...compositeFilter)
|
|
33
|
+
: and(...compositeFilter)
|
|
34
|
+
: undefined;
|
|
35
|
+
const queryToExecute = finalCompositeFilter
|
|
36
|
+
? query(collectionReference, finalCompositeFilter, ...queryConstraints.map(buildQueryConstraint))
|
|
37
|
+
: query(collectionReference, ...queryConstraints);
|
|
38
|
+
const querySnapshot = await getDocs(queryToExecute);
|
|
39
|
+
const docs = [];
|
|
40
|
+
if (querySnapshot) {
|
|
41
|
+
querySnapshot.forEach((doc) => {
|
|
42
|
+
docs.push({ ...doc.data(), uid: doc.id });
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return docs;
|
|
46
|
+
}, []);
|
|
47
|
+
};
|
package/package.json
CHANGED