Merge pull request #1144 from GetStream/hotfix/messagePagination

fix(llc, core): fix message pagination parameters
This commit is contained in:
Salvatore Giordano
2022-05-17 10:36:44 +02:00
committed by GitHub
8 changed files with 145 additions and 31 deletions
+14
View File
@@ -1,3 +1,17 @@
## Upcoming
✅ Added
- Added `PaginationParams.createdAtAfterOrEqual` for message pagination.
- Added `PaginationParams.createdAtAfter` for message pagination.
- Added `PaginationParams.createdAtBeforeOrEqual` for message pagination.
- Added `PaginationParams.createdAtBefore` for message pagination.
- Added `PaginationParams.createdAtAround` for message pagination.
🔄 Changed
- Deprecated `PaginationParams.before` and `PaginationParams.after`. Use `PaginationParams.limit` instead.
## 4.1.0
✅ Added
@@ -1,3 +1,5 @@
// ignore_for_file: deprecated_member_use_from_same_package
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
@@ -69,6 +71,11 @@ class PaginationParams extends Equatable {
this.greaterThanOrEqual,
this.lessThan,
this.lessThanOrEqual,
this.createdAtAfterOrEqual,
this.createdAtAfter,
this.createdAtBeforeOrEqual,
this.createdAtBefore,
this.createdAtAround,
}) : assert(
offset == null || offset == 0 || next == null,
'Cannot specify non-zero `offset` with `next` parameter',
@@ -82,9 +89,11 @@ class PaginationParams extends Equatable {
final int limit;
/// The amount of items requested before message ID from the APIs.
@Deprecated('before is deprecated, use limit instead')
final int before;
/// The amount of items requested after message ID from the APIs.
@Deprecated('after is deprecated, use limit instead')
final int after;
/// The offset of requesting items.
@@ -113,6 +122,26 @@ class PaginationParams extends Equatable {
@JsonKey(name: 'id_lte')
final String? lessThanOrEqual;
/// Filter on createdAt greater than or equal the given value.
@JsonKey(name: 'created_at_after_or_equal')
final DateTime? createdAtAfterOrEqual;
/// Filter on createdAt greater than the given value.
@JsonKey(name: 'created_at_after')
final DateTime? createdAtAfter;
/// Filter on createdAt smaller than or equal the given value.
@JsonKey(name: 'created_at_before_or_equal')
final DateTime? createdAtBeforeOrEqual;
/// Filter on createdAt smaller than the given value.
@JsonKey(name: 'created_at_before')
final DateTime? createdAtBefore;
/// Filter on createdAt around the given value.
@JsonKey(name: 'created_at_around')
final DateTime? createdAtAround;
/// Serialize model to json
Map<String, dynamic> toJson() => _$PaginationParamsToJson(this);
@@ -128,6 +157,11 @@ class PaginationParams extends Equatable {
String? greaterThanOrEqual,
String? lessThan,
String? lessThanOrEqual,
DateTime? createdAtAfterOrEqual,
DateTime? createdAtAfter,
DateTime? createdAtBeforeOrEqual,
DateTime? createdAtBefore,
DateTime? createdAtAround,
}) =>
PaginationParams(
limit: limit ?? this.limit,
@@ -140,6 +174,13 @@ class PaginationParams extends Equatable {
greaterThanOrEqual: greaterThanOrEqual ?? this.greaterThanOrEqual,
lessThan: lessThan ?? this.lessThan,
lessThanOrEqual: lessThanOrEqual ?? this.lessThanOrEqual,
createdAtAfterOrEqual:
createdAtAfterOrEqual ?? this.createdAtAfterOrEqual,
createdAtAfter: createdAtAfter ?? this.createdAtAfter,
createdAtBeforeOrEqual:
createdAtBeforeOrEqual ?? this.createdAtBeforeOrEqual,
createdAtBefore: createdAtBefore ?? this.createdAtBefore,
createdAtAround: createdAtAround ?? this.createdAtAround,
);
@override
@@ -30,6 +30,21 @@ PaginationParams _$PaginationParamsFromJson(Map<String, dynamic> json) =>
greaterThanOrEqual: json['id_gte'] as String?,
lessThan: json['id_lt'] as String?,
lessThanOrEqual: json['id_lte'] as String?,
createdAtAfterOrEqual: json['created_at_after_or_equal'] == null
? null
: DateTime.parse(json['created_at_after_or_equal'] as String),
createdAtAfter: json['created_at_after'] == null
? null
: DateTime.parse(json['created_at_after'] as String),
createdAtBeforeOrEqual: json['created_at_before_or_equal'] == null
? null
: DateTime.parse(json['created_at_before_or_equal'] as String),
createdAtBefore: json['created_at_before'] == null
? null
: DateTime.parse(json['created_at_before'] as String),
createdAtAround: json['created_at_around'] == null
? null
: DateTime.parse(json['created_at_around'] as String),
);
Map<String, dynamic> _$PaginationParamsToJson(PaginationParams instance) {
@@ -52,6 +67,15 @@ Map<String, dynamic> _$PaginationParamsToJson(PaginationParams instance) {
writeNotNull('id_gte', instance.greaterThanOrEqual);
writeNotNull('id_lt', instance.lessThan);
writeNotNull('id_lte', instance.lessThanOrEqual);
writeNotNull('created_at_after_or_equal',
instance.createdAtAfterOrEqual?.toIso8601String());
writeNotNull('created_at_after', instance.createdAtAfter?.toIso8601String());
writeNotNull('created_at_before_or_equal',
instance.createdAtBeforeOrEqual?.toIso8601String());
writeNotNull(
'created_at_before', instance.createdAtBefore?.toIso8601String());
writeNotNull(
'created_at_around', instance.createdAtAround?.toIso8601String());
return val;
}
@@ -12,7 +12,7 @@ part of 'attachment_file.dart';
T _$identity<T>(T value) => value;
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 information: https://github.com/rrousselGit/freezed#custom-getters-and-methods');
'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']) {
@@ -31,6 +31,39 @@ UploadState _$UploadStateFromJson(Map<String, dynamic> json) {
}
}
/// @nodoc
class _$UploadStateTearOff {
const _$UploadStateTearOff();
Preparing preparing() {
return const Preparing();
}
InProgress inProgress({required int uploaded, required int total}) {
return InProgress(
uploaded: uploaded,
total: total,
);
}
Success success() {
return const Success();
}
Failed failed({required String error}) {
return Failed(
error: error,
);
}
UploadState fromJson(Map<String, Object?> json) {
return UploadState.fromJson(json);
}
}
/// @nodoc
const $UploadState = _$UploadStateTearOff();
/// @nodoc
mixin _$UploadState {
@optionalTypeArgs
@@ -123,7 +156,7 @@ class __$$PreparingCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res>
/// @nodoc
@JsonSerializable()
class _$Preparing implements Preparing {
const _$Preparing({final String? $type}) : $type = $type ?? 'preparing';
const _$Preparing({String? $type}) : $type = $type ?? 'preparing';
factory _$Preparing.fromJson(Map<String, dynamic> json) =>
_$$PreparingFromJson(json);
@@ -142,7 +175,6 @@ class _$Preparing implements Preparing {
(other.runtimeType == runtimeType && other is _$Preparing);
}
@JsonKey(ignore: true)
@override
int get hashCode => runtimeType.hashCode;
@@ -272,7 +304,7 @@ class __$$InProgressCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res>
@JsonSerializable()
class _$InProgress implements InProgress {
const _$InProgress(
{required this.uploaded, required this.total, final String? $type})
{required this.uploaded, required this.total, String? $type})
: $type = $type ?? 'inProgress';
factory _$InProgress.fromJson(Map<String, dynamic> json) =>
@@ -300,7 +332,6 @@ class _$InProgress implements InProgress {
const DeepCollectionEquality().equals(other.total, total));
}
@JsonKey(ignore: true)
@override
int get hashCode => Object.hash(
runtimeType,
@@ -393,14 +424,14 @@ class _$InProgress implements InProgress {
}
abstract class InProgress implements UploadState {
const factory InProgress(
{required final int uploaded, required final int total}) = _$InProgress;
const factory InProgress({required int uploaded, required int total}) =
_$InProgress;
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;
@@ -425,7 +456,7 @@ class __$$SuccessCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res>
/// @nodoc
@JsonSerializable()
class _$Success implements Success {
const _$Success({final String? $type}) : $type = $type ?? 'success';
const _$Success({String? $type}) : $type = $type ?? 'success';
factory _$Success.fromJson(Map<String, dynamic> json) =>
_$$SuccessFromJson(json);
@@ -444,7 +475,6 @@ class _$Success implements Success {
(other.runtimeType == runtimeType && other is _$Success);
}
@JsonKey(ignore: true)
@override
int get hashCode => runtimeType.hashCode;
@@ -566,7 +596,7 @@ class __$$FailedCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res>
/// @nodoc
@JsonSerializable()
class _$Failed implements Failed {
const _$Failed({required this.error, final String? $type})
const _$Failed({required this.error, String? $type})
: $type = $type ?? 'failed';
factory _$Failed.fromJson(Map<String, dynamic> json) =>
@@ -591,7 +621,6 @@ class _$Failed implements Failed {
const DeepCollectionEquality().equals(other.error, error));
}
@JsonKey(ignore: true)
@override
int get hashCode =>
Object.hash(runtimeType, const DeepCollectionEquality().hash(error));
@@ -682,11 +711,11 @@ class _$Failed implements Failed {
}
abstract class Failed implements UploadState {
const factory Failed({required final String error}) = _$Failed;
const factory Failed({required String error}) = _$Failed;
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;
@@ -1,3 +1,5 @@
// ignore_for_file: deprecated_member_use_from_same_package
import 'dart:async';
import 'dart:math';
@@ -1,3 +1,10 @@
## Upcoming
🔄 Changed
- Deprecated `before` and `after` parameters in `StreamChannel.queryAroundMessage`. Use `limit` instead.
- Deprecated `before` and `after` parameters in `StreamChannel.loadChannelAtMessage`. Use `limit` instead.
## 4.1.0
- Updated `stream_chat` dependency to [`4.1.0`](https://pub.dev/packages/stream_chat/changelog).
@@ -220,21 +220,20 @@ class StreamChannelState extends State<StreamChannel> {
/// Loads channel at specific message
Future<void> loadChannelAtMessage(
String? messageId, {
int before = 20,
int after = 20,
@Deprecated('before is deprecated, use limit instead') int before = 20,
@Deprecated('after is deprecated, use limit instead') int after = 20,
int limit = 20,
bool preferOffline = false,
}) =>
_queryAtMessage(
messageId: messageId,
before: before,
after: after,
limit: limit,
preferOffline: preferOffline,
);
Future<ChannelState?> _queryAtMessage({
String? messageId,
int before = 20,
int after = 20,
int limit = 20,
bool preferOffline = false,
}) async {
if (channel.state == null) return null;
@@ -244,7 +243,7 @@ class StreamChannelState extends State<StreamChannel> {
if (messageId == null) {
await channel.query(
messagesPagination: PaginationParams(
limit: before,
limit: limit,
),
preferOffline: preferOffline,
);
@@ -254,8 +253,7 @@ class StreamChannelState extends State<StreamChannel> {
return queryAroundMessage(
messageId,
before: before,
after: after,
limit: limit,
preferOffline: preferOffline,
);
}
@@ -263,15 +261,15 @@ class StreamChannelState extends State<StreamChannel> {
///
Future<ChannelState> queryAroundMessage(
String messageId, {
int before = 20,
int after = 20,
@Deprecated('before is deprecated, use limit instead') int before = 20,
@Deprecated('after is deprecated, use limit instead') int after = 20,
int limit = 20,
bool preferOffline = false,
}) =>
channel.query(
messagesPagination: PaginationParams(
idAround: messageId,
before: before,
after: after,
limit: limit,
),
preferOffline: preferOffline,
);
@@ -338,7 +336,7 @@ class StreamChannelState extends State<StreamChannel> {
}
/// Reloads the channel with latest message
Future<void> reloadChannel() => _queryAtMessage(before: 30);
Future<void> reloadChannel() => _queryAtMessage(limit: 30);
late List<Future<bool>> _futures;
@@ -211,8 +211,7 @@ void main() {
final paginationParams = PaginationParams(
idAround: initialMessageId,
after: 20,
before: 20,
limit: 20,
);
when(() => mockChannel.initialized).thenAnswer((_) async => true);