feat: system messages, group DM welcome header, and dm_owner_updated event
- Render system messages (member_added, member_removed, owner_changed) inline in MessageList with icon + human-readable text; system messages never group with adjacent user messages - Rewrite WelcomeHeader to branch on ownerId: group DMs show overlapping avatars, group name, creator attribution, federated privacy note, and a Leave Group button - Add dm_owner_updated ServerEvent; broadcast from dm.ts leave handler and federation processOwnershipTransferEvent so all clients update ownerId in real-time - Add updateDmOwner action to spaceStore and handle dm_owner_updated in useWebSocket - Add leaveGroup alias to API client dm namespace
This commit is contained in:
@@ -53,6 +53,7 @@ interface SpaceState {
|
||||
removeDmChannel: (id: string) => void;
|
||||
addDmMember: (dmChannelId: string, user: User) => void;
|
||||
removeDmMember: (dmChannelId: string, userId: string) => void;
|
||||
updateDmOwner: (dmChannelId: string, newOwnerId: string) => void;
|
||||
closeDm: (id: string) => Promise<void>;
|
||||
leaveDm: (id: string) => Promise<void>;
|
||||
loadSpaces: () => Promise<void>;
|
||||
@@ -201,6 +202,12 @@ export const useSpaceStore = create<SpaceState>((set, get) => ({
|
||||
),
|
||||
})),
|
||||
|
||||
updateDmOwner: (dmChannelId, newOwnerId) => set((state) => ({
|
||||
dmChannels: state.dmChannels.map(dm =>
|
||||
dm.id === dmChannelId ? { ...dm, ownerId: newOwnerId } : dm
|
||||
),
|
||||
})),
|
||||
|
||||
closeDm: async (id) => {
|
||||
const origin = get().channelOriginMap.get(id) || '';
|
||||
const targetApi = getApiForOrigin(origin);
|
||||
|
||||
Reference in New Issue
Block a user