diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index 7ca86f78..ae525f7b 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -690,6 +690,13 @@ class Channel { return _client.decode(response.data, UpdateChannelResponse.fromJson); } + /// Edit the channel custom data + Future updatePartial( + Map channelData) async { + final response = await _client.patch(_channelURL, data: channelData); + return _client.decode(response.data, PartialUpdateChannelResponse.fromJson); + } + /// Delete this channel. Messages are permanently removed. Future delete() async { final response = await _client.delete(_channelURL); diff --git a/packages/stream_chat/lib/src/api/responses.dart b/packages/stream_chat/lib/src/api/responses.dart index 3e5b7a7f..a1e928d6 100644 --- a/packages/stream_chat/lib/src/api/responses.dart +++ b/packages/stream_chat/lib/src/api/responses.dart @@ -247,6 +247,20 @@ class UpdateChannelResponse extends _BaseResponse { _$UpdateChannelResponseFromJson(json); } +/// Model response for [Channel.updatePartial] api call +@JsonSerializable(createToJson: false) +class PartialUpdateChannelResponse extends _BaseResponse { + /// Updated channel + ChannelModel channel; + + /// Channel members + List members; + + /// Create a new instance from a json + static PartialUpdateChannelResponse fromJson(Map json) => + _$PartialUpdateChannelResponseFromJson(json); +} + /// Model response for [Channel.inviteMembers] api call @JsonSerializable(createToJson: false) class InviteMembersResponse extends _BaseResponse { diff --git a/packages/stream_chat/lib/src/api/responses.g.dart b/packages/stream_chat/lib/src/api/responses.g.dart index fc51dd52..1f290d6e 100644 --- a/packages/stream_chat/lib/src/api/responses.g.dart +++ b/packages/stream_chat/lib/src/api/responses.g.dart @@ -225,6 +225,23 @@ UpdateChannelResponse _$UpdateChannelResponseFromJson(Map json) { )); } +PartialUpdateChannelResponse _$PartialUpdateChannelResponseFromJson(Map json) { + return PartialUpdateChannelResponse() + ..duration = json['duration'] as String + ..channel = json['channel'] == null + ? null + : ChannelModel.fromJson((json['channel'] as Map)?.map( + (k, e) => MapEntry(k as String, e), + )) + ..members = (json['members'] as List) + ?.map((e) => e == null + ? null + : Member.fromJson((e as Map)?.map( + (k, e) => MapEntry(k as String, e), + ))) + ?.toList(); +} + InviteMembersResponse _$InviteMembersResponseFromJson(Map json) { return InviteMembersResponse() ..duration = json['duration'] as String diff --git a/packages/stream_chat/test/src/client_test.dart b/packages/stream_chat/test/src/client_test.dart index e82658e1..b38185b5 100644 --- a/packages/stream_chat/test/src/client_test.dart +++ b/packages/stream_chat/test/src/client_test.dart @@ -992,5 +992,37 @@ void main() { }); }); }); + + group('channel', () { + test('should update channel', () async { + final mockDio = MockDio(); + + when(mockDio.options).thenReturn(BaseOptions()); + when(mockDio.interceptors).thenReturn(Interceptors()); + + final client = StreamChatClient( + 'api-key', + httpClient: mockDio, + ); + + final channelClient = + client.channel('type', id: 'id', extraData: {'name': 'init'}); + + var update = { + 'set': {'name': 'demo'} + }; + + when(mockDio.patch( + '/channels/${channelClient.type}/${channelClient.id}', + data: update, + )).thenAnswer((_) async => Response(data: '{}', statusCode: 200)); + + await channelClient.updatePartial(update); + verify(mockDio.patch( + '/channels/${channelClient.type}/${channelClient.id}', + data: update)) + .called(1); + }); + }); }); } diff --git a/packages/stream_chat_flutter/lib/src/message_search_list_view.dart b/packages/stream_chat_flutter/lib/src/message_search_list_view.dart index 94a79eaf..da1144b8 100644 --- a/packages/stream_chat_flutter/lib/src/message_search_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_search_list_view.dart @@ -154,7 +154,7 @@ class _MessageSearchListViewState extends State { }, ); }, - errorBuilder: widget.emptyBuilder ?? + errorBuilder: widget.errorBuilder ?? (BuildContext context, dynamic error) { if (error is Error) { print((error).stackTrace);