import { useEffect } from 'react' import { useCollection, useDocument } from 'react-firebase-hooks/firestore' import { TypedDocumentRef, TypedQueryRef } from '../core' import { _web } from '../lib/firestore-types' import { useDocumentSnapData, useQuerySnapData } from './useSnapData' import { useRefChangeLimitExceeded } from './utils' export type UseTypedDocument = { data: V | undefined snap: _web.DocumentSnapshot | undefined loading: boolean error: Error | undefined } export const useTypedDocument = ( typedDoc: TypedDocumentRef | null | undefined, transformer?: (data: U, snap: _web.DocumentSnapshot) => V, options?: { snapshotListenOptions?: _web.SnapshotListenOptions }, ): UseTypedDocument => { const { exceeded } = useRefChangeLimitExceeded(typedDoc?.raw) const [snap, loading, error] = useDocument( exceeded() ? undefined : typedDoc?.raw, options, ) useEffect(() => { if (error) { console.error(error) } }, [error]) const data = useDocumentSnapData(snap, transformer) return { data, snap, loading, error } } export type UseTypedQuery = { data: V[] | undefined snap: _web.QuerySnapshot | undefined loading: boolean error: Error | undefined } export const useTypedQuery = ( typedQuery: TypedQueryRef | null | undefined, transformer?: (data: U, snap: _web.DocumentSnapshot) => V, options?: { snapshotListenOptions?: _web.SnapshotListenOptions }, ): UseTypedQuery => { const { exceeded } = useRefChangeLimitExceeded(typedQuery?.raw) const [snap, loading, error] = useCollection( exceeded() ? undefined : typedQuery?.raw, options, ) useEffect(() => { if (error) { console.error(error) } }, [error]) const data = useQuerySnapData(snap, transformer) return { data, snap, loading, error } }