diff --git a/.gitignore b/.gitignore index 4d41844..b077e89 100644 --- a/.gitignore +++ b/.gitignore @@ -44,5 +44,4 @@ app.*.map.json /android/app/profile /android/app/release -# FVM Version Cache -.fvm/ +untranslated_messages.txt \ No newline at end of file diff --git a/l10n.yaml b/l10n.yaml index 6754e31..3e34692 100644 --- a/l10n.yaml +++ b/l10n.yaml @@ -1,4 +1,5 @@ +# Run with `flutter gen-l10n`. arb-dir: lib/l10n template-arb-file: app_en.arb -# untranslated-messages-file: untranslated_messages.txt +untranslated-messages-file: untranslated_messages.txt output-localization-file: app_localizations.dart \ No newline at end of file diff --git a/lib/eval/dart/model/m_bridge.dart b/lib/eval/dart/model/m_bridge.dart index 123989c..89814b1 100644 --- a/lib/eval/dart/model/m_bridge.dart +++ b/lib/eval/dart/model/m_bridge.dart @@ -3,6 +3,7 @@ import 'package:bot_toast/bot_toast.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:html/dom.dart' hide Text; import 'package:intl/date_symbol_data_local.dart'; import 'package:intl/intl.dart'; @@ -11,6 +12,7 @@ import 'package:json_path/json_path.dart'; import 'package:mangayomi/eval/dart/model/document.dart'; import 'package:mangayomi/eval/javascript/http.dart'; import 'package:mangayomi/models/manga.dart'; +import 'package:mangayomi/router/router.dart'; import 'package:mangayomi/services/anime_extractors/dood_extractor.dart'; import 'package:mangayomi/services/anime_extractors/filemoon.dart'; import 'package:mangayomi/services/anime_extractors/gogocdn_extractor.dart'; @@ -29,6 +31,7 @@ import 'package:mangayomi/services/anime_extractors/your_upload_extractor.dart'; import 'package:mangayomi/utils/cryptoaes/crypto_aes.dart'; import 'package:mangayomi/utils/cryptoaes/deobfuscator.dart'; import 'package:mangayomi/utils/cryptoaes/js_unpacker.dart'; +import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:mangayomi/utils/extensions/string_extensions.dart'; import 'package:mangayomi/utils/reg_exp_matcher.dart'; import 'package:xpath_selector_html_parser/xpath_selector_html_parser.dart'; @@ -667,7 +670,10 @@ void botToast(String title, {int second = 10, double? fontSize, double alignX = 0, - double alignY = 0.99}) { + double alignY = 0.99, + bool hasCloudFlare = false, + String? url}) { + final context = navigatorKey.currentState?.context; final assets = [ 'assets/app_icons/icon-black.png', 'assets/app_icons/icon-red.png' @@ -680,10 +686,19 @@ void botToast(String title, animationDuration: const Duration(milliseconds: 200), animationReverseDuration: const Duration(milliseconds: 200), leading: (_) => Image.asset((assets..shuffle()).first, height: 25), - title: (_) => Text( - title, - style: TextStyle(fontSize: fontSize), - ), + title: (_) => Text(title, style: TextStyle(fontSize: fontSize)), + trailing: hasCloudFlare + ? (_) => OutlinedButton.icon( + style: OutlinedButton.styleFrom(elevation: 10), + onPressed: () { + context + ?.push("/mangawebview", extra: {'url': url, 'title': ''}); + }, + label: Text("Resolve Cloudflare challenge", + style: TextStyle(color: context?.secondaryColor)), + icon: const Icon(Icons.public), + ) + : null, ); } diff --git a/lib/modules/webview/webview.dart b/lib/modules/webview/webview.dart index 7abe7a0..47e9332 100644 --- a/lib/modules/webview/webview.dart +++ b/lib/modules/webview/webview.dart @@ -12,13 +12,8 @@ import 'package:share_plus/share_plus.dart'; class MangaWebView extends ConsumerStatefulWidget { final String url; - final String sourceId; final String title; - const MangaWebView( - {super.key, - required this.url, - required this.sourceId, - required this.title}); + const MangaWebView({super.key, required this.url, required this.title}); @override ConsumerState createState() => _MangaWebViewState(); diff --git a/lib/router/router.dart b/lib/router/router.dart index 2394522..ae6b37a 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -41,17 +41,18 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter/cupertino.dart'; part 'router.g.dart'; +final GlobalKey navigatorKey = GlobalKey(); @riverpod GoRouter router(RouterRef ref) { final router = RouterNotifier(); return GoRouter( - observers: [BotToastNavigatorObserver()], - initialLocation: '/MangaLibrary', - debugLogDiagnostics: kDebugMode, - refreshListenable: router, - routes: router._routes, - ); + observers: [BotToastNavigatorObserver()], + initialLocation: '/MangaLibrary', + debugLogDiagnostics: kDebugMode, + refreshListenable: router, + routes: router._routes, + navigatorKey: navigatorKey); } @riverpod @@ -380,7 +381,6 @@ class RouterNotifier extends ChangeNotifier { final data = state.extra as Map; return MangaWebView( url: data["url"]!, - sourceId: data["sourceId"]!, title: data['title']!, ); }, @@ -390,7 +390,6 @@ class RouterNotifier extends ChangeNotifier { key: state.pageKey, child: MangaWebView( url: data["url"]!, - sourceId: data["sourceId"]!, title: data['title']!, ), ); diff --git a/lib/services/http/m_client.dart b/lib/services/http/m_client.dart index a9b91bb..16f66f2 100644 --- a/lib/services/http/m_client.dart +++ b/lib/services/http/m_client.dart @@ -176,7 +176,8 @@ class LoggerInterceptor extends InterceptorContract { Logger.add(LoggerLevel.info, "----- Response -----\n${response.request?.method}: ${response.request?.url}, statusCode: ${response.statusCode} ${cloudflare ? "Failed to bypass Cloudflare" : ""}"); if (cloudflare) { - botToast("${response.statusCode} Failed to bypass Cloudflare"); + botToast("${response.statusCode} Failed to bypass Cloudflare", + hasCloudFlare: cloudflare, url: response.request!.url.toString()); } return response; }