Compare commits

..

2 Commits

Author SHA1 Message Date
08e742f8bb wip 2025-02-06 22:48:45 +01:00
6597d61905 wip 2025-02-06 21:34:30 +01:00
5 changed files with 44 additions and 30 deletions

View File

@@ -1,3 +1,4 @@
use crate::codec::ron::Ron;
use crate::pages; use crate::pages;
use leptos::prelude::*; use leptos::prelude::*;
use leptos_router::components::*; use leptos_router::components::*;
@@ -55,29 +56,34 @@ pub fn Home() -> impl leptos::IntoView {
tracing::debug!("Rendering home component"); tracing::debug!("Rendering home component");
let action = Action::new(|()| async move { // dbg!(leptos::prelude::Owner::current().map(|o| o.ancestry()));
tracing::debug!("running action");
let walls = crate::server_functions::get_walls()
.await
.inspect_err(|e| {
dbg!(e);
})
.expect("failed to get walls")
.into_inner();
let wall = walls.first();
if let Some(wall) = wall { let wall_uid = OnceResource::<_, Ron>::new_with_options(
async move {
// dbg!(leptos::prelude::Owner::current().map(|o| o.ancestry()));
let walls = crate::server_functions::get_walls()
.await
.inspect_err(|e| {
dbg!(e);
})
.expect("failed to get walls")
.into_inner();
walls.first().map(|wall| wall.uid)
},
false,
);
Effect::new(move || {
tracing::debug!("running effect");
if let Some(wall_uid) = wall_uid.get().flatten() {
tracing::debug!("navigating");
let navigate = leptos_router::hooks::use_navigate(); let navigate = leptos_router::hooks::use_navigate();
let url = format!("/wall/{}", wall.uid); let url = format!("/wall/{}", wall_uid);
navigate(&url, Default::default()); navigate(&url, Default::default());
tracing::debug!("navigated");
} }
}); });
tracing::debug!("dispatching action...");
action.dispatch(());
tracing::debug!("dispatched action");
leptos::view! {} leptos::view! {}
} }

View File

@@ -1,11 +1,13 @@
use leptos::prelude::*; use leptos::prelude::*;
#[derive(Debug, Clone)]
pub struct HeaderItems { pub struct HeaderItems {
pub left: Vec<HeaderItem>, pub left: Vec<HeaderItem>,
pub middle: Vec<HeaderItem>, pub middle: Vec<HeaderItem>,
pub right: Vec<HeaderItem>, pub right: Vec<HeaderItem>,
} }
#[derive(Debug, Clone)]
pub struct HeaderItem { pub struct HeaderItem {
pub text: String, pub text: String,
pub link: Option<String>, pub link: Option<String>,
@@ -13,7 +15,7 @@ pub struct HeaderItem {
/// Header with background color etc. /// Header with background color etc.
#[component] #[component]
pub fn StyledHeader(items: HeaderItems) -> impl IntoView { pub fn StyledHeader(#[prop(into)] items: Signal<HeaderItems>) -> impl IntoView {
view! { view! {
<div class="bg-orange-300 text-black border-b-2 border-b-orange-400"> <div class="bg-orange-300 text-black border-b-2 border-b-orange-400">
// <div class="container mx-auto" > // <div class="container mx-auto" >
@@ -25,32 +27,34 @@ pub fn StyledHeader(items: HeaderItems) -> impl IntoView {
/// Function header without styling /// Function header without styling
#[component] #[component]
pub fn Header(items: HeaderItems) -> impl IntoView { pub fn Header(#[prop(into)] items: Signal<HeaderItems>) -> impl IntoView {
let HeaderItems { left, middle, right } = items; let left = move || items.read().left.clone();
let middle = move || items.read().middle.clone();
let right = move || items.read().right.clone();
view! { view! {
<div class="grid grid-cols-[1fr_3fr_1fr] text-xl font-semibold p-4"> <div class="grid grid-cols-[1fr_3fr_1fr] text-xl font-semibold p-4">
// Left side of header // Left side of header
<div class="justify-self-start"> <div class="justify-self-start">
<Items items=left /> <Items items=Signal::derive(left) />
</div> </div>
// Expanding space in the middle // Expanding space in the middle
<div class="justify-self-center font-semibold"> <div class="justify-self-center font-semibold">
<Items items=middle /> <Items items=Signal::derive(middle) />
</div> </div>
// Right side of header // Right side of header
<div class="justify-self-end"> <div class="justify-self-end">
<Items items=right /> <Items items=Signal::derive(right) />
</div> </div>
</div> </div>
} }
} }
#[component] #[component]
fn Items(items: Vec<HeaderItem>) -> impl IntoView { fn Items(#[prop(into)] items: Signal<Vec<HeaderItem>>) -> impl IntoView {
let items = items.into_iter().map(|item| view! { <Item item /> }).collect_view(); let items = move || items.get().into_iter().map(|item| view! { <Item item /> }).collect_view();
view! { <div class="flex gap-4">{items}</div> } view! { <div class="flex gap-4">{items}</div> }
} }

View File

@@ -58,7 +58,7 @@ pub fn Wall() -> impl leptos::IntoView {
leptos::view! { leptos::view! {
<div class="min-w-screen min-h-screen bg-slate-900"> <div class="min-w-screen min-h-screen bg-slate-900">
<StyledHeader items=header_items() /> <StyledHeader items=Signal::derive(header_items) />
<div class="m-2"> <div class="m-2">
<Suspense fallback=move || { <Suspense fallback=move || {

View File

@@ -63,6 +63,7 @@ async fn serve(cli: Cli) -> Result<(), Error> {
let leptos_options = leptos_conf_file.leptos_options; let leptos_options = leptos_conf_file.leptos_options;
let addr = leptos_options.site_addr; let addr = leptos_options.site_addr;
let routes = generate_route_list(App); let routes = generate_route_list(App);
dbg!(&routes);
let config = load_config(cli)?; let config = load_config(cli)?;

View File

@@ -4,19 +4,20 @@ use crate::models;
use leptos::prelude::expect_context; use leptos::prelude::expect_context;
use leptos::server; use leptos::server;
use server_fn::ServerFnError; use server_fn::ServerFnError;
use server_fn::error::ServerFnErrorErr;
#[server( #[server(
input = Ron, input = Ron,
output = Ron, output = Ron,
custom = RonEncoded custom = RonEncoded
)] )]
#[tracing::instrument(skip_all, err(Debug))] // #[tracing::instrument(skip_all, err(Debug))]
pub(crate) async fn get_walls() -> Result<RonEncoded<Vec<models::Wall>>, ServerFnError> { pub async fn get_walls() -> Result<RonEncoded<Vec<models::Wall>>, ServerFnError> {
use crate::server::db::Database; use crate::server::db::Database;
use redb::ReadableTable; use redb::ReadableTable;
tracing::debug!("Enter"); tracing::debug!("Enter");
// dbg!(leptos::prelude::Owner::current().map(|o| o.ancestry()));
let db = expect_context::<Database>(); let db = expect_context::<Database>();
let walls = db let walls = db
@@ -27,6 +28,8 @@ pub(crate) async fn get_walls() -> Result<RonEncoded<Vec<models::Wall>>, ServerF
}) })
.await?; .await?;
tracing::debug!("Exit");
Ok(RonEncoded::new(walls)) Ok(RonEncoded::new(walls))
} }