feat: friendly notification

This commit is contained in:
cialloo
2024-07-24 22:21:19 +08:00
parent 81038b787d
commit 5ac19aeac6
6 changed files with 101 additions and 9 deletions

View File

@@ -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<ControlPage> {
'-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

4
lib/globals.dart Normal file
View File

@@ -0,0 +1,4 @@
import 'package:flutter/material.dart';
final GlobalKey<ScaffoldMessengerState> snackbarKey =
GlobalKey<ScaffoldMessengerState>();

View File

@@ -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"
}

View File

@@ -20,5 +20,8 @@
"use": "使用",
"configNameComment": "给这个配置备注一个名字",
"showWindow": "显示主面板",
"chooseLanguage": "选择语言"
"chooseLanguage": "选择语言",
"successfullyConnected": "已连接",
"macOrIpAlreadyInUse": "MAC或IP地址已被占用或者未被中转服务器释放",
"otherReasonFail": "连接失败"
}

View File

@@ -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<MainApp> {
darkTheme: ThemeData.dark(),
themeMode: _themeMode,
locale: _locale,
scaffoldMessengerKey: snackbarKey,
navigatorKey: NavigationService.navigatorKey,
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
home: const Scaffold(

View File

@@ -0,0 +1,5 @@
import 'package:flutter/material.dart';
class NavigationService {
static GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
}