From 04c665e0f75ea0986a2887f46eba52f5474a2a85 Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Fri, 27 Mar 2026 05:50:38 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20three=20code=20review=20issues=20?= =?UTF-8?q?=E2=80=94=20leaveGroup=20duplicate,=20as=20any=20casts,=20feder?= =?UTF-8?q?ation=20ownership=20fallback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove redundant `leaveGroup` API method from client.ts (duplicated `leave`); update MessageList.tsx WelcomeHeader to call `api.dm.leave` directly - Add optional `type` field to shared `Message` interface so `MessageWithUser` carries it; remove `(msg as any).type` casts in `isSameGroup` and the render branch in MessageList.tsx - Fix `processOwnershipTransferEvent` in federation.ts: replace `channel.ownerId` fallbacks (pre-update, old owner) with `event.ownership.newOwner.homeUserId` in the db update, dm_owner_updated broadcast, and both system message content payloads --- packages/server/src/routes/federation.ts | 8 ++++---- packages/shared/src/types.ts | 1 + packages/web/src/api/client.ts | 3 --- packages/web/src/components/chat/MessageList.tsx | 6 +++--- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/server/src/routes/federation.ts b/packages/server/src/routes/federation.ts index 97bfa5bd..78d14605 100644 --- a/packages/server/src/routes/federation.ts +++ b/packages/server/src/routes/federation.ts @@ -1965,7 +1965,7 @@ function processOwnershipTransferEvent( db.update(schema.dmChannels) .set({ - ownerId: newOwnerLocal?.id ?? channel.ownerId, + ownerId: newOwnerLocal?.id ?? null, ownerHomeUserId: event.ownership.newOwner.homeUserId, ownerHomeInstance: event.ownership.newOwner.homeInstance, }) @@ -1975,7 +1975,7 @@ function processOwnershipTransferEvent( connectionManager.sendToDmMembers(channel.id, { type: 'dm_owner_updated', dmChannelId: channel.id, - newOwnerId: newOwnerLocal?.id ?? channel.ownerId!, + newOwnerId: newOwnerLocal?.id ?? event.ownership.newOwner.homeUserId, }); const prevOwnerLocal = event.ownership.previousOwner @@ -1991,7 +1991,7 @@ function processOwnershipTransferEvent( userId: prevOwnerId, content: JSON.stringify({ event: 'owner_changed', - newOwnerId: newOwnerLocal?.id ?? channel.ownerId, + newOwnerId: newOwnerLocal?.id ?? event.ownership.newOwner.homeUserId, newOwnerDisplayName: newOwnerLocal?.displayName ?? newOwnerBaseName, }), type: 'system', @@ -2006,7 +2006,7 @@ function processOwnershipTransferEvent( userId: prevOwnerId, content: JSON.stringify({ event: 'owner_changed', - newOwnerId: newOwnerLocal?.id ?? channel.ownerId, + newOwnerId: newOwnerLocal?.id ?? event.ownership.newOwner.homeUserId, newOwnerDisplayName: newOwnerLocal?.displayName ?? newOwnerBaseName, }), type: 'system', diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 9f5bba94..db8d9c9f 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -193,6 +193,7 @@ export interface Message { userId: string; replyToId: string | null; content: string | null; + type?: 'user' | 'system'; editedAt: number | null; createdAt: number; } diff --git a/packages/web/src/api/client.ts b/packages/web/src/api/client.ts index 3320a798..dd585dfe 100644 --- a/packages/web/src/api/client.ts +++ b/packages/web/src/api/client.ts @@ -145,7 +145,6 @@ export class BackspaceApiClient { deleteMessage: (id: string) => Promise<{ success: boolean }>; addMember: (dmChannelId: string, data: { userId: string }) => Promise; leave: (dmChannelId: string) => Promise<{ success: boolean }>; - leaveGroup: (dmChannelId: string) => Promise<{ success: boolean }>; }; readonly social: { @@ -506,8 +505,6 @@ export class BackspaceApiClient { request('POST', `/dm/${dmChannelId}/members`, data), leave: (dmChannelId: string) => request<{ success: boolean }>('DELETE', `/dm/${dmChannelId}/members`), - leaveGroup: (dmChannelId: string) => - request<{ success: boolean }>('DELETE', `/dm/${dmChannelId}/members`), }; this.social = { diff --git a/packages/web/src/components/chat/MessageList.tsx b/packages/web/src/components/chat/MessageList.tsx index d96c99fd..78cd43aa 100644 --- a/packages/web/src/components/chat/MessageList.tsx +++ b/packages/web/src/components/chat/MessageList.tsx @@ -21,7 +21,7 @@ interface MessageListProps { } function isSameGroup(prev: MessageWithUser, curr: MessageWithUser): boolean { - if ((prev as any).type === 'system' || (curr as any).type === 'system') return false; + if (prev.type === 'system' || curr.type === 'system') return false; if (prev.userId !== curr.userId) return false; const timeDiff = curr.createdAt - prev.createdAt; return timeDiff < 5 * 60 * 1000; // 5 minutes @@ -338,7 +338,7 @@ export function MessageList({ channelId, jumpToMessageId, onJumpComplete }: Mess
)} - {(msg as any).type === 'system' ? ( + {msg.type === 'system' ? ( ) : ( { try { - await api.dm.leaveGroup(channelId); + await api.dm.leave(channelId); navigate('/channels/@me'); } catch (err) { console.error('Failed to leave group:', err);