Skip to content

Commit cdd3544

Browse files
committed
Fixed operatorIds bugs when updating channel
1 parent 7539831 commit cdd3544

22 files changed

+495
-73
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## [3.1.6] - Nov 3, 2021
2+
* Added `RestrictedUser` for callback mute/ban feature
3+
* Fixed session related issue
4+
* Fixed group channel updates not to apply unset `operator_ids` in `GroupChannelParams`
5+
16
## [3.1.5] - Sep 30, 2021
27
* Fixed link in README
38
* Improved stabilities

lib/constant/enums.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,3 +606,8 @@ const memberListOrderEnumMap = <MemberListOrder, String>{
606606
MemberListOrder.operatorThenMemberNicknameAlphabetical:
607607
'operator_then_member_alphabetical',
608608
};
609+
610+
enum RestrictionType {
611+
muted,
612+
banned,
613+
}

lib/core/models/member.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flutter/material.dart';
22
import 'package:json_annotation/json_annotation.dart';
33
import 'package:sendbird_sdk/constant/enums.dart';
4+
import 'package:sendbird_sdk/core/models/restricted_user.dart';
45
import 'package:sendbird_sdk/core/models/user.dart';
56
import 'package:sendbird_sdk/utils/json_from_parser.dart';
67

@@ -31,6 +32,10 @@ class Member extends User {
3132
@JsonKey(defaultValue: Role.none, unknownEnumValue: Role.none)
3233
Role role;
3334

35+
/// Restriction information
36+
@JsonKey(ignore: true)
37+
RestrictionInfo? restrictionInfo;
38+
3439
Member({
3540
this.state = MemberState.none,
3641
this.isBlockedByMe = false,
@@ -64,7 +69,11 @@ class Member extends User {
6469

6570
// json serialization
6671

67-
factory Member.fromJson(Map<String, dynamic> json) => _$MemberFromJson(json);
72+
factory Member.fromJson(Map<String, dynamic> json) {
73+
final member = _$MemberFromJson(json);
74+
member.restrictionInfo = RestrictionInfo.fromJson(json);
75+
return member;
76+
}
6877

6978
@override
7079
Map<String, dynamic> toJson() => _$MemberToJson(this);

lib/core/models/responses.dart

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import 'package:sendbird_sdk/core/channel/base/base_channel.dart';
33
import 'package:sendbird_sdk/core/channel/group/group_channel.dart';
44
import 'package:sendbird_sdk/core/channel/open/open_channel.dart';
55
import 'package:sendbird_sdk/core/message/base_message.dart';
6+
import 'package:sendbird_sdk/core/models/member.dart';
7+
import 'package:sendbird_sdk/core/models/restricted_user.dart';
68
import 'package:sendbird_sdk/core/models/user.dart';
79
import 'package:sendbird_sdk/services/db/cache_service.dart';
810

@@ -158,16 +160,17 @@ class OperatorListQueryResponse extends BaseResponse {
158160
}
159161

160162
@JsonSerializable(createToJson: false)
161-
class UserListQueryResponse extends BaseResponse {
163+
class UserListQueryResponse<T extends User> extends BaseResponse {
162164
@JsonKey(defaultValue: [])
163-
List<User> users;
165+
@UserConverter()
166+
List<T> users;
164167

165168
String? next;
166169

167170
UserListQueryResponse({this.users = const [], this.next});
168171

169172
factory UserListQueryResponse.fromJson(Map<String, dynamic> json) =>
170-
_$UserListQueryResponseFromJson(json);
173+
_$UserListQueryResponseFromJson<T>(json);
171174
}
172175

173176
@JsonSerializable(createToJson: false)
@@ -204,6 +207,30 @@ class ChannelConverter<T> implements JsonConverter<T, Object> {
204207
}
205208
}
206209

210+
class UserConverter<T> implements JsonConverter<T, Object> {
211+
const UserConverter();
212+
213+
@override
214+
T fromJson(Object json) {
215+
if (json is Map<String, dynamic>) {
216+
if (json.containsKey('end_at')) {
217+
return RestrictedUser.fromJson(json) as T;
218+
} else if (json.containsKey('muted_end_at') ||
219+
json.containsKey('is_muted')) {
220+
return Member.fromJson(json) as T;
221+
} else {
222+
return User.fromJson(json) as T;
223+
}
224+
}
225+
return json as T;
226+
}
227+
228+
@override
229+
Object toJson(T object) {
230+
return object as Object;
231+
}
232+
}
233+
207234
@JsonSerializable(createToJson: false)
208235
class MessageSearchQueryResponse extends BaseResponse {
209236
@JsonKey(defaultValue: [])

lib/core/models/responses.g.dart

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import 'package:json_annotation/json_annotation.dart';
2+
import 'package:sendbird_sdk/constant/enums.dart';
3+
import 'package:sendbird_sdk/core/models/user.dart';
4+
import 'package:sendbird_sdk/utils/json_from_parser.dart';
5+
6+
part 'restricted_user.g.dart';
7+
8+
/// An object represents a sender of a message.
9+
@JsonSerializable()
10+
class RestrictedUser extends User {
11+
/// Information about restriction
12+
RestrictionInfo? get restrictionInfo => _info;
13+
RestrictionInfo? _info;
14+
15+
RestrictedUser({
16+
required String userId,
17+
required String nickname,
18+
String? profileUrl,
19+
UserConnectionStatus connectionStatus = UserConnectionStatus.notAvailable,
20+
int? lastSeenAt,
21+
List<String>? preferredLanguages,
22+
String? friendDiscoveryKey,
23+
String? friendName,
24+
List<String>? discoveryKeys,
25+
Map<String, String> metaData = const {},
26+
bool requireAuth = false,
27+
}) : super(
28+
userId: userId,
29+
nickname: nickname,
30+
profileUrl: profileUrl,
31+
connectionStatus: connectionStatus,
32+
lastSeenAt: lastSeenAt,
33+
preferredLanguages: preferredLanguages,
34+
friendDiscoveryKey: friendDiscoveryKey,
35+
friendName: friendName,
36+
discoveryKeys: discoveryKeys,
37+
metaData: metaData,
38+
requireAuth: requireAuth,
39+
);
40+
41+
factory RestrictedUser.fromJson(Map<String, dynamic> json) {
42+
final user = _$RestrictedUserFromJson(json);
43+
user._info = RestrictionInfo.fromJson(json);
44+
return user;
45+
}
46+
47+
@override
48+
Map<String, dynamic> toJson() => _$RestrictedUserToJson(this);
49+
}
50+
51+
@JsonSerializable()
52+
class RestrictionInfo {
53+
// description of restriction
54+
final String? description;
55+
56+
// timestamp when restriction will end
57+
final int? endAt;
58+
59+
// timestamp when restriction started
60+
final int? startAt;
61+
62+
// restriction type
63+
final RestrictionType type;
64+
65+
RestrictionInfo({
66+
this.description,
67+
this.endAt,
68+
this.startAt,
69+
this.type = RestrictionType.muted,
70+
});
71+
72+
factory RestrictionInfo.fromJson(Map<String, dynamic> json) {
73+
json['end_at'] = json['end_at'] ?? json['muted_end_at'];
74+
json['start_at'] = json['start_at'] ?? json['muted_start_at'];
75+
json['description'] = json['description'] ?? json['muted_description'];
76+
if (json['type'] == null) json['type'] = 'muted';
77+
return _$RestrictionInfoFromJson(json);
78+
}
79+
80+
Map<String, dynamic> toJson() => _$RestrictionInfoToJson(this);
81+
}

lib/core/models/restricted_user.g.dart

Lines changed: 97 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/events/session_event.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@ part 'session_event.g.dart';
66
/// Represents session information
77
@JsonSerializable(createToJson: false)
88
class SessionEvent extends BaseEvent {
9-
@JsonKey(defaultValue: 0)
10-
final int? expiresAt;
11-
129
final String? newKey;
1310

1411
final String? ekey;
@@ -17,7 +14,7 @@ class SessionEvent extends BaseEvent {
1714

1815
String get sessionKey => key ?? newKey ?? '';
1916

20-
SessionEvent({this.expiresAt, this.newKey, this.ekey, this.key});
17+
SessionEvent({this.newKey, this.ekey, this.key});
2118

2219
factory SessionEvent.fromJson(Map<String, dynamic> json) =>
2320
_$SessionEventFromJson(json);

lib/events/session_event.g.dart

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)