Files
hoppscotch/helpers/fb/feeds.ts
2021-06-14 00:11:57 -04:00

92 lines
2.1 KiB
TypeScript

import firebase from "firebase"
import { BehaviorSubject } from "rxjs"
import { currentUser$ } from "./auth"
type HoppFeed = firebase.firestore.DocumentData & {
id: string
label: string
message: string
}
/**
* An observable subject which is defined as an array of feeds
* the current user has.
*
* Note: If this is null, then it means the user is not signed in
*/
export const currentFeeds$ = new BehaviorSubject<HoppFeed[] | null>(null)
export function initFeeds() {
let snapshotStop: (() => void) | null = null
currentUser$.subscribe((user) => {
if (!user && snapshotStop) {
// User has logged out, clean up snapshot listeners
snapshotStop()
snapshotStop = null
} else if (user) {
snapshotStop = firebase
.firestore()
.collection("users")
.doc(user.uid)
.collection("feeds")
.orderBy("createdOn", "desc")
.onSnapshot((feedsRef) => {
const feeds: HoppFeed[] = []
feedsRef.forEach((doc) => {
const feed = doc.data()
feed.id = doc.id
feeds.push(feed as HoppFeed)
})
currentFeeds$.next(feeds)
})
}
})
}
export async function writeFeed(label: string, message: string) {
if (currentUser$.value == null)
throw new Error("Logged out user cannot write to feeds")
const dt = {
createdOn: new Date(),
author: currentUser$.value.uid,
author_name: currentUser$.value.displayName,
author_image: currentUser$.value.photoURL,
message,
label,
}
try {
await firebase
.firestore()
.collection("users")
.doc(currentUser$.value.uid)
.collection("feeds")
.add(dt)
} catch (e) {
console.error("error inserting", dt, e)
throw e
}
}
export async function deleteFeed(id: string) {
if (currentUser$.value == null)
throw new Error("Logged out user cannot delete feed")
try {
await firebase
.firestore()
.collection("users")
.doc(currentUser$.value.uid)
.collection("feeds")
.doc(id)
.delete()
} catch (e) {
console.error("error deleting", id, e)
throw e
}
}