Skip to content

Commit 3e517e4

Browse files
authored
feat(llc): add hideHistoryBefore to addMembers (#2459)
1 parent ba177ae commit 3e517e4

File tree

7 files changed

+189
-2
lines changed

7 files changed

+189
-2
lines changed

packages/stream_chat/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
## Upcoming
2+
3+
✅ Added
4+
5+
- Added support for `hideHistoryBefore` in `Channel.addMembers` and `Client.addChannelMembers` to
6+
specify a timestamp before which channel history should be hidden for newly added members. When
7+
provided, it takes precedence over the `hideHistory` boolean flag.
8+
19
## 9.21.0
210

311
🐞 Fixed

packages/stream_chat/lib/src/client/channel.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1575,6 +1575,7 @@ class Channel {
15751575
List<String> memberIds, {
15761576
Message? message,
15771577
bool hideHistory = false,
1578+
DateTime? hideHistoryBefore,
15781579
}) async {
15791580
_checkInitialized();
15801581
return _client.addChannelMembers(
@@ -1583,6 +1584,7 @@ class Channel {
15831584
memberIds,
15841585
message: message,
15851586
hideHistory: hideHistory,
1587+
hideHistoryBefore: hideHistoryBefore,
15861588
);
15871589
}
15881590

packages/stream_chat/lib/src/client/client.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1266,13 +1266,15 @@ class StreamChatClient {
12661266
List<String> memberIds, {
12671267
Message? message,
12681268
bool hideHistory = false,
1269+
DateTime? hideHistoryBefore,
12691270
}) =>
12701271
_chatApi.channel.addMembers(
12711272
channelId,
12721273
channelType,
12731274
memberIds,
12741275
message: message,
12751276
hideHistory: hideHistory,
1277+
hideHistoryBefore: hideHistoryBefore,
12761278
);
12771279

12781280
/// Remove members from the channel

packages/stream_chat/lib/src/core/api/channel_api.dart

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,13 +209,18 @@ class ChannelApi {
209209
List<String> memberIds, {
210210
Message? message,
211211
bool hideHistory = false,
212+
DateTime? hideHistoryBefore,
212213
}) async {
213214
final response = await _client.post(
214215
_getChannelUrl(channelId, channelType),
215216
data: {
216217
'add_members': memberIds,
217-
'message': message,
218-
'hide_history': hideHistory,
218+
if (message != null) 'message': message,
219+
// [hideHistoryBefore] takes precedence over [hideHistory]
220+
...switch (hideHistoryBefore?.toUtc().toIso8601String()) {
221+
final hideBefore? => {'hide_history_before': hideBefore},
222+
_ => {'hide_history': hideHistory},
223+
},
219224
},
220225
);
221226
return AddMembersResponse.fromJson(response.data);

packages/stream_chat/test/src/client/channel_test.dart

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2686,6 +2686,53 @@ void main() {
26862686
message: any(named: 'message'))).called(1);
26872687
});
26882688

