Skip to content

Commit 72d6e35

Browse files
authored
feat(llc, persistence): add avgResponseTime to User model (#2322)
1 parent dcd373e commit 72d6e35

File tree

13 files changed

+120
-3
lines changed

13 files changed

+120
-3
lines changed

packages/stream_chat/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
## Upcoming
22

3+
✅ Added
4+
5+
- Added `avgResponseTime` field to the `User` model to track average response time in seconds.
6+
37
🐞 Fixed
48

59
- Fixed `WebSocket` race condition where reconnection could access null user during disconnect.

packages/stream_chat/lib/src/core/models/own_user.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class OwnUser extends User {
3232
super.teams,
3333
super.language,
3434
super.teamsRole,
35+
super.avgResponseTime,
3536
});
3637

3738
/// Create a new instance from json.
@@ -55,6 +56,7 @@ class OwnUser extends User {
5556
teams: user.teams,
5657
language: user.language,
5758
teamsRole: user.teamsRole,
59+
avgResponseTime: user.avgResponseTime,
5860
);
5961

6062
/// Creates a copy of [OwnUser] with specified attributes overridden.
@@ -81,6 +83,7 @@ class OwnUser extends User {
8183
int? unreadThreads,
8284
String? language,
8385
Map<String, String>? teamsRole,
86+
int? avgResponseTime,
8487
}) =>
8588
OwnUser(
8689
id: id ?? this.id,
@@ -107,6 +110,7 @@ class OwnUser extends User {
107110
blockedUserIds: blockedUserIds ?? this.blockedUserIds,
108111
language: language ?? this.language,
109112
teamsRole: teamsRole ?? this.teamsRole,
113+
avgResponseTime: avgResponseTime ?? this.avgResponseTime,
110114
);
111115

112116
/// Returns a new [OwnUser] that is a combination of this ownUser
@@ -135,6 +139,7 @@ class OwnUser extends User {
135139
updatedAt: other.updatedAt,
136140
language: other.language,
137141
teamsRole: other.teamsRole,
142+
avgResponseTime: other.avgResponseTime,
138143
);
139144
}
140145

packages/stream_chat/lib/src/core/models/own_user.g.dart

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

