aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author alemi <me@alemi.dev>2024-05-03 06:14:36 +0200
committer alemi <me@alemi.dev>2024-05-03 06:14:46 +0200
commit188dd7ee818d0a456f348d9010ff616a701497d6 (patch)
tree5f7b02ed998a182347988a0ae173813a851db91d
parent85a2bedc1a4881262285d36a5568b26079d309b1 (diff)
feat(web): bad search bar and page
-rw-r--r--web/src/app.rs1
-rw-r--r--web/src/control.rs21
-rw-r--r--web/src/page.rs54
3 files changed, 72 insertions, 4 deletions
diff --git a/web/src/app.rs b/web/src/app.rs
index 9e7845e..8ae651c 100644
--- a/web/src/app.rs
+++ b/web/src/app.rs
@@ -112,6 +112,7 @@ pub fn App() -> impl IntoView {
<Route path="/web/objects/:id" view=move || view! { <ObjectPage tl=context_tl /> } />
<Route path="/web/debug" view=DebugPage />
+ <Route path="/web/search" view=SearchPage />
<Route path="/" view=move || view! { <Redirect path="/web" /> } />
</Routes>
diff --git a/web/src/control.rs b/web/src/control.rs
index 84ac46c..73c3c92 100644
--- a/web/src/control.rs
+++ b/web/src/control.rs
@@ -6,11 +6,24 @@ use crate::prelude::*;
#[component]
pub fn Navigator() -> impl IntoView {
let auth = use_context::<Auth>().expect("missing auth context");
+ let (query, set_query) = create_signal("".to_string());
view! {
- <a href="/web/home"><input class="w-100" type="submit" class:hidden=move || !auth.present() value="home timeline" /></a>
- <a href="/web/server"><input class="w-100" type="submit" value="server timeline" /></a>
- <a href="/web/about"><input class="w-100" type="submit" value="about" /></a>
- <a href="/web/debug"><input class="w-100" type="submit" value="debug" class:hidden=move|| !auth.present() /></a>
+ <table class="align">
+ <tr>
+ <td class="w-100">
+ <input type="text" class="w-100" on:input=move |ev| {
+ set_query.set(event_target_value(&ev))
+ } />
+ </td>
+ <td>
+ <a href={move|| format!("/web/search?q={}", query.get())}><input type="submit" value="go" /></a>
+ </td>
+ </tr>
+ <tr><td colspan="2"><a href="/web/home"><input class="w-100" type="submit" class:hidden=move || !auth.present() value="home timeline" /></a></td></tr>
+ <tr><td colspan="2"><a href="/web/server"><input class="w-100" type="submit" value="server timeline" /></a></td></tr>
+ <tr><td colspan="2"><a href="/web/about"><input class="w-100" type="submit" value="about" /></a></td></tr>
+ <tr><td colspan="2"><a href="/web/debug"><input class="w-100" type="submit" value="debug" class:hidden=move|| !auth.present() /></a></td></tr>
+ </table>
}
}
diff --git a/web/src/page.rs b/web/src/page.rs
index 03ba6af..e8e6fd6 100644
--- a/web/src/page.rs
+++ b/web/src/page.rs
@@ -331,3 +331,57 @@ pub fn DebugPage() -> impl IntoView {
</div>
}
}
+
+#[component]
+pub fn SearchPage() -> impl IntoView {
+ let auth = use_context::<Auth>().expect("missing auth context");
+
+ let user = create_local_resource(
+ move || use_query_map().get().get("q").cloned().unwrap_or_default(),
+ move |q| {
+ let user_fetch = Uri::api(FetchKind::User, &q, true);
+ async move { Some(Arc::new(Http::fetch::<serde_json::Value>(&user_fetch, auth).await.ok()?)) }
+ }
+ );
+
+ let object = create_local_resource(
+ move || use_query_map().get().get("q").cloned().unwrap_or_default(),
+ move |q| {
+ let object_fetch = Uri::api(FetchKind::Object, &q, true);
+ async move { Some(Arc::new(Http::fetch::<serde_json::Value>(&object_fetch, auth).await.ok()?)) }
+ }
+ );
+
+ view! {
+ <Breadcrumb>search</Breadcrumb>
+ <blockquote class="mt-1 mb-1">
+ <details open>
+ <summary class="mb-2">
+ <code class="cw center color ml-s w-100">users</code>
+ </summary>
+ {move || match user.get() {
+ None => None,
+ Some(None) => None,
+ Some(Some(u)) => Some(view! {
+ <ActorBanner object=u />
+ }),
+ }}
+ </details>
+ </blockquote>
+
+ <blockquote class="mt-1 mb-1">
+ <details open>
+ <summary class="mb-2">
+ <code class="cw center color ml-s w-100">objects</code>
+ </summary>
+ {move || match object.get() {
+ None => None,
+ Some(None) => None,
+ Some(Some(o)) => Some(view! {
+ <Object object=o />
+ }),
+ }}
+ </details>
+ </blockquote>
+ }
+}