manifold/web/lib/firebase/posts.ts
James Grugett b21daa1248
Date docs on Manifold (#941)
* Date docs

* Create date doc

* Create and show a date market as well

* Move url to date-docs

* Date doc individual page

* Add share button

* Edit date docs

* Layout

* Add comments for create-post

* Add comments and back nav

* Fix urls

* Tweaks
2022-09-27 17:30:07 -05:00

67 lines
1.6 KiB
TypeScript

import {
deleteDoc,
doc,
getDocs,
query,
updateDoc,
where,
} from 'firebase/firestore'
import { DateDoc, Post } from 'common/post'
import { coll, getValue, getValues, listenForValue } from './utils'
import { getUserByUsername } from './users'
export const posts = coll<Post>('posts')
export function postPath(postSlug: string) {
return `/post/${postSlug}`
}
export function updatePost(post: Post, updates: Partial<Post>) {
return updateDoc(doc(posts, post.id), updates)
}
export function deletePost(post: Post) {
return deleteDoc(doc(posts, post.id))
}
export function getPost(postId: string) {
return getValue<Post>(doc(posts, postId))
}
export async function getPostBySlug(slug: string) {
const q = query(posts, where('slug', '==', slug))
const docs = (await getDocs(q)).docs
return docs.length === 0 ? null : docs[0].data()
}
export function listenForPost(
postId: string,
setPost: (post: Post | null) => void
) {
return listenForValue(doc(posts, postId), setPost)
}
export async function listPosts(postIds?: string[]) {
if (postIds === undefined) return []
return Promise.all(postIds.map(getPost))
}
export async function getDateDocs() {
const q = query(posts, where('type', '==', 'date-doc'))
return getValues<DateDoc>(q)
}
export async function getDateDoc(username: string) {
const user = await getUserByUsername(username)
if (!user) return null
const q = query(
posts,
where('type', '==', 'date-doc'),
where('creatorId', '==', user.id)
)
const docs = await getValues<DateDoc>(q)
const post = docs.length === 0 ? null : docs[0]
return { post, user }
}