// services/frontend-leptos/frontend/src/auth.rs use leptos::prelude::*; use wasm_bindgen_futures::spawn_local; use crate::app::AuthContext; use crate::api::auth as auth_api; #[component] pub fn AuthOverlay() -> impl IntoView { let auth = use_context::().expect("AuthContext not provided"); let (password, set_password) = create_signal(String::new()); let (error, set_error) = create_signal(Option::::None); let (loading, set_loading) = create_signal(false); let handle_submit = move |ev: leptos::ev::SubmitEvent| { ev.prevent_default(); let pwd = password.get(); if pwd.is_empty() { set_error.set(Some("Password diperlukan".to_string())); return; } set_loading.set(true); set_error.set(None); let auth_clone = auth.clone(); let pwd_clone = pwd.clone(); let set_loading_clone = set_loading.clone(); let set_error_clone = set_error.clone(); spawn_local(async move { match auth_api::login(&pwd_clone).await { Ok(true) => { // Store password in sessionStorage if let Some(storage) = web_sys::window() .and_then(|w| w.local_storage().ok()) .flatten() { let _ = storage.set_item("admin-password", &pwd_clone); } auth_clone.authenticated.set(true); auth_clone.password.set(pwd_clone); } Ok(false) => { set_error_clone.set(Some("Login gagal — password salah".to_string())); } Err(e) => { set_error_clone.set(Some(format!("Error: {}", e.message))); } } set_loading_clone.set(false); }); }; view! { } }