feat: real-time user profile updates and propagate avatarColor to all Avatar callsites

Broadcast user_updated events over WebSocket when profile fields change,
updating members, DM participants, friends, and cached messages in real time.
Widen useVoiceParticipantMeta to return the full user object and add a
standalone avatarColor prop to Avatar so all ~16 callsites now resolve
the user's chosen gradient color instead of falling back to hash-based colors.
This commit is contained in:
Jannis Braun
2026-03-11 01:12:12 +01:00
parent 9255683d8c
commit 3790386a5f
16 changed files with 131 additions and 12 deletions
+15
View File
@@ -60,6 +60,7 @@ interface SpaceState {
addSpace: (space: Space) => void;
removeSpace: (spaceId: string) => void;
updateMemberPresence: (userId: string, status: string) => void;
updateUserEverywhere: (user: User) => void;
addMember: (member: MemberWithUser) => void;
removeMember: (userId: string) => void;
populateFromReady: (origin: string, spaces: SpaceWithChannelsAndMembers[], folders?: SpaceFolder[], dmChannels?: DmChannel[]) => void;
@@ -304,6 +305,20 @@ export const useSpaceStore = create<SpaceState>((set, get) => ({
}));
},
updateUserEverywhere: (user: User) => {
set((state) => ({
members: state.members.map(m =>
m.userId === user.id ? { ...m, user: { ...m.user, ...user } } : m
),
dmChannels: state.dmChannels.map(dm => ({
...dm,
members: dm.members.map(m =>
m.id === user.id ? { ...m, ...user } : m
),
})),
}));
},
addMember: (member: MemberWithUser) => {
set((state) => ({
members: [...state.members.filter(m => m.userId !== member.userId), member],