your personal website on atproto - mirror blento.app

update statusphere card

+44 -25
+10 -4
src/lib/cards/media/StatusphereCard/EditStatusphereCard.svelte
··· 26 26 } 27 27 }); 28 28 29 - // Use card-specific emoji if set, otherwise fall back to PDS data 30 - let emoji = $derived(item.cardData?.emoji ?? record?.value?.status); 29 + let mode = $derived(item.cardData?.mode ?? 'emoji'); 30 + // Emoji mode: use cardData. Statusphere mode: use latest record or preview. 31 + let emoji = $derived( 32 + mode === 'statusphere' 33 + ? (item.cardData?.emoji ?? record?.value?.status) 34 + : item.cardData?.emoji 35 + ); 31 36 32 37 let showPopover = $state(false); 33 38 </script> ··· 36 41 <PopoverEmojiPicker 37 42 bind:open={showPopover} 38 43 onpicked={(picked) => { 39 - item.cardData.hasUpdate = true; 44 + if (mode === 'statusphere') { 45 + item.cardData.hasUpdate = true; 46 + } 40 47 item.cardData.emoji = picked.unicode; 41 - 42 48 showPopover = false; 43 49 }} 44 50 >
+21 -16
src/lib/cards/media/StatusphereCard/SettingsStatusphereCard.svelte
··· 1 1 <script lang="ts"> 2 - import type { Item } from '$lib/types'; 3 - import { getAdditionalUserData } from '$lib/website/context'; 4 - import { EmojiPicker } from '@foxui/social'; 2 + import type { SettingsComponentProps } from '../../types'; 5 3 6 - let { item }: { item: Item } = $props(); 4 + let { item = $bindable() }: SettingsComponentProps = $props(); 7 5 8 - const data = getAdditionalUserData(); 9 - // svelte-ignore state_referenced_locally 10 - let record = $state(data[item.cardType] as any); 6 + let mode: 'emoji' | 'statusphere' = $derived(item.cardData.mode ?? 'emoji'); 11 7 </script> 12 8 13 - <EmojiPicker 14 - onpicked={(emoji) => { 15 - record.value.status = emoji.unicode; 16 - data[item.cardType] = { value: { status: emoji.unicode } }; 17 - 18 - item.cardData.hasUpdate = true; 19 - item.cardData.emoji = emoji.unicode; 20 - }} 21 - /> 9 + <div class="flex gap-2"> 10 + <button 11 + class="rounded-full px-3 py-1 text-sm font-medium transition-colors {mode === 'emoji' 12 + ? 'bg-accent-500 text-white' 13 + : 'bg-base-200 dark:bg-base-700 text-base-700 dark:text-base-300'}" 14 + onclick={() => (item.cardData.mode = 'emoji')} 15 + > 16 + Emoji 17 + </button> 18 + <button 19 + class="rounded-full px-3 py-1 text-sm font-medium transition-colors {mode === 'statusphere' 20 + ? 'bg-accent-500 text-white' 21 + : 'bg-base-200 dark:bg-base-700 text-base-700 dark:text-base-300'}" 22 + onclick={() => (item.cardData.mode = 'statusphere')} 23 + > 24 + Statusphere 25 + </button> 26 + </div>
+5 -2
src/lib/cards/media/StatusphereCard/StatusphereCard.svelte
··· 9 9 // svelte-ignore state_referenced_locally 10 10 let record = $state(data[item.cardType] as any); 11 11 12 - // Use card-specific emoji if set, otherwise fall back to PDS data 13 - let emoji = $derived(item.cardData?.emoji ?? record?.value?.status); 12 + let mode = $derived(item.cardData?.mode ?? 'emoji'); 13 + // Emoji mode: use cardData. Statusphere mode: use latest record from PDS. 14 + let emoji = $derived( 15 + mode === 'statusphere' ? record?.value?.status : item.cardData?.emoji 16 + ); 14 17 let animated = $derived(emojiToNotoAnimatedWebp(emoji)); 15 18 </script> 16 19
+8 -3
src/lib/cards/media/StatusphereCard/index.ts
··· 5 5 import { listRecords, putRecord } from '$lib/atproto'; 6 6 import StatusphereCard from './StatusphereCard.svelte'; 7 7 import EditStatusphereCard from './EditStatusphereCard.svelte'; 8 + import SettingsStatusphereCard from './SettingsStatusphereCard.svelte'; 8 9 import icons from './icons.json'; 9 10 import * as TID from '@atcute/tid'; 10 11 ··· 12 13 type: 'statusphere', 13 14 contentComponent: StatusphereCard, 14 15 editingContentComponent: EditStatusphereCard, 16 + settingsComponent: SettingsStatusphereCard, 15 17 16 18 createNew: (item) => {}, 17 19 18 20 loadData: async (items, { did }) => { 21 + // Only fetch statusphere records if any card uses statusphere mode 22 + const needsStatusphere = items.some((i) => i.cardData.mode === 'statusphere'); 23 + if (!needsStatusphere) return undefined; 24 + 19 25 const data = await listRecords({ did, collection: 'xyz.statusphere.status', limit: 1 }); 20 - 21 26 return data[0]; 22 27 }, 23 28 upload: async (item) => { 24 - if (item.cardData.hasUpdate) { 29 + if (item.cardData.mode === 'statusphere' && item.cardData.hasUpdate) { 25 30 await putRecord({ 26 31 rkey: TID.now(), 27 32 collection: 'xyz.statusphere.status', ··· 31 36 } 32 37 }); 33 38 delete item.cardData.hasUpdate; 34 - // Keep item.cardData.emoji so each card can have its own status 39 + delete item.cardData.emoji; 35 40 } 36 41 37 42 return item;