diff --git a/lib/ui/home/home_countdown_dialog_ui.dart b/lib/ui/home/dialogs/home_countdown_dialog_ui.dart similarity index 100% rename from lib/ui/home/home_countdown_dialog_ui.dart rename to lib/ui/home/dialogs/home_countdown_dialog_ui.dart diff --git a/lib/ui/home/dialogs/home_md_content_dialog_ui.dart b/lib/ui/home/dialogs/home_md_content_dialog_ui.dart new file mode 100644 index 0000000..9e28b6b --- /dev/null +++ b/lib/ui/home/dialogs/home_md_content_dialog_ui.dart @@ -0,0 +1,55 @@ +import 'package:fluent_ui/fluent_ui.dart'; +import 'package:flutter/material.dart' show Material; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:starcitizen_doctor/common/io/rs_http.dart'; +import 'package:starcitizen_doctor/widgets/widgets.dart'; + +class HomeMdContentDialogUI extends HookConsumerWidget { + final String title; + final String url; + + const HomeMdContentDialogUI( + {super.key, required this.title, required this.url}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Material( + child: ContentDialog( + constraints: BoxConstraints( + maxWidth: MediaQuery.of(context).size.width * .6, + ), + title: Text(title), + content: LoadingWidget( + onLoadData: _getContent, + childBuilder: (BuildContext context, String data) { + return SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.only(left: 12, right: 12), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: makeMarkdownView(data), + ), + ), + ); + }, + ), + actions: [ + FilledButton( + child: const Padding( + padding: EdgeInsets.only(left: 8, right: 8, top: 2, bottom: 2), + child: Text("关闭"), + ), + onPressed: () { + Navigator.pop(context); + }) + ], + ), + ); + } + + Future _getContent() async { + final r = await RSHttp.getText(url); + return r; + } +} diff --git a/lib/ui/home/home_ui.dart b/lib/ui/home/home_ui.dart index 051532e..a727474 100644 --- a/lib/ui/home/home_ui.dart +++ b/lib/ui/home/home_ui.dart @@ -10,7 +10,8 @@ import 'package:starcitizen_doctor/common/helper/system_helper.dart'; import 'package:starcitizen_doctor/widgets/widgets.dart'; import 'package:url_launcher/url_launcher_string.dart'; -import 'home_countdown_dialog_ui.dart'; +import 'dialogs/home_countdown_dialog_ui.dart'; +import 'dialogs/home_md_content_dialog_ui.dart'; import 'home_ui_model.dart'; class HomeUI extends HookConsumerWidget { @@ -729,14 +730,14 @@ class HomeUI extends HookConsumerWidget { launchUrlString(homeState.appPlacardData?.link); return; case "doc": - // showDialog( - // context: context, - // builder: (context) { - // return BaseUIContainer( - // uiCreate: () => MDContentDialogUI(), - // modelCreate: () => MDContentDialogUIModel( - // appPlacardData?.title ?? "公告详情", appPlacardData?.link)); - // }); + showDialog( + context: context, + builder: (context) { + return HomeMdContentDialogUI( + title: homeState.appPlacardData?.title ?? "公告详情", + url: homeState.appPlacardData?.link, + ); + }); return; } } diff --git a/lib/ui/home/home_ui_model.dart b/lib/ui/home/home_ui_model.dart index 50ff6cf..9278cab 100644 --- a/lib/ui/home/home_ui_model.dart +++ b/lib/ui/home/home_ui_model.dart @@ -176,20 +176,6 @@ class HomeUIModel extends _$HomeUIModel { appVersionData: appGlobalState.networkVersionData!, ); - // if (await File( - // "${AppConf.applicationSupportDir}\\webview_data\\enable_webview_localization_capture") - // .exists()) { - // webViewModel.enableCapture = true; - // BaseUIContainer( - // uiCreate: () => WebviewLocalizationCaptureUI(), - // modelCreate: () => - // WebviewLocalizationCaptureUIModel(webViewModel)) - // .push(context!) - // .then((_) { - // webViewModel.enableCapture = false; - // }); - // } - await Future.delayed(const Duration(milliseconds: 500)); await webViewModel.launch(url, appGlobalState.networkVersionData!); } @@ -264,9 +250,10 @@ class HomeUIModel extends _$HomeUIModel { Future _loadRRS() async { try { + final rssVideoItems = await RSSApi.getRssVideo(); + final rssTextItems = await RSSApi.getRssText(); state = state.copyWith( - rssVideoItems: await RSSApi.getRssVideo(), - rssTextItems: await RSSApi.getRssText()); + rssVideoItems: rssVideoItems, rssTextItems: rssTextItems); dPrint("RSS update Success !"); } catch (e) { dPrint("_loadRRS Error:$e"); diff --git a/lib/widgets/widgets.dart b/lib/widgets/widgets.dart index f9bf759..85f6ef7 100644 --- a/lib/widgets/widgets.dart +++ b/lib/widgets/widgets.dart @@ -1,5 +1,7 @@ import 'package:fluent_ui/fluent_ui.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:go_router/go_router.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:url_launcher/url_launcher_string.dart'; import 'package:window_manager/window_manager.dart'; import 'package:markdown_widget/config/all.dart'; @@ -141,3 +143,49 @@ CustomTransitionPage myPageBuilder( ); }); } + +class LoadingWidget extends HookConsumerWidget { + final T? data; + final Future Function()? onLoadData; + final Widget Function(BuildContext context, T data) childBuilder; + + const LoadingWidget( + {super.key, this.data, required this.childBuilder, this.onLoadData}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final dataState = useState(null); + final errorMsg = useState(""); + useEffect(() { + if (data == null && onLoadData != null) { + _loadData(dataState, errorMsg); + return null; + } + return null; + }, const []); + + if (errorMsg.value.isNotEmpty) { + return Button( + onPressed: () { + _loadData(dataState, errorMsg); + }, + child: Center( + child: Text(errorMsg.value), + ), + ); + } + if (dataState.value == null && data == null) return makeLoading(context); + return childBuilder(context, (data ?? dataState.value) as T); + } + + void _loadData( + ValueNotifier dataState, ValueNotifier errorMsg) async { + errorMsg.value = ""; + try { + final r = await onLoadData!(); + dataState.value = r; + } catch (e) { + errorMsg.value = e.toString(); + } + } +} diff --git a/rust/src/http_package/mod.rs b/rust/src/http_package/mod.rs index dd985e6..3cf961f 100644 --- a/rust/src/http_package/mod.rs +++ b/rust/src/http_package/mod.rs @@ -94,7 +94,7 @@ fn _reade_resp_header(r_header: &HeaderMap) -> HashMap { for ele in r_header { resp_headers.insert( ele.0.as_str().to_string(), - ele.1.to_str().unwrap().to_string(), + ele.1.to_str().unwrap_or("").to_string(), ); } resp_headers