import { useMemo } from 'react'; import { snapshotToData } from './helpers'; import type { CollectionDataHook, CollectionDataOnceHook, CollectionHook, CollectionOnceHook, Data, DataOptions, OnceDataOptions, OnceOptions, Options, } from './types'; import type { FirebaseFirestoreTypes } from '@react-native-firebase/firestore'; import { useInternalOnce } from './useInternalOnce'; import { useInternal } from './useInternal'; export const useCollection = ( query?: FirebaseFirestoreTypes.Query | null, options?: Options ) => useInternal>(query, options); export const useCollectionOnce = ( query?: FirebaseFirestoreTypes.Query | null, options?: Options & OnceOptions ) => useInternalOnce>(query, options); export const useCollectionData = < T = FirebaseFirestoreTypes.DocumentData, IDField extends string | undefined = undefined, RefField extends string | undefined = undefined >( query?: FirebaseFirestoreTypes.Query | null, options?: DataOptions ): CollectionDataHook => { const [snapshots, loading, error] = useCollection(query, options); const values = useGetValuesFromSnapshots(snapshots, options); return useMemo>( () => [values, loading, error], [values, loading, error] ); }; export const useCollectionDataOnce = < T = FirebaseFirestoreTypes.DocumentData, IDField extends string | undefined = undefined, RefField extends string | undefined = undefined >( query?: FirebaseFirestoreTypes.Query | null, options?: DataOptions & OnceDataOptions ) => { const [snapshots, loading, error] = useCollectionOnce(query, options); const values = useGetValuesFromSnapshots(snapshots, options); return useMemo>( () => [values, loading, error], [values, loading, error] ); }; const useGetValuesFromSnapshots = < T, IDField extends string | undefined = undefined, RefField extends string | undefined = undefined >( snapshots?: FirebaseFirestoreTypes.QuerySnapshot, options?: DataOptions & OnceDataOptions ) => { return useMemo( () => snapshots?.docs.map((doc) => snapshotToData( doc, options?.idField, options?.refField, options?.transform ) ) as Data[], [snapshots, options?.idField, options?.refField, options?.transform] ); };