feat(ui): Hide the button when scrolled to the bottom

This commit is contained in:
2023-04-12 16:11:05 +02:00
parent 99021f2668
commit d38ee1692b
9 changed files with 396 additions and 167 deletions

View File

@@ -26,6 +26,7 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
on<MangaUpdatedEvent>(_onMangaUpdated);
on<AnimeRemovedEvent>(_onAnimeRemoved);
on<MangaRemovedEvent>(_onMangaRemoved);
on<AddButtonVisibilitySetEvent>(_onButtonVisibilityToggled);
}
/// Internal anime state
@@ -162,6 +163,7 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
emit(
state.copyWith(
trackingType: event.type,
buttonVisibility: true,
),
);
}
@@ -281,4 +283,12 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
// Update the database
await GetIt.I.get<DatabaseService>().deleteManga(event.id);
}
Future<void> _onButtonVisibilityToggled(AddButtonVisibilitySetEvent event, Emitter<AnimeListState> emit) async {
emit(
state.copyWith(
buttonVisibility: event.state,
),
);
}
}

View File

@@ -16,6 +16,7 @@ final _privateConstructorUsedError = UnsupportedError(
/// @nodoc
mixin _$AnimeListState {
bool get buttonVisibility => throw _privateConstructorUsedError;
List<AnimeTrackingData> get animes => throw _privateConstructorUsedError;
List<MangaTrackingData> get mangas => throw _privateConstructorUsedError;
MediumTrackingState get animeFilterState =>
@@ -35,7 +36,8 @@ abstract class $AnimeListStateCopyWith<$Res> {
AnimeListState value, $Res Function(AnimeListState) then) =
_$AnimeListStateCopyWithImpl<$Res>;
$Res call(
{List<AnimeTrackingData> animes,
{bool buttonVisibility,
List<AnimeTrackingData> animes,
List<MangaTrackingData> mangas,
MediumTrackingState animeFilterState,
MediumTrackingState mangaFilterState,
@@ -53,6 +55,7 @@ class _$AnimeListStateCopyWithImpl<$Res>
@override
$Res call({
Object? buttonVisibility = freezed,
Object? animes = freezed,
Object? mangas = freezed,
Object? animeFilterState = freezed,
@@ -60,6 +63,10 @@ class _$AnimeListStateCopyWithImpl<$Res>
Object? trackingType = freezed,
}) {
return _then(_value.copyWith(
buttonVisibility: buttonVisibility == freezed
? _value.buttonVisibility
: buttonVisibility // ignore: cast_nullable_to_non_nullable
as bool,
animes: animes == freezed
? _value.animes
: animes // ignore: cast_nullable_to_non_nullable
@@ -92,7 +99,8 @@ abstract class _$$_AnimeListStateCopyWith<$Res>
__$$_AnimeListStateCopyWithImpl<$Res>;
@override
$Res call(
{List<AnimeTrackingData> animes,
{bool buttonVisibility,
List<AnimeTrackingData> animes,
List<MangaTrackingData> mangas,
MediumTrackingState animeFilterState,
MediumTrackingState mangaFilterState,
@@ -112,6 +120,7 @@ class __$$_AnimeListStateCopyWithImpl<$Res>
@override
$Res call({
Object? buttonVisibility = freezed,
Object? animes = freezed,
Object? mangas = freezed,
Object? animeFilterState = freezed,
@@ -119,6 +128,10 @@ class __$$_AnimeListStateCopyWithImpl<$Res>
Object? trackingType = freezed,
}) {
return _then(_$_AnimeListState(
buttonVisibility: buttonVisibility == freezed
? _value.buttonVisibility
: buttonVisibility // ignore: cast_nullable_to_non_nullable
as bool,
animes: animes == freezed
? _value._animes
: animes // ignore: cast_nullable_to_non_nullable
@@ -147,7 +160,8 @@ class __$$_AnimeListStateCopyWithImpl<$Res>
class _$_AnimeListState implements _AnimeListState {
_$_AnimeListState(
{final List<AnimeTrackingData> animes = const [],
{this.buttonVisibility = true,
final List<AnimeTrackingData> animes = const [],
final List<MangaTrackingData> mangas = const [],
this.animeFilterState = MediumTrackingState.ongoing,
this.mangaFilterState = MediumTrackingState.ongoing,
@@ -155,6 +169,9 @@ class _$_AnimeListState implements _AnimeListState {
: _animes = animes,
_mangas = mangas;
@override
@JsonKey()
final bool buttonVisibility;
final List<AnimeTrackingData> _animes;
@override
@JsonKey()
@@ -183,7 +200,7 @@ class _$_AnimeListState implements _AnimeListState {
@override
String toString() {
return 'AnimeListState(animes: $animes, mangas: $mangas, animeFilterState: $animeFilterState, mangaFilterState: $mangaFilterState, trackingType: $trackingType)';
return 'AnimeListState(buttonVisibility: $buttonVisibility, animes: $animes, mangas: $mangas, animeFilterState: $animeFilterState, mangaFilterState: $mangaFilterState, trackingType: $trackingType)';
}
@override
@@ -191,6 +208,8 @@ class _$_AnimeListState implements _AnimeListState {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$_AnimeListState &&
const DeepCollectionEquality()
.equals(other.buttonVisibility, buttonVisibility) &&
const DeepCollectionEquality().equals(other._animes, _animes) &&
const DeepCollectionEquality().equals(other._mangas, _mangas) &&
const DeepCollectionEquality()
@@ -204,6 +223,7 @@ class _$_AnimeListState implements _AnimeListState {
@override
int get hashCode => Object.hash(
runtimeType,
const DeepCollectionEquality().hash(buttonVisibility),
const DeepCollectionEquality().hash(_animes),
const DeepCollectionEquality().hash(_mangas),
const DeepCollectionEquality().hash(animeFilterState),
@@ -218,12 +238,15 @@ class _$_AnimeListState implements _AnimeListState {
abstract class _AnimeListState implements AnimeListState {
factory _AnimeListState(
{final List<AnimeTrackingData> animes,
{final bool buttonVisibility,
final List<AnimeTrackingData> animes,
final List<MangaTrackingData> mangas,
final MediumTrackingState animeFilterState,
final MediumTrackingState mangaFilterState,
final TrackingMediumType trackingType}) = _$_AnimeListState;
@override
bool get buttonVisibility;
@override
List<AnimeTrackingData> get animes;
@override

View File

@@ -96,3 +96,10 @@ class MangaRemovedEvent extends AnimeListEvent {
/// The ID of the manga to be removed from the list.
final String id;
}
class AddButtonVisibilitySetEvent extends AnimeListEvent {
AddButtonVisibilitySetEvent(this.state);
/// The visibility of the button
final bool state;
}

View File

@@ -3,6 +3,7 @@ part of 'anime_list_bloc.dart';
@freezed
class AnimeListState with _$AnimeListState {
factory AnimeListState({
@Default(true) bool buttonVisibility,
@Default([]) List<AnimeTrackingData> animes,
@Default([]) List<MangaTrackingData> mangas,
@Default(MediumTrackingState.ongoing) MediumTrackingState animeFilterState,