use leptos::prelude::*; use leptos::task::spawn_local; use leptos_shadcn_input::Input; use leptos_shadcn_button::{Button, ButtonVariant}; use leptos_shadcn_alert::{Alert, AlertDescription, AlertVariant}; use crate::store::TorrentStore; use crate::api; #[component] pub fn AddTorrentDialog( on_close: Callback<()>, ) -> impl IntoView { let store = use_context::().expect("TorrentStore not provided"); let uri = signal(String::new()); let is_loading = signal(false); let error_msg = signal(Option::::None); let handle_submit = move |ev: web_sys::SubmitEvent| { ev.prevent_default(); let uri_val = uri.0.get(); if uri_val.is_empty() { error_msg.1.set(Some("Please enter a Magnet URI or URL".to_string())); return; } is_loading.1.set(true); error_msg.1.set(None); let on_close = on_close.clone(); spawn_local(async move { match api::torrent::add(&uri_val).await { Ok(_) => { log::info!("Torrent added successfully"); crate::store::toast_success("Torrent başarıyla eklendi"); on_close.run(()); } Err(e) => { log::error!("Failed to add torrent: {:?}", e); error_msg.1.set(Some(format!("Hata: {:?}", e))); is_loading.1.set(false); } } }); }; let handle_backdrop = { let on_close = on_close.clone(); move |e: web_sys::MouseEvent| { e.stop_propagation(); on_close.run(()); } }; view! { // Backdrop overlay
// Dialog panel
// Header

"Add Torrent"

"Enter a Magnet link or a .torrent file URL."

{move || error_msg.0.get().map(|msg| view! { {msg} })}
// Close button (X)
} }