use leptos::prelude::*; use leptos_router::hooks::use_query_map; use crate::api; use crate::i18n::*; #[component] pub fn ResetPasswordPage() -> impl IntoView { let i18n = use_i18n(); let query = use_query_map(); // Read token once — not reactive, just a plain String. let token = query.with(|m| m.get("token").map(|s| s.to_string()).unwrap_or_default()); let new_password = RwSignal::new(String::new()); let confirm_password = RwSignal::new(String::new()); let pending = RwSignal::new(false); let success = RwSignal::new(false); let error = RwSignal::new(String::new()); if token.is_empty() { error.set(t_string!(i18n, reset_password_invalid).to_string()); } // `submit` moves `token: String` — it is FnMut (clones token each call) but not Copy. // Keep it off of reactive closures: put it directly on