From 0d9ee44eee6b28a6e133a1a6809d5f4829d5ca73 Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Mon, 23 Mar 2026 19:27:39 +0100 Subject: [PATCH] feat: add federation badges to mobile surfaces Globe/amber badge on federated space icons, @domain on federated DM users, home instance on the You screen profile card. --- .../src/components/layout/MobileDmsScreen.tsx | 8 ++++++++ .../components/layout/MobileSpacesScreen.tsx | 19 +++++++++++++++++++ .../src/components/layout/MobileYouScreen.tsx | 6 ++++++ 3 files changed, 33 insertions(+) diff --git a/packages/web/src/components/layout/MobileDmsScreen.tsx b/packages/web/src/components/layout/MobileDmsScreen.tsx index cfc9dc19..5a3c8090 100644 --- a/packages/web/src/components/layout/MobileDmsScreen.tsx +++ b/packages/web/src/components/layout/MobileDmsScreen.tsx @@ -9,6 +9,7 @@ import { Avatar } from '../ui/Avatar'; import { Mascot } from '../ui/Mascot'; import { resolveAssetUrl } from '../../utils/assetUrls'; import { useNavigate } from 'react-router-dom'; +import { parseFederatedUsername } from '../../utils/identity'; export function MobileDmsScreen() { const pushMobileScreen = useUIStore((s) => s.pushMobileScreen); @@ -195,6 +196,13 @@ export function MobileDmsScreen() { )} + {(() => { + const mainUser = otherMembers[0]; + if (!mainUser) return null; + const { domain } = parseFederatedUsername(mainUser.username); + if (!domain) return null; + return
@{domain}
; + })()} {preview && (

{previewSender && previewSender.id !== authUser?.id diff --git a/packages/web/src/components/layout/MobileSpacesScreen.tsx b/packages/web/src/components/layout/MobileSpacesScreen.tsx index b6a0b34d..11c35121 100644 --- a/packages/web/src/components/layout/MobileSpacesScreen.tsx +++ b/packages/web/src/components/layout/MobileSpacesScreen.tsx @@ -13,6 +13,7 @@ import type { Channel } from '@backspace/shared'; import { Mascot } from '../ui/Mascot'; import { ConfirmDialog } from '../ui/ConfirmDialog'; import { TransferOwnershipModal } from '../modals/TransferOwnershipModal'; +import { useInstanceStore } from '../../stores/instanceStore'; export function MobileSpacesScreen() { const spaces = useSpaceStore((s) => s.spaces); @@ -466,6 +467,24 @@ export function MobileSpacesScreen() { )} + {(() => { + const origin = (space as TaggedSpace)._instanceOrigin; + if (!origin) return null; + const instances = useInstanceStore.getState().instances; + const inst = instances.find(i => i.origin === origin); + const isDisconnected = inst ? !inst.connected : false; + return ( +

+ {isDisconnected ? ( +
+ ) : ( + + + + )} +
+ ); + })()}
); })} diff --git a/packages/web/src/components/layout/MobileYouScreen.tsx b/packages/web/src/components/layout/MobileYouScreen.tsx index 5e8c18b4..aecfa4fe 100644 --- a/packages/web/src/components/layout/MobileYouScreen.tsx +++ b/packages/web/src/components/layout/MobileYouScreen.tsx @@ -3,6 +3,7 @@ import { useUIStore } from '../../stores/uiStore'; import { useAuthStore } from '../../stores/authStore'; import { Avatar } from '../ui/Avatar'; import { ConfirmDialog } from '../ui/ConfirmDialog'; +import { parseFederatedUsername } from '../../utils/identity'; export function MobileYouScreen() { const pushMobileScreen = useUIStore((s) => s.pushMobileScreen); @@ -99,6 +100,11 @@ export function MobileYouScreen() { {user.displayName ?? user.username}

@{user.username}

+ {(() => { + const { domain } = parseFederatedUsername(user.username); + if (!domain) return null; + return
Home instance: {domain}
; + })()} {user.customStatus && (

{user.customStatus}

)}