upub-web 0.6.0

web frontend for upub
Documentation
use apb::{ActivityMut, CollectionMut, ObjectMut};
use leptos::prelude::*;
use crate::prelude::*;

#[component]
pub fn ListsPage() -> impl IntoView {
	let auth = use_context::<Auth>().expect("missing auth context");
	let reload = use_context::<ReadSignal<()>>().expect("missing reload signal");
	let list_controls = use_context::<ListControls>().expect("missing list controls context");

	Effect::watch(
		move || reload.get(),
		move |_, _, _state| list_controls.fetch(auth),
		false,
	);

	let uid = auth.username();

	let (error, set_error) = signal(None);

	let name_ref: NodeRef<leptos::html::Input> = NodeRef::new();
	let summary_ref: NodeRef<leptos::html::Input> = NodeRef::new();

	view! {
		<Loadable
			base=format!("{URL_BASE}/actors/{uid}/lists/page")
			element=move |obj| view! { <List list=obj /> }
		/>

		<blockquote class="mt-3">
			<details class="cw">
				<summary>
					<code class="cw center color">new list</code>
				</summary>
					<table class="align w-100">
						<tr>
							<td class="w-33"><input class="w-100" type="text" node_ref=name_ref placeholder="name" required /></td>
							<td class="w-50"><input class="w-100" type="text" node_ref=summary_ref placeholder="summary" /></td>
							<td class="w-33">
								<input class="w-100" type="submit" value="create" on:click=move |ev| {
									ev.prevent_default();
									let name = name_ref.get().map(|x| x.value()).filter(|x| !x.is_empty());
									if name.is_none() {
										set_error.set(Some("'name' is required".to_string()));
										return;
									}
									let summary = summary_ref.get().map(|x| x.value()).filter(|x| !x.is_empty());
									let payload = apb::new()
										.set_activity_type(Some(apb::ActivityType::Create))
										.set_object(apb::Node::object(
											apb::new()
												.set_collection_type(Some(apb::CollectionType::Collection))
												.set_name(name)
												.set_summary(summary)
										));
									leptos::task::spawn_local(async move {
										match crate::Http::post(&auth.outbox(), &payload, auth).await {
											Ok(()) => {
												if let Some(name_ref_element) = name_ref.get() {
													name_ref_element.set_value("");
												}
												if let Some(summary_ref_element) = summary_ref.get() {
													summary_ref_element.set_value("");
												}
												set_error.set(None);
											},
											Err(e) => {
												tracing::error!("{e}");
												set_error.set(Some(e.to_string()));
											},
										}
									});
								} />
							</td>
						</tr>
						<tr>
							<td colspan="3" class="center"><b>{error}</b></td>
						</tr>
					</table>
			</details>
		</blockquote>
	}
}