fix user login state

Signed-off-by: dignow <linlong1265@gmail.com>
This commit is contained in:
dignow
2023-06-22 23:31:46 +08:00
parent fea9cfba7f
commit 96d95fa08a
12 changed files with 182 additions and 81 deletions

View File

@@ -30,6 +30,7 @@ class _AddressBookState extends State<AddressBook> {
@override
Widget build(BuildContext context) => Obx(() {
debugPrint('REMOVE ME =========================== AddressBook ${gFFI.userModel.userName.value} ${gFFI.abModel.abLoading} ${gFFI.abModel.abError} ${gFFI.abModel.fromServer} ${isDesktop}');
if (gFFI.userModel.userName.value.isEmpty) {
return Center(
child: ElevatedButton(

View File

@@ -1,7 +1,5 @@
// main window right pane
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:auto_size_text/auto_size_text.dart';
@@ -9,7 +7,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_hbb/consts.dart';
import 'package:flutter_hbb/desktop/widgets/scroll_wrapper.dart';
import 'package:flutter_hbb/models/state_model.dart';
import 'package:flutter_hbb/models/user_model.dart';
import 'package:get/get.dart';
import 'package:url_launcher/url_launcher_string.dart';
import 'package:window_manager/window_manager.dart';
@@ -37,13 +34,10 @@ class _ConnectionPageState extends State<ConnectionPage>
/// Nested scroll controller
final _scrollController = ScrollController();
Timer? _updateTimer;
final RxBool _idInputFocused = false.obs;
final FocusNode _idFocusNode = FocusNode();
var svcStopped = Get.find<RxBool>(tag: 'stop-service');
var svcIsUsingPublicServer = true.obs;
bool isWindowMinimized = false;
@@ -60,9 +54,7 @@ class _ConnectionPageState extends State<ConnectionPage>
}
}();
}
_updateTimer = periodic_immediate(Duration(seconds: 1), () async {
updateStatus();
});
stateGlobal.startSvcStatusTimer();
_idFocusNode.addListener(() {
_idInputFocused.value = _idFocusNode.hasFocus;
// select all to faciliate removing text, just following the behavior of address input of chrome
@@ -75,7 +67,7 @@ class _ConnectionPageState extends State<ConnectionPage>
@override
void dispose() {
_idController.dispose();
_updateTimer?.cancel();
stateGlobal.cancelSvcStatusTimer();
windowManager.removeListener(this);
super.dispose();
}
@@ -290,7 +282,7 @@ class _ConnectionPageState extends State<ConnectionPage>
child: Offstage(
offstage: !(!svcStopped.value &&
stateGlobal.svcStatus.value == SvcStatus.ready &&
svcIsUsingPublicServer.value),
stateGlobal.svcIsUsingPublicServer.value),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
@@ -329,31 +321,4 @@ class _ConnectionPageState extends State<ConnectionPage>
}
});
}
updateStatus() async {
final status =
jsonDecode(await bind.mainGetConnectStatus()) as Map<String, dynamic>;
final statusNum = status['status_num'] as int;
final preStatus = stateGlobal.svcStatus.value;
if (statusNum == 0) {
stateGlobal.svcStatus.value = SvcStatus.connecting;
} else if (statusNum == -1) {
stateGlobal.svcStatus.value = SvcStatus.notReady;
} else if (statusNum == 1) {
stateGlobal.svcStatus.value = SvcStatus.ready;
if (preStatus != SvcStatus.ready) {
gFFI.userModel.refreshCurrentUser();
}
} else {
stateGlobal.svcStatus.value = SvcStatus.notReady;
}
if (stateGlobal.svcStatus.value != SvcStatus.ready) {
gFFI.userModel.isAdmin.value = false;
gFFI.groupModel.reset();
}
if (preStatus != stateGlobal.svcStatus.value) {
UserModel.updateOtherModels();
}
svcIsUsingPublicServer.value = await bind.mainIsUsingPublicServer();
}
}

