diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index e69501ba..9bffbf5c 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -3,6 +3,8 @@ 🐞 Fixed - Fixed reactions not working for threads in offline mode. +- [[#1046]](https://github.com/GetStream/stream-chat-flutter/issues/1046) After `/mute` command on reload cannot access + any channel. - [[#1047]](https://github.com/GetStream/stream-chat-flutter/issues/1047) `own_capabilities` extraData missing after channel update. diff --git a/packages/stream_chat/lib/src/core/models/channel_mute.dart b/packages/stream_chat/lib/src/core/models/channel_mute.dart new file mode 100644 index 00000000..ab17161b --- /dev/null +++ b/packages/stream_chat/lib/src/core/models/channel_mute.dart @@ -0,0 +1,37 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:stream_chat/src/core/models/channel_model.dart'; +import 'package:stream_chat/src/core/models/user.dart'; + +part 'channel_mute.g.dart'; + +/// The class that contains the information about a muted channel +@JsonSerializable(createToJson: false) +class ChannelMute { + /// Constructor used for json serialization + ChannelMute({ + required this.user, + required this.channel, + required this.createdAt, + required this.updatedAt, + this.expires, + }); + + /// Create a new instance from a json + factory ChannelMute.fromJson(Map json) => + _$ChannelMuteFromJson(json); + + /// The user that performed the muting action + final User user; + + /// The target channel + final ChannelModel channel; + + /// The date in which the channel was muted + final DateTime createdAt; + + /// The date of the last update + final DateTime updatedAt; + + /// The date in which the mute expires + final DateTime? expires; +} diff --git a/packages/stream_chat/lib/src/core/models/channel_mute.g.dart b/packages/stream_chat/lib/src/core/models/channel_mute.g.dart new file mode 100644 index 00000000..9b6d00c1 --- /dev/null +++ b/packages/stream_chat/lib/src/core/models/channel_mute.g.dart @@ -0,0 +1,17 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'channel_mute.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +ChannelMute _$ChannelMuteFromJson(Map json) => ChannelMute( + user: User.fromJson(json['user'] as Map), + channel: ChannelModel.fromJson(json['channel'] as Map), + createdAt: DateTime.parse(json['created_at'] as String), + updatedAt: DateTime.parse(json['updated_at'] as String), + expires: json['expires'] == null + ? null + : DateTime.parse(json['expires'] as String), + ); diff --git a/packages/stream_chat/lib/src/core/models/mute.dart b/packages/stream_chat/lib/src/core/models/mute.dart index 857b34a1..02c91784 100644 --- a/packages/stream_chat/lib/src/core/models/mute.dart +++ b/packages/stream_chat/lib/src/core/models/mute.dart @@ -1,7 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; -import 'package:stream_chat/src/core/models/channel_model.dart'; import 'package:stream_chat/src/core/models/user.dart'; -import 'package:stream_chat/src/core/util/serializer.dart'; part 'mute.g.dart'; @@ -11,27 +9,27 @@ class Mute { /// Constructor used for json serialization Mute({ required this.user, - required this.channel, + required this.target, required this.createdAt, required this.updatedAt, + this.expires, }); /// Create a new instance from a json factory Mute.fromJson(Map json) => _$MuteFromJson(json); /// The user that performed the muting action - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) final User user; /// The target user - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) - final ChannelModel channel; + final User target; /// The date in which the use was muted - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) final DateTime createdAt; /// The date of the last update - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) final DateTime updatedAt; + + /// The date in which the mute expires + final DateTime? expires; } diff --git a/packages/stream_chat/lib/src/core/models/mute.g.dart b/packages/stream_chat/lib/src/core/models/mute.g.dart index f57fd312..a0d908a8 100644 --- a/packages/stream_chat/lib/src/core/models/mute.g.dart +++ b/packages/stream_chat/lib/src/core/models/mute.g.dart @@ -8,7 +8,10 @@ part of 'mute.dart'; Mute _$MuteFromJson(Map json) => Mute( user: User.fromJson(json['user'] as Map), - channel: ChannelModel.fromJson(json['channel'] as Map), + target: User.fromJson(json['target'] as Map), createdAt: DateTime.parse(json['created_at'] as String), updatedAt: DateTime.parse(json['updated_at'] as String), + expires: json['expires'] == null + ? null + : DateTime.parse(json['expires'] as String), ); diff --git a/packages/stream_chat/lib/src/core/models/own_user.dart b/packages/stream_chat/lib/src/core/models/own_user.dart index 5246f48e..6133dd76 100644 --- a/packages/stream_chat/lib/src/core/models/own_user.dart +++ b/packages/stream_chat/lib/src/core/models/own_user.dart @@ -1,4 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; +import 'package:stream_chat/src/core/models/channel_mute.dart'; import 'package:stream_chat/src/core/util/serializer.dart'; import 'package:stream_chat/stream_chat.dart'; @@ -79,7 +80,7 @@ class OwnUser extends User { bool? banned, DateTime? banExpires, List? teams, - List? channelMutes, + List? channelMutes, List? devices, List? mutes, int? totalUnreadCount, @@ -142,7 +143,7 @@ class OwnUser extends User { /// List of channels muted by the user. @JsonKey(includeIfNull: false) - final List channelMutes; + final List channelMutes; /// Total unread messages by the user. @JsonKey(includeIfNull: false) diff --git a/packages/stream_chat/lib/src/core/models/own_user.g.dart b/packages/stream_chat/lib/src/core/models/own_user.g.dart index be8f2d45..6cae18ee 100644 --- a/packages/stream_chat/lib/src/core/models/own_user.g.dart +++ b/packages/stream_chat/lib/src/core/models/own_user.g.dart @@ -18,7 +18,7 @@ OwnUser _$OwnUserFromJson(Map json) => OwnUser( totalUnreadCount: json['total_unread_count'] as int? ?? 0, unreadChannels: json['unread_channels'] as int? ?? 0, channelMutes: (json['channel_mutes'] as List?) - ?.map((e) => Mute.fromJson(e as Map)) + ?.map((e) => ChannelMute.fromJson(e as Map)) .toList() ?? const [], id: json['id'] as String, diff --git a/packages/stream_chat/test/fixtures/channel_mute.json b/packages/stream_chat/test/fixtures/channel_mute.json new file mode 100644 index 00000000..cc6c3a8c --- /dev/null +++ b/packages/stream_chat/test/fixtures/channel_mute.json @@ -0,0 +1,74 @@ +{ + "user": { + "id": "super-band-9", + "role": "user", + "created_at": "2020-03-03T16:48:28.853674Z", + "updated_at": "2021-05-26T03:22:20.296181Z", + "last_active": "2021-06-16T11:42:29.466165498Z", + "banned": false, + "online": true, + "username": "Rioland", + "image": "https://placehold.jp/150x150.png", + "invisible": false, + "name": "Proud darkness", + "unread_count": 0 + }, + "channel": { + "id": "!members-Qsp7PpigdPkW0rJk0603y5GnTiF1iRfoDc4SAngMMmw", + "type": "messaging", + "cid": "messaging:!members-Qsp7PpigdPkW0rJk0603y5GnTiF1iRfoDc4SAngMMmw", + "last_message_at": "2020-12-02T06:56:18.003432Z", + "created_at": "2020-11-30T10:25:32.494601Z", + "updated_at": "2020-11-30T10:25:32.494601Z", + "created_by": { + "id": "super-band-9", + "role": "user", + "created_at": "2020-03-03T16:48:28.853674Z", + "updated_at": "2021-05-26T03:22:20.296181Z", + "last_active": "2021-06-16T11:42:29.466165498Z", + "banned": false, + "online": true, + "image": "https://placehold.jp/150x150.png", + "invisible": false, + "name": "Proud darkness", + "unread_count": 0, + "username": "Rioland" + }, + "frozen": false, + "disabled": false, + "member_count": 2, + "config": { + "created_at": "2020-04-15T14:57:17.00966Z", + "updated_at": "2021-05-25T14:25:30.405621Z", + "name": "messaging", + "typing_events": true, + "read_events": true, + "connect_events": true, + "search": true, + "reactions": true, + "replies": true, + "mutes": true, + "uploads": true, + "url_enrichment": true, + "custom_events": false, + "push_notifications": true, + "message_retention": "infinite", + "max_message_length": 5000, + "automod": "disabled", + "automod_behavior": "flag", + "blocklist": "profanity_en_2020_v1", + "blocklist_behavior": "block", + "automod_thresholds": {}, + "commands": [ + { + "name": "giphy", + "description": "Post a random gif to the channel", + "args": "[text]", + "set": "fun_set" + } + ] + } + }, + "created_at": "2020-12-04T10:39:06.512021Z", + "updated_at": "2020-12-04T10:39:06.512021Z" +} \ No newline at end of file diff --git a/packages/stream_chat/test/fixtures/mute.json b/packages/stream_chat/test/fixtures/mute.json index cc6c3a8c..5e425392 100644 --- a/packages/stream_chat/test/fixtures/mute.json +++ b/packages/stream_chat/test/fixtures/mute.json @@ -13,61 +13,19 @@ "name": "Proud darkness", "unread_count": 0 }, - "channel": { - "id": "!members-Qsp7PpigdPkW0rJk0603y5GnTiF1iRfoDc4SAngMMmw", - "type": "messaging", - "cid": "messaging:!members-Qsp7PpigdPkW0rJk0603y5GnTiF1iRfoDc4SAngMMmw", - "last_message_at": "2020-12-02T06:56:18.003432Z", - "created_at": "2020-11-30T10:25:32.494601Z", - "updated_at": "2020-11-30T10:25:32.494601Z", - "created_by": { - "id": "super-band-9", - "role": "user", - "created_at": "2020-03-03T16:48:28.853674Z", - "updated_at": "2021-05-26T03:22:20.296181Z", - "last_active": "2021-06-16T11:42:29.466165498Z", - "banned": false, - "online": true, - "image": "https://placehold.jp/150x150.png", - "invisible": false, - "name": "Proud darkness", - "unread_count": 0, - "username": "Rioland" - }, - "frozen": false, - "disabled": false, - "member_count": 2, - "config": { - "created_at": "2020-04-15T14:57:17.00966Z", - "updated_at": "2021-05-25T14:25:30.405621Z", - "name": "messaging", - "typing_events": true, - "read_events": true, - "connect_events": true, - "search": true, - "reactions": true, - "replies": true, - "mutes": true, - "uploads": true, - "url_enrichment": true, - "custom_events": false, - "push_notifications": true, - "message_retention": "infinite", - "max_message_length": 5000, - "automod": "disabled", - "automod_behavior": "flag", - "blocklist": "profanity_en_2020_v1", - "blocklist_behavior": "block", - "automod_thresholds": {}, - "commands": [ - { - "name": "giphy", - "description": "Post a random gif to the channel", - "args": "[text]", - "set": "fun_set" - } - ] - } + "target": { + "id": "super-band-10", + "role": "user", + "created_at": "2020-03-03T16:48:28.853674Z", + "updated_at": "2021-05-26T03:22:20.296181Z", + "last_active": "2021-06-16T11:42:29.466165498Z", + "banned": false, + "online": true, + "username": "Holland", + "image": "https://placehold.jp/150x150.png", + "invisible": false, + "name": "Proud brightness", + "unread_count": 0 }, "created_at": "2020-12-04T10:39:06.512021Z", "updated_at": "2020-12-04T10:39:06.512021Z" diff --git a/packages/stream_chat/test/src/core/models/channel_mute_test.dart b/packages/stream_chat/test/src/core/models/channel_mute_test.dart new file mode 100644 index 00000000..9a84f263 --- /dev/null +++ b/packages/stream_chat/test/src/core/models/channel_mute_test.dart @@ -0,0 +1,18 @@ +import 'package:stream_chat/src/core/models/channel_model.dart'; +import 'package:stream_chat/src/core/models/channel_mute.dart'; +import 'package:stream_chat/src/core/models/user.dart'; +import 'package:test/test.dart'; + +import '../../utils.dart'; + +void main() { + group('src/models/channel_mute', () { + test('should parse json correctly', () { + final mute = ChannelMute.fromJson(jsonFixture('channel_mute.json')); + expect(mute.user, isA()); + expect(mute.channel, isA()); + expect(mute.createdAt, DateTime.parse('2020-12-04T10:39:06.512021Z')); + expect(mute.updatedAt, DateTime.parse('2020-12-04T10:39:06.512021Z')); + }); + }); +} diff --git a/packages/stream_chat/test/src/core/models/mute_test.dart b/packages/stream_chat/test/src/core/models/mute_test.dart index f1f7b606..f5361506 100644 --- a/packages/stream_chat/test/src/core/models/mute_test.dart +++ b/packages/stream_chat/test/src/core/models/mute_test.dart @@ -1,4 +1,3 @@ -import 'package:stream_chat/src/core/models/channel_model.dart'; import 'package:stream_chat/src/core/models/mute.dart'; import 'package:stream_chat/src/core/models/user.dart'; import 'package:test/test.dart'; @@ -6,12 +5,13 @@ import 'package:test/test.dart'; import '../../utils.dart'; void main() { - group('src/models/mute', () { + group('src/models/channel_mute', () { test('should parse json correctly', () { final mute = Mute.fromJson(jsonFixture('mute.json')); - expect(mute.channel, isA()); expect(mute.user, isA()); + expect(mute.target, isA()); expect(mute.createdAt, DateTime.parse('2020-12-04T10:39:06.512021Z')); + expect(mute.updatedAt, DateTime.parse('2020-12-04T10:39:06.512021Z')); }); }); } diff --git a/packages/stream_chat/test/src/core/models/own_user_test.dart b/packages/stream_chat/test/src/core/models/own_user_test.dart index 430e9c36..e0dc7801 100644 --- a/packages/stream_chat/test/src/core/models/own_user_test.dart +++ b/packages/stream_chat/test/src/core/models/own_user_test.dart @@ -1,4 +1,5 @@ import 'package:mocktail/mocktail.dart'; +import 'package:stream_chat/src/core/models/channel_mute.dart'; import 'package:stream_chat/stream_chat.dart'; import 'package:test/test.dart'; @@ -6,12 +7,14 @@ import '../../utils.dart'; class MockMute extends Mock implements Mute {} +class ChannelMockMute extends Mock implements ChannelMute {} + class MockDevice extends Mock implements Device {} void main() { final devices = [MockDevice(), MockDevice()]; final mutes = [MockMute(), MockMute()]; - final channelMutes = [MockMute()]; + final channelMutes = [ChannelMockMute()]; final createdAt = DateTime.parse('2021-05-03 12:39:21.817646'); final updatedAt = DateTime.parse('2021-04-03 12:39:21.817646'); final lastActive = DateTime.parse('2021-03-03 12:39:21.817646');