fix(llc): Update channel state when member gets banned/unbanned.

Signed-off-by: xsahil03x <[email protected]>
This commit is contained in:
Sahil Kumar
2022-01-31 12:57:58 +05:30
committed by xsahil03x
parent 15e87f76d5
commit 7723b0c8b6
8 changed files with 94 additions and 4 deletions
@@ -1493,6 +1493,10 @@ class ChannelClientState {
_listenMemberRemoved(); _listenMemberRemoved();
_listenMemberBanned();
_listenMemberUnbanned();
_startCleaning(); _startCleaning();
_startCleaningPinnedMessages(); _startCleaningPinnedMessages();
@@ -1591,6 +1595,54 @@ class ChannelClientState {
})); }));
} }
void _listenMemberBanned() {
_subscriptions.add(_channel
.on(EventType.userBanned)
.where((it) => it.cid != null) // filters channel ban from app ban
.listen(
(event) async {
final user = event.user!;
final member = await _channel
.queryMembers(filter: Filter.equal('id', user.id))
.then((it) => it.members.first);
_updateMember(member);
},
));
}
void _listenMemberUnbanned() {
_subscriptions.add(_channel
.on(EventType.userUnbanned)
.where((it) => it.cid != null) // filters channel ban from app ban
.listen(
(event) async {
final user = event.user!;
final member = await _channel
.queryMembers(filter: Filter.equal('id', user.id))
.then((it) => it.members.first);
_updateMember(member);
},
));
}
void _updateMember(Member member) {
final currentMembers = [...members];
final memberIndex = currentMembers.indexWhere(
(m) => m.userId == member.userId,
);
if (memberIndex == -1) return;
currentMembers[memberIndex] = member;
updateChannelState(
channelState.copyWith(
members: currentMembers,
),
);
}
/// Flag which indicates if [ChannelClientState] contain latest/recent messages or not. /// Flag which indicates if [ChannelClientState] contain latest/recent messages or not.
/// ///
/// This flag should be managed by UI sdks. /// This flag should be managed by UI sdks.
@@ -20,6 +20,7 @@ class Member extends Equatable {
DateTime? createdAt, DateTime? createdAt,
DateTime? updatedAt, DateTime? updatedAt,
this.banned = false, this.banned = false,
this.banExpires,
this.shadowBanned = false, this.shadowBanned = false,
}) : createdAt = createdAt ?? DateTime.now(), }) : createdAt = createdAt ?? DateTime.now(),
updatedAt = updatedAt ?? DateTime.now(); updatedAt = updatedAt ?? DateTime.now();
@@ -56,6 +57,9 @@ class Member extends Equatable {
/// True if the member is banned from the channel /// True if the member is banned from the channel
final bool banned; final bool banned;
/// The date at which the ban will expire.
final DateTime? banExpires;
/// True if the member is shadow banned from the channel /// True if the member is shadow banned from the channel
final bool shadowBanned; final bool shadowBanned;
@@ -77,6 +81,7 @@ class Member extends Equatable {
DateTime? createdAt, DateTime? createdAt,
DateTime? updatedAt, DateTime? updatedAt,
bool? banned, bool? banned,
DateTime? banExpires,
bool? shadowBanned, bool? shadowBanned,
}) => }) =>
Member( Member(
@@ -85,6 +90,7 @@ class Member extends Equatable {
inviteRejectedAt: inviteRejectedAt ?? this.inviteRejectedAt, inviteRejectedAt: inviteRejectedAt ?? this.inviteRejectedAt,
invited: invited ?? this.invited, invited: invited ?? this.invited,
banned: banned ?? this.banned, banned: banned ?? this.banned,
banExpires: banExpires ?? this.banExpires,
shadowBanned: shadowBanned ?? this.shadowBanned, shadowBanned: shadowBanned ?? this.shadowBanned,
role: role ?? this.role, role: role ?? this.role,
userId: userId ?? this.userId, userId: userId ?? this.userId,
@@ -106,6 +112,7 @@ class Member extends Equatable {
userId, userId,
isModerator, isModerator,
banned, banned,
banExpires,
shadowBanned, shadowBanned,
createdAt, createdAt,
updatedAt, updatedAt,
@@ -27,6 +27,9 @@ Member _$MemberFromJson(Map<String, dynamic> json) => Member(
? null ? null
: DateTime.parse(json['updated_at'] as String), : DateTime.parse(json['updated_at'] as String),
banned: json['banned'] as bool? ?? false, banned: json['banned'] as bool? ?? false,
banExpires: json['ban_expires'] == null
? null
: DateTime.parse(json['ban_expires'] as String),
shadowBanned: json['shadow_banned'] as bool? ?? false, shadowBanned: json['shadow_banned'] as bool? ?? false,
); );
@@ -39,6 +42,7 @@ Map<String, dynamic> _$MemberToJson(Member instance) => <String, dynamic>{
'user_id': instance.userId, 'user_id': instance.userId,
'is_moderator': instance.isModerator, 'is_moderator': instance.isModerator,
'banned': instance.banned, 'banned': instance.banned,
'ban_expires': instance.banExpires?.toIso8601String(),
'shadow_banned': instance.shadowBanned, 'shadow_banned': instance.shadowBanned,
'created_at': instance.createdAt.toIso8601String(), 'created_at': instance.createdAt.toIso8601String(),
'updated_at': instance.updatedAt.toIso8601String(), 'updated_at': instance.updatedAt.toIso8601String(),
@@ -26,6 +26,7 @@ class OwnUser extends User {
bool online = false, bool online = false,
Map<String, Object?> extraData = const {}, Map<String, Object?> extraData = const {},
bool banned = false, bool banned = false,
DateTime? banExpires,
List<String> teams = const [], List<String> teams = const [],
String? language, String? language,
}) : super( }) : super(
@@ -39,6 +40,7 @@ class OwnUser extends User {
online: online, online: online,
extraData: extraData, extraData: extraData,
banned: banned, banned: banned,
banExpires: banExpires,
teams: teams, teams: teams,
language: language, language: language,
); );
@@ -75,6 +77,7 @@ class OwnUser extends User {
bool? online, bool? online,
Map<String, Object?>? extraData, Map<String, Object?>? extraData,
bool? banned, bool? banned,
DateTime? banExpires,
List<String>? teams, List<String>? teams,
List<Mute>? channelMutes, List<Mute>? channelMutes,
List<Device>? devices, List<Device>? devices,
@@ -91,6 +94,7 @@ class OwnUser extends User {
// if null, it will be retrieved from extraData['image'] // if null, it will be retrieved from extraData['image']
image: image, image: image,
banned: banned ?? this.banned, banned: banned ?? this.banned,
banExpires: banExpires ?? this.banExpires,
createdAt: createdAt ?? this.createdAt, createdAt: createdAt ?? this.createdAt,
updatedAt: updatedAt ?? this.updatedAt, updatedAt: updatedAt ?? this.updatedAt,
lastActive: lastActive ?? this.lastActive, lastActive: lastActive ?? this.lastActive,
@@ -35,6 +35,9 @@ OwnUser _$OwnUserFromJson(Map<String, dynamic> json) => OwnUser(
online: json['online'] as bool? ?? false, online: json['online'] as bool? ?? false,
extraData: json['extra_data'] as Map<String, dynamic>? ?? const {}, extraData: json['extra_data'] as Map<String, dynamic>? ?? const {},
banned: json['banned'] as bool? ?? false, banned: json['banned'] as bool? ?? false,
banExpires: json['ban_expires'] == null
? null
: DateTime.parse(json['ban_expires'] as String),
teams: teams:
(json['teams'] as List<dynamic>?)?.map((e) => e as String).toList() ?? (json['teams'] as List<dynamic>?)?.map((e) => e as String).toList() ??
const [], const [],
@@ -41,6 +41,7 @@ class User extends Equatable {
Map<String, Object?> extraData = const {}, Map<String, Object?> extraData = const {},
this.online = false, this.online = false,
this.banned = false, this.banned = false,
this.banExpires,
this.teams = const [], this.teams = const [],
this.language, this.language,
}) : createdAt = createdAt ?? DateTime.now(), }) : createdAt = createdAt ?? DateTime.now(),
@@ -67,6 +68,8 @@ class User extends Equatable {
'last_active', 'last_active',
'online', 'online',
'banned', 'banned',
'ban_expires',
'dashboard_ban_channel_cid',
'teams', 'teams',
'language', 'language',
]; ];
@@ -129,14 +132,18 @@ class User extends Equatable {
) )
final bool banned; final bool banned;
/// Map of custom user extraData. /// The date at which the ban will expire.
@JsonKey(includeIfNull: false) @JsonKey(includeIfNull: false, toJson: Serializer.readOnly)
final Map<String, Object?> extraData; final DateTime? banExpires;
/// The language this user prefers. /// The language this user prefers.
@JsonKey(includeIfNull: false) @JsonKey(includeIfNull: false)
final String? language; final String? language;
/// Map of custom user extraData.
@JsonKey(includeIfNull: false)
final Map<String, Object?> extraData;
/// List of users to list of userIds. /// List of users to list of userIds.
static List<String>? toIds(List<User>? users) => static List<String>? toIds(List<User>? users) =>
users?.map((u) => u.id).toList(); users?.map((u) => u.id).toList();
@@ -158,6 +165,7 @@ class User extends Equatable {
bool? online, bool? online,
Map<String, Object?>? extraData, Map<String, Object?>? extraData,
bool? banned, bool? banned,
DateTime? banExpires,
List<String>? teams, List<String>? teams,
String? language, String? language,
}) => }) =>
@@ -174,6 +182,7 @@ class User extends Equatable {
online: online ?? this.online, online: online ?? this.online,
extraData: extraData ?? this.extraData, extraData: extraData ?? this.extraData,
banned: banned ?? this.banned, banned: banned ?? this.banned,
banExpires: banExpires ?? this.banExpires,
teams: teams ?? this.teams, teams: teams ?? this.teams,
language: language ?? this.language, language: language ?? this.language,
); );
@@ -186,6 +195,7 @@ class User extends Equatable {
online, online,
extraData, extraData,
banned, banned,
banExpires,
teams, teams,
language, language,
]; ];
@@ -21,6 +21,9 @@ User _$UserFromJson(Map<String, dynamic> json) => User(
extraData: json['extra_data'] as Map<String, dynamic>? ?? const {}, extraData: json['extra_data'] as Map<String, dynamic>? ?? const {},
online: json['online'] as bool? ?? false, online: json['online'] as bool? ?? false,
banned: json['banned'] as bool? ?? false, banned: json['banned'] as bool? ?? false,
banExpires: json['ban_expires'] == null
? null
: DateTime.parse(json['ban_expires'] as String),
teams: teams:
(json['teams'] as List<dynamic>?)?.map((e) => e as String).toList() ?? (json['teams'] as List<dynamic>?)?.map((e) => e as String).toList() ??
const [], const [],
@@ -45,7 +48,8 @@ Map<String, dynamic> _$UserToJson(User instance) {
writeNotNull('last_active', readonly(instance.lastActive)); writeNotNull('last_active', readonly(instance.lastActive));
writeNotNull('online', readonly(instance.online)); writeNotNull('online', readonly(instance.online));
writeNotNull('banned', readonly(instance.banned)); writeNotNull('banned', readonly(instance.banned));
val['extra_data'] = instance.extraData; writeNotNull('ban_expires', readonly(instance.banExpires));
writeNotNull('language', instance.language); writeNotNull('language', instance.language);
val['extra_data'] = instance.extraData;
return val; return val;
} }
@@ -73,6 +73,12 @@ class EventType {
/// Event sent when a member is removed to a channel /// Event sent when a member is removed to a channel
static const String memberRemoved = 'member.removed'; static const String memberRemoved = 'member.removed';
/// Event sent when a member is removed to a channel
static const String userBanned = 'user.banned';
/// Event sent when a member is removed to a channel
static const String userUnbanned = 'user.unbanned';
/// Event sent when a channel is hidden /// Event sent when a channel is hidden
static const String channelHidden = 'channel.hidden'; static const String channelHidden = 'channel.hidden';