your personal website on atproto - mirror
blento.app
1import { getRecord, listRecords, parseUri } from '$lib/atproto';
2import type { CardDefinition } from '../../types';
3import StandardSiteDocumentListCard from './StandardSiteDocumentListCard.svelte';
4
5export const StandardSiteDocumentListCardDefinition = {
6 type: 'publicationList',
7 contentComponent: StandardSiteDocumentListCard,
8 createNew: (card) => {
9 card.w = 4;
10 card.mobileW = 8;
11 card.mobileH = 6;
12 },
13
14 loadData: async (items, { did }) => {
15 const records = await listRecords({ did, collection: 'site.standard.document' });
16
17 const publications: Record<string, string> = {};
18 for (const record of records) {
19 const site = record.value.site as string;
20
21 if (site.startsWith('at://')) {
22 if (!publications[site]) {
23 const siteParts = parseUri(site);
24
25 if (!siteParts) continue;
26
27 const publicationRecord = await getRecord({
28 did: siteParts.repo as `did:${string}:${string}`,
29 collection: siteParts.collection!,
30 rkey: siteParts.rkey
31 });
32
33 if (!publicationRecord.value) continue;
34
35 publications[site] = publicationRecord.value.url as string;
36 }
37
38 record.value.href = publications[site] + record.value.path;
39 } else {
40 record.value.href = site + record.value.path;
41 }
42 }
43
44 return records.filter((r) => r.value?.href);
45 },
46
47 name: 'Blog Posts',
48
49 keywords: ['articles', 'writing', 'blog', 'posts', 'frontpage'],
50 groups: ['Content'],
51 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>`
52} as CardDefinition & { type: 'site.standard.document list' };