diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 262b8101..5f2dd4bf 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -465,5 +465,9 @@ "show_hidden_notifications_description": "Click to restore all hidden notifications on the dashboard", "warning": "Warning", "invalid_course_info": "Please provide valid information about course slots", - "danke": "Course" + "danke": "Course", + "fix_danke_description": "Having trouble with Danke? Click to try resetting and fixing it.", + "fix": "Fix", + "refresh": "Refresh", + "reset": "Reset" } \ No newline at end of file diff --git a/lib/l10n/intl_ja.arb b/lib/l10n/intl_ja.arb index 7c87f86c..4cd3ec01 100644 --- a/lib/l10n/intl_ja.arb +++ b/lib/l10n/intl_ja.arb @@ -428,5 +428,9 @@ "show_hidden_notifications": "隠された通知を表示", "show_hidden_notifications_description": "クリックしてすべての隠された通知を復元する", "warning": "警告", - "invalid_course_info": "コーススロットに関する有効な情報を提供してください" + "invalid_course_info": "コーススロットに関する有効な情報を提供してください", + "fix_danke_description": "問題が発生しましたか? 確認をクリックしてリセットして修正してみてください。", + "fix": "修正", + "refresh": "更新", + "reset": "リセット" } \ No newline at end of file diff --git a/lib/l10n/intl_zh_CN.arb b/lib/l10n/intl_zh_CN.arb index 5d7f4b54..6dd8a172 100644 --- a/lib/l10n/intl_zh_CN.arb +++ b/lib/l10n/intl_zh_CN.arb @@ -457,5 +457,9 @@ "show_hidden_notifications_description": "点击以恢复所有已隐藏的首页通知卡片", "warning": "警告", "invalid_course_info": "请提供完整的课程时间信息", - "danke": "评教" + "danke": "评教", + "fix_danke_description": "使用评教时遇到了问题?点击确认以尝试重置并修复。", + "fix": "修复", + "refresh": "刷新", + "reset": "重置" } \ No newline at end of file diff --git a/lib/page/subpage_danke.dart b/lib/page/subpage_danke.dart index 7697f40f..cffb29d9 100644 --- a/lib/page/subpage_danke.dart +++ b/lib/page/subpage_danke.dart @@ -19,9 +19,14 @@ import 'package:dan_xi/common/constant.dart'; import 'package:dan_xi/generated/l10n.dart'; import 'package:dan_xi/page/platform_subpage.dart'; import 'package:dan_xi/provider/settings_provider.dart'; +import 'package:dan_xi/util/noticing.dart'; +import 'package:dan_xi/util/platform_universal.dart'; +import 'package:dan_xi/util/public_extension_methods.dart'; +import 'package:dan_xi/util/stream_listener.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; +import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:provider/provider.dart'; class DankeSubPage extends PlatformSubpage { @@ -32,10 +37,89 @@ class DankeSubPage extends PlatformSubpage { @override Create get title => (cxt) => Text(S.of(cxt).danke); + + @override + Create> get trailing { + return (cxt) => [ + AppBarButtonItem(S.of(cxt).refresh, Icon(PlatformIcons(cxt).refresh), + () { + RefreshPageEvent().fire(); + }), + AppBarButtonItem( + S.of(cxt).reset, + Icon(PlatformX.isMaterial(cxt) + ? Icons.medical_services_outlined + : CupertinoIcons.rays), () { + ResetWebViewEvent().fire(); + }), + ]; + } } +class RefreshPageEvent {} + +class ResetWebViewEvent {} + class DankeSubPageState extends PlatformSubpageState { InAppWebViewController? webViewController; + static final StateStreamListener _refreshSubscription = + StateStreamListener(); + static final StateStreamListener _resetSubscription = + StateStreamListener(); + + URLRequest get urlRequest => URLRequest( + url: Uri.https('danke.fduhole.com', '/jump', { + 'access': SettingsProvider.getInstance().fduholeToken?.access, + 'refresh': SettingsProvider.getInstance().fduholeToken?.refresh, + })); + + @override + void initState() { + super.initState(); + _refreshSubscription.bindOnlyInvalid( + Constant.eventBus + .on() + .listen((event) => webViewController?.reload()), + hashCode); + _resetSubscription.bindOnlyInvalid( + Constant.eventBus.on().listen((event) async { + if (!mounted) return; + bool? confirmed = await Noticing.showConfirmationDialog( + context, S.of(context).fix_danke_description, + title: S.of(context).fix); + if (confirmed == true) { + await webViewController?.clearCache(); + + if (PlatformX.isAndroid) { + await WebStorageManager.instance().android.deleteAllData(); + } + if (PlatformX.isIOS) { + final manager = WebStorageManager.instance().ios; + var records = await manager.fetchDataRecords( + dataTypes: IOSWKWebsiteDataType.values); + await manager.removeDataFor( + dataTypes: IOSWKWebsiteDataType.values, + dataRecords: records.filter((element) => + element.displayName?.contains("fduhole.com") ?? false)); + } + + await HttpAuthCredentialDatabase.instance() + .clearAllAuthCredentials(); + + await CookieManager.instance().deleteAllCookies(); + + await webViewController?.loadUrl(urlRequest: urlRequest); + } + }), + hashCode); + } + + @override + void dispose() { + super.dispose(); + _refreshSubscription.cancel(); + _resetSubscription.cancel(); + } @override Widget buildPage(BuildContext context) { @@ -54,11 +138,7 @@ class DankeSubPageState extends PlatformSubpageState { }, child: InAppWebView( initialOptions: InAppWebViewGroupOptions(crossPlatform: settings), - initialUrlRequest: URLRequest( - url: Uri.https('danke.fduhole.com', '/jump', { - 'access': SettingsProvider.getInstance().fduholeToken?.access, - 'refresh': SettingsProvider.getInstance().fduholeToken?.refresh, - })), + initialUrlRequest: urlRequest, onWebViewCreated: (InAppWebViewController controller) { webViewController = controller; },