use leptos::*; use leptos_router::*; use crate::prelude::*; #[component] pub fn DebugPage() -> impl IntoView { let query_params = use_query_map(); let query = move || { query_params.with(|params| params.get("q").cloned().unwrap_or_default()) }; let cached_ref: NodeRef = create_node_ref(); let auth = use_context::().expect("missing auth context"); let (plain, set_plain) = create_signal(false); let (text, set_text) = create_signal("".to_string()); let navigate = use_navigate(); let object = create_local_resource( query, move |q| async move { set_text.set(q.clone()); if q.is_empty() { return serde_json::Value::Null }; let cached = cached_ref.get().map(|x| x.checked()).unwrap_or_default(); if cached { match CACHE.get(&q) { Some(x) => (*x).clone(), None => serde_json::Value::Null, } } else { debug_fetch(&format!("{URL_BASE}/proxy?id={q}"), auth).await } } ); let loading = object.loading(); view! {
config :: devtools
obj " " usr
				{move || object.get().map(|o| if plain.get() {
					serde_json::to_string_pretty(&o).unwrap_or_else(|e| e.to_string()).into_view()
				} else {
					view! {  }.into_view()
				})}
			

" plain :: " external " :: " copy

} } // this is a rather weird way to fetch but i want to see the bare error text if it fails! async fn debug_fetch(url: &str, token: Auth) -> serde_json::Value { match Http::request::<()>(reqwest::Method::GET, url, None, token).await { Err(e) => serde_json::Value::String(format!("[!] failed sending request: {e}")), Ok(res) => match res.text().await { Err(e) => serde_json::Value::String(format!("[!] invalid response body: {e}")), Ok(x) => match serde_json::from_str(&x) { Err(_) => serde_json::Value::String(x), Ok(v) => v, }, } } } #[component] fn DocumentNode(obj: serde_json::Value, #[prop(optional)] depth: usize) -> impl IntoView { let prefix = " ".repeat(depth); match obj { serde_json::Value::Null => view! { null }.into_view(), serde_json::Value::Bool(x) => view! { {x} }.into_view(), serde_json::Value::Number(n) => view! { {n.to_string()} }.into_view(), serde_json::Value::String(s) => { if s.starts_with("https://") || s.starts_with("http://") { view! { {s} }.into_view() } else { view! { "\""{s}"\"" }.into_view() } }, serde_json::Value::Array(arr) => if arr.is_empty() { view! { "[]" }.into_view() } else { view! { "[\n" {arr.into_iter().map(|x| view! { {prefix.clone()}" ""\n" }).collect_view()} {prefix.clone()}"]" }.into_view() }, serde_json::Value::Object(map) => if map.is_empty() { view! { "{}" }.into_view() } else { view! { "{\n" { map.into_iter() .map(|(k, v)| view! { {prefix.clone()}" "{k}": ""\n" }) .collect_view() } {prefix.clone()}"}" }.into_view() }, } }