packages/stream_chat/lib/src/core/models/user.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class User extends Equatable implements ComparableFieldProvider {
4747
this.teams = const [],
4848
this.language,
4949
this.teamsRole,
50+
this.avgResponseTime,
5051
}) :
5152
// For backwards compatibility, set 'name', 'image' in [extraData].
5253
extraData = {
@@ -74,6 +75,7 @@ class User extends Equatable implements ComparableFieldProvider {
7475
'teams',
7576
'language',
7677
'teams_role',
78+
'avg_response_time',
7779
];
7880

7981
/// User id.
@@ -143,6 +145,10 @@ class User extends Equatable implements ComparableFieldProvider {
143145
@JsonKey(includeIfNull: false)
144146
final Map< /*Team*/ String, /*Role*/ String>? teamsRole;
145147

148+
/// The average response time of the user in seconds.
149+
@JsonKey(includeToJson: false)
150+
final int? avgResponseTime;
151+
146152
/// Map of custom user extraData.
147153
final Map<String, Object?> extraData;
148154

@@ -171,6 +177,7 @@ class User extends Equatable implements ComparableFieldProvider {
171177
List<String>? teams,
172178
String? language,
173179
Map<String, String>? teamsRole,
180+
int? avgResponseTime,
174181
}) =>
175182
User(
176183
id: id ?? this.id,
@@ -190,6 +197,7 @@ class User extends Equatable implements ComparableFieldProvider {
190197
teams: teams ?? this.teams,
191198
language: language ?? this.language,
192199
teamsRole: teamsRole ?? this.teamsRole,
200+
avgResponseTime: avgResponseTime ?? this.avgResponseTime,
193201
);
194202

195203
@override
@@ -204,6 +212,7 @@ class User extends Equatable implements ComparableFieldProvider {
204212
teams,
205213
language,
206214
teamsRole,
215+
avgResponseTime,
207216
];
208217

209218
@override

packages/stream_chat/lib/src/core/models/user.g.dart

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

packages/stream_chat/test/fixtures/user.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,7 @@
1313
"created_at": "2021-08-03 12:39:21.817646",
1414
"updated_at": "2021-08-04 12:39:21.817646",
1515
"last_active" : "2021-08-05 12:39:21.817646",
16-
"language": "en"
16+
"language": "en",
17+
"teams_role": {"team-1": "admin", "team-2": "member"},
18+
"avg_response_time": 120
1719
}

packages/stream_chat/test/src/core/models/user_test.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ void main() {
1818
const online = true;
1919
const banned = true;
2020
const teams = ['team-1', 'team-2'];
21+
const teamsRole = {'team-1': 'admin', 'team-2': 'member'};
22+
const avgResponseTime = 120;
2123
const createdAtString = '2021-08-03 12:39:21.817646';
2224
const updatedAtString = '2021-08-04 12:39:21.817646';
2325
const lastActiveString = '2021-08-05 12:39:21.817646';
@@ -41,6 +43,8 @@ void main() {
4143
expect(user.updatedAt, DateTime.parse(updatedAtString));
4244
expect(user.lastActive, DateTime.parse(lastActiveString));
4345
expect(user.language, 'en');
46+
expect(user.teamsRole, teamsRole);
47+
expect(user.avgResponseTime, avgResponseTime);
4448
});
4549

4650
test('should serialize to json correctly', () {
@@ -62,6 +66,8 @@ void main() {
6266
online: banned,
6367
teams: const ['team-1', 'team-2'],
6468
language: 'fr',
69+
teamsRole: teamsRole,
70+
avgResponseTime: avgResponseTime,
6571
);
6672

6773
expect(user.toJson(), {
@@ -73,6 +79,7 @@ void main() {
7379
'extraDataDoubleTest': extraDataDoubleTest,
7480
'extraDataBoolTest': extraDataBoolTest,
7581
'language': 'fr',
82+
'teams_role': teamsRole,
7683
});
7784
});
7885

@@ -91,6 +98,8 @@ void main() {
9198
expect(newUser.updatedAt, user.updatedAt);
9299
expect(newUser.lastActive, user.lastActive);
93100
expect(newUser.language, user.language);
101+
expect(newUser.teamsRole, user.teamsRole);
102+
expect(newUser.avgResponseTime, user.avgResponseTime);
94103

95104
newUser = user.copyWith(
96105
id: 'test',
@@ -104,6 +113,8 @@ void main() {
104113
updatedAt: DateTime.parse('2021-05-04 12:39:21.817646'),
105114
lastActive: DateTime.parse('2021-05-06 12:39:21.817646'),
106115
language: 'it',
116+
teamsRole: {'new-team1': 'admin', 'new-team2': 'member'},
117+
avgResponseTime: 60,
107118
);
108119

109120
expect(newUser.id, 'test');
@@ -118,6 +129,8 @@ void main() {
118129
expect(newUser.updatedAt, DateTime.parse('2021-05-04 12:39:21.817646'));
119130
expect(newUser.lastActive, DateTime.parse('2021-05-06 12:39:21.817646'));
120131
expect(newUser.language, 'it');
132+
expect(newUser.teamsRole, {'new-team1': 'admin', 'new-team2': 'member'});
133+
expect(newUser.avgResponseTime, 60);
121134
});
122135

123136
test('name property and extraData manipulation', () {
@@ -202,6 +215,8 @@ void main() {
202215
expect(user.lastActive, null);
203216
expect(user.createdAt, null);
204217
expect(user.updatedAt, null);
218+
expect(user.teamsRole, null);
219+
expect(user.avgResponseTime, null);
205220
});
206221

207222
test('default values, parse json', () {
@@ -218,6 +233,8 @@ void main() {
218233
expect(user.lastActive, null);
219234
expect(user.createdAt, null);
220235
expect(user.updatedAt, null);
236+
expect(user.teamsRole, null);
237+
expect(user.avgResponseTime, null);
221238
});
222239

223240
group('ComparableFieldProvider', () {
@@ -449,6 +466,8 @@ User createTestUser({
449466
bool? banned,
450467
DateTime? lastActive,
451468
Map<String, Object?>? extraData,
469+
Map<String, String>? teamsRole,
470+
int? avgResponseTime,
452471
}) {
453472
return User(
454473
id: id,
@@ -457,5 +476,7 @@ User createTestUser({
457476
banned: banned ?? false,
458477
lastActive: lastActive,
459478
extraData: extraData ?? {},
479+
teamsRole: teamsRole,
480+
avgResponseTime: avgResponseTime,
460481
);
461482
}

packages/stream_chat_persistence/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
- Fixed draft message retrieval logic where channel drafts were incorrectly attached to all messages
66
instead of only thread drafts being attached to their respective parent messages.
77

8+
✅ Added
9+
10+
- Added support for `User.avgResponseTime` field.
11+
812
## 9.14.0
913

1014
- Updated `stream_chat` dependency to [`9.14.0`](https://pub.dev/packages/stream_chat/changelog).

packages/stream_chat_persistence/lib/src/db/drift_chat_database.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class DriftChatDatabase extends _$DriftChatDatabase {
5555

5656
// you should bump this number whenever you change or add a table definition.
5757
@override
58-
int get schemaVersion => 22;
58+
int get schemaVersion => 23;
5959

6060
@override
6161
MigrationStrategy get migration => MigrationStrategy(

0 commit comments

Comments
 (0)