feat(web): route DM creation to home instance with federated identity

All DM creation and add-member call sites now use the home api client
and pass homeUserId/homeInstance instead of routing to the remote instance.
Also updates addMember in the API client to accept AddDmMemberRequest.
This commit is contained in:
Jannis Braun
2026-04-01 12:45:13 +02:00
parent 4d7a777ae4
commit 7f3ca4e6d1
7 changed files with 49 additions and 33 deletions
@@ -114,7 +114,11 @@ export function AddDmMemberModal() {
} else {
// Existing group DM → add each friend sequentially
for (const friend of selectedFriends) {
await api.dm.addMember(dmChannelId, { userId: friend.id });
await api.dm.addMember(dmChannelId, {
userId: friend.homeInstance ? undefined : friend.id,
homeUserId: friend.homeUserId ?? undefined,
homeInstance: friend.homeInstance ?? undefined,
});
}
closeModal();
}
@@ -3,7 +3,7 @@ import { useNavigate } from 'react-router-dom';
import { Modal } from '../ui/Modal';
import { Avatar } from '../ui/Avatar';
import { useUIStore } from '../../stores/uiStore';
import { useSpaceStore, getApiForOrigin, resolveUserOrigin } from '../../stores/spaceStore';
import { useSpaceStore } from '../../stores/spaceStore';
import { api } from '../../api/client';
import type { User } from '@backspace/shared';
import { parseFederatedUsername } from '../../utils/identity';
@@ -67,10 +67,12 @@ export function NewDmModal() {
navigate(`/channels/@me/${existing.dm.id}`);
return;
}
const origin = resolveUserOrigin(user);
const dmApi = getApiForOrigin(origin);
const channel = await dmApi.dm.create({ userId: user.id });
addDmChannel(channel, origin);
const channel = await api.dm.create({
userId: user.homeInstance ? undefined : user.id,
homeUserId: user.homeUserId ?? undefined,
homeInstance: user.homeInstance ?? undefined,
});
addDmChannel(channel);
closeModal();
useUIStore.getState().setShowDms(true);
navigate(`/channels/@me/${channel.id}`);
@@ -6,6 +6,7 @@ import { Avatar } from '../ui/Avatar';
import { Username } from '../ui/Username';
import { useUIStore } from '../../stores/uiStore';
import { useSpaceStore, getApiForOrigin, resolveUserOrigin } from '../../stores/spaceStore';
import { api } from '../../api/client';
import { useSocialStore, type TaggedFriend, type TaggedFriendRequest, InstanceNotConnectedError, InstanceDisconnectedError } from '../../stores/socialStore';
import { ConnectInstanceModal } from './ConnectInstanceModal';
import { useAuthStore } from '../../stores/authStore';
@@ -170,9 +171,12 @@ export function UserProfileModal() {
navigate(`/channels/@me/${existing.dm.id}`);
return;
}
const dmApi = getApiForOrigin(userOrigin);
const channel = await dmApi.dm.create({ userId: user.id });
addDmChannel(channel, userOrigin);
const channel = await api.dm.create({
userId: user.homeInstance ? undefined : user.id,
homeUserId: user.homeUserId ?? undefined,
homeInstance: user.homeInstance ?? undefined,
});
addDmChannel(channel);
useUIStore.getState().setShowDms(true);
closeModal();
navigate(`/channels/@me/${channel.id}`);