+ {:else}
+ {status.emoji}
+ {/if}
+ {#if status.text}
+ {status.text}
+ {/if} + {:else if loaded} + No active status + {:else} + Loading… + {/if} + bufo status + diff --git a/src/lib/cards/social/BufoStatusCard/index.ts b/src/lib/cards/social/BufoStatusCard/index.ts new file mode 100644 index 0000000..9315679 --- /dev/null +++ b/src/lib/cards/social/BufoStatusCard/index.ts @@ -0,0 +1,58 @@ +import type { CardDefinition } from '../../types'; +import { listRecords } from '$lib/atproto'; +import BufoStatusCard from './BufoStatusCard.svelte'; + +interface StatusRecord { + emoji: string; + text?: string; + expires?: string; + createdAt: string; +} + +export type BufoStatusData = { + emoji: string; + text?: string; + rkey: string; +} | null; + +export const BufoStatusCardDefinition = { + type: 'bufoStatus', + contentComponent: BufoStatusCard, + + createNew: (item) => { + item.w = 2; + item.h = 2; + item.mobileW = 4; + item.mobileH = 2; + }, + + loadData: async (_items, { did }) => { + const records = await listRecords({ + did, + collection: 'io.zzstoatzz.status.record', + limit: 10 + }); + + const now = Date.now(); + const active = records + .map((r) => { + const parts = r.uri.split('/'); + const rkey = parts[parts.length - 1] ?? ''; + const value = r.value as unknown as StatusRecord; + return { ...value, rkey }; + }) + .filter((r) => r.emoji && r.rkey && (!r.expires || new Date(r.expires).getTime() > now)) + .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()); + + return active[0] ?? null; + }, + cacheLoadData: { ttl: 300 }, + + minW: 2, + minH: 1, + + name: 'Bufo Status', + keywords: ['bufo', 'status', 'emoji', 'mood', 'zzstoatzz'], + groups: ['Social'], + icon: `` +} as CardDefinition & { type: 'bufoStatus' };