diff --git a/lib/data/mappers/cats_mapper.dart b/lib/data/mappers/cats_mapper.dart index e8d8515..2dccbd2 100644 --- a/lib/data/mappers/cats_mapper.dart +++ b/lib/data/mappers/cats_mapper.dart @@ -5,7 +5,7 @@ import '../../domain/models/home.dart'; const _imagePlaceholder = 'https://upload.wikimedia.org/wikipedia/en/archive/b/b1/20210811082420%21Portrait_placeholder.png'; -extension CharactersDtoToModel on CatsDto { +extension CatsDtoToModel on CatsDto { HomeData toDomain() => HomeData( data: data?.map((e) => e.toDomain()).toList(), ); diff --git a/lib/data/repositories/cats_repository.dart b/lib/data/repositories/cats_repository.dart index 79bd0d3..c50ba3f 100644 --- a/lib/data/repositories/cats_repository.dart +++ b/lib/data/repositories/cats_repository.dart @@ -21,19 +21,18 @@ class CatsRepository extends ApiInterface { Future loadData({ OnErrorCallback? onError, String? q, - int page = 1, + int offset = 0, int pageSize = 20, }) async { try { const String url = '/v1/cats?min_weight=1'; - final int offset = (page - 1) * pageSize; - final Response response = await _dio.get( url, queryParameters: { 'name': q, 'offset': offset, + 'limit': pageSize, }, ); diff --git a/lib/domain/models/home.dart b/lib/domain/models/home.dart index 4f1fbf6..12a9508 100644 --- a/lib/domain/models/home.dart +++ b/lib/domain/models/home.dart @@ -2,7 +2,7 @@ import 'card.dart'; class HomeData { final List? data; - final int? nextPage; + final int? offset; - HomeData({this.data, this.nextPage}); + HomeData({this.data, this.offset}); } \ No newline at end of file diff --git a/lib/presentation/home_page/bloc/bloc.dart b/lib/presentation/home_page/bloc/bloc.dart index 2164b0f..d7c5051 100644 --- a/lib/presentation/home_page/bloc/bloc.dart +++ b/lib/presentation/home_page/bloc/bloc.dart @@ -11,7 +11,7 @@ class HomeBloc extends Bloc { } Future _onLoadData(HomeLoadDataEvent event, Emitter emit) async { - if (event.nextPage == null) { + if (event.offset == 0) { emit(state.copyWith(isLoading: true)); } else { emit(state.copyWith(isPaginationLoading: true)); @@ -21,19 +21,27 @@ class HomeBloc extends Bloc { final data = await repo.loadData( q: event.search, - page: event.nextPage ?? 1, onError: (e) => error = e, + offset: event.offset, ); - if (event.nextPage != null) { - data?.data?.insertAll(0, state.data?.data ?? []); - } + if (data != null) { + final updatedData = (event.offset == 0 + ? data.data + : [...state.data?.data ?? [], ...data.data ?? []]); - emit(state.copyWith( - isLoading: false, - isPaginationLoading: false, - data: data, - error: error, - )); + emit(state.copyWith( + isLoading: false, + isPaginationLoading: false, + data: HomeData(data: updatedData), + error: error, + )); + } else { + emit(state.copyWith( + isLoading: false, + isPaginationLoading: false, + error: error, + )); + } } } \ No newline at end of file diff --git a/lib/presentation/home_page/bloc/events.dart b/lib/presentation/home_page/bloc/events.dart index 025c2b0..49e56e6 100644 --- a/lib/presentation/home_page/bloc/events.dart +++ b/lib/presentation/home_page/bloc/events.dart @@ -4,7 +4,7 @@ abstract class HomeEvent { class HomeLoadDataEvent extends HomeEvent { final String? search; - final int? nextPage; + final int offset; - const HomeLoadDataEvent({this.search, this.nextPage}); + const HomeLoadDataEvent({this.search, this.offset = 0}); } \ No newline at end of file diff --git a/lib/presentation/home_page/bloc/state.dart b/lib/presentation/home_page/bloc/state.dart index f8f91c5..8446dd9 100644 --- a/lib/presentation/home_page/bloc/state.dart +++ b/lib/presentation/home_page/bloc/state.dart @@ -7,12 +7,14 @@ part 'state.g.dart'; @CopyWith() class HomeState extends Equatable { final HomeData? data; + final int offset; final bool isLoading; final bool isPaginationLoading; final String? error; const HomeState({ this.data, + this.offset = 0, this.isLoading = false, this.isPaginationLoading = false, this.error, @@ -21,6 +23,7 @@ class HomeState extends Equatable { @override List get props => [ data, + offset, isLoading, isPaginationLoading, error, diff --git a/lib/presentation/home_page/bloc/state.g.dart b/lib/presentation/home_page/bloc/state.g.dart index 114ac25..2cf8db1 100644 --- a/lib/presentation/home_page/bloc/state.g.dart +++ b/lib/presentation/home_page/bloc/state.g.dart @@ -9,6 +9,8 @@ part of 'state.dart'; abstract class _$HomeStateCWProxy { HomeState data(HomeData? data); + HomeState offset(int offset); + HomeState isLoading(bool isLoading); HomeState isPaginationLoading(bool isPaginationLoading); @@ -23,6 +25,7 @@ abstract class _$HomeStateCWProxy { /// ```` HomeState call({ HomeData? data, + int? offset, bool? isLoading, bool? isPaginationLoading, String? error, @@ -38,6 +41,9 @@ class _$HomeStateCWProxyImpl implements _$HomeStateCWProxy { @override HomeState data(HomeData? data) => this(data: data); + @override + HomeState offset(int offset) => this(offset: offset); + @override HomeState isLoading(bool isLoading) => this(isLoading: isLoading); @@ -58,6 +64,7 @@ class _$HomeStateCWProxyImpl implements _$HomeStateCWProxy { /// ```` HomeState call({ Object? data = const $CopyWithPlaceholder(), + Object? offset = const $CopyWithPlaceholder(), Object? isLoading = const $CopyWithPlaceholder(), Object? isPaginationLoading = const $CopyWithPlaceholder(), Object? error = const $CopyWithPlaceholder(), @@ -67,6 +74,10 @@ class _$HomeStateCWProxyImpl implements _$HomeStateCWProxy { ? _value.data // ignore: cast_nullable_to_non_nullable : data as HomeData?, + offset: offset == const $CopyWithPlaceholder() || offset == null + ? _value.offset + // ignore: cast_nullable_to_non_nullable + : offset as int, isLoading: isLoading == const $CopyWithPlaceholder() || isLoading == null ? _value.isLoading // ignore: cast_nullable_to_non_nullable