From 9d84c380d1e6e117a9e31ddf265223e0837b0312 Mon Sep 17 00:00:00 2001 From: Connor Johnstone Date: Sat, 13 Sep 2025 18:19:16 -0400 Subject: [PATCH] Fix server and username pre-population on login page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Save credentials to LocalStorage on successful login when remember checkboxes are checked - Save credentials immediately when input values change and remember is enabled - Fix closure ownership issues with checkbox state in submit handler - Ensure remembered values persist and pre-populate correctly on subsequent visits - Address issue where values weren't saved if checkboxes defaulted to checked state 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- frontend/src/components/login.rs | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/login.rs b/frontend/src/components/login.rs index de35299..174823f 100644 --- a/frontend/src/components/login.rs +++ b/frontend/src/components/login.rs @@ -30,17 +30,31 @@ pub fn Login(props: &LoginProps) -> Html { let on_server_url_change = { let server_url = server_url.clone(); + let remember_server = remember_server.clone(); Callback::from(move |e: Event| { let target = e.target_unchecked_into::(); - server_url.set(target.value()); + let new_value = target.value(); + server_url.set(new_value.clone()); + + // Save to localStorage immediately if remember is checked + if *remember_server { + let _ = LocalStorage::set("remembered_server_url", new_value); + } }) }; let on_username_change = { let username = username.clone(); + let remember_username = remember_username.clone(); Callback::from(move |e: Event| { let target = e.target_unchecked_into::(); - username.set(target.value()); + let new_value = target.value(); + username.set(new_value.clone()); + + // Save to localStorage immediately if remember is checked + if *remember_username { + let _ = LocalStorage::set("remembered_username", new_value); + } }) }; @@ -90,6 +104,8 @@ pub fn Login(props: &LoginProps) -> Html { let password = password.clone(); let error_message = error_message.clone(); let is_loading = is_loading.clone(); + let remember_server = remember_server.clone(); + let remember_username = remember_username.clone(); let on_login = props.on_login.clone(); Callback::from(move |e: SubmitEvent| { @@ -100,6 +116,8 @@ pub fn Login(props: &LoginProps) -> Html { let password = (*password).clone(); let error_message = error_message.clone(); let is_loading = is_loading.clone(); + let remember_server_value = *remember_server; + let remember_username_value = *remember_username; let on_login = on_login.clone(); // Basic client-side validation @@ -140,6 +158,14 @@ pub fn Login(props: &LoginProps) -> Html { let _ = LocalStorage::set("user_preferences", &prefs_json); } + // Save server URL and username to LocalStorage if remember checkboxes are checked + if remember_server_value { + let _ = LocalStorage::set("remembered_server_url", server_url.clone()); + } + if remember_username_value { + let _ = LocalStorage::set("remembered_username", username.clone()); + } + is_loading.set(false); on_login.emit(token); }