2689+
test('`.addMembers` with hideHistoryBefore', () async {
2690+
final members = List.generate(
2691+
3,
2692+
(index) => Member(userId: 'test-member-id-$index'),
2693+
);
2694+
final memberIds = members
2695+
.map((it) => it.userId)
2696+
.whereType<String>()
2697+
.toList(growable: false);
2698+
final message = Message(id: 'test-message-id', text: 'Members Added');
2699+
final hideHistoryBefore = DateTime.parse('2024-01-01T00:00:00Z');
2700+
2701+
final channelModel = ChannelModel(cid: channelCid);
2702+
2703+
when(() => client.addChannelMembers(
2704+
channelId,
2705+
channelType,
2706+
memberIds,
2707+
message: message,
2708+
hideHistoryBefore: hideHistoryBefore,
2709+
)).thenAnswer(
2710+
(_) async => AddMembersResponse()
2711+
..channel = channelModel
2712+
..members = members
2713+
..message = message,
2714+
);
2715+
2716+
final res = await channel.addMembers(
2717+
memberIds,
2718+
message: message,
2719+
hideHistoryBefore: hideHistoryBefore,
2720+
);
2721+
2722+
expect(res, isNotNull);
2723+
expect(res.channel.cid, channelModel.cid);
2724+
expect(res.members.length, members.length);
2725+
expect(res.message?.id, message.id);
2726+
2727+
verify(() => client.addChannelMembers(
2728+
channelId,
2729+
channelType,
2730+
memberIds,
2731+
message: message,
2732+
hideHistoryBefore: hideHistoryBefore,
2733+
)).called(1);
2734+
});
2735+
26892736
test('`.inviteMembers`', () async {
26902737
final members = List.generate(
26912738
3,

packages/stream_chat/test/src/client/client_test.dart

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1915,6 +1915,50 @@ void main() {
19151915
verifyNoMoreInteractions(api.channel);
19161916
});
19171917

1918+
test('`.addChannelMembers` with hideHistoryBefore', () async {
1919+
const channelType = 'test-channel-type';
1920+
const channelId = 'test-channel-id';
1921+
const channelCid = '$channelType:$channelId';
1922+
1923+
final members = List.generate(
1924+
3,
1925+
(index) => Member(userId: 'test-user-id-$index'),
1926+
);
1927+
1928+
final memberIds = members.map((e) => e.userId!).toList(growable: false);
1929+
final hideHistoryBefore = DateTime.parse('2024-01-01T00:00:00Z');
1930+
1931+
when(() => api.channel.addMembers(
1932+
channelId,
1933+
channelType,
1934+
memberIds,
1935+
hideHistoryBefore: hideHistoryBefore,
1936+
)).thenAnswer((_) async => AddMembersResponse()
1937+
..channel = ChannelModel(cid: channelCid)
1938+
..members = members);
1939+
1940+
final res = await client.addChannelMembers(
1941+
channelId,
1942+
channelType,
1943+
memberIds,
1944+
hideHistoryBefore: hideHistoryBefore,
1945+
);
1946+
1947+
expect(res, isNotNull);
1948+
expect(res.channel.cid, channelCid);
1949+
expect(res.members.length, memberIds.length);
1950+
1951+
verify(
1952+
() => api.channel.addMembers(
1953+
channelId,
1954+
channelType,
1955+
memberIds,
1956+
hideHistoryBefore: hideHistoryBefore,
1957+
),
1958+
).called(1);
1959+
verifyNoMoreInteractions(api.channel);
1960+
});
1961+
19181962
test('`.removeChannelMembers`', () async {
19191963
const channelType = 'test-channel-type';
19201964
const channelId = 'test-channel-id';

packages/stream_chat/test/src/core/api/channel_api_test.dart

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,85 @@ void main() {
409409
verifyNoMoreInteractions(client);
410410
});
411411

412+
test('addMembers with hideHistoryBefore', () async {
413+
const channelId = 'test-channel-id';
414+
const channelType = 'test-channel-type';
415+
const memberIds = ['test-member-id-1', 'test-member-id-2'];
416+
final channelModel = ChannelModel(id: channelId, type: channelType);
417+
final message = Message(id: 'test-message-id', text: 'members-added');
418+
final hideHistoryBefore = DateTime.parse('2024-01-01T00:00:00Z');
419+
420+
final path = _getChannelUrl(channelId, channelType);
421+
422+
when(() => client.post(
423+
path,
424+
data: {
425+
'add_members': memberIds,
426+
'message': message,
427+
'hide_history_before': hideHistoryBefore.toUtc().toIso8601String(),
428+
},
429+
)).thenAnswer((_) async => successResponse(path, data: {
430+
'channel': channelModel.toJson(),
431+
'message': message.toJson(),
432+
}));
433+
434+
final res = await channelApi.addMembers(
435+
channelId,
436+
channelType,
437+
memberIds,
438+
message: message,
439+
hideHistoryBefore: hideHistoryBefore,
440+
);
441+
442+
expect(res, isNotNull);
443+
expect(res.channel.cid, channelModel.cid);
444+
expect(res.message?.id, message.id);
445+
446+
verify(() => client.post(path, data: any(named: 'data'))).called(1);
447+
verifyNoMoreInteractions(client);
448+
});
449+
450+
test('addMembers with hideHistoryBefore takes precedence over hideHistory',
451+
() async {
452+
const channelId = 'test-channel-id';
453+
const channelType = 'test-channel-type';
454+
const memberIds = ['test-member-id-1', 'test-member-id-2'];
455+
final channelModel = ChannelModel(id: channelId, type: channelType);
456+
final message = Message(id: 'test-message-id', text: 'members-added');
457+
const hideHistory = true;
458+
final hideHistoryBefore = DateTime.parse('2024-01-01T00:00:00Z');
459+
460+
final path = _getChannelUrl(channelId, channelType);
461+
462+
when(() => client.post(
463+
path,
464+
data: {
465+
'add_members': memberIds,
466+
'message': message,
467+
'hide_history_before': hideHistoryBefore.toUtc().toIso8601String(),
468+
},
469+
)).thenAnswer((_) async => successResponse(path, data: {
470+
'channel': channelModel.toJson(),
471+
'message': message.toJson(),
472+
}));
473+
474+
final res = await channelApi.addMembers(
475+
channelId,
476+
channelType,
477+
memberIds,
478+
message: message,
479+
hideHistory: hideHistory,
480+
hideHistoryBefore: hideHistoryBefore,
481+
);
482+
483+
expect(res, isNotNull);
484+
expect(res.channel.cid, channelModel.cid);
485+
expect(res.message?.id, message.id);
486+
487+
verify(() => client.post(path, data: any(named: 'data'))).called(1);
488+
verifyNoMoreInteractions(client);
489+
});
490+
412491
test('removeMembers', () async {
413492
const channelId = 'test-channel-id';
414493
const channelType = 'test-channel-type';

0 commit comments

Comments
 (0)