diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index 69d967fe..657126c1 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -507,9 +507,9 @@ class Channel { /// Pins provided message Future pinMessage( - Message message, + Message message, [ Object? timeoutOrExpirationDate, - ) { + ]) { assert(() { if (timeoutOrExpirationDate is! DateTime && timeoutOrExpirationDate != null && @@ -517,7 +517,7 @@ class Channel { throw ArgumentError('Invalid timeout or Expiration date'); } return true; - }(), 'Check for invalid token or expiration date'); + }(), 'Check whether time out is valid'); DateTime? pinExpires; if (timeoutOrExpirationDate is DateTime) { diff --git a/packages/stream_chat/lib/src/client.dart b/packages/stream_chat/lib/src/client.dart index 05f2559b..6e7caa9e 100644 --- a/packages/stream_chat/lib/src/client.dart +++ b/packages/stream_chat/lib/src/client.dart @@ -1361,12 +1361,13 @@ class StreamChatClient { /// [timeoutOrExpirationDate] can either be a [DateTime] or a value in seconds /// to be added to [DateTime.now] Future pinMessage( - Message message, - Object timeoutOrExpirationDate, - ) { + Message message, [ + Object? timeoutOrExpirationDate, + ]) { assert(() { if (timeoutOrExpirationDate is! DateTime && - timeoutOrExpirationDate is! num) { + timeoutOrExpirationDate is! num && + timeoutOrExpirationDate != null) { throw ArgumentError('Invalid timeout or Expiration date'); } return true; @@ -1383,13 +1384,19 @@ class StreamChatClient { .toUtc(); } return updateMessage( - message.copyWith(pinned: true, pinExpires: pinExpires), + message.copyWith( + pinned: true, + pinExpires: pinExpires, + ), ); } /// Unpins provided message - Future unpinMessage(Message message) => - updateMessage(message.copyWith(pinned: false)); + Future unpinMessage(Message message) => updateMessage( + message.copyWith( + pinned: false, + ), + ); } /// The class that handles the state of the channel listening to the events diff --git a/packages/stream_chat/test/src/api/channel_test.dart b/packages/stream_chat/test/src/api/channel_test.dart index c3409b7e..f92b05bb 100644 --- a/packages/stream_chat/test/src/api/channel_test.dart +++ b/packages/stream_chat/test/src/api/channel_test.dart @@ -449,6 +449,51 @@ void main() { .called(1); }); + test('should be pinned successfully with null timeout', () async { + final mockDio = MockDio(); + + when(() => mockDio.options).thenReturn(BaseOptions()); + when(() => mockDio.interceptors).thenReturn(Interceptors()); + + final client = StreamChatClient( + 'api-key', + httpClient: mockDio, + tokenProvider: (_) async => '', + ); + final channelClient = client.channel('messaging', id: 'testid'); + final message = Message(text: 'Hello', id: 'test'); + + when(() => mockDio.post( + any(), + data: any(named: 'data'), + )).thenAnswer((_) async => Response( + data: jsonEncode(ChannelState()), + statusCode: 200, + requestOptions: FakeRequestOptions(), + )); + + await channelClient.watch(); + + when( + () => mockDio.post( + '/messages/${message.id}', + data: anything, + ), + ).thenAnswer( + (_) async => Response( + data: jsonEncode({'message': message}), + statusCode: 200, + requestOptions: FakeRequestOptions(), + ), + ); + + await channelClient.pinMessage(message); + + verify(() => + mockDio.post('/messages/${message.id}', data: anything)) + .called(1); + }); + test('should be unpinned successfully', () async { final mockDio = MockDio(); diff --git a/packages/stream_chat/test/src/client_test.dart b/packages/stream_chat/test/src/client_test.dart index b2a5bbac..53792764 100644 --- a/packages/stream_chat/test/src/client_test.dart +++ b/packages/stream_chat/test/src/client_test.dart @@ -1112,6 +1112,28 @@ void main() { data: {'message': anything})).called(1); }); + test('should complete successfully with a null value', () async { + final message = Message(text: 'Hello'); + + when( + () => mockDio.post( + '/messages/${message.id}', + data: anything, + ), + ).thenAnswer( + (_) async => Response( + data: jsonEncode({'message': message}), + statusCode: 200, + requestOptions: FakeRequestOptions(), + ), + ); + + await client.pinMessage(message); + + verify(() => mockDio.post('/messages/${message.id}', + data: {'message': anything})).called(1); + }); + test('should unpin message successfully', () async { final message = Message(text: 'Hello');