upub-web 0.6.0

web frontend for upub
Documentation
use leptos::{either::Either, prelude::*};
use crate::prelude::*;

#[component]
pub fn ThreadsPage() -> impl IntoView {
	let (days, set_days) = signal(Some(30));
	let (skip, set_skip) = signal(Some(0));
	let auth = use_context::<Auth>().expect("missing auth context");
	view! {
		{move || if auth.present() {
			Either::Left(view! {
				<blockquote class="mb-3">
					<details class="cw">
						<summary>
							<code class="cw center color ml-s w-100">subscriptions</code>
						</summary>
						<div class="ml-2 mt-1 mb-1">
							<Loadable
								base=format!("{URL_BASE}/actors/{}/groups/page", auth.username())
								convert=U::Actor
								element=|obj| view! { <ActorBanner object=obj /><hr /> }
							/>
						</div>
					</details>
				</blockquote>
			})
		} else {
			Either::Right(())
		}}
		<div class="pl-1 pr-1">
			<table class="w-100 fixed">
				<tr>
					<td class="pa-1">
						"in last "
						<input type="number" size="4" placeholder="30"
							prop:value=move || days.get()
							on:input=move |ev| {
								ev.prevent_default();
								set_days.set(event_target_value(&ev).parse().ok());
						} />
						" days"
					</td>
					<td class="pa-1">
						"skip "
						<input type="number" size="4" placeholder="0"
							prop:value=move || skip.get().unwrap_or(0)
							on:input=move |ev| {
								ev.prevent_default();
								set_skip.set(event_target_value(&ev).parse().ok());
						} />
						" most recent days"
					</td>
				</tr>
			</table>
		</div>
		{move || match (days.get(), skip.get()) {
			(Some(days_n), Some(skip_n)) => Either::Right(view! {
				<div class="mt-3">
					<Loadable
						base=format!("{URL_BASE}/threads/page?days={days_n}&skip={skip_n}")
						element=move |obj| view! { <Item item=obj sep=true /> }
					/>
				</div>
			}),
			_ => Either::Left(view! {
				<p class="center"><code>invalid days/skip parameters</code></p>
			}),
		}}
	}
}