import { html, render } from "/js/lib/lit-html.js"; import { resolveDidFromHandleOrDid } from "/js/atproto.js"; import { headerTemplate } from "/js/templates/header.template.js"; import { formatLargeNumber } from "/js/utils.js"; import { postFeedTemplate } from "/js/templates/postFeed.template.js"; import { pageEffect, bindPageTitle, onPageShow } from "/js/router.js"; import { tryAgainButtonTemplate } from "/js/templates/tryAgainButton.template.js"; export default async function postQuotesView({ root, params, context: { dataLayer, identityResolver, isAuthenticated, pluginService, interactionHandlers, }, }) { const { handleOrDid, rkey } = params; const authorDid = await resolveDidFromHandleOrDid( handleOrDid, identityResolver, ); const postUri = `at://${authorDid}/app.bsky.feed.post/${rkey}`; const { postInteractionHandler } = interactionHandlers; function quotesErrorTemplate({ error }) { console.error(error); return html`
Error loading quotes
${tryAgainButtonTemplate()}
`; } pageEffect(root, () => { const currentUser = dataLayer.derived.$currentUser.get(); const postQuotes = dataLayer.derived.$hydratedPostQuotes.get(postUri); const post = dataLayer.derived.$hydratedPosts.get(postUri); const postQuotesRequestStatus = dataLayer.requests.statusStore.$statuses.get("loadPostQuotes-" + postUri); const subtitle = post?.quoteCount ? `${formatLargeNumber(post.quoteCount)} ${ post.quoteCount === 1 ? "quote" : "quotes" }` : null; // Format as feed for postFeedTemplate const postQuotesFeed = postQuotes ? { feed: postQuotes.posts.map((quote) => ({ post: quote })), cursor: postQuotes.cursor, } : null; render( html`
${headerTemplate({ title: "Quotes", subtitle, })}
${postQuotesRequestStatus.error ? quotesErrorTemplate({ error: postQuotesRequestStatus.error, }) : postFeedTemplate({ feed: postQuotesFeed, currentUser, isAuthenticated, onLoadMore: loadQuotes, postInteractionHandler, emptyMessage: "No quotes yet.", pluginService, })}
`, root, ); }); bindPageTitle(root, () => "Quoted by"); async function loadQuotes({ reload = false } = {}) { const cursor = reload ? undefined : dataLayer.derived.$hydratedPostQuotes.get(postUri)?.cursor; await dataLayer.requests.loadPostQuotes(postUri, { cursor }); } function loadPageData() { dataLayer.requests.loadPostThread(postUri); loadQuotes({ reload: true }); } onPageShow(root, ({ action }) => { if (action === "restore") return; loadPageData(); }); }