View File

@@ -151,6 +151,7 @@ void runMobileApp() async {
await initEnv(kAppTypeMain);
if (isAndroid) androidChannelInit();
platformFFI.syncAndroidServiceAppDirConfigPath();
gFFI.userModel.refreshCurrentUser();
runApp(App());
}

View File

@@ -11,6 +11,7 @@ import '../../common/widgets/login.dart';
import '../../common/widgets/peer_tab_page.dart';
import '../../consts.dart';
import '../../models/model.dart';
import '../../models/state_model.dart';
import '../../models/platform_model.dart';
import 'home_page.dart';
import 'scan_page.dart';
@@ -54,6 +55,7 @@ class _ConnectionPageState extends State<ConnectionPage> {
}
}();
}
stateGlobal.startSvcStatusTimer();
if (isAndroid) {
Timer(const Duration(seconds: 5), () async {
_updateUrl = await bind.mainGetSoftwareUpdateUrl();
@@ -180,6 +182,7 @@ class _ConnectionPageState extends State<ConnectionPage> {
@override
void dispose() {
_idController.dispose();
stateGlobal.cancelSvcStatusTimer();
super.dispose();
}
}

View File

@@ -57,6 +57,7 @@ class AbModel {
return "";
}
} catch (err) {
debugPrint('REMOVE ME ====================== err $err');
err.printError();
abError.value = err.toString();
} finally {

View File

@@ -1,10 +1,16 @@
import 'dart:convert';
import 'dart:io';
import 'dart:async';
import 'package:desktop_multi_window/desktop_multi_window.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../consts.dart';
import '../common.dart';
import './platform_model.dart';
import './user_model.dart';
enum SvcStatus { notReady, connecting, ready }
@@ -18,7 +24,10 @@ class StateGlobal {
final RxDouble _windowBorderWidth = RxDouble(kWindowBorderWidth);
final RxBool showRemoteToolBar = false.obs;
final RxInt displaysCount = 0.obs;
final svcStatus = SvcStatus.notReady.obs;
final svcIsUsingPublicServer = true.obs;
Timer? _svcStatusTimer;
// Use for desktop -> remote toolbar -> resolution
final Map<String, Map<int, String?>> _lastResolutionGroupValues = {};
@@ -84,6 +93,46 @@ class StateGlobal {
}
}
startSvcStatusTimer() {
_svcStatusTimer = periodic_immediate(Duration(seconds: 1), () async {
_updateSvcStatus();
});
}
cancelSvcStatusTimer() {
_svcStatusTimer?.cancel();
_svcStatusTimer = null;
}
_updateSvcStatus() async {
final status =
jsonDecode(await bind.mainGetConnectStatus()) as Map<String, dynamic>;
final statusNum = status['status_num'] as int;
final preStatus = stateGlobal.svcStatus.value;
if (statusNum == 0) {
stateGlobal.svcStatus.value = SvcStatus.connecting;
} else if (statusNum == -1) {
stateGlobal.svcStatus.value = SvcStatus.notReady;
} else if (statusNum == 1) {
stateGlobal.svcStatus.value = SvcStatus.ready;
if (preStatus != SvcStatus.ready) {
gFFI.userModel.refreshCurrentUser();
}
} else {
stateGlobal.svcStatus.value = SvcStatus.notReady;
}
if (stateGlobal.svcStatus.value != SvcStatus.ready) {
gFFI.userModel.isAdmin.value = false;
gFFI.groupModel.reset();
}
debugPrint('REMOVE ME ========================== $preStatus -> ${stateGlobal.svcStatus.value}');
if (preStatus != stateGlobal.svcStatus.value) {
UserModel.updateOtherModels();
}
stateGlobal.svcIsUsingPublicServer.value =
await bind.mainIsUsingPublicServer();
}
StateGlobal._();
static final StateGlobal instance = StateGlobal._();