Skip to content

Commit a840226

Browse files
fix: [REACT-353] unify pinned_at & archived_at nullish values (#1516)
## Description of the changes, What, Why and How? Event handler for `member.updated` receives a `member` object which contains `archived_at` and `pinned_at` with `null` values if unarchive/unpin actions are called - to make matters for our integrators easier, the only nullish value for these would be `undefined`. I'll keep the types unchanged (#1515) as the `ChannelMemberResponse` used in the `Event` type is still correct.
1 parent e4f7e68 commit a840226

File tree

2 files changed

+69
-8
lines changed

2 files changed

+69
-8
lines changed

src/channel.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1618,22 +1618,36 @@ export class Channel<StreamChatGenerics extends ExtendableGenerics = DefaultGene
16181618
}
16191619
break;
16201620
case 'member.added':
1621-
case 'member.updated':
1622-
if (event.member?.user) {
1621+
case 'member.updated': {
1622+
const memberCopy: ChannelMemberResponse = {
1623+
...event.member,
1624+
};
1625+
1626+
if (memberCopy.pinned_at === null) {
1627+
delete memberCopy.pinned_at;
1628+
}
1629+
1630+
if (memberCopy.archived_at === null) {
1631+
delete memberCopy.archived_at;
1632+
}
1633+
1634+
if (memberCopy?.user) {
16231635
channelState.members = {
16241636
...channelState.members,
1625-
[event.member.user.id]: event.member,
1637+
[memberCopy.user.id]: memberCopy,
16261638
};
16271639
}
16281640

1641+
const currentUserId = this.getClient().userID;
16291642
if (
1630-
typeof channelState.membership.user?.id === 'string' &&
1631-
typeof event.member?.user?.id === 'string' &&
1632-
event.member.user.id === channelState.membership.user.id
1643+
typeof currentUserId === 'string' &&
1644+
typeof memberCopy?.user?.id === 'string' &&
1645+
memberCopy.user.id === currentUserId
16331646
) {
1634-
channelState.membership = event.member;
1647+
channelState.membership = memberCopy;
16351648
}
16361649
break;
1650+
}
16371651
case 'member.removed':
16381652
if (event.user?.id) {
16391653
const newMembers = {

test/unit/channel.js

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import chai from 'chai';
1+
import chai, { use } from 'chai';
22
import { v4 as uuidv4 } from 'uuid';
33

44
import { generateChannel } from './test-utils/generateChannel';
@@ -208,6 +208,53 @@ describe('Channel _handleChannelEvent', function () {
208208
channel.initialized = true;
209209
});
210210

211+
it('member.updated/member.added are being handled properly (ChannelState.membership & ChannelState.members)', () => {
212+
expect(channel.state.members).to.be.empty;
213+
expect(channel.state.membership).to.be.empty;
214+
215+
const currentMember = generateMember({
216+
user,
217+
pinned_at: new Date().toISOString(),
218+
archived_at: new Date().toISOString(),
219+
});
220+
221+
const otherMember = generateMember({
222+
user: { id: 'user-other' },
223+
});
224+
225+
channel._handleChannelEvent({
226+
type: 'member.added',
227+
user,
228+
member: currentMember,
229+
});
230+
231+
expect(channel.state.members).to.have.property(user.id);
232+
expect(channel.state.members[user.id]).to.deep.equal(currentMember);
233+
expect(channel.state.membership).to.deep.equal(currentMember);
234+
235+
channel._handleChannelEvent({
236+
type: 'member.added',
237+
user,
238+
member: otherMember,
239+
});
240+
241+
expect(channel.state.members).to.have.keys([user.id, otherMember.user.id]);
242+
expect(channel.state.members[otherMember.user.id]).to.deep.equal(otherMember);
243+
expect(channel.state.members[user.id]).to.deep.equal(currentMember);
244+
expect(channel.state.membership).to.deep.equal(currentMember);
245+
246+
const currentMemberUpdated = generateMember({ user, pinned_at: null, archived_at: null });
247+
248+
channel._handleChannelEvent({
249+
type: 'member.updated',
250+
user,
251+
member: currentMemberUpdated,
252+
});
253+
254+
expect(channel.state.membership).to.not.have.keys(['pinned_at', 'archived_at']);
255+
expect(channel.state.membership).to.equal(channel.state.members[user.id]);
256+
});
257+
211258
it('message.new does not reset the unreadCount for current user messages', function () {
212259
channel.state.unreadCount = 100;
213260
channel._handleChannelEvent({

0 commit comments

Comments
 (0)