import StandardSiteDocumentListCard from './StandardSiteDocumentListCard.svelte'; import { getRecord, listRecords, parseUri } from '$lib/atproto'; import { SiteStandardDocument } from '@atcute/standard-site'; import { isGenericUri } from '@atcute/lexicons/syntax'; import type { BlogItem } from './BlogEntry.svelte'; import type { CardDefinition } from '../../types'; import { is } from '@atcute/lexicons'; export const StandardSiteDocumentListCardDefinition = { type: 'publicationList', contentComponent: StandardSiteDocumentListCard, createNew: (card) => { card.w = 4; card.mobileW = 8; card.mobileH = 6; }, loadData: async (_, { did }) => { const records = await listRecords({ did, collection: 'site.standard.document' }); const items: BlogItem[] = []; const publications: Record = {}; for (const record of records) { if (!is(SiteStandardDocument.mainSchema, record.value)) continue; if (record.value.site.startsWith('at://')) { if (!publications[record.value.site]) { const siteParts = parseUri(record.value.site); if (!siteParts) continue; const publicationRecord = await getRecord({ did: siteParts.repo as `did:${string}:${string}`, collection: siteParts.collection!, rkey: siteParts.rkey }); if (!publicationRecord.value) continue; const { url } = publicationRecord.value; if (isGenericUri(url) && url.startsWith('http')) { publications[record.value.site] = url; } } record.value.site = publications[record.value.site]; if (!record.value.site) continue; } items.push({ href: `${record.value.site}${record.value.path}`, title: record.value.title, description: record.value.description, date: record.value.publishedAt }); } return items.toSorted((a, b) => Date.parse(b.date) - Date.parse(a.date)); }, name: 'Blog Posts', keywords: ['articles', 'writing', 'blog', 'posts', 'frontpage'], groups: ['Content'], icon: `` } as CardDefinition & { type: 'site.standard.document list' };