Skip to content

Commit 79694cf

Browse files
committed
rewrite: Finished Manga Details Screen
1 parent 658f12f commit 79694cf

36 files changed

Lines changed: 2793 additions & 1395 deletions

lib/application/cubits/home_cubit.dart

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'package:unyo/core/di/locator.dart';
1414
import 'package:unyo/core/enums/selected_menu_option.dart';
1515
import 'package:unyo/core/enums/service.dart';
1616
import 'package:unyo/core/notification/anime_notifier.dart';
17+
import 'package:unyo/core/notification/manga_notifier.dart';
1718
import 'package:unyo/core/notification/media_list_notifier.dart';
1819
import 'package:unyo/core/notification/menu_bar_notifier.dart';
1920
import 'package:unyo/core/notification/user_notifier.dart';
@@ -35,13 +36,15 @@ class HomeCubit extends Cubit<HomeState> with EffectMixin<HomeState> {
3536
final UserNotifier _loggedUserNotifier;
3637
final MenuBarNotifier _menuBarNotifier;
3738
final AnimeNotifier _selectedAnimeNotifier;
39+
final MangaNotifier _selectedMangaNotifier;
3840
final MediaListNotifier _selectedMediaListNotifier;
3941
late StreamSubscription<User> _newLoggedUserSubscription;
4042
final Logger _logger = sl<Logger>();
4143

4244
HomeCubit(
4345
this._loggedUserNotifier,
4446
this._selectedAnimeNotifier,
47+
this._selectedMangaNotifier,
4548
this._selectedMediaListNotifier,
4649
this._userRepositoryAnilist,
4750
this._animeRepositoryAnilist,
@@ -95,12 +98,19 @@ class HomeCubit extends Cubit<HomeState> with EffectMixin<HomeState> {
9598
}
9699

97100
void navigateToAnimeDetails(Anime anime, MediaList mediaList) {
98-
_logger.i("Navigating to Anime Details of ${anime.title}");
101+
_logger.i("Navigating to Anime Details of ${anime.title.userPreferred}");
99102
_selectedAnimeNotifier.updateSelectedAnime(anime);
100103
_selectedMediaListNotifier.updateSelectedMediaList(mediaList);
101104
pushRouteEffect(path: "/animedetails");
102105
}
103106

107+
void navigateToMangaDetails(Manga manga, MediaList mediaList) {
108+
_logger.i("Navigating to Manga Details of ${manga.title.userPreferred}");
109+
_selectedMangaNotifier.updateSelectedManga(manga);
110+
_selectedMediaListNotifier.updateSelectedMediaList(mediaList);
111+
pushRouteEffect(path: "/mangadetails");
112+
}
113+
104114
void navigateToUserAnimeList(BuildContext context) {
105115
_logger.i("Navigating to User Anime List");
106116
pushRouteEffect(path: "/userlist?type=anime");

lib/application/cubits/manga_cubit.dart

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,24 @@ import 'package:unyo/application/states/manga_state.dart';
66
import 'package:flutter_bloc/flutter_bloc.dart';
77
import 'package:unyo/core/di/locator.dart';
88
import 'package:unyo/core/enums/service.dart';
9+
import 'package:unyo/core/notification/manga_notifier.dart';
10+
import 'package:unyo/core/notification/media_list_notifier.dart';
911
import 'package:unyo/core/notification/user_notifier.dart';
1012
import 'package:unyo/data/repositories/manga_repository_anilist.dart';
1113
import 'package:unyo/domain/entities/manga.dart';
14+
import 'package:unyo/domain/entities/media_list.dart';
1215
import 'package:unyo/domain/entities/user.dart';
1316
import 'effect_mixin.dart';
1417

1518
class MangaCubit extends Cubit<MangaState> with EffectMixin<MangaState> {
1619
final MangaRepositoryAnilist _mangaRepositoryAnilist;
1720
final UserNotifier _loggedUserNotifier;
21+
final MangaNotifier _selectedMangaNotifier;
22+
final MediaListNotifier _selectedMediaListNotifier;
1823
late StreamSubscription<User> _loggedUserSubscription;
1924
final Logger _logger = sl<Logger>();
2025

21-
MangaCubit(this._mangaRepositoryAnilist, this._loggedUserNotifier)
26+
MangaCubit(this._mangaRepositoryAnilist, this._loggedUserNotifier, this._selectedMangaNotifier, this._selectedMediaListNotifier)
2227
: super(
2328
MangaState(
2429
trending: (false, []),
@@ -64,6 +69,13 @@ class MangaCubit extends Cubit<MangaState> with EffectMixin<MangaState> {
6469
}
6570
}
6671

72+
void navigateToMangaDetails(Manga manga, MediaList mediaList) {
73+
_logger.i("Navigating to Anime Details of ${manga.title.userPreferred}");
74+
_selectedMangaNotifier.updateSelectedManga(manga);
75+
_selectedMediaListNotifier.updateSelectedMediaList(mediaList);
76+
pushRouteEffect(path: "/mangadetails");
77+
}
78+
6779
Future<void> _fetchTrending(int page) async {
6880
try {
6981
switch (state.loggedUser.settings.service) {

lib/application/cubits/manga_details_cubit.dart

Lines changed: 22 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import 'dart:async';
22
import 'dart:math';
33
import 'package:awesome_snackbar_content/awesome_snackbar_content.dart';
44
import 'package:collection/collection.dart';
5-
import 'package:k3vinb5_aniyomi_bridge/jmodels/jsanime.dart';
65
import 'package:k3vinb5_aniyomi_bridge/jmodels/jsmanga.dart';
76
import 'package:logger/logger.dart';
87
import 'package:unyo/application/cubits/effect_mixin.dart';
@@ -12,23 +11,19 @@ import 'package:unyo/application/states/manga_details_state.dart';
1211
import 'package:unyo/core/di/locator.dart';
1312
import 'package:unyo/core/enums/episode_service.dart';
1413
import 'package:unyo/core/enums/service.dart';
15-
import 'package:unyo/core/notification/anime_notifier.dart';
1614
import 'package:unyo/core/notification/manga_notifier.dart';
1715
import 'package:unyo/core/notification/media_list_notifier.dart';
1816
import 'package:unyo/core/notification/user_notifier.dart';
1917
import 'package:unyo/core/services/api/http/http_exception.dart';
2018
import 'package:unyo/data/models/anilist_user_model.dart';
2119
import 'package:unyo/data/models/local_user_model.dart';
22-
import 'package:unyo/data/repositories/anime_repository_anilist.dart';
2320
import 'package:unyo/data/repositories/episode_repository_anizip.dart';
2421
import 'package:unyo/data/repositories/extension_repository_aniyomi.dart';
2522
import 'package:unyo/data/repositories/manga_repository_anilist.dart';
2623
import 'package:unyo/data/repositories/repositories.dart';
27-
import 'package:unyo/domain/entities/anime.dart';
28-
import 'package:unyo/domain/entities/anime_details.dart';
29-
import 'package:unyo/domain/entities/episode_info.dart';
3024
import 'package:unyo/domain/entities/extension.dart';
3125
import 'package:unyo/domain/entities/manga.dart';
26+
import 'package:unyo/domain/entities/manga_details.dart';
3227
import 'package:unyo/domain/entities/media_list.dart';
3328
import 'package:unyo/domain/entities/settings.dart';
3429
import 'package:unyo/domain/entities/user.dart';
@@ -69,7 +64,6 @@ class MangaDetailsCubit extends Cubit<MangaDetailsState> with EffectMixin<MangaD
6964
repeat: 0,
7065
characters: (false, []),
7166
recommendations: (false, []),
72-
episodesInfo: [],
7367
banners: [],
7468
alternateImage: '',
7569
installedExtensions: {},
@@ -114,7 +108,6 @@ class MangaDetailsCubit extends Cubit<MangaDetailsState> with EffectMixin<MangaD
114108
});
115109
_selectedMangaSubscription = _selectedMangaNotifier.mangaStream.listen((manga) {
116110
_getMangaDetails(state.loggedUser, manga);
117-
_getEpisodesDetails(state.loggedUser, manga);
118111
emit(state.copyWith(selectedManga: manga));
119112
});
120113
_selectedMediaListSubscription = _selectedMediaListNotifier.mediaListStream.listen((mediaList) {
@@ -168,7 +161,6 @@ class MangaDetailsCubit extends Cubit<MangaDetailsState> with EffectMixin<MangaD
168161
(bool, List<Manga>) trendingMangas = await _mangaRepositoryAnilist.getTrendingMangas(1);
169162
emit(state.copyWith(recommendations: (trendingMangas.$1, trendingMangas.$2.shuffled(Random()))));
170163
}
171-
_getAlternativeImage(loggedUser, selectedManga);
172164
case Service.mal:
173165
_logger.i("Fetching Manga Details from MyMangaList for ${state.selectedManga.title}");
174166
case Service.shikimori:
@@ -211,49 +203,27 @@ class MangaDetailsCubit extends Cubit<MangaDetailsState> with EffectMixin<MangaD
211203
}
212204
}
213205

214-
Future<void> _getAlternativeImage(User loggedUser, Manga selectedManga) async {
215-
try {
216-
switch (loggedUser.settings.episodeService) {
217-
case EpisodeService.anizip:
218-
_logger.i("Fetching Alternative Image from Anizip for ${state.selectedManga.title}");
219-
late String alternateImage;
220-
if (loggedUser.settings.service == Service.anilist) {
221-
alternateImage = await _episodeRepositoryAnizip.getAlternativeImage(malId: -1, anilistId: selectedManga.id);
222-
} else {
223-
alternateImage = await _episodeRepositoryAnizip.getAlternativeImage(malId: selectedManga.idMal, anilistId: -1);
224-
}
225-
emit(state.copyWith(alternateImage: alternateImage));
226-
case EpisodeService.kitsu:
227-
_logger.i("Fetching Alternative Image from Kitsu for ${state.selectedManga.title}");
228-
}
229-
} on HttpServerException catch (e, stackTrace) {
230-
handleError("Error fetching Alternative Image:", responseBody: e.message, stackTrace: stackTrace);
231-
} catch (e, stackTrace) {
232-
handleError("Error fetching Alternative Image: $e", stackTrace: stackTrace);
233-
}
234-
}
235-
236-
Future<void> _getEpisodesDetails(User loggedUser, Manga selectedManga) async {
237-
try {
238-
switch (loggedUser.settings.episodeService) {
239-
case EpisodeService.anizip:
240-
_logger.i("Fetching Episodes Details from Anizip for ${state.selectedManga.title}");
241-
late List<EpisodeInfo> episodesInfo;
242-
if (loggedUser.settings.service == Service.anilist) {
243-
episodesInfo = await _episodeRepositoryAnizip.getEpisodeInfo(malId: -1, anilistId: selectedManga.id);
244-
} else {
245-
episodesInfo = await _episodeRepositoryAnizip.getEpisodeInfo(malId: selectedManga.idMal, anilistId: -1);
246-
}
247-
emit(state.copyWith(episodesInfo: episodesInfo));
248-
case EpisodeService.kitsu:
249-
_logger.i("Fetching Episodes Details from Kitsu for ${state.selectedManga.title}");
250-
}
251-
} on HttpServerException catch (e, stackTrace) {
252-
handleError("Error fetching Episodes details:", responseBody: e.message, stackTrace: stackTrace);
253-
} catch (e, stackTrace) {
254-
handleError("Error fetching Episodes Details: $e", stackTrace: stackTrace);
255-
}
256-
}
206+
// Future<void> _getEpisodesDetails(User loggedUser, Manga selectedManga) async {
207+
// try {
208+
// switch (loggedUser.settings.episodeService) {
209+
// case EpisodeService.anizip:
210+
// _logger.i("Fetching Episodes Details from Anizip for ${state.selectedManga.title}");
211+
// late List<EpisodeInfo> episodesInfo;
212+
// if (loggedUser.settings.service == Service.anilist) {
213+
// episodesInfo = await _episodeRepositoryAnizip.getEpisodeInfo(malId: -1, anilistId: selectedManga.id);
214+
// } else {
215+
// episodesInfo = await _episodeRepositoryAnizip.getEpisodeInfo(malId: selectedManga.idMal, anilistId: -1);
216+
// }
217+
// emit(state.copyWith(episodesInfo: episodesInfo));
218+
// case EpisodeService.kitsu:
219+
// _logger.i("Fetching Episodes Details from Kitsu for ${state.selectedManga.title}");
220+
// }
221+
// } on HttpServerException catch (e, stackTrace) {
222+
// handleError("Error fetching Episodes details:", responseBody: e.message, stackTrace: stackTrace);
223+
// } catch (e, stackTrace) {
224+
// handleError("Error fetching Episodes Details: $e", stackTrace: stackTrace);
225+
// }
226+
// }
257227

258228
Future<void> _getMangaBanners(User loggedUser) async {
259229
try {

lib/application/cubits/media_list_cubit.dart

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:unyo/application/states/media_list_state.dart';
77
import 'package:flutter_bloc/flutter_bloc.dart';
88
import 'package:unyo/core/di/locator.dart';
99
import 'package:unyo/core/notification/anime_notifier.dart';
10+
import 'package:unyo/core/notification/manga_notifier.dart';
1011
import 'package:unyo/core/notification/media_list_notifier.dart';
1112
import 'package:unyo/core/notification/user_notifier.dart';
1213
import 'package:unyo/data/models/anilist_user_model.dart';
@@ -23,10 +24,11 @@ class MediaListCubit extends Cubit<MediaListState>
2324
final UserRepositoryAnilist _userRepositoryAnilist;
2425
final UserNotifier _loggedUserNotifier;
2526
final AnimeNotifier _selectedAnimeNotifier;
27+
final MangaNotifier _selectedMangaNotifier;
2628
final MediaListNotifier _selectedMediaListNotifier;
2729
late StreamSubscription<User> _newLoggedUserSubscription;
2830

29-
MediaListCubit(this._loggedUserNotifier, this._userRepositoryAnilist, this._selectedAnimeNotifier, this._selectedMediaListNotifier)
31+
MediaListCubit(this._loggedUserNotifier, this._userRepositoryAnilist, this._selectedAnimeNotifier, this._selectedMangaNotifier, this._selectedMediaListNotifier)
3032
: super(
3133
MediaListState(
3234
userAnimeLists: {},
@@ -66,12 +68,14 @@ class MediaListCubit extends Cubit<MediaListState>
6668
void navigateToMediaDetails(Object media, MediaList mediaList) {
6769
switch (media) {
6870
case Anime anime:
69-
_logger.i("Navigating to Anime Details of ${anime.title}");
71+
_logger.i("Navigating to Anime Details of ${anime.title.userPreferred}");
7072
_selectedAnimeNotifier.updateSelectedAnime(anime);
7173
_selectedMediaListNotifier.updateSelectedMediaList(mediaList);
7274
pushRouteEffect(path: "/animedetails");
7375
case Manga manga:
74-
_logger.i("Navigating to Manga Details of ${manga.title}");
76+
_logger.i("Navigating to Manga Details of ${manga.title.userPreferred}");
77+
_selectedMangaNotifier.updateSelectedManga(manga);
78+
_selectedMediaListNotifier.updateSelectedMediaList(mediaList);
7579
pushRouteEffect(path: "/mangadetails");
7680
}
7781
}

lib/application/states/manga_details_state.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ abstract class MangaDetailsState with _$MangaDetailsState implements HasEffects{
2424
required int repeat,
2525
required (bool, List<MediaCharacter>) characters,
2626
required (bool, List<Manga>) recommendations,
27-
required List<EpisodeInfo> episodesInfo,
2827
required List<String> banners,
2928
required String alternateImage,
3029
required Set<Extension> installedExtensions,

0 commit comments

Comments
 (0)