import { collection, getDoc, getDocs, onSnapshot, Query, CollectionReference, DocumentReference, } from 'firebase/firestore' import { db } from './init' export const coll = (path: string, ...rest: string[]) => { return collection(db, path, ...rest) as CollectionReference } export const getValue = async (doc: DocumentReference) => { const snap = await getDoc(doc) return snap.exists() ? (snap.data() as T) : null } export const getValues = async (query: Query) => { const snap = await getDocs(query) return snap.docs.map((doc) => doc.data() as T) } export function listenForValue( docRef: DocumentReference, setValue: (value: T | null) => void ) { // Exclude cached snapshots so we only trigger on fresh data. // includeMetadataChanges ensures listener is called even when server data is the same as cached data. return onSnapshot(docRef, { includeMetadataChanges: true }, (snapshot) => { if (snapshot.metadata.fromCache) return const value = snapshot.exists() ? (snapshot.data() as T) : null setValue(value) }) } export function listenForValues( query: Query, setValues: (values: T[]) => void ) { // Exclude cached snapshots so we only trigger on fresh data. // includeMetadataChanges ensures listener is called even when server data is the same as cached data. return onSnapshot(query, { includeMetadataChanges: true }, (snapshot) => { if (snapshot.metadata.fromCache) return const values = snapshot.docs.map((doc) => doc.data() as T) setValues(values) }) }