From 5ac19aeac631f445c6805e6c0eabf6c868448cc4 Mon Sep 17 00:00:00 2001 From: cialloo Date: Wed, 24 Jul 2024 22:21:19 +0800 Subject: [PATCH] feat: friendly notification --- lib/control_page.dart | 87 ++++++++++++++++++++++++++++++++++--- lib/globals.dart | 4 ++ lib/l10n/app_en.arb | 5 ++- lib/l10n/app_zh.arb | 5 ++- lib/main.dart | 4 ++ lib/navigation_service.dart | 5 +++ 6 files changed, 101 insertions(+), 9 deletions(-) create mode 100644 lib/globals.dart create mode 100644 lib/navigation_service.dart diff --git a/lib/control_page.dart b/lib/control_page.dart index 0eec255..804ad26 100644 --- a/lib/control_page.dart +++ b/lib/control_page.dart @@ -3,6 +3,8 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:winui_n2n/edge_state.dart'; +import 'package:winui_n2n/globals.dart'; +import 'package:winui_n2n/navigation_service.dart'; import 'package:winui_n2n/saved_connection.dart'; import 'package:winui_n2n/shared_pref_singleton.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -276,22 +278,93 @@ class _ControlPageState extends State { '-r', ], ).then((process) async { - EdgeState.instance.isRunning = true; EdgeState.instance.process = process; - EdgeState.instance.logger - .addLog('edge.exe starting'); - debugPrint('edge.exe starting'); - setState(() { - _edgeConnecting = false; - }); + EdgeState.instance.logger.addLog('edge.exe start'); + process.stdout .transform(const SystemEncoding().decoder) .listen((data) { debugPrint('stdout: $data'); + + if (data.contains('<<< ================ >>>')) { + debugPrint('edge.exe connected'); + ScaffoldMessenger.of(context) + ..removeCurrentSnackBar() + ..showSnackBar( + SnackBar( + content: Text( + AppLocalizations.of(context)! + .successfullyConnected), + duration: const Duration(seconds: 2), + ), + ); + + setState(() { + _edgeConnecting = false; + EdgeState.instance.isRunning = true; + }); + } else if (data.contains( + 'MAC or IP address already in use or not released yet by supernode')) { + debugPrint( + 'MAC or IP address already in use or not released yet by supernode'); + + ScaffoldMessenger.of(context) + ..removeCurrentSnackBar() + ..showSnackBar( + SnackBar( + content: Text( + AppLocalizations.of(context)! + .macOrIpAlreadyInUse), + duration: const Duration(seconds: 2), + ), + ); + + setState(() { + _edgeConnecting = false; + if (EdgeState.instance.process != null) { + if (EdgeState.instance.process!.kill()) { + EdgeState.instance.isRunning = false; + } + } + }); + } + // else if (data.contains( + // 'username or password not recognized by supernode')) { + // debugPrint('Other reason fail'); + + // ScaffoldMessenger.of(context) + // ..removeCurrentSnackBar() + // ..showSnackBar( + // SnackBar( + // content: Text( + // AppLocalizations.of(context)! + // .otherReasonFail), + // duration: const Duration(seconds: 2), + // ), + // ); + + // setState(() { + // _edgeConnecting = false; + // EdgeState.instance.isRunning = false; + // }); + // } + EdgeState.instance.logger.addLog(data); }); await process.exitCode; + if (_edgeConnecting) { + debugPrint('Other reason fail'); + // TODO: Notify user. + snackbarKey.currentState + ?..removeCurrentSnackBar() + ..showSnackBar(SnackBar( + content: Text(AppLocalizations.of( + NavigationService + .navigatorKey.currentContext!)! + .otherReasonFail))); + } + _edgeConnecting = false; EdgeState.instance.isRunning = false; EdgeState.instance.process = null; EdgeState.instance.logger diff --git a/lib/globals.dart b/lib/globals.dart new file mode 100644 index 0000000..176fff9 --- /dev/null +++ b/lib/globals.dart @@ -0,0 +1,4 @@ +import 'package:flutter/material.dart'; + +final GlobalKey snackbarKey = + GlobalKey(); diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index edd23d3..ac8d6d2 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -20,5 +20,8 @@ "use": "Use It", "configNameComment": "Write a name for this config", "showWindow": "Show Window", - "chooseLanguage": "Choose Language" + "chooseLanguage": "Choose Language", + "successfullyConnected": "Connected", + "macOrIpAlreadyInUse": "MAC or IP address already in use or not released yet by supernode", + "otherReasonFail": "Connect fail" } \ No newline at end of file diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index b99d2ee..bea9002 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -20,5 +20,8 @@ "use": "使用", "configNameComment": "给这个配置备注一个名字", "showWindow": "显示主面板", - "chooseLanguage": "选择语言" + "chooseLanguage": "选择语言", + "successfullyConnected": "已连接", + "macOrIpAlreadyInUse": "MAC或IP地址已被占用或者未被中转服务器释放", + "otherReasonFail": "连接失败" } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index f608294..29db43a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; import 'package:window_manager/window_manager.dart'; import 'package:winui_n2n/application_exit_control.dart'; import 'package:winui_n2n/edge_state.dart'; +import 'package:winui_n2n/globals.dart'; +import 'package:winui_n2n/navigation_service.dart'; import 'package:winui_n2n/shared_pref_singleton.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -54,6 +56,8 @@ class _MainAppState extends State { darkTheme: ThemeData.dark(), themeMode: _themeMode, locale: _locale, + scaffoldMessengerKey: snackbarKey, + navigatorKey: NavigationService.navigatorKey, localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, home: const Scaffold( diff --git a/lib/navigation_service.dart b/lib/navigation_service.dart new file mode 100644 index 0000000..141af58 --- /dev/null +++ b/lib/navigation_service.dart @@ -0,0 +1,5 @@ +import 'package:flutter/material.dart'; + +class NavigationService { + static GlobalKey navigatorKey = GlobalKey(); +}