From 9bd8a62d31870ccbd057532d3be5ff3998aae53f Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Sun, 28 Dec 2025 22:59:44 +0100 Subject: [PATCH] Reduce Code Duplication Extract the `_updateLibrary()` function from `updates_screen.dart` and `library_screen.dart` to a top-level function in `libray_updater.dart`. --- lib/modules/library/library_screen.dart | 73 +++++++------------------ lib/modules/updates/updates_screen.dart | 63 +++++---------------- lib/services/library_updater.dart | 61 +++++++++++++++++++++ 3 files changed, 94 insertions(+), 103 deletions(-) create mode 100644 lib/services/library_updater.dart diff --git a/lib/modules/library/library_screen.dart b/lib/modules/library/library_screen.dart index 553c6e65..9fad552d 100644 --- a/lib/modules/library/library_screen.dart +++ b/lib/modules/library/library_screen.dart @@ -2,12 +2,10 @@ import 'dart:io'; import 'dart:math'; -import 'package:bot_toast/bot_toast.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:isar_community/isar.dart'; -import 'package:mangayomi/eval/model/m_bridge.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/changed.dart'; import 'package:mangayomi/models/chapter.dart'; @@ -19,10 +17,8 @@ import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/modules/library/providers/add_torrent.dart'; import 'package:mangayomi/modules/library/providers/local_archive.dart'; import 'package:mangayomi/modules/manga/detail/providers/state_providers.dart'; -import 'package:mangayomi/modules/manga/detail/providers/update_manga_detail_providers.dart'; import 'package:mangayomi/modules/more/categories/providers/isar_providers.dart'; import 'package:mangayomi/modules/more/providers/downloaded_only_state_provider.dart'; -import 'package:mangayomi/modules/more/settings/appearance/providers/theme_mode_state_provider.dart'; import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/modules/widgets/bottom_select_bar.dart'; import 'package:mangayomi/modules/widgets/category_selection_dialog.dart'; @@ -30,6 +26,7 @@ import 'package:mangayomi/modules/widgets/custom_draggable_tabbar.dart'; import 'package:mangayomi/modules/widgets/manga_image_card_widget.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/providers/storage_provider.dart'; +import 'package:mangayomi/services/library_updater.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:mangayomi/modules/library/providers/isar_providers.dart'; import 'package:mangayomi/modules/library/providers/library_state_provider.dart'; @@ -82,53 +79,6 @@ class _LibraryScreenState extends ConsumerState super.dispose(); } - Future _updateLibrary(List mangaList) async { - bool isDark = ref.read(themeModeStateProvider); - botToast( - context.l10n.updating_library("0", "0", "0"), - fontSize: 13, - second: 30, - alignY: !context.isTablet ? 0.85 : 1, - themeDark: isDark, - ); - int numbers = 0; - int failed = 0; - for (var manga in mangaList) { - try { - await ref.read( - updateMangaDetailProvider( - mangaId: manga.id, - isInit: false, - showToast: false, - ).future, - ); - } catch (_) { - failed++; - } - numbers++; - if (mounted) { - botToast( - context.l10n.updating_library(numbers, failed, mangaList.length), - fontSize: 13, - second: 10, - alignY: !context.isTablet ? 0.85 : 1, - animationDuration: 0, - dismissDirections: [DismissDirection.none], - onlyOne: false, - themeDark: isDark, - ); - } - } - await Future.doWhile(() async { - await Future.delayed(const Duration(seconds: 1)); - if (mangaList.length == numbers) { - return false; - } - return true; - }); - BotToast.cleanAll(); - } - @override Widget build(BuildContext context) { final settingsStream = ref.watch(getSettingsStreamProvider); @@ -776,7 +726,12 @@ class _LibraryScreenState extends ConsumerState final entriesManga = reverse ? entries.reversed.toList() : entries; return RefreshIndicator( onRefresh: () async { - await _updateLibrary(data); + await updateLibrary( + ref: ref, + context: context, + mangaList: data, + itemType: widget.itemType, + ); }, child: displayType == DisplayType.list ? LibraryListViewWidget( @@ -867,7 +822,12 @@ class _LibraryScreenState extends ConsumerState final entriesManga = reverse ? entries.reversed.toList() : entries; return RefreshIndicator( onRefresh: () async { - await _updateLibrary(data); + await updateLibrary( + ref: ref, + context: context, + mangaList: data, + itemType: widget.itemType, + ); }, child: displayType == DisplayType.list ? LibraryListViewWidget( @@ -2013,7 +1973,12 @@ class _LibraryScreenState extends ConsumerState onSelected: (value) { if (value == 0) { manga.whenData((value) { - _updateLibrary(value); + updateLibrary( + ref: ref, + context: context, + mangaList: value, + itemType: widget.itemType, + ); }); } else if (value == 1) { manga.whenData((value) { diff --git a/lib/modules/updates/updates_screen.dart b/lib/modules/updates/updates_screen.dart index 4f05927b..d79e18f2 100644 --- a/lib/modules/updates/updates_screen.dart +++ b/lib/modules/updates/updates_screen.dart @@ -1,21 +1,18 @@ -import 'package:bot_toast/bot_toast.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/models/changed.dart'; -import 'package:mangayomi/modules/more/settings/appearance/providers/theme_mode_state_provider.dart'; import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/modules/widgets/custom_sliver_grouped_list_view.dart'; import 'package:isar_community/isar.dart'; -import 'package:mangayomi/eval/model/m_bridge.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/models/manga.dart'; -import 'package:mangayomi/modules/manga/detail/providers/update_manga_detail_providers.dart'; import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/modules/updates/widgets/update_chapter_list_tile_widget.dart'; import 'package:mangayomi/modules/history/providers/isar_providers.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/services/library_updater.dart'; import 'package:mangayomi/utils/date.dart'; import 'package:mangayomi/modules/library/widgets/search_text_form_field.dart'; import 'package:mangayomi/modules/widgets/error_text.dart'; @@ -35,63 +32,31 @@ class _UpdatesScreenState extends ConsumerState late final List _tabList; late final List hideItems; bool _isLoading = false; + Future _updateLibrary() async { setState(() { _isLoading = true; }); - bool isDark = ref.read(themeModeStateProvider); - botToast( - context.l10n.updating_library("0", "0", "0"), - fontSize: 13, - second: 30, - alignY: !context.isTablet ? 0.85 : 1, - themeDark: isDark, - ); + final itemType = _tabBarController.index == 0 + ? ItemType.manga + : _tabBarController.index == 1 + ? ItemType.anime + : ItemType.novel; final mangaList = isar.mangas .filter() .idIsNotNull() .favoriteEqualTo(true) .and() - .itemTypeEqualTo( - _tabBarController.index == 0 - ? ItemType.manga - : _tabBarController.index == 1 - ? ItemType.anime - : ItemType.novel, - ) + .itemTypeEqualTo(itemType) .and() .isLocalArchiveEqualTo(false) .findAllSync(); - int numbers = 0; - int failed = 0; - - for (var manga in mangaList) { - try { - await ref.read( - updateMangaDetailProvider( - mangaId: manga.id, - isInit: false, - showToast: false, - ).future, - ); - } catch (_) { - failed++; - } - numbers++; - if (mounted) { - botToast( - context.l10n.updating_library(numbers, failed, mangaList.length), - fontSize: 13, - second: 10, - alignY: !context.isTablet ? 0.85 : 1, - animationDuration: 0, - dismissDirections: [DismissDirection.none], - onlyOne: false, - themeDark: isDark, - ); - } - } - BotToast.cleanAll(); + await updateLibrary( + ref: ref, + context: context, + mangaList: mangaList, + itemType: itemType, + ); setState(() { _isLoading = false; }); diff --git a/lib/services/library_updater.dart b/lib/services/library_updater.dart new file mode 100644 index 00000000..6affc104 --- /dev/null +++ b/lib/services/library_updater.dart @@ -0,0 +1,61 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter/material.dart'; +import 'package:bot_toast/bot_toast.dart'; +import 'package:mangayomi/eval/model/m_bridge.dart'; +import 'package:mangayomi/modules/manga/detail/providers/update_manga_detail_providers.dart'; +import 'package:mangayomi/modules/more/settings/appearance/providers/theme_mode_state_provider.dart'; +import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; +import 'package:mangayomi/models/manga.dart'; + +Future updateLibrary({ + required WidgetRef ref, + required BuildContext context, + required List mangaList, + required ItemType itemType, +}) async { + bool isDark = ref.read(themeModeStateProvider); + botToast( + context.l10n.updating_library("0", "0", "0"), + fontSize: 13, + second: 30, + alignY: !context.isTablet ? 0.85 : 1, + themeDark: isDark, + ); + int numbers = 0; + int failed = 0; + for (var manga in mangaList) { + try { + await ref.read( + updateMangaDetailProvider( + mangaId: manga.id, + isInit: false, + showToast: false, + ).future, + ); + } catch (_) { + failed++; + } + numbers++; + if (context.mounted) { + botToast( + context.l10n.updating_library(numbers, failed, mangaList.length), + fontSize: 13, + second: 10, + alignY: !context.isTablet ? 0.85 : 1, + animationDuration: 0, + dismissDirections: [DismissDirection.none], + onlyOne: false, + themeDark: isDark, + ); + } + } + await Future.doWhile(() async { + await Future.delayed(const Duration(seconds: 1)); + if (mangaList.length == numbers) { + return false; + } + return true; + }); + BotToast.cleanAll(); +}