//! Realm detail/edit page component. use leptos::prelude::*; #[cfg(feature = "hydrate")] use leptos::task::spawn_local; use leptos_router::hooks::use_params_map; use crate::components::{ Card, DetailGrid, DetailItem, MessageAlert, NsfwBadge, PageHeader, PrivacyBadge, }; use crate::hooks::use_fetch_if; use crate::models::RealmDetail; use crate::utils::get_api_base; /// Realm detail page component. #[component] pub fn RealmDetailPage() -> impl IntoView { let params = use_params_map(); let slug = move || params.get().get("slug").unwrap_or_default(); let initial_slug = params.get_untracked().get("slug").unwrap_or_default(); let (message, set_message) = signal(Option::<(String, bool)>::None); let realm = use_fetch_if::( move || !slug().is_empty(), move || format!("{}/realms/{}", get_api_base(), slug()), ); let slug_for_scenes = initial_slug.clone(); view! { "Manage Scenes" "Back to Realms" "Loading realm..."

}> {move || { realm.get().map(|maybe_realm| { match maybe_realm { Some(r) => view! { }.into_any(), None => view! {

"Realm not found or you don't have permission to view."

}.into_any() } }) }}
} } #[component] #[allow(unused_variables)] fn RealmDetailView( realm: RealmDetail, message: ReadSignal>, set_message: WriteSignal>, ) -> impl IntoView { #[cfg(feature = "hydrate")] let slug = realm.slug.clone(); let slug_display = realm.slug.clone(); let (pending, set_pending) = signal(false); // Form state let (name, set_name) = signal(realm.name.clone()); let (tagline, set_tagline) = signal(realm.tagline.clone().unwrap_or_default()); let (description, set_description) = signal(realm.description.clone().unwrap_or_default()); let (privacy, set_privacy) = signal(realm.privacy.clone()); let (max_users, set_max_users) = signal(realm.max_users); let (is_nsfw, set_is_nsfw) = signal(realm.is_nsfw); let (allow_guest_access, set_allow_guest_access) = signal(realm.allow_guest_access); let (allow_user_teleport, set_allow_user_teleport) = signal(realm.allow_user_teleport); let (theme_color, set_theme_color) = signal( realm .theme_color .clone() .unwrap_or_else(|| "#7c3aed".to_string()), ); let on_submit = move |ev: leptos::ev::SubmitEvent| { ev.prevent_default(); set_pending.set(true); set_message.set(None); #[cfg(feature = "hydrate")] { use gloo_net::http::Request; let api_base = get_api_base(); let slug = slug.clone(); let data = serde_json::json!({ "name": name.get(), "description": if description.get().is_empty() { None:: } else { Some(description.get()) }, "tagline": if tagline.get().is_empty() { None:: } else { Some(tagline.get()) }, "privacy": privacy.get(), "is_nsfw": is_nsfw.get(), "max_users": max_users.get(), "allow_guest_access": allow_guest_access.get(), "allow_user_teleport": allow_user_teleport.get(), "theme_color": theme_color.get() }); spawn_local(async move { let response = Request::put(&format!("{}/realms/{}", api_base, slug)) .json(&data) .unwrap() .send() .await; set_pending.set(false); match response { Ok(resp) if resp.ok() => { set_message.set(Some(("Realm updated successfully!".to_string(), true))); } Ok(_) => { set_message.set(Some(("Failed to update realm".to_string(), false))); } Err(_) => { set_message.set(Some(("Network error".to_string(), false))); } } }); } }; view! {

{realm.name.clone()}

{realm.tagline.clone().unwrap_or_default()}

{if realm.is_nsfw { view! { }.into_any() } else { view! {}.into_any() }}
{realm.owner_display_name.clone()} " (@" {realm.owner_username.clone()} ")" {realm.member_count.to_string()} {realm.current_user_count.to_string()} {realm.max_users.to_string()} {realm.created_at.clone()} {realm.updated_at.clone()}
"Slug cannot be changed"
} }