diff --git a/README.md b/README.md index 89c002c..1ff2735 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ A set of reusable [React Hooks](https://reactjs.org/docs/hooks-intro.html) for [ This documentation is for v4 of React Firebase Hooks which makes the package compatible with Firebase v9 and drops support for previous versions of Firebase - more details [here](https://github.com/CSFrequency/react-firebase-hooks/releases/tag/v4.0.0). -- For v3 documentation (Firebase v8), see [here](https://github.com/CSFrequency/react-firebase-hooks/tree/v3.0.0). +- For v3 documentation (Firebase v8), see [here](https://github.com/CSFrequency/react-firebase-hooks/tree/v3.0.4). - For v2 documentation, see [here](https://github.com/CSFrequency/react-firebase-hooks/tree/v2.2.0). ## Installation diff --git a/firestore/helpers/index.ts b/firestore/helpers/index.ts index 3e506b4..4c273af 100644 --- a/firestore/helpers/index.ts +++ b/firestore/helpers/index.ts @@ -1,8 +1,14 @@ import { + CollectionReference, DocumentData, + DocumentReference, DocumentSnapshot, + Query, + queryEqual, + refEqual, SnapshotOptions, } from 'firebase/firestore'; +import { RefHook, useComparatorRef } from '../../util'; export const snapshotToData = ( snapshot: DocumentSnapshot, @@ -28,3 +34,39 @@ export const snapshotToData = ( return data; }; + +const isRefEqual = < + T extends DocumentReference | CollectionReference +>( + v1: T | null | undefined, + v2: T | null | undefined +): boolean => { + const bothNull: boolean = !v1 && !v2; + const equal: boolean = !!v1 && !!v2 && refEqual(v1, v2); + return bothNull || equal; +}; + +export const useIsFirestoreRefEqual = < + T extends DocumentReference | CollectionReference +>( + value: T | null | undefined, + onChange?: () => void +): RefHook => { + return useComparatorRef(value, isRefEqual, onChange); +}; + +const isQueryEqual = >( + v1: T | null | undefined, + v2: T | null | undefined +): boolean => { + const bothNull: boolean = !v1 && !v2; + const equal: boolean = !!v1 && !!v2 && queryEqual(v1, v2); + return bothNull || equal; +}; + +export const useIsFirestoreQueryEqual = >( + value: T | null | undefined, + onChange?: () => void +): RefHook => { + return useComparatorRef(value, isQueryEqual, onChange); +}; diff --git a/firestore/useCollection.ts b/firestore/useCollection.ts index ad1c938..98810be 100644 --- a/firestore/useCollection.ts +++ b/firestore/useCollection.ts @@ -10,7 +10,7 @@ import { } from 'firebase/firestore'; import { useEffect, useMemo } from 'react'; import { useLoadingValue } from '../util'; -import { snapshotToData } from './helpers'; +import { snapshotToData, useIsFirestoreQueryEqual } from './helpers'; import { CollectionDataHook, CollectionHook, @@ -21,7 +21,6 @@ import { OnceOptions, Options, } from './types'; -import { useIsEqualFirestoreQuery } from './util'; export const useCollection = ( query?: Query | null, @@ -68,7 +67,7 @@ const useCollectionInternal = ( QuerySnapshot, FirestoreError >(); - const ref = useIsEqualFirestoreQuery>(query, reset); + const ref = useIsFirestoreQueryEqual>(query, reset); useEffect(() => { if (!ref.current) { @@ -90,7 +89,9 @@ const useCollectionInternal = ( listener(); }; } else { - const get = getDocsFnFromGetOptions(options ? options.getOptions : undefined); + const get = getDocsFnFromGetOptions( + options ? options.getOptions : undefined + ); get(ref.current).then(setValue).catch(setError); } }, [ref.current]); diff --git a/firestore/useDocument.ts b/firestore/useDocument.ts index fcbd935..a9a3551 100644 --- a/firestore/useDocument.ts +++ b/firestore/useDocument.ts @@ -10,7 +10,7 @@ import { } from 'firebase/firestore'; import { useEffect, useMemo } from 'react'; import { useLoadingValue } from '../util'; -import { snapshotToData } from './helpers'; +import { snapshotToData, useIsFirestoreRefEqual } from './helpers'; import { Data, DataOptions, @@ -21,8 +21,6 @@ import { OnceOptions, Options, } from './types'; -import { useIsEqualFirestoreRef } from './util'; - export const useDocument = ( docRef?: DocumentReference | null, options?: Options @@ -68,7 +66,7 @@ const useDocumentInternal = ( DocumentSnapshot, FirestoreError >(); - const ref = useIsEqualFirestoreRef>(docRef, reset); + const ref = useIsFirestoreRefEqual>(docRef, reset); useEffect(() => { if (!ref.current) { diff --git a/firestore/util.ts b/firestore/util.ts deleted file mode 100644 index f89e7f4..0000000 --- a/firestore/util.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { - CollectionReference, - DocumentReference, - Query, - queryEqual, - refEqual, -} from 'firebase/firestore'; -import { RefHook, useComparatorRef } from '../util'; - -const isRefEqual = < - T extends DocumentReference | CollectionReference ->( - v1: T | null | undefined, - v2: T | null | undefined -): boolean => { - const bothNull: boolean = !v1 && !v2; - const equal: boolean = !!v1 && !!v2 && refEqual(v1, v2); - return bothNull || equal; -}; - -export const useIsEqualFirestoreRef = < - T extends DocumentReference | CollectionReference ->( - value: T | null | undefined, - onChange?: () => void -): RefHook => { - return useComparatorRef(value, isRefEqual, onChange); -}; - -const isQueryEqual = >( - v1: T | null | undefined, - v2: T | null | undefined -): boolean => { - const bothNull: boolean = !v1 && !v2; - const equal: boolean = !!v1 && !!v2 && queryEqual(v1, v2); - return bothNull || equal; -}; - -export const useIsEqualFirestoreQuery = >( - value: T | null | undefined, - onChange?: () => void -): RefHook => { - return useComparatorRef(value, isQueryEqual, onChange); -};