Merge pull request #793 from GetStream/hotfix/event

fix(llc): ChannelEvent.membersCount default to 0
This commit is contained in:
Salvatore Giordano
2021-11-26 14:59:15 +01:00
committed by GitHub
9 changed files with 74 additions and 43 deletions
+3 -2
View File
@@ -7,8 +7,9 @@
🐞 Fixed
- `closeConnection()` now uses `normalClosure` status when closing websocket.
- Fixed local unread count indicator increasing for thread replies
- Fixed user presence indicator not updating correctly
- Fixed local unread count indicator increasing for thread replies.
- Fixed user presence indicator not updating correctly.
- `ChannelEvent.membersCount` defaults to 0 avoiding parsing errors due to missing `members_count` field.
## 3.2.0
@@ -1432,6 +1432,7 @@ class ClientState {
.listen((Event event) async {
final eventChannel = event.channel!;
await _client.chatPersistenceClient?.deleteChannels([eventChannel.cid]);
channels[eventChannel.cid]?.dispose();
channels = channels..remove(eventChannel.cid);
}));
}
@@ -14,7 +14,7 @@ final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods');
UploadState _$UploadStateFromJson(Map<String, dynamic> json) {
switch (json['runtimeType'] as String?) {
switch (json['runtimeType']) {
case 'preparing':
return Preparing.fromJson(json);
case 'inProgress':
@@ -55,7 +55,7 @@ class _$UploadStateTearOff {
);
}
UploadState fromJson(Map<String, Object> json) {
UploadState fromJson(Map<String, Object?> json) {
return UploadState.fromJson(json);
}
}
@@ -153,11 +153,14 @@ class _$PreparingCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res>
/// @nodoc
@JsonSerializable()
class _$Preparing implements Preparing {
const _$Preparing();
const _$Preparing({String? $type}) : $type = $type ?? 'preparing';
factory _$Preparing.fromJson(Map<String, dynamic> json) =>
_$$PreparingFromJson(json);
@JsonKey(name: 'runtimeType')
final String $type;
@override
String toString() {
return 'UploadState.preparing()';
@@ -165,7 +168,8 @@ class _$Preparing implements Preparing {
@override
bool operator ==(dynamic other) {
return identical(this, other) || (other is Preparing);
return identical(this, other) ||
(other.runtimeType == runtimeType && other is Preparing);
}
@override
@@ -247,7 +251,7 @@ class _$Preparing implements Preparing {
@override
Map<String, dynamic> toJson() {
return _$$PreparingToJson(this)..['runtimeType'] = 'preparing';
return _$$PreparingToJson(this);
}
}
@@ -295,7 +299,9 @@ class _$InProgressCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res>
/// @nodoc
@JsonSerializable()
class _$InProgress implements InProgress {
const _$InProgress({required this.uploaded, required this.total});
const _$InProgress(
{required this.uploaded, required this.total, String? $type})
: $type = $type ?? 'inProgress';
factory _$InProgress.fromJson(Map<String, dynamic> json) =>
_$$InProgressFromJson(json);
@@ -305,6 +311,9 @@ class _$InProgress implements InProgress {
@override
final int total;
@JsonKey(name: 'runtimeType')
final String $type;
@override
String toString() {
return 'UploadState.inProgress(uploaded: $uploaded, total: $total)';
@@ -313,19 +322,15 @@ class _$InProgress implements InProgress {
@override
bool operator ==(dynamic other) {
return identical(this, other) ||
(other is InProgress &&
(other.runtimeType == runtimeType &&
other is InProgress &&
(identical(other.uploaded, uploaded) ||
const DeepCollectionEquality()
.equals(other.uploaded, uploaded)) &&
(identical(other.total, total) ||
const DeepCollectionEquality().equals(other.total, total)));
other.uploaded == uploaded) &&
(identical(other.total, total) || other.total == total));
}
@override
int get hashCode =>
runtimeType.hashCode ^
const DeepCollectionEquality().hash(uploaded) ^
const DeepCollectionEquality().hash(total);
int get hashCode => Object.hash(runtimeType, uploaded, total);
@JsonKey(ignore: true)
@override
@@ -408,7 +413,7 @@ class _$InProgress implements InProgress {
@override
Map<String, dynamic> toJson() {
return _$$InProgressToJson(this)..['runtimeType'] = 'inProgress';
return _$$InProgressToJson(this);
}
}
@@ -419,8 +424,8 @@ abstract class InProgress implements UploadState {
factory InProgress.fromJson(Map<String, dynamic> json) =
_$InProgress.fromJson;
int get uploaded => throw _privateConstructorUsedError;
int get total => throw _privateConstructorUsedError;
int get uploaded;
int get total;
@JsonKey(ignore: true)
$InProgressCopyWith<InProgress> get copyWith =>
throw _privateConstructorUsedError;
@@ -445,11 +450,14 @@ class _$SuccessCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res>
/// @nodoc
@JsonSerializable()
class _$Success implements Success {
const _$Success();
const _$Success({String? $type}) : $type = $type ?? 'success';
factory _$Success.fromJson(Map<String, dynamic> json) =>
_$$SuccessFromJson(json);
@JsonKey(name: 'runtimeType')
final String $type;
@override
String toString() {
return 'UploadState.success()';
@@ -457,7 +465,8 @@ class _$Success implements Success {
@override
bool operator ==(dynamic other) {
return identical(this, other) || (other is Success);
return identical(this, other) ||
(other.runtimeType == runtimeType && other is Success);
}
@override
@@ -539,7 +548,7 @@ class _$Success implements Success {
@override
Map<String, dynamic> toJson() {
return _$$SuccessToJson(this)..['runtimeType'] = 'success';
return _$$SuccessToJson(this);
}
}
@@ -581,7 +590,8 @@ class _$FailedCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res>
/// @nodoc
@JsonSerializable()
class _$Failed implements Failed {
const _$Failed({required this.error});
const _$Failed({required this.error, String? $type})
: $type = $type ?? 'failed';
factory _$Failed.fromJson(Map<String, dynamic> json) =>
_$$FailedFromJson(json);
@@ -589,6 +599,9 @@ class _$Failed implements Failed {
@override
final String error;
@JsonKey(name: 'runtimeType')
final String $type;
@override
String toString() {
return 'UploadState.failed(error: $error)';
@@ -597,14 +610,13 @@ class _$Failed implements Failed {
@override
bool operator ==(dynamic other) {
return identical(this, other) ||
(other is Failed &&
(identical(other.error, error) ||
const DeepCollectionEquality().equals(other.error, error)));
(other.runtimeType == runtimeType &&
other is Failed &&
(identical(other.error, error) || other.error == error));
}
@override
int get hashCode =>
runtimeType.hashCode ^ const DeepCollectionEquality().hash(error);
int get hashCode => Object.hash(runtimeType, error);
@JsonKey(ignore: true)
@override
@@ -687,7 +699,7 @@ class _$Failed implements Failed {
@override
Map<String, dynamic> toJson() {
return _$$FailedToJson(this)..['runtimeType'] = 'failed';
return _$$FailedToJson(this);
}
}
@@ -696,7 +708,7 @@ abstract class Failed implements UploadState {
factory Failed.fromJson(Map<String, dynamic> json) = _$Failed.fromJson;
String get error => throw _privateConstructorUsedError;
String get error;
@JsonKey(ignore: true)
$FailedCopyWith<Failed> get copyWith => throw _privateConstructorUsedError;
}
@@ -22,31 +22,42 @@ Map<String, dynamic> _$AttachmentFileToJson(AttachmentFile instance) =>
'size': instance.size,
};
_$Preparing _$$PreparingFromJson(Map<String, dynamic> json) => _$Preparing();
_$Preparing _$$PreparingFromJson(Map<String, dynamic> json) => _$Preparing(
$type: json['runtimeType'] as String?,
);
Map<String, dynamic> _$$PreparingToJson(_$Preparing instance) =>
<String, dynamic>{};
<String, dynamic>{
'runtimeType': instance.$type,
};
_$InProgress _$$InProgressFromJson(Map<String, dynamic> json) => _$InProgress(
uploaded: json['uploaded'] as int,
total: json['total'] as int,
$type: json['runtimeType'] as String?,
);
Map<String, dynamic> _$$InProgressToJson(_$InProgress instance) =>
<String, dynamic>{
'uploaded': instance.uploaded,
'total': instance.total,
'runtimeType': instance.$type,
};
_$Success _$$SuccessFromJson(Map<String, dynamic> json) => _$Success();
_$Success _$$SuccessFromJson(Map<String, dynamic> json) => _$Success(
$type: json['runtimeType'] as String?,
);
Map<String, dynamic> _$$SuccessToJson(_$Success instance) =>
<String, dynamic>{};
Map<String, dynamic> _$$SuccessToJson(_$Success instance) => <String, dynamic>{
'runtimeType': instance.$type,
};
_$Failed _$$FailedFromJson(Map<String, dynamic> json) => _$Failed(
error: json['error'] as String,
$type: json['runtimeType'] as String?,
);
Map<String, dynamic> _$$FailedToJson(_$Failed instance) => <String, dynamic>{
'error': instance.error,
'runtimeType': instance.$type,
};
@@ -181,7 +181,7 @@ class EventChannel extends ChannelModel {
required DateTime createdAt,
required DateTime updatedAt,
DateTime? deletedAt,
required int memberCount,
int memberCount = 0,
Map<String, Object?>? extraData,
int cooldown = 0,
String? team,
@@ -82,7 +82,7 @@ EventChannel _$EventChannelFromJson(Map<String, dynamic> json) => EventChannel(
deletedAt: json['deleted_at'] == null
? null
: DateTime.parse(json['deleted_at'] as String),
memberCount: json['member_count'] as int,
memberCount: json['member_count'] as int? ?? 0,
extraData: json['extra_data'] as Map<String, dynamic>?,
cooldown: json['cooldown'] as int? ?? 0,
team: json['team'] as String?,
@@ -310,7 +310,10 @@ class WebSocket with TimerHelper {
Event? event;
try {
event = Event.fromJson(jsonData);
} catch (_) {}
} catch (e, stk) {
_logger?.warning('Error parsing an event: $e');
_logger?.warning('Stack trace: $stk');
}
if (event == null) return;
+3 -3
View File
@@ -13,10 +13,10 @@ dependencies:
collection: ^1.15.0
dio: ^4.0.0
equatable: ^2.0.0
freezed_annotation: ^0.15.0
freezed_annotation: ^1.0.0
http_parser: ^4.0.0
jose: ^0.3.2
json_annotation: ^4.0.1
json_annotation: ^4.3.0
logging: ^1.0.1
meta: ^1.3.0
mime: ^1.0.0
@@ -28,7 +28,7 @@ dependencies:
dev_dependencies:
build_runner: ^2.0.1
dart_code_metrics: ^4.4.0
freezed: ^0.15.0+1
freezed: ^1.0.0
json_serializable: ^6.0.1
mocktail: ^0.2.0
test: ^1.17.12
@@ -157,7 +157,10 @@ class ChannelListCoreState extends State<ChannelListCore> {
presence: widget.presence,
memberLimit: widget.memberLimit,
messageLimit: widget.messageLimit,
paginationParams: PaginationParams(limit: widget.limit),
paginationParams: PaginationParams(
limit: widget.limit,
offset: 0,
),
);
/// Fetches more channels with updated pagination and updates the widget