upub-web 0.6.0

web frontend for upub
Documentation
use std::sync::Arc;

use leptos::prelude::*;
use leptos_router::hooks::use_query_map;
use crate::prelude::*;

#[component]
pub fn SearchPage() -> impl IntoView {
	let auth = use_context::<Auth>().expect("missing auth context");

	let query = Signal::derive(||
		use_query_map().with(|x| x.get("q").unwrap_or_default())
	);

	let user = LocalResource::new(
		move || {
			let q = use_query_map().get().get("q").unwrap_or_default();
			let user_fetch = Uri::api(U::Actor, &q, true);
			async move { Some(Arc::new(Http::fetch::<serde_json::Value>(&user_fetch, auth).await.ok()?)) }
		}
	);
	
	let object = LocalResource::new(
		move || {
			let q = use_query_map().get().get("q").unwrap_or_default();
			let object_fetch = Uri::api(U::Object, &q, true);
			async move { Some(Arc::new(Http::fetch::<serde_json::Value>(&object_fetch, auth).await.ok()?)) }
		}
	);

	view! {

		<blockquote class="mt-3 mb-3">
			<details class="cw" open>
				<summary class="mb-2">
					<code class="cw center color ml-s w-100">actor</code>
				</summary>
				<div class="pb-1">
				{move || match user.get() {
					None => view! { <p class="center"><small>searching...</small></p> }.into_any(),
					Some(None) => view! { <p class="center"><code>N/A</code></p> }.into_any(),
					Some(Some(u)) => view! { <p><ActorBanner object=u /></p> }.into_any(),
				}}
				</div>
			</details>
		</blockquote>

		<blockquote class="mt-3 mb-3">
			<details class="cw" open>
				<summary class="mb-2">
					<code class="cw center color ml-s w-100">object</code>
				</summary>
				<div class="pb-1">
				{move || match object.get() {
					None => view! { <p class="center"><small>searching...</small></p> }.into_any(),
					Some(None) => view!{ <p class="center"><code>N/A</code></p> }.into_any(),
					Some(Some(o)) => view! { <p><Object object=o /></p> }.into_any(),
				}}
				</div>
			</details>
		</blockquote>

		<blockquote>
			<details class="cw" open>
				<summary class="mb-2">
					<code class="cw center color ml-s w-100">hashtags</code>
				</summary>
				<div class="pb-1">
					<ul>
						<li><a href={format!("/web/tags/{}", query.get())}>#{query}</a></li>
					</ul>
				</div>
			</details>
		</blockquote>


		<blockquote class="mt-3 mb-3">
			<details class="cw" open>
				<summary class="mb-2">
					<code class="cw center color ml-s w-100">full text</code>
				</summary>
				<div class="pb-1">
					<Loadable
						base=format!("{URL_BASE}/search?q={}", query.get())
						convert=U::Object
						element=|obj| view! { <Item item=obj sep=true /> }
					/>
				</div>
			</details>
		</blockquote>
	}
}