From 1f9689dc006f6d1d72a94bd6a433ff5178a3f4ee Mon Sep 17 00:00:00 2001 From: 21pages Date: Sun, 21 Dec 2025 22:18:18 +0800 Subject: [PATCH] show login dialog when clicking note if not logged in (#13856) Signed-off-by: 21pages --- flutter/lib/common/widgets/toolbar.dart | 24 ++++++++++--- flutter/lib/consts.dart | 1 + .../lib/desktop/pages/desktop_home_page.dart | 2 ++ .../desktop/pages/desktop_setting_page.dart | 28 ++++++++------- flutter/lib/mobile/pages/settings_page.dart | 35 ++++++++++--------- flutter/lib/models/model.dart | 3 ++ 6 files changed, 58 insertions(+), 35 deletions(-) diff --git a/flutter/lib/common/widgets/toolbar.dart b/flutter/lib/common/widgets/toolbar.dart index b158679eb..929acbfcf 100644 --- a/flutter/lib/common/widgets/toolbar.dart +++ b/flutter/lib/common/widgets/toolbar.dart @@ -6,10 +6,12 @@ import 'package:flutter/services.dart'; import 'package:flutter_hbb/common.dart'; import 'package:flutter_hbb/common/shared_state.dart'; import 'package:flutter_hbb/common/widgets/dialog.dart'; +import 'package:flutter_hbb/common/widgets/login.dart'; import 'package:flutter_hbb/consts.dart'; import 'package:flutter_hbb/desktop/widgets/remote_toolbar.dart'; import 'package:flutter_hbb/models/model.dart'; import 'package:flutter_hbb/models/platform_model.dart'; +import 'package:flutter_hbb/utils/multi_window_manager.dart'; import 'package:get/get.dart'; bool isEditOsPassword = false; @@ -193,14 +195,26 @@ List toolbarControls(BuildContext context, String id, FFI ffi) { ); } // note - if (isDefaultConn && - bind - .sessionGetAuditServerSync(sessionId: sessionId, typ: "conn") - .isNotEmpty) { + if (isDefaultConn && !bind.isDisableAccount()) { v.add( TTextMenu( child: Text(translate('Note')), - onPressed: () => showAuditDialog(ffi)), + onPressed: () async { + bool isLogin = + bind.mainGetLocalOption(key: 'access_token').isNotEmpty; + if (!isLogin) { + final res = await loginDialog(); + if (res != true) return; + // Desktop: send message to main window to refresh login status + // Web: login is required before connection, so no need to refresh + // Mobile: same isolate, no need to send message + if (isDesktop) { + rustDeskWinManager.call( + WindowType.Main, kWindowRefreshCurrentUser, ""); + } + } + showAuditDialog(ffi); + }), ); } // divider diff --git a/flutter/lib/consts.dart b/flutter/lib/consts.dart index 6c68d3d91..94a0aaac5 100644 --- a/flutter/lib/consts.dart +++ b/flutter/lib/consts.dart @@ -50,6 +50,7 @@ const String kAppTypeDesktopPortForward = "port forward"; const String kAppTypeDesktopTerminal = "terminal"; const String kWindowMainWindowOnTop = "main_window_on_top"; +const String kWindowRefreshCurrentUser = "refresh_current_user"; const String kWindowGetWindowInfo = "get_window_info"; const String kWindowGetScreenList = "get_screen_list"; // This method is not used, maybe it can be removed. diff --git a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart index b8b7c0286..0a75175db 100644 --- a/flutter/lib/desktop/pages/desktop_home_page.dart +++ b/flutter/lib/desktop/pages/desktop_home_page.dart @@ -776,6 +776,8 @@ class _DesktopHomePageState extends State } if (call.method == kWindowMainWindowOnTop) { windowOnTop(null); + } else if (call.method == kWindowRefreshCurrentUser) { + gFFI.userModel.refreshCurrentUser(); } else if (call.method == kWindowGetWindowInfo) { final screen = (await window_size.getWindowInfo()).screen; if (screen == null) { diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index 82b7c75ee..ab6dfe47e 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -561,19 +561,21 @@ class _GeneralState extends State<_General> { children.add(_OptionCheckBox( context, 'Allow linux headless', kOptionAllowLinuxHeadless)); } - children.add(_OptionCheckBox( - context, - 'note-at-conn-end-tip', - kOptionAllowAskForNoteAtEndOfConnection, - isServer: false, - optSetter: (key, value) async { - if (value && !gFFI.userModel.isLogin) { - final res = await loginDialog(); - if (res != true) return; - } - await mainSetLocalBoolOption(key, value); - }, - )); + if (!bind.isDisableAccount()) { + children.add(_OptionCheckBox( + context, + 'note-at-conn-end-tip', + kOptionAllowAskForNoteAtEndOfConnection, + isServer: false, + optSetter: (key, value) async { + if (value && !gFFI.userModel.isLogin) { + final res = await loginDialog(); + if (res != true) return; + } + await mainSetLocalBoolOption(key, value); + }, + )); + } return _Card(title: 'Other', children: children); } diff --git a/flutter/lib/mobile/pages/settings_page.dart b/flutter/lib/mobile/pages/settings_page.dart index 9a237f44a..69a9d6a44 100644 --- a/flutter/lib/mobile/pages/settings_page.dart +++ b/flutter/lib/mobile/pages/settings_page.dart @@ -786,23 +786,24 @@ class _SettingsState extends State with WidgetsBindingObserver { showThemeSettings(gFFI.dialogManager); }, ), - SettingsTile.switchTile( - title: Text(translate('note-at-conn-end-tip')), - initialValue: _allowAskForNoteAtEndOfConnection, - onToggle: (v) async { - if (v && !gFFI.userModel.isLogin) { - final res = await loginDialog(); - if (res != true) return; - } - await mainSetLocalBoolOption( - kOptionAllowAskForNoteAtEndOfConnection, v); - final newValue = mainGetLocalBoolOptionSync( - kOptionAllowAskForNoteAtEndOfConnection); - setState(() { - _allowAskForNoteAtEndOfConnection = newValue; - }); - }, - ) + if (!bind.isDisableAccount()) + SettingsTile.switchTile( + title: Text(translate('note-at-conn-end-tip')), + initialValue: _allowAskForNoteAtEndOfConnection, + onToggle: (v) async { + if (v && !gFFI.userModel.isLogin) { + final res = await loginDialog(); + if (res != true) return; + } + await mainSetLocalBoolOption( + kOptionAllowAskForNoteAtEndOfConnection, v); + final newValue = mainGetLocalBoolOptionSync( + kOptionAllowAskForNoteAtEndOfConnection); + setState(() { + _allowAskForNoteAtEndOfConnection = newValue; + }); + }, + ) ]), if (isAndroid) SettingsSection(title: Text(translate('Hardware Codec')), tiles: [ diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 5eba92cb7..6e3d77c54 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -1101,6 +1101,9 @@ class FfiModel with ChangeNotifier { void _queryAuditGuid(String peerId) async { try { + if (bind.isDisableAccount()) { + return; + } if (bind .sessionGetAuditServerSync(sessionId: sessionId, typ: "conn/active") .isEmpty) {