diff --git a/src/lib/cards/index.ts b/src/lib/cards/index.ts index 1f915c5..e0c53f2 100644 --- a/src/lib/cards/index.ts +++ b/src/lib/cards/index.ts @@ -49,6 +49,7 @@ import { LastFMProfileCardDefinition } from './media/LastFMCard/LastFMProfileCar import { PlyrFMCardDefinition, PlyrFMCollectionCardDefinition } from './media/PlyrFMCard'; import { MarginCardDefinition } from './social/MarginCard'; import { SembleCollectionCardDefinition } from './social/SembleCollectionCard'; +import { GermDMCardDefinition } from './social/GermDMCard'; // import { Model3DCardDefinition } from './visual/Model3DCard'; export const AllCardDefinitions = [ @@ -103,7 +104,8 @@ export const AllCardDefinitions = [ PlyrFMCardDefinition, PlyrFMCollectionCardDefinition, MarginCardDefinition, - SembleCollectionCardDefinition + SembleCollectionCardDefinition, + GermDMCardDefinition ] as const; export const CardDefinitionsByType = AllCardDefinitions.reduce( diff --git a/src/lib/cards/social/GermDMCard/GermDMCard.svelte b/src/lib/cards/social/GermDMCard/GermDMCard.svelte new file mode 100644 index 0000000..a380726 --- /dev/null +++ b/src/lib/cards/social/GermDMCard/GermDMCard.svelte @@ -0,0 +1,73 @@ + + +{#if germData && dmUrl} +
+
+ {@html platformsData.germ.svg} +
+
+ + {#if !isEditing} + +
+ Message me on Germ +
+ {/if} +{:else if isLoaded} +
+ Germ DM not available +
+{:else} +
+ Loading... +
+{/if} diff --git a/src/lib/cards/social/GermDMCard/index.ts b/src/lib/cards/social/GermDMCard/index.ts new file mode 100644 index 0000000..78add01 --- /dev/null +++ b/src/lib/cards/social/GermDMCard/index.ts @@ -0,0 +1,42 @@ +import { getRecord } from '$lib/atproto'; +import type { CardDefinition } from '../../types'; +import { platformsData } from '../BigSocialCard'; +import GermDMCard from './GermDMCard.svelte'; + +const germ = platformsData.germ; + +export const GermDMCardDefinition = { + type: 'germDM', + contentComponent: GermDMCard, + createNew: (card) => { + card.w = 2; + card.h = 2; + card.mobileW = 4; + card.mobileH = 4; + card.cardData.label = 'Message me'; + }, + loadData: async (_items, { did }) => { + try { + const record = await getRecord({ + did, + collection: 'com.germnetwork.declaration', + rkey: 'self' + }); + const value = record?.value; + if (!value?.messageMe) return null; + return { + messageMeUrl: value.messageMe.messageMeUrl, + showButtonTo: value.messageMe.showButtonTo + }; + } catch { + return null; + } + }, + defaultColor: 'transparent', + allowSetColor: false, + canHaveLabel: true, + name: 'DM on Germ', + keywords: ['germ', 'dm', 'message', 'chat', 'encrypted'], + groups: ['Social'], + icon: `${germ.svg.replace(/]*>/, '').replace(/<\/svg>/, '')}` +} as CardDefinition & { type: 'germDM' }; diff --git a/src/lib/website/Context.svelte b/src/lib/website/Context.svelte index 4150144..7ea3281 100644 --- a/src/lib/website/Context.svelte +++ b/src/lib/website/Context.svelte @@ -20,7 +20,9 @@ setAdditionalUserData(data.additionalData); setCanEdit( - () => (dev && isEditing === true) || (user.isLoggedIn && user.profile?.did === data.did && isEditing === true) + () => + (dev && isEditing === true) || + (user.isLoggedIn && user.profile?.did === data.did && isEditing === true) ); // svelte-ignore state_referenced_locally -- 2.51.2 From d1a65400426b9a807dc769387589a6f2f75da8fa Mon Sep 17 00:00:00 2001 From: Florian <45694132+flo-bit@users.noreply.github.com> Date: Wed, 18 Feb 2026 00:50:58 +0100 Subject: [PATCH 2/2] only show germ if collection present --- src/lib/cards/media/TealFMPlaysCard/index.ts | 1 + src/lib/cards/social/GermDMCard/index.ts | 5 +- src/lib/cards/types.ts | 2 + .../card-command/CardCommand.svelte | 58 +++++++++++++------ src/routes/(auth)/oauth/callback/+page.svelte | 11 +++- 5 files changed, 55 insertions(+), 22 deletions(-) diff --git a/src/lib/cards/media/TealFMPlaysCard/index.ts b/src/lib/cards/media/TealFMPlaysCard/index.ts index 60c68fc..391cc85 100644 --- a/src/lib/cards/media/TealFMPlaysCard/index.ts +++ b/src/lib/cards/media/TealFMPlaysCard/index.ts @@ -22,6 +22,7 @@ export const TealFMPlaysCardDefinition = { }, minW: 4, canHaveLabel: true, + canAdd: ({ collections }) => collections.includes('fm.teal.alpha.feed.play'), keywords: ['music', 'scrobble', 'listening', 'songs'], name: 'Teal.fm Plays', diff --git a/src/lib/cards/social/GermDMCard/index.ts b/src/lib/cards/social/GermDMCard/index.ts index 78add01..6068a41 100644 --- a/src/lib/cards/social/GermDMCard/index.ts +++ b/src/lib/cards/social/GermDMCard/index.ts @@ -32,11 +32,14 @@ export const GermDMCardDefinition = { return null; } }, + canAdd: ({ collections }) => collections.includes('com.germnetwork.declaration'), defaultColor: 'transparent', allowSetColor: false, canHaveLabel: true, name: 'DM on Germ', keywords: ['germ', 'dm', 'message', 'chat', 'encrypted'], groups: ['Social'], - icon: `${germ.svg.replace(/]*>/, '').replace(/<\/svg>/, '')}` + icon: ` + +` } as CardDefinition & { type: 'germDM' }; diff --git a/src/lib/cards/types.ts b/src/lib/cards/types.ts index e4084de..75a94b4 100644 --- a/src/lib/cards/types.ts +++ b/src/lib/cards/types.ts @@ -73,6 +73,8 @@ export type CardDefinition = { canResize?: boolean; + canAdd?: (context: { collections: string[] }) => boolean; + onUrlHandler?: (url: string, item: Item) => Item | null; urlHandlerPriority?: number; diff --git a/src/lib/components/card-command/CardCommand.svelte b/src/lib/components/card-command/CardCommand.svelte index ec2b24d..1ba0e5f 100644 --- a/src/lib/components/card-command/CardCommand.svelte +++ b/src/lib/components/card-command/CardCommand.svelte @@ -3,19 +3,7 @@ import type { CardDefinition } from '$lib/cards/types'; import { Command, Dialog } from 'bits-ui'; import { isTyping } from '$lib/helper'; - - const CardDefGroups = [ - 'Core', - ...Array.from( - new Set( - AllCardDefinitions.map((cardDef) => cardDef.groups) - .flat() - .filter((g) => g) - ) - ) - .sort() - .filter((g) => g !== 'Core') - ]; + import { describeRepo, user } from '$lib/atproto'; let { open = $bindable(false), @@ -27,6 +15,39 @@ onlink?: (url: string, cardDef: CardDefinition) => void; } = $props(); + let collections = $state([]); + let fetchedForDid = $state(undefined); + + $effect(() => { + if (open && user.did && fetchedForDid !== user.did) { + const did = user.did; + describeRepo({ did }).then((result) => { + if (result?.collections) { + collections = result.collections; + } + fetchedForDid = did; + }); + } + }); + + let filteredCardDefs = $derived( + AllCardDefinitions.filter((d) => !d.canAdd || d.canAdd({ collections })) + ); + + let cardDefGroups = $derived([ + 'Core', + ...Array.from( + new Set( + filteredCardDefs + .map((cardDef) => cardDef.groups) + .flat() + .filter((g) => g) + ) + ) + .sort() + .filter((g) => g !== 'Core') + ]); + let searchValue = $state(''); let normalizedUrl = $derived.by(() => { @@ -44,7 +65,8 @@ let urlMatchingCards = $derived.by(() => { if (!normalizedUrl) return []; - return AllCardDefinitions.filter((d) => d.onUrlHandler) + return filteredCardDefs + .filter((d) => d.onUrlHandler) .filter((d) => { try { const testItem = { cardData: {} }; @@ -150,8 +172,8 @@ {/if} - {#each CardDefGroups as group, index (group)} - {#if group && AllCardDefinitions.some((cardDef) => cardDef.groups?.includes(group))} + {#each cardDefGroups as group, index (group)} + {#if group && filteredCardDefs.some((cardDef) => cardDef.groups?.includes(group))} - {#each AllCardDefinitions.filter( (cardDef) => cardDef.groups?.includes(group) ) as cardDef (cardDef.type)} + {#each filteredCardDefs.filter( (cardDef) => cardDef.groups?.includes(group) ) as cardDef (cardDef.type)} { open = false; @@ -179,7 +201,7 @@ {/each} - {#if index < CardDefGroups.length - 1} + {#if index < cardDefGroups.length - 1} {/if} {/if} diff --git a/src/routes/(auth)/oauth/callback/+page.svelte b/src/routes/(auth)/oauth/callback/+page.svelte index 99b8899..59d5b4c 100644 --- a/src/routes/(auth)/oauth/callback/+page.svelte +++ b/src/routes/(auth)/oauth/callback/+page.svelte @@ -13,10 +13,15 @@ if (user.profile) { if (hasRedirected) return; - const redirect = localStorage.getItem('login-redirect'); + let redirect = localStorage.getItem('login-redirect'); localStorage.removeItem('login-redirect'); - console.log('redirect', redirect); - goto(redirect || '/' + getHandleOrDid(user.profile) + '/edit', {}); + + const editPath = '/' + getHandleOrDid(user.profile) + '/edit'; + if (!redirect || redirect === '/' || redirect === 'https://blento.app' || redirect === 'https://blento.app/') { + redirect = editPath; + } + + goto(redirect, {}); hasRedirected = true; }