fix(llc, core): fix message pagination parameters

This commit is contained in:
Salvatore Giordano
2022-05-13 11:45:36 +02:00
parent d5f449c04f
commit 4896c43342
9 changed files with 130 additions and 36 deletions
@@ -1,3 +1,5 @@
// ignore_for_file: deprecated_member_use_from_same_package
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
@@ -69,6 +71,11 @@ class PaginationParams extends Equatable {
this.greaterThanOrEqual, this.greaterThanOrEqual,
this.lessThan, this.lessThan,
this.lessThanOrEqual, this.lessThanOrEqual,
this.createdAtAfterOrEqual,
this.createdAtAfter,
this.createdAtBeforeOrEqual,
this.createdAtBefore,
this.createdAtAround,
}) : assert( }) : assert(
offset == null || offset == 0 || next == null, offset == null || offset == 0 || next == null,
'Cannot specify non-zero `offset` with `next` parameter', 'Cannot specify non-zero `offset` with `next` parameter',
@@ -82,9 +89,11 @@ class PaginationParams extends Equatable {
final int limit; final int limit;
/// The amount of items requested before message ID from the APIs. /// The amount of items requested before message ID from the APIs.
@Deprecated('before is deprecated, use limit instead')
final int before; final int before;
/// The amount of items requested after message ID from the APIs. /// The amount of items requested after message ID from the APIs.
@Deprecated('after is deprecated, use limit instead')
final int after; final int after;
/// The offset of requesting items. /// The offset of requesting items.
@@ -113,6 +122,26 @@ class PaginationParams extends Equatable {
@JsonKey(name: 'id_lte') @JsonKey(name: 'id_lte')
final String? lessThanOrEqual; 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 /// Serialize model to json
Map<String, dynamic> toJson() => _$PaginationParamsToJson(this); Map<String, dynamic> toJson() => _$PaginationParamsToJson(this);
@@ -128,6 +157,11 @@ class PaginationParams extends Equatable {
String? greaterThanOrEqual, String? greaterThanOrEqual,
String? lessThan, String? lessThan,
String? lessThanOrEqual, String? lessThanOrEqual,
DateTime? createdAtAfterOrEqual,
DateTime? createdAtAfter,
DateTime? createdAtBeforeOrEqual,
DateTime? createdAtBefore,
DateTime? createdAtAround,
}) => }) =>
PaginationParams( PaginationParams(
limit: limit ?? this.limit, limit: limit ?? this.limit,
@@ -140,6 +174,13 @@ class PaginationParams extends Equatable {
greaterThanOrEqual: greaterThanOrEqual ?? this.greaterThanOrEqual, greaterThanOrEqual: greaterThanOrEqual ?? this.greaterThanOrEqual,
lessThan: lessThan ?? this.lessThan, lessThan: lessThan ?? this.lessThan,
lessThanOrEqual: lessThanOrEqual ?? this.lessThanOrEqual, 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 @override
@@ -30,6 +30,21 @@ PaginationParams _$PaginationParamsFromJson(Map<String, dynamic> json) =>
greaterThanOrEqual: json['id_gte'] as String?, greaterThanOrEqual: json['id_gte'] as String?,
lessThan: json['id_lt'] as String?, lessThan: json['id_lt'] as String?,
lessThanOrEqual: json['id_lte'] 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) { Map<String, dynamic> _$PaginationParamsToJson(PaginationParams instance) {
@@ -52,6 +67,15 @@ Map<String, dynamic> _$PaginationParamsToJson(PaginationParams instance) {
writeNotNull('id_gte', instance.greaterThanOrEqual); writeNotNull('id_gte', instance.greaterThanOrEqual);
writeNotNull('id_lt', instance.lessThan); writeNotNull('id_lt', instance.lessThan);
writeNotNull('id_lte', instance.lessThanOrEqual); 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; return val;
} }
@@ -12,7 +12,7 @@ part of 'attachment_file.dart';
T _$identity<T>(T value) => value; T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError( 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) { UploadState _$UploadStateFromJson(Map<String, dynamic> json) {
switch (json['runtimeType']) { 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 /// @nodoc
mixin _$UploadState { mixin _$UploadState {
@optionalTypeArgs @optionalTypeArgs
@@ -121,7 +154,7 @@ class _$PreparingCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res>
/// @nodoc /// @nodoc
@JsonSerializable() @JsonSerializable()
class _$Preparing implements Preparing { 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) => factory _$Preparing.fromJson(Map<String, dynamic> json) =>
_$$PreparingFromJson(json); _$$PreparingFromJson(json);
@@ -140,7 +173,6 @@ class _$Preparing implements Preparing {
(other.runtimeType == runtimeType && other is Preparing); (other.runtimeType == runtimeType && other is Preparing);
} }
@JsonKey(ignore: true)
@override @override
int get hashCode => runtimeType.hashCode; int get hashCode => runtimeType.hashCode;
@@ -269,7 +301,7 @@ class _$InProgressCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res>
@JsonSerializable() @JsonSerializable()
class _$InProgress implements InProgress { class _$InProgress implements InProgress {
const _$InProgress( const _$InProgress(
{required this.uploaded, required this.total, final String? $type}) {required this.uploaded, required this.total, String? $type})
: $type = $type ?? 'inProgress'; : $type = $type ?? 'inProgress';
factory _$InProgress.fromJson(Map<String, dynamic> json) => factory _$InProgress.fromJson(Map<String, dynamic> json) =>
@@ -297,7 +329,6 @@ class _$InProgress implements InProgress {
const DeepCollectionEquality().equals(other.total, total)); const DeepCollectionEquality().equals(other.total, total));
} }
@JsonKey(ignore: true)
@override @override
int get hashCode => Object.hash( int get hashCode => Object.hash(
runtimeType, runtimeType,
@@ -390,14 +421,14 @@ class _$InProgress implements InProgress {
} }
abstract class InProgress implements UploadState { abstract class InProgress implements UploadState {
const factory InProgress( const factory InProgress({required int uploaded, required int total}) =
{required final int uploaded, required final int total}) = _$InProgress; _$InProgress;
factory InProgress.fromJson(Map<String, dynamic> json) = factory InProgress.fromJson(Map<String, dynamic> json) =
_$InProgress.fromJson; _$InProgress.fromJson;
int get uploaded => throw _privateConstructorUsedError; int get uploaded;
int get total => throw _privateConstructorUsedError; int get total;
@JsonKey(ignore: true) @JsonKey(ignore: true)
$InProgressCopyWith<InProgress> get copyWith => $InProgressCopyWith<InProgress> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@@ -422,7 +453,7 @@ class _$SuccessCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res>
/// @nodoc /// @nodoc
@JsonSerializable() @JsonSerializable()
class _$Success implements Success { 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) => factory _$Success.fromJson(Map<String, dynamic> json) =>
_$$SuccessFromJson(json); _$$SuccessFromJson(json);
@@ -441,7 +472,6 @@ class _$Success implements Success {
(other.runtimeType == runtimeType && other is Success); (other.runtimeType == runtimeType && other is Success);
} }
@JsonKey(ignore: true)
@override @override
int get hashCode => runtimeType.hashCode; int get hashCode => runtimeType.hashCode;
@@ -563,7 +593,7 @@ class _$FailedCopyWithImpl<$Res> extends _$UploadStateCopyWithImpl<$Res>
/// @nodoc /// @nodoc
@JsonSerializable() @JsonSerializable()
class _$Failed implements Failed { class _$Failed implements Failed {
const _$Failed({required this.error, final String? $type}) const _$Failed({required this.error, String? $type})
: $type = $type ?? 'failed'; : $type = $type ?? 'failed';
factory _$Failed.fromJson(Map<String, dynamic> json) => factory _$Failed.fromJson(Map<String, dynamic> json) =>
@@ -588,7 +618,6 @@ class _$Failed implements Failed {
const DeepCollectionEquality().equals(other.error, error)); const DeepCollectionEquality().equals(other.error, error));
} }
@JsonKey(ignore: true)
@override @override
int get hashCode => int get hashCode =>
Object.hash(runtimeType, const DeepCollectionEquality().hash(error)); Object.hash(runtimeType, const DeepCollectionEquality().hash(error));
@@ -679,11 +708,11 @@ class _$Failed implements Failed {
} }
abstract class Failed implements UploadState { 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; factory Failed.fromJson(Map<String, dynamic> json) = _$Failed.fromJson;
String get error => throw _privateConstructorUsedError; String get error;
@JsonKey(ignore: true) @JsonKey(ignore: true)
$FailedCopyWith<Failed> get copyWith => throw _privateConstructorUsedError; $FailedCopyWith<Failed> get copyWith => throw _privateConstructorUsedError;
} }
@@ -889,7 +889,7 @@ class _StreamMessageListViewState extends State<StreamMessageListView> {
initialIndex = 0; initialIndex = 0;
await streamChannel!.reloadChannel(); await streamChannel!.reloadChannel();
WidgetsBinding.instance?.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
_scrollController!.jumpTo(index: 0); _scrollController!.jumpTo(index: 0);
}); });
} else { } else {
@@ -1341,7 +1341,7 @@ class _StreamMessageListViewState extends State<StreamMessageListView> {
if (event.message?.parentId == widget.parentMessage?.id && if (event.message?.parentId == widget.parentMessage?.id &&
event.message!.user!.id == event.message!.user!.id ==
streamChannel!.channel.client.state.currentUser!.id) { streamChannel!.channel.client.state.currentUser!.id) {
WidgetsBinding.instance!.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
_scrollController?.scrollTo( _scrollController?.scrollTo(
index: 0, index: 0,
duration: const Duration(seconds: 1), duration: const Duration(seconds: 1),
@@ -1,3 +1,5 @@
// ignore_for_file: deprecated_member_use_from_same_package
import 'dart:async'; import 'dart:async';
import 'dart:math'; import 'dart:math';
@@ -1317,7 +1317,7 @@ void main() {
await setUpWidgetTest(tester, itemPositionsListener: itemPositionsListener); await setUpWidgetTest(tester, itemPositionsListener: itemPositionsListener);
final root = WidgetsBinding final root = WidgetsBinding
.instance!.pipelineOwner.semanticsOwner!.rootSemanticsNode!; .instance.pipelineOwner.semanticsOwner!.rootSemanticsNode!;
final semanticNodes = <SemanticsNode>[root]; final semanticNodes = <SemanticsNode>[root];
@@ -322,7 +322,7 @@ class _PagedValueListViewState<K, V> extends State<PagedValueListView<K, V>> {
index == newPageRequestTriggerIndex; index == newPageRequestTriggerIndex;
if (nextPageKey != null && isBuildingTriggerIndexItem) { if (nextPageKey != null && isBuildingTriggerIndexItem) {
// Schedules the request for the end of this frame. // Schedules the request for the end of this frame.
WidgetsBinding.instance?.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {
if (error == null) { if (error == null) {
await _controller.loadMore(nextPageKey); await _controller.loadMore(nextPageKey);
} }
@@ -678,7 +678,7 @@ class _PagedValueGridViewState<K, V> extends State<PagedValueGridView<K, V>> {
index == newPageRequestTriggerIndex; index == newPageRequestTriggerIndex;
if (nextPageKey != null && isBuildingTriggerIndexItem) { if (nextPageKey != null && isBuildingTriggerIndexItem) {
// Schedules the request for the end of this frame. // Schedules the request for the end of this frame.
WidgetsBinding.instance?.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {
if (error == null) { if (error == null) {
await _controller.loadMore(nextPageKey); await _controller.loadMore(nextPageKey);
} }
@@ -220,21 +220,20 @@ class StreamChannelState extends State<StreamChannel> {
/// Loads channel at specific message /// Loads channel at specific message
Future<void> loadChannelAtMessage( Future<void> loadChannelAtMessage(
String? messageId, { String? messageId, {
int before = 20, @Deprecated('before is deprecated, use limit instead') int before = 20,
int after = 20, @Deprecated('before is deprecated, use limit instead') int after = 20,
int limit = 20,
bool preferOffline = false, bool preferOffline = false,
}) => }) =>
_queryAtMessage( _queryAtMessage(
messageId: messageId, messageId: messageId,
before: before, limit: limit,
after: after,
preferOffline: preferOffline, preferOffline: preferOffline,
); );
Future<ChannelState?> _queryAtMessage({ Future<ChannelState?> _queryAtMessage({
String? messageId, String? messageId,
int before = 20, int limit = 20,
int after = 20,
bool preferOffline = false, bool preferOffline = false,
}) async { }) async {
if (channel.state == null) return null; if (channel.state == null) return null;
@@ -244,7 +243,7 @@ class StreamChannelState extends State<StreamChannel> {
if (messageId == null) { if (messageId == null) {
await channel.query( await channel.query(
messagesPagination: PaginationParams( messagesPagination: PaginationParams(
limit: before, limit: limit,
), ),
preferOffline: preferOffline, preferOffline: preferOffline,
); );
@@ -254,8 +253,7 @@ class StreamChannelState extends State<StreamChannel> {
return queryAroundMessage( return queryAroundMessage(
messageId, messageId,
before: before, limit: limit,
after: after,
preferOffline: preferOffline, preferOffline: preferOffline,
); );
} }
@@ -263,15 +261,15 @@ class StreamChannelState extends State<StreamChannel> {
/// ///
Future<ChannelState> queryAroundMessage( Future<ChannelState> queryAroundMessage(
String messageId, { String messageId, {
int before = 20, @Deprecated('before is deprecated, use limit instead') int before = 20,
int after = 20, @Deprecated('after is deprecated, use limit instead') int after = 20,
int limit = 20,
bool preferOffline = false, bool preferOffline = false,
}) => }) =>
channel.query( channel.query(
messagesPagination: PaginationParams( messagesPagination: PaginationParams(
idAround: messageId, idAround: messageId,
before: before, limit: limit,
after: after,
), ),
preferOffline: preferOffline, preferOffline: preferOffline,
); );
@@ -338,7 +336,7 @@ class StreamChannelState extends State<StreamChannel> {
} }
/// Reloads the channel with latest message /// Reloads the channel with latest message
Future<void> reloadChannel() => _queryAtMessage(before: 30); Future<void> reloadChannel() => _queryAtMessage(limit: 30);
late List<Future<bool>> _futures; late List<Future<bool>> _futures;
@@ -115,7 +115,7 @@ class StreamChatCoreState extends State<StreamChatCore>
@override @override
void initState() { void initState() {
super.initState(); super.initState();
WidgetsBinding.instance?.addObserver(this); WidgetsBinding.instance.addObserver(this);
_subscribeToConnectivityChange(widget.connectivityStream); _subscribeToConnectivityChange(widget.connectivityStream);
} }
@@ -207,7 +207,7 @@ class StreamChatCoreState extends State<StreamChatCore>
@override @override
void dispose() { void dispose() {
WidgetsBinding.instance?.removeObserver(this); WidgetsBinding.instance.removeObserver(this);
_unsubscribeFromConnectivityChange(); _unsubscribeFromConnectivityChange();
_eventSubscription?.cancel(); _eventSubscription?.cancel();
_disconnectTimer?.cancel(); _disconnectTimer?.cancel();