manifold/web/lib/firebase/utils.ts
James Grugett 60f68b178d
Folds (#34)
* Fold type, fold page, query for fold contracts

* Tsconfig: target esnext, nounused locals: false

* Store tags in field on contract. Script to update contract tags

* Show tags on fold page

* Load all fold comments server-side to serve better feed

* Fix the annoying firebase already initialized error!

* Add links to /edit and /leaderboards for fold

* Page with list of folds

* UI for creating a fold

* Create a fold

* Edit fold page
2022-01-21 17:21:46 -06:00

42 lines
947 B
TypeScript

import { db } from './init'
import {
doc,
getDoc,
getDocs,
onSnapshot,
Query,
DocumentReference,
} from 'firebase/firestore'
export const getValue = async <T>(doc: DocumentReference) => {
const snap = await getDoc(doc)
return snap.exists() ? (snap.data() as T) : null
}
export const getValues = async <T>(query: Query) => {
const snap = await getDocs(query)
return snap.docs.map((doc) => doc.data() as T)
}
export function listenForValue<T>(
docRef: DocumentReference,
setValue: (value: T | null) => void
) {
return onSnapshot(docRef, (snapshot) => {
const value = snapshot.exists() ? (snapshot.data() as T) : null
setValue(value)
})
}
export function listenForValues<T>(
query: Query,
setValues: (values: T[]) => void
) {
return onSnapshot(query, (snapshot) => {
if (snapshot.metadata.fromCache) return
const values = snapshot.docs.map((doc) => doc.data() as T)
setValues(values)
})
}