feeds.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import firebase from "firebase"
  2. import { BehaviorSubject } from "rxjs"
  3. import { currentUser$ } from "./auth"
  4. type HoppFeed = firebase.firestore.DocumentData & {
  5. id: string
  6. label: string
  7. message: string
  8. }
  9. /**
  10. * An observable subject which is defined as an array of feeds
  11. * the current user has.
  12. *
  13. * Note: If this is null, then it means the user is not signed in
  14. */
  15. export const currentFeeds$ = new BehaviorSubject<HoppFeed[] | null>(null)
  16. export function initFeeds() {
  17. let snapshotStop: (() => void) | null = null
  18. currentUser$.subscribe((user) => {
  19. if (!user && snapshotStop) {
  20. // User has logged out, clean up snapshot listeners
  21. snapshotStop()
  22. snapshotStop = null
  23. } else if (user) {
  24. snapshotStop = firebase
  25. .firestore()
  26. .collection("users")
  27. .doc(user.uid)
  28. .collection("feeds")
  29. .orderBy("createdOn", "desc")
  30. .onSnapshot((feedsRef) => {
  31. const feeds: HoppFeed[] = []
  32. feedsRef.forEach((doc) => {
  33. const feed = doc.data()
  34. feed.id = doc.id
  35. feeds.push(feed as HoppFeed)
  36. })
  37. currentFeeds$.next(feeds)
  38. })
  39. }
  40. })
  41. }
  42. export async function writeFeed(label: string, message: string) {
  43. if (currentUser$.value == null)
  44. throw new Error("Logged out user cannot write to feeds")
  45. const dt = {
  46. createdOn: new Date(),
  47. author: currentUser$.value.uid,
  48. author_name: currentUser$.value.displayName,
  49. author_image: currentUser$.value.photoURL,
  50. message,
  51. label,
  52. }
  53. try {
  54. await firebase
  55. .firestore()
  56. .collection("users")
  57. .doc(currentUser$.value.uid)
  58. .collection("feeds")
  59. .add(dt)
  60. } catch (e) {
  61. console.error("error inserting", dt, e)
  62. throw e
  63. }
  64. }
  65. export async function deleteFeed(id: string) {
  66. if (currentUser$.value == null)
  67. throw new Error("Logged out user cannot delete feed")
  68. try {
  69. await firebase
  70. .firestore()
  71. .collection("users")
  72. .doc(currentUser$.value.uid)
  73. .collection("feeds")
  74. .doc(id)
  75. .delete()
  76. } catch (e) {
  77. console.error("error deleting", id, e)
  78. throw e
  79. }
  80. }