From bb339a7806520919c3b6d463e5f2c783bce46f83 Mon Sep 17 00:00:00 2001 From: Collin Bartlam Date: Sun, 15 Feb 2026 08:14:00 -0500 Subject: [PATCH 1/3] Handle enter key for login fields --- .../lib/ui/pages/login/login_page_view.dart | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/commet/lib/ui/pages/login/login_page_view.dart b/commet/lib/ui/pages/login/login_page_view.dart index fc4b4009b..50a30b69c 100644 --- a/commet/lib/ui/pages/login/login_page_view.dart +++ b/commet/lib/ui/pages/login/login_page_view.dart @@ -55,6 +55,7 @@ class _LoginPageViewState extends State { ); final TextEditingController _usernameTextField = TextEditingController(); final TextEditingController _passwordTextField = TextEditingController(); + final FocusNode _passwordFocusNode = FocusNode(); String get promptHomeserver => Intl.message("Homeserver", name: "promptHomeserver", @@ -82,6 +83,12 @@ class _LoginPageViewState extends State { super.initState(); } + @override + void dispose() { + _passwordFocusNode.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -311,10 +318,7 @@ class _LoginPageViewState extends State { height: 50, child: tiamat.Button( text: promptSubmitLogin, - onTap: flow != null - ? () => widget.doPasswordLogin - ?.call(flow, _usernameTextField.text, _passwordTextField.text) - : null, + onTap: (_) => _attemptLogin(), ), ); } @@ -323,8 +327,11 @@ class _LoginPageViewState extends State { return TextField( autocorrect: false, controller: _passwordTextField, + focusNode: _passwordFocusNode, obscureText: true, readOnly: widget.isLoggingIn, + textInputAction: TextInputAction.go, + onSubmitted: (_) => _attemptLogin(), decoration: InputDecoration( border: const OutlineInputBorder(), labelText: promptPassword, @@ -337,6 +344,14 @@ class _LoginPageViewState extends State { autocorrect: false, controller: _usernameTextField, readOnly: widget.isLoggingIn, + textInputAction: TextInputAction.next, + onSubmitted: (_) { + if (_passwordTextField.text.isEmpty) { + _passwordFocusNode.requestFocus(); + } else { + _attemptLogin(); + } + }, inputFormatters: [FilteringTextInputFormatter.deny(RegExp("[ ]"))], decoration: InputDecoration( border: const OutlineInputBorder(), @@ -394,4 +409,12 @@ class _LoginPageViewState extends State { widget.updateHomeserver?.call(_homeserverTextField.text); } } + + void _attemptLogin() { + var flow = widget.flows?.whereType().firstOrNull; + if (flow != null) { + widget.doPasswordLogin + ?.call(flow, _usernameTextField.text, _passwordTextField.text); + } + } } From 3558828968540acb4aa3b5d0b45af5bc867bc2b3 Mon Sep 17 00:00:00 2001 From: Collin Bartlam Date: Sun, 15 Feb 2026 09:51:05 -0500 Subject: [PATCH 2/3] Fixed mismatched closure arguments in login button --- commet/lib/ui/pages/login/login_page_view.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commet/lib/ui/pages/login/login_page_view.dart b/commet/lib/ui/pages/login/login_page_view.dart index 50a30b69c..a1542cd5e 100644 --- a/commet/lib/ui/pages/login/login_page_view.dart +++ b/commet/lib/ui/pages/login/login_page_view.dart @@ -318,7 +318,7 @@ class _LoginPageViewState extends State { height: 50, child: tiamat.Button( text: promptSubmitLogin, - onTap: (_) => _attemptLogin(), + onTap: () => _attemptLogin(), ), ); } From 95ce80c31d623d288767e0bc68cb9ea4ac2d60a4 Mon Sep 17 00:00:00 2001 From: Collin Bartlam Date: Tue, 17 Feb 2026 04:10:02 -0500 Subject: [PATCH 3/3] Remove unused variable --- commet/lib/ui/pages/login/login_page_view.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/commet/lib/ui/pages/login/login_page_view.dart b/commet/lib/ui/pages/login/login_page_view.dart index a1542cd5e..6d38b29bf 100644 --- a/commet/lib/ui/pages/login/login_page_view.dart +++ b/commet/lib/ui/pages/login/login_page_view.dart @@ -311,8 +311,6 @@ class _LoginPageViewState extends State { } SizedBox loginButton() { - var flow = widget.flows?.whereType().firstOrNull; - return SizedBox( width: double.infinity, height: 50,