feat: friendly notification
This commit is contained in:
@@ -3,6 +3,8 @@ import 'dart:io';
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:winui_n2n/edge_state.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/saved_connection.dart';
|
||||||
import 'package:winui_n2n/shared_pref_singleton.dart';
|
import 'package:winui_n2n/shared_pref_singleton.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
@@ -276,22 +278,93 @@ class _ControlPageState extends State<ControlPage> {
|
|||||||
'-r',
|
'-r',
|
||||||
],
|
],
|
||||||
).then((process) async {
|
).then((process) async {
|
||||||
EdgeState.instance.isRunning = true;
|
|
||||||
EdgeState.instance.process = process;
|
EdgeState.instance.process = process;
|
||||||
EdgeState.instance.logger
|
EdgeState.instance.logger.addLog('edge.exe start');
|
||||||
.addLog('edge.exe starting');
|
|
||||||
debugPrint('edge.exe starting');
|
|
||||||
setState(() {
|
|
||||||
_edgeConnecting = false;
|
|
||||||
});
|
|
||||||
process.stdout
|
process.stdout
|
||||||
.transform(const SystemEncoding().decoder)
|
.transform(const SystemEncoding().decoder)
|
||||||
.listen((data) {
|
.listen((data) {
|
||||||
debugPrint('stdout: $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);
|
EdgeState.instance.logger.addLog(data);
|
||||||
});
|
});
|
||||||
|
|
||||||
await process.exitCode;
|
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.isRunning = false;
|
||||||
EdgeState.instance.process = null;
|
EdgeState.instance.process = null;
|
||||||
EdgeState.instance.logger
|
EdgeState.instance.logger
|
||||||
|
4
lib/globals.dart
Normal file
4
lib/globals.dart
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
final GlobalKey<ScaffoldMessengerState> snackbarKey =
|
||||||
|
GlobalKey<ScaffoldMessengerState>();
|
@@ -20,5 +20,8 @@
|
|||||||
"use": "Use It",
|
"use": "Use It",
|
||||||
"configNameComment": "Write a name for this config",
|
"configNameComment": "Write a name for this config",
|
||||||
"showWindow": "Show Window",
|
"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"
|
||||||
}
|
}
|
@@ -20,5 +20,8 @@
|
|||||||
"use": "使用",
|
"use": "使用",
|
||||||
"configNameComment": "给这个配置备注一个名字",
|
"configNameComment": "给这个配置备注一个名字",
|
||||||
"showWindow": "显示主面板",
|
"showWindow": "显示主面板",
|
||||||
"chooseLanguage": "选择语言"
|
"chooseLanguage": "选择语言",
|
||||||
|
"successfullyConnected": "已连接",
|
||||||
|
"macOrIpAlreadyInUse": "MAC或IP地址已被占用或者未被中转服务器释放",
|
||||||
|
"otherReasonFail": "连接失败"
|
||||||
}
|
}
|
@@ -4,6 +4,8 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
import 'package:winui_n2n/application_exit_control.dart';
|
import 'package:winui_n2n/application_exit_control.dart';
|
||||||
import 'package:winui_n2n/edge_state.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:winui_n2n/shared_pref_singleton.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
|
|
||||||
@@ -54,6 +56,8 @@ class _MainAppState extends State<MainApp> {
|
|||||||
darkTheme: ThemeData.dark(),
|
darkTheme: ThemeData.dark(),
|
||||||
themeMode: _themeMode,
|
themeMode: _themeMode,
|
||||||
locale: _locale,
|
locale: _locale,
|
||||||
|
scaffoldMessengerKey: snackbarKey,
|
||||||
|
navigatorKey: NavigationService.navigatorKey,
|
||||||
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
||||||
supportedLocales: AppLocalizations.supportedLocales,
|
supportedLocales: AppLocalizations.supportedLocales,
|
||||||
home: const Scaffold(
|
home: const Scaffold(
|
||||||
|
5
lib/navigation_service.dart
Normal file
5
lib/navigation_service.dart
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class NavigationService {
|
||||||
|
static GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
||||||
|
}
|
Reference in New Issue
Block a user