fix(llc): Update channel state when member gets banned/unbanned.
Signed-off-by: xsahil03x <[email protected]>
This commit is contained in:
@@ -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';
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user