fullstrapp
Version:
Bootstrap a scalable full stack application with pre-configured: hosting, database, authentication, analytics, CI, CD, code templates, and issue templates.
49 lines (43 loc) • 1.05 kB
text/typescript
import { useEffect, useState } from 'react'
import FirestoreCollectionPath from '../../models/FirestoreCollectionPath'
import firestore from '../firestore'
export type FirestoreDocumentResult<T> = {
loading: boolean
data?: T
error?: Error
}
const useFirestoreDocument = <T extends {}>(
collectionPath: FirestoreCollectionPath,
documentId: string
) => {
const [result, setResult] = useState<FirestoreDocumentResult<T>>({
loading: true
})
useEffect(
() =>
firestore
.collection(collectionPath)
.doc(documentId)
.onSnapshot(
result => {
setResult({
loading: false,
data: {
id: result.id,
...(result.data() as T)
}
})
},
error => {
console.error(error)
setResult({
loading: false,
error
})
}
),
[collectionPath, documentId]
)
return result
}
export default useFirestoreDocument