feat(meta): Implement manga tracking
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import 'dart:math';
|
||||
import 'package:anitrack/src/data/anime.dart';
|
||||
import 'package:anitrack/src/data/manga.dart';
|
||||
import 'package:anitrack/src/data/type.dart';
|
||||
import 'package:anitrack/src/service/database.dart';
|
||||
import 'package:bloc/bloc.dart';
|
||||
@@ -13,11 +14,15 @@ part 'anime_list_bloc.freezed.dart';
|
||||
class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
|
||||
AnimeListBloc() : super(AnimeListState()) {
|
||||
on<AnimeAddedEvent>(_onAnimeAdded);
|
||||
on<AnimeEpisodeIncrementedEvent>(_onIncremented);
|
||||
on<AnimeEpisodeDecrementedEvent>(_onDecremented);
|
||||
on<MangaAddedEvent>(_onMangaAdded);
|
||||
on<AnimeEpisodeIncrementedEvent>(_onAnimeIncremented);
|
||||
on<AnimeEpisodeDecrementedEvent>(_onAnimeDecremented);
|
||||
on<AnimesLoadedEvent>(_onAnimesLoaded);
|
||||
on<AnimeFilterChangedEvent>(_onAnimesFiltered);
|
||||
on<AnimeTrackingTypeChanged>(_onTrackingTypeChanged);
|
||||
on<MangaFilterChangedEvent>(_onMangasFiltered);
|
||||
on<MangaChapterIncrementedEvent>(_onMangaIncremented);
|
||||
on<MangaChapterDecrementedEvent>(_onMangaDecremented);
|
||||
}
|
||||
|
||||
Future<void> _onAnimeAdded(AnimeAddedEvent event, Emitter<AnimeListState> emit) async {
|
||||
@@ -34,7 +39,21 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _onIncremented(AnimeEpisodeIncrementedEvent event, Emitter<AnimeListState> emit) async {
|
||||
Future<void> _onMangaAdded(MangaAddedEvent event, Emitter<AnimeListState> emit) async {
|
||||
// Add the manga to the database
|
||||
await GetIt.I.get<DatabaseService>().addManga(event.data);
|
||||
|
||||
emit(
|
||||
state.copyWith(
|
||||
mangas: List.from([
|
||||
...state.mangas,
|
||||
event.data,
|
||||
]),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _onAnimeIncremented(AnimeEpisodeIncrementedEvent event, Emitter<AnimeListState> emit) async {
|
||||
final index = state.animes.indexWhere((item) => item.id == event.id);
|
||||
if (index == -1) return;
|
||||
|
||||
@@ -56,7 +75,7 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
|
||||
await GetIt.I.get<DatabaseService>().updateAnime(newAnime);
|
||||
}
|
||||
|
||||
Future<void> _onDecremented(AnimeEpisodeDecrementedEvent event, Emitter<AnimeListState> emit) async {
|
||||
Future<void> _onAnimeDecremented(AnimeEpisodeDecrementedEvent event, Emitter<AnimeListState> emit) async {
|
||||
final index = state.animes.indexWhere((item) => item.id == event.id);
|
||||
if (index == -1) return;
|
||||
|
||||
@@ -82,6 +101,7 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
|
||||
emit(
|
||||
state.copyWith(
|
||||
animes: await GetIt.I.get<DatabaseService>().loadAnimes(),
|
||||
mangas: await GetIt.I.get<DatabaseService>().loadMangas(),
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -89,11 +109,19 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
|
||||
Future<void> _onAnimesFiltered(AnimeFilterChangedEvent event, Emitter<AnimeListState> emit) async {
|
||||
emit(
|
||||
state.copyWith(
|
||||
filterState: event.filterState,
|
||||
animeFilterState: event.filterState,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _onMangasFiltered(MangaFilterChangedEvent event, Emitter<AnimeListState> emit) async {
|
||||
emit(
|
||||
state.copyWith(
|
||||
mangaFilterState: event.filterState,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _onTrackingTypeChanged(AnimeTrackingTypeChanged event, Emitter<AnimeListState> emit) async {
|
||||
emit(
|
||||
state.copyWith(
|
||||
@@ -101,4 +129,48 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _onMangaIncremented(MangaChapterIncrementedEvent event, Emitter<AnimeListState> emit) async {
|
||||
final index = state.mangas.indexWhere((item) => item.id == event.id);
|
||||
if (index == -1) return;
|
||||
|
||||
final manga = state.mangas[index];
|
||||
if (manga.chaptersTotal != null && manga.chaptersRead + 1 > manga.chaptersTotal!) return;
|
||||
|
||||
final newList = List<MangaTrackingData>.from(state.mangas);
|
||||
final newManga = manga.copyWith(
|
||||
chaptersRead: manga.chaptersRead + 1,
|
||||
);
|
||||
newList[index] = newManga;
|
||||
|
||||
emit(
|
||||
state.copyWith(
|
||||
mangas: newList,
|
||||
),
|
||||
);
|
||||
|
||||
await GetIt.I.get<DatabaseService>().updateManga(newManga);
|
||||
}
|
||||
|
||||
Future<void> _onMangaDecremented(MangaChapterDecrementedEvent event, Emitter<AnimeListState> emit) async {
|
||||
final index = state.mangas.indexWhere((item) => item.id == event.id);
|
||||
if (index == -1) return;
|
||||
|
||||
final manga = state.mangas[index];
|
||||
if (manga.chaptersRead - 1 < 0) return;
|
||||
|
||||
final newList = List<MangaTrackingData>.from(state.mangas);
|
||||
final newManga = manga.copyWith(
|
||||
chaptersRead: manga.chaptersRead - 1,
|
||||
);
|
||||
newList[index] = newManga;
|
||||
|
||||
emit(
|
||||
state.copyWith(
|
||||
mangas: newList,
|
||||
),
|
||||
);
|
||||
|
||||
await GetIt.I.get<DatabaseService>().updateManga(newManga);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user