your personal website on atproto - mirror blento.app
at small-improvements 66 lines 2.6 kB view raw
1import StandardSiteDocumentListCard from './StandardSiteDocumentListCard.svelte'; 2import { getRecord, listRecords, parseUri } from '$lib/atproto'; 3import { SiteStandardDocument } from '@atcute/standard-site'; 4import { isGenericUri } from '@atcute/lexicons/syntax'; 5import type { BlogItem } from './BlogEntry.svelte'; 6import type { CardDefinition } from '../../types'; 7import { is } from '@atcute/lexicons'; 8 9export const StandardSiteDocumentListCardDefinition = { 10 type: 'publicationList', 11 contentComponent: StandardSiteDocumentListCard, 12 createNew: (card) => { 13 card.w = 4; 14 card.mobileW = 8; 15 card.mobileH = 6; 16 }, 17 18 loadData: async (_, { did }) => { 19 const records = await listRecords({ did, collection: 'site.standard.document' }); 20 const items: BlogItem[] = []; 21 22 const publications: Record<string, SiteStandardDocument.Main['site']> = {}; 23 for (const record of records) { 24 if (!is(SiteStandardDocument.mainSchema, record.value)) continue; 25 26 if (record.value.site.startsWith('at://')) { 27 if (!publications[record.value.site]) { 28 const siteParts = parseUri(record.value.site); 29 30 if (!siteParts) continue; 31 32 const publicationRecord = await getRecord({ 33 did: siteParts.repo as `did:${string}:${string}`, 34 collection: siteParts.collection!, 35 rkey: siteParts.rkey 36 }); 37 38 if (!publicationRecord.value) continue; 39 const { url } = publicationRecord.value; 40 41 if (isGenericUri(url) && url.startsWith('http')) { 42 publications[record.value.site] = url; 43 } 44 } 45 46 record.value.site = publications[record.value.site]; 47 if (!record.value.site) continue; 48 } 49 50 items.push({ 51 href: `${record.value.site}${record.value.path}`, 52 title: record.value.title, 53 description: record.value.description, 54 date: record.value.publishedAt 55 }); 56 } 57 58 return items.toSorted((a, b) => Date.parse(b.date) - Date.parse(a.date)); 59 }, 60 61 name: 'Blog Posts', 62 63 keywords: ['articles', 'writing', 'blog', 'posts', 'frontpage'], 64 groups: ['Content'], 65 icon: `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="size-4"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z" /></svg>` 66} as CardDefinition & { type: 'site.standard.document list' };