From 2ff3c0ebccc7c801394d51a7df4daa920e07d1e2 Mon Sep 17 00:00:00 2001 From: kodjomoustapha <107993382+kodjodevf@users.noreply.github.com> Date: Fri, 2 Aug 2024 11:21:42 +0100 Subject: [PATCH] + --- lib/modules/history/history_screen.dart | 22 +---- .../widgets/library_gridview_widget.dart | 90 ++++++++++++------- .../widgets/library_listview_widget.dart | 88 +++++++++++------- .../manga/detail/manga_details_view.dart | 38 ++------ .../widgets/chapter_list_tile_widget.dart | 4 +- .../providers/crop_borders_provider.dart | 9 +- .../manga/reader/providers/push_router.dart | 14 ++- lib/utils/extensions/chapter.dart | 25 ++++++ pubspec.yaml | 2 +- 9 files changed, 163 insertions(+), 129 deletions(-) create mode 100644 lib/utils/extensions/chapter.dart diff --git a/lib/modules/history/history_screen.dart b/lib/modules/history/history_screen.dart index 6ef4261f..7145af3c 100644 --- a/lib/modules/history/history_screen.dart +++ b/lib/modules/history/history_screen.dart @@ -10,12 +10,11 @@ import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/history.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/modules/history/providers/isar_providers.dart'; -import 'package:mangayomi/modules/manga/reader/providers/push_router.dart'; -import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/cached_network.dart'; import 'package:mangayomi/utils/constant.dart'; import 'package:mangayomi/utils/date.dart'; +import 'package:mangayomi/utils/extensions/chapter.dart'; import 'package:mangayomi/utils/headers.dart'; import 'package:mangayomi/modules/library/widgets/search_text_form_field.dart'; import 'package:mangayomi/modules/widgets/error_text.dart'; @@ -232,24 +231,7 @@ class _HistoryTabState extends ConsumerState { elevation: 0, shadowColor: Colors.transparent), onPressed: () { - if (!chapter.isRead!) { - pushMangaReaderView(context: context, chapter: chapter); - } else { - final filteredChaps = - chapter.manga.value!.getFilteredChapterList(); - bool exist = false; - for (var filteredChap in filteredChaps.reversed) { - if (filteredChap.toJson().toString() == - chapter.toJson().toString()) { - exist = true; - } - if (exist && !filteredChap.isRead!) { - pushMangaReaderView( - context: context, chapter: filteredChap); - break; - } - } - } + chapter.pushToReaderView(context); }, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 12), diff --git a/lib/modules/library/widgets/library_gridview_widget.dart b/lib/modules/library/widgets/library_gridview_widget.dart index 9c38f8c3..31a90a6e 100644 --- a/lib/modules/library/widgets/library_gridview_widget.dart +++ b/lib/modules/library/widgets/library_gridview_widget.dart @@ -3,23 +3,22 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/download.dart'; -import 'package:mangayomi/modules/history/providers/isar_providers.dart'; +import 'package:mangayomi/models/history.dart'; import 'package:mangayomi/modules/library/providers/isar_providers.dart'; import 'package:mangayomi/modules/library/providers/library_state_provider.dart'; -import 'package:mangayomi/modules/manga/reader/providers/push_router.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:mangayomi/utils/constant.dart'; +import 'package:mangayomi/utils/extensions/chapter.dart'; import 'package:mangayomi/utils/headers.dart'; import 'package:mangayomi/modules/more/providers/incognito_mode_state_provider.dart'; import 'package:mangayomi/modules/widgets/bottom_text_widget.dart'; import 'package:mangayomi/modules/widgets/cover_view_widget.dart'; -import 'package:mangayomi/modules/widgets/error_text.dart'; import 'package:mangayomi/modules/widgets/gridview_widget.dart'; import 'package:mangayomi/modules/widgets/manga_image_card_widget.dart'; -import 'package:mangayomi/modules/widgets/progress_center.dart'; class LibraryGridViewWidget extends StatefulWidget { final bool isCoverOnlyGrid; @@ -274,25 +273,55 @@ class _LibraryGridViewWidgetState extends State { padding: const EdgeInsets.all(9), child: Consumer( builder: (context, ref, child) { - final history = ref.watch( - getAllHistoryStreamProvider( - isManga: entry.isManga!)); - return history.when( - data: (data) { - final incognitoMode = - ref.watch(incognitoModeStateProvider); - final entries = data - .where((element) => - element.mangaId == entry.id) - .toList(); - if (entries.isNotEmpty && !incognitoMode) { + return StreamBuilder( + stream: isar.historys + .filter() + .idIsNotNull() + .and() + .chapter((q) => q.manga((q) => + q.isMangaEqualTo(entry.isManga!))) + .watch(fireImmediately: true), + builder: (context, snapshot) { + if (snapshot.hasData && + snapshot.data!.isNotEmpty) { + final incognitoMode = + ref.watch(incognitoModeStateProvider); + final entries = snapshot.data! + .where((element) => + element.mangaId == entry.id) + .toList(); + if (entries.isNotEmpty && + !incognitoMode) { + return GestureDetector( + onTap: () { + entries.first.chapter.value! + .pushToReaderView(context); + }, + child: Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(5), + color: context.primaryColor + .withOpacity(0.9), + ), + child: const Padding( + padding: EdgeInsets.all(7), + child: Icon( + Icons.play_arrow, + size: 19, + color: Colors.white, + )), + ), + ); + } return GestureDetector( onTap: () { - pushMangaReaderView( - context: context, - chapter: - entries.first.chapter.value!, - ); + entry.chapters + .toList() + .reversed + .toList() + .last + .pushToReaderView(context); }, child: Container( decoration: BoxDecoration( @@ -313,13 +342,12 @@ class _LibraryGridViewWidgetState extends State { } return GestureDetector( onTap: () { - pushMangaReaderView( - context: context, - chapter: entry.chapters - .toList() - .reversed - .toList() - .last); + entry.chapters + .toList() + .reversed + .toList() + .last + .pushToReaderView(context); }, child: Container( decoration: BoxDecoration( @@ -338,12 +366,6 @@ class _LibraryGridViewWidgetState extends State { ), ); }, - error: (Object error, StackTrace stackTrace) { - return ErrorText(error); - }, - loading: () { - return const ProgressCenter(); - }, ); }, ))) diff --git a/lib/modules/library/widgets/library_listview_widget.dart b/lib/modules/library/widgets/library_listview_widget.dart index a712f473..7123a8e8 100644 --- a/lib/modules/library/widgets/library_listview_widget.dart +++ b/lib/modules/library/widgets/library_listview_widget.dart @@ -3,21 +3,20 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/download.dart'; -import 'package:mangayomi/modules/history/providers/isar_providers.dart'; +import 'package:mangayomi/models/history.dart'; import 'package:mangayomi/modules/library/providers/isar_providers.dart'; import 'package:mangayomi/modules/library/providers/library_state_provider.dart'; -import 'package:mangayomi/modules/manga/reader/providers/push_router.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:mangayomi/utils/constant.dart'; +import 'package:mangayomi/utils/extensions/chapter.dart'; import 'package:mangayomi/utils/headers.dart'; import 'package:mangayomi/modules/more/providers/incognito_mode_state_provider.dart'; -import 'package:mangayomi/modules/widgets/error_text.dart'; import 'package:mangayomi/modules/widgets/listview_widget.dart'; import 'package:mangayomi/modules/widgets/manga_image_card_widget.dart'; -import 'package:mangayomi/modules/widgets/progress_center.dart'; class LibraryListViewWidget extends StatelessWidget { final List entriesManga; @@ -259,24 +258,54 @@ class LibraryListViewWidget extends StatelessWidget { if (continueReaderBtn) Consumer( builder: (context, ref, child) { - final history = ref.watch( - getAllHistoryStreamProvider( - isManga: entry.isManga!)); - return history.when( - data: (data) { - final incognitoMode = - ref.watch(incognitoModeStateProvider); - final entries = data - .where((element) => - element.mangaId == entry.id) - .toList(); - if (entries.isNotEmpty && !incognitoMode) { + return StreamBuilder( + stream: isar.historys + .filter() + .idIsNotNull() + .and() + .chapter((q) => q.manga((q) => + q.isMangaEqualTo(entry.isManga!))) + .watch(fireImmediately: true), + builder: (context, snapshot) { + if (snapshot.hasData && + snapshot.data!.isNotEmpty) { + final incognitoMode = + ref.watch(incognitoModeStateProvider); + final entries = snapshot.data! + .where((element) => + element.mangaId == entry.id) + .toList(); + if (entries.isNotEmpty && !incognitoMode) { + final chap = entries.first.chapter.value!; + return GestureDetector( + onTap: () { + chap.pushToReaderView(context); + }, + child: Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(5), + color: context.primaryColor + .withOpacity(0.9), + ), + child: const Padding( + padding: EdgeInsets.all(7), + child: Icon( + Icons.play_arrow, + size: 19, + color: Colors.white, + )), + ), + ); + } return GestureDetector( onTap: () { - pushMangaReaderView( - context: context, - chapter: entries.first.chapter.value!, - ); + entry.chapters + .toList() + .reversed + .toList() + .last + .pushToReaderView(context); }, child: Container( decoration: BoxDecoration( @@ -297,13 +326,12 @@ class LibraryListViewWidget extends StatelessWidget { } return GestureDetector( onTap: () { - pushMangaReaderView( - context: context, - chapter: entry.chapters - .toList() - .reversed - .toList() - .last); + entry.chapters + .toList() + .reversed + .toList() + .last + .pushToReaderView(context); }, child: Container( decoration: BoxDecoration( @@ -321,12 +349,6 @@ class LibraryListViewWidget extends StatelessWidget { ), ); }, - error: (Object error, StackTrace stackTrace) { - return ErrorText(error); - }, - loading: () { - return const ProgressCenter(); - }, ); }, ) diff --git a/lib/modules/manga/detail/manga_details_view.dart b/lib/modules/manga/detail/manga_details_view.dart index 41b24598..9bb699e9 100644 --- a/lib/modules/manga/detail/manga_details_view.dart +++ b/lib/modules/manga/detail/manga_details_view.dart @@ -7,9 +7,7 @@ import 'package:mangayomi/models/category.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/history.dart'; import 'package:mangayomi/modules/manga/detail/widgets/custom_floating_action_btn.dart'; -import 'package:mangayomi/modules/manga/reader/providers/push_router.dart'; import 'package:mangayomi/models/manga.dart'; -import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:mangayomi/utils/constant.dart'; @@ -18,6 +16,7 @@ import 'package:mangayomi/modules/manga/detail/providers/state_providers.dart'; import 'package:mangayomi/modules/manga/detail/widgets/chapter_filter_list_tile_widget.dart'; import 'package:mangayomi/modules/more/providers/incognito_mode_state_provider.dart'; import 'package:mangayomi/modules/widgets/progress_center.dart'; +import 'package:mangayomi/utils/extensions/chapter.dart'; class MangaDetailsView extends ConsumerStatefulWidget { final Manga manga; @@ -78,27 +77,7 @@ class _MangaDetailsViewState extends ConsumerState { isExtended: !isExtended, label: l10n.resume, onPressed: () { - if (!chap.isRead!) { - pushMangaReaderView( - context: context, chapter: chap); - } else { - final filteredChaps = chap.manga.value! - .getFilteredChapterList(); - bool exist = false; - for (var filteredChap - in filteredChaps.reversed) { - if (filteredChap.toJson().toString() == - chap.toJson().toString()) { - exist = true; - } - if (exist && !filteredChap.isRead!) { - pushMangaReaderView( - context: context, - chapter: filteredChap); - break; - } - } - } + chap.pushToReaderView(context); }, textWidth: 70, width: 110, @@ -108,13 +87,12 @@ class _MangaDetailsViewState extends ConsumerState { isExtended: !isExtended, label: l10n.read, onPressed: () { - pushMangaReaderView( - context: context, - chapter: widget.manga.chapters - .toList() - .reversed - .toList() - .last); + widget.manga.chapters + .toList() + .reversed + .toList() + .last + .pushToReaderView(context); }, textWidth: isFr ? 80 : 40, width: isFr ? 130 : 90, diff --git a/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart b/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart index 32812c72..2d6b8caa 100644 --- a/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart +++ b/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart @@ -3,8 +3,8 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/date.dart'; -import 'package:mangayomi/modules/manga/reader/providers/push_router.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; +import 'package:mangayomi/utils/extensions/chapter.dart'; import 'package:mangayomi/utils/extensions/string_extensions.dart'; import 'package:mangayomi/modules/manga/detail/providers/state_providers.dart'; import 'package:mangayomi/modules/manga/download/download_page_widget.dart'; @@ -51,7 +51,7 @@ class ChapterListTileWidget extends ConsumerWidget { if (isLongPressed) { ref.read(chaptersListStateProvider.notifier).update(chapter); } else { - pushMangaReaderView(context: context, chapter: chapter); + chapter.pushToReaderView(context, ignoreIsRead: true); } }, title: Row( diff --git a/lib/modules/manga/reader/providers/crop_borders_provider.dart b/lib/modules/manga/reader/providers/crop_borders_provider.dart index 5fc114a6..d211e566 100644 --- a/lib/modules/manga/reader/providers/crop_borders_provider.dart +++ b/lib/modules/manga/reader/providers/crop_borders_provider.dart @@ -1,7 +1,9 @@ import 'dart:async'; +import 'dart:isolate'; import 'package:flutter/foundation.dart'; import 'package:mangayomi/modules/manga/reader/reader_view.dart'; import 'package:mangayomi/src/rust/api/image.dart'; +import 'package:mangayomi/src/rust/frb_generated.dart'; import 'package:mangayomi/utils/extensions/others.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'crop_borders_provider.g.dart'; @@ -18,7 +20,12 @@ Future cropBorders(CropBordersRef ref, return null; } - return processCropImage(image: imageBytes); + return await Isolate.run(() async { + await RustLib.init(); + final imageRes = processCropImage(image: imageBytes!); + RustLib.dispose(); + return imageRes; + }); } return null; } diff --git a/lib/modules/manga/reader/providers/push_router.dart b/lib/modules/manga/reader/providers/push_router.dart index 9d82c9a0..abde10cb 100644 --- a/lib/modules/manga/reader/providers/push_router.dart +++ b/lib/modules/manga/reader/providers/push_router.dart @@ -5,10 +5,10 @@ import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/source.dart'; -pushMangaReaderView({ +Future pushMangaReaderView({ required BuildContext context, required Chapter chapter, -}) { +}) async { final sourceExist = isar.sources .filter() .langContains(chapter.manga.value!.lang!, caseSensitive: false) @@ -24,17 +24,15 @@ pushMangaReaderView({ .isNotEmpty; if (sourceExist || chapter.manga.value!.isLocalArchive!) { if (chapter.manga.value!.isManga!) { - context.push('/mangareaderview', extra: chapter); + await context.push('/mangareaderview', extra: chapter); } else { - context.push('/animePlayerView', extra: chapter); + await context.push('/animePlayerView', extra: chapter); } } } -pushReplacementMangaReaderView({ - required BuildContext context, - required Chapter chapter, -}) { +void pushReplacementMangaReaderView( + {required BuildContext context, required Chapter chapter}) { if (chapter.manga.value!.isManga!) { context.pushReplacement('/mangareaderview', extra: chapter); } else { diff --git a/lib/utils/extensions/chapter.dart b/lib/utils/extensions/chapter.dart new file mode 100644 index 00000000..4821ef00 --- /dev/null +++ b/lib/utils/extensions/chapter.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/modules/manga/reader/providers/push_router.dart'; +import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; + +extension ChapterExtension on Chapter { + Future pushToReaderView(BuildContext context, + {bool ignoreIsRead = false}) async { + if (ignoreIsRead || !isRead!) { + await pushMangaReaderView(context: context, chapter: this); + } else { + final filteredChaps = manga.value!.getFilteredChapterList(); + bool exist = false; + for (var filteredChap in filteredChaps.reversed) { + if (filteredChap.toJson().toString() == toJson().toString()) { + exist = true; + } + if (exist && !filteredChap.isRead!) { + await pushMangaReaderView(context: context, chapter: filteredChap); + break; + } + } + } + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 7cc328e6..451f7b05 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -54,7 +54,7 @@ dependencies: window_manager: ^0.3.9 ffi: ^2.1.2 ffigen: ^12.0.0 - http_interceptor: ^2.0.0-beta.8 + http_interceptor: ^2.0.0 js_packer: ^0.0.5 flutter_windows_webview: git: