import { $, component$ } from '@builder.io/qwik' import { getDatabase } from 'wildebeest/backend/src/database' import { MastodonStatus } from '~/types' import * as timelines from 'wildebeest/functions/api/v1/timelines/public' import { DocumentHead, loader$ } from '@builder.io/qwik-city' import StickyHeader from '~/components/StickyHeader/StickyHeader' import { getDocumentHead } from '~/utils/getDocumentHead' import { StatusesPanel } from '~/components/StatusesPanel/StatusesPanel' import { getErrorHtml } from '~/utils/getErrorHtml/getErrorHtml' export const statusesLoader = loader$, { DATABASE: D1Database; domain: string }>( async ({ platform, html }) => { try { // TODO: use the "trending" API endpoint here. const response = await timelines.handleRequest(platform.domain, await getDatabase(platform), { local: true }) const results = await response.text() // Manually parse the JSON to ensure that Qwik finds the resulting objects serializable. return JSON.parse(results) as MastodonStatus[] } catch (e: unknown) { const error = e as { stack: string; cause: string } console.warn(error.stack, error.cause) throw html(500, getErrorHtml('The local timeline is unavailable')) } } ) export default component$(() => { const statuses = statusesLoader().value return ( <>
Local timeline
{ let statuses: MastodonStatus[] = [] try { const response = await fetch(`/api/v1/timelines/public?local=true&offset=${numOfCurrentStatuses}`) if (response.ok) { const results = await response.text() statuses = JSON.parse(results) } } catch { /* empty */ } return statuses })} /> ) }) export const requestLoader = loader$(async ({ request }) => { // Manually parse the JSON to ensure that Qwik finds the resulting objects serializable. return JSON.parse(JSON.stringify(request)) as Request }) export const head: DocumentHead = ({ resolveValue }) => { const { url } = resolveValue(requestLoader) return getDocumentHead({ title: 'Local timeline - Wildebeest', og: { url, }, }) }