Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions firestore/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ export {
useCollectionOnce,
useCollectionData,
useCollectionDataOnce,
useCollectioCountOnce
} from './useCollection';
export {
useDocument,
Expand Down
10 changes: 10 additions & 0 deletions firestore/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,16 @@ export type CollectionOnceHook<T = DocumentData> = [
...CollectionHook<T>,
() => Promise<void>
];

export type CollectionCountHook<T = DocumentData> = LoadingHook<
number,
FirestoreError
>;

export type CollectionCountOnceHook<T = DocumentData> = [
...CollectionCountHook<T>,
() => Promise<void>
];
export type CollectionDataHook<T = DocumentData> = [
...LoadingHook<T[], FirestoreError>,
QuerySnapshot<T> | undefined
Expand Down
45 changes: 45 additions & 0 deletions firestore/useCollection.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {
DocumentData,
FirestoreError,
getCountFromServer,
getDocs,
getDocsFromCache,
getDocsFromServer,
Expand All @@ -14,6 +15,7 @@ import { useLoadingValue } from '../util';
import useIsMounted from '../util/useIsMounted';
import { useIsFirestoreQueryEqual } from './helpers';
import {
CollectionCountOnceHook,
CollectionDataHook,
CollectionDataOnceHook,
CollectionHook,
Expand Down Expand Up @@ -136,6 +138,49 @@ export const useCollectionDataOnce = <T = DocumentData>(
return [values, loading, error, snapshots, reloadData];
};

export const useCollectioCountOnce = <T = DocumentData>(
query?: Query<T> | null
): CollectionCountOnceHook<T> => {
const { error, loading, reset, setError, setValue, value } = useLoadingValue<
number,
FirestoreError
>();
const isMounted = useIsMounted();
const ref = useIsFirestoreQueryEqual<Query<T>>(query, reset);

const loadData = useCallback(
async (query?: Query<T> | null) => {
if (!query) {
setValue(undefined);
return;
}

try {
const result = await getCountFromServer(query);
if (isMounted) {
setValue(result?.data()?.count);
}
} catch (error) {
if (isMounted) {
setError(error as FirestoreError);
}
}
},
[]
);

const reloadData = useCallback(() => loadData(ref.current), [
loadData,
ref.current,
]);

useEffect(() => {
loadData(ref.current);
}, [ref.current]);

return [value, loading, error, reloadData];
};

const getValuesFromSnapshots = <T>(
snapshots: QuerySnapshot<T> | undefined,
options?: SnapshotOptions,
Expand Down