import { component$ } from '@builder.io/qwik' import { DocumentHead, loader$ } from '@builder.io/qwik-city' import { getDatabase } from 'wildebeest/backend/src/database' import { getDomain } from 'wildebeest/backend/src/utils/getDomain' import { handleRequestGet as settingsHandleRequestGet } from 'wildebeest/functions/api/wb/settings/server/server' import { handleRequestGet as rulesHandleRequestGet } from 'wildebeest/functions/api/v1/instance/rules' import { Accordion } from '~/components/Accordion/Accordion' // import { AccountCard } from '~/components/AccountCard/AccountCard' import { HtmlContent } from '~/components/HtmlContent/HtmlContent' import { ServerSettingsData } from '~/routes/(admin)/settings/server-settings/layout' import { Account } from '~/types' import { getDocumentHead } from '~/utils/getDocumentHead' import { instanceLoader } from '../layout' import { getAdmins } from 'wildebeest/functions/api/wb/settings/server/admins' import { emailSymbol } from 'wildebeest/backend/src/activitypub/actors' import { loadLocalMastodonAccount } from 'wildebeest/backend/src/mastodon/account' import { AccountCard } from '~/components/AccountCard/AccountCard' import { getNotFoundHtml } from '~/utils/getNotFoundHtml/getNotFoundHtml' type AboutInfo = { image: string domain: string admin: { account: Account | null; email: string } rules: { id: number; text: string }[] extended_description: { content: string } } export const aboutInfoLoader = loader$>(async ({ resolveValue, request, platform, html }) => { throw html(404, getNotFoundHtml()) // TODO: fetching the instance for the thumbnail, but that should be part of the settings const instance = await resolveValue(instanceLoader) const database = await getDatabase(platform) const brandingDataResp = await settingsHandleRequestGet(database) let brandingData: ServerSettingsData | null try { brandingData = await brandingDataResp.json() } catch { brandingData = null } const rulesResp = await rulesHandleRequestGet(database) let rules: { id: number; text: string }[] = [] try { rules = await rulesResp.json() } catch { rules = [] } const admins = await getAdmins(database) let adminAccount: Account | null = null const adminPerson = admins.find((admin) => admin[emailSymbol] === platform.ADMIN_EMAIL) if (adminPerson) { try { adminAccount = (await loadLocalMastodonAccount(database, adminPerson)) as Account } catch { /* empty */ } } return { image: instance.thumbnail, domain: getDomain(request.url), admin: { account: JSON.parse(JSON.stringify(adminAccount)), email: platform.ADMIN_EMAIL }, rules: JSON.parse(JSON.stringify(rules.sort(({ id: idA }, { id: idB }) => idA - idB))), extended_description: { content: brandingData?.['extended description'] ?? '', }, } }) export default component$(() => { const aboutInfo = aboutInfoLoader().value return ( <>

{aboutInfo.domain}

Decentralised social media powered by{' '} Mastodon

{!!aboutInfo.admin.account && (
Administered by:
)}
Contact: {aboutInfo.admin.email}
    {aboutInfo.rules.map(({ id, text }) => (
  1. {id} {text}
  2. ))}
) }) export const head: DocumentHead = ({ resolveValue, head }) => { const instance = resolveValue(instanceLoader) return getDocumentHead( { title: `About - ${instance.title}`, description: `About page for the ${instance.title} Mastodon instance`, og: { type: 'website', image: instance.thumbnail, }, }, head ) }