From fe33cc9c12a7af25c95a33825a6bda286a5dc9c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asger=20Juul=20Brunsh=C3=B8j?= Date: Sun, 9 Feb 2025 18:22:56 +0100 Subject: [PATCH] fixup edit wall page --- crates/ascend/src/components/problem.rs | 4 +- crates/ascend/src/pages/edit_wall.rs | 86 ++++++++++++++----------- crates/ascend/src/pages/routes.rs | 20 ++---- crates/ascend/src/pages/wall.rs | 6 +- 4 files changed, 56 insertions(+), 60 deletions(-) diff --git a/crates/ascend/src/components/problem.rs b/crates/ascend/src/components/problem.rs index 6a0e9d5..6afc219 100644 --- a/crates/ascend/src/components/problem.rs +++ b/crates/ascend/src/components/problem.rs @@ -23,9 +23,7 @@ pub fn Problem(#[prop(into)] dim: Signal, #[prop(into)] view! {
-
- {holds} -
+
{holds}
} } diff --git a/crates/ascend/src/pages/edit_wall.rs b/crates/ascend/src/pages/edit_wall.rs index 3727348..0459c78 100644 --- a/crates/ascend/src/pages/edit_wall.rs +++ b/crates/ascend/src/pages/edit_wall.rs @@ -1,13 +1,13 @@ -use crate::codec::ron::Ron; -use crate::codec::ron::RonEncoded; +use crate::components::StyledHeader; use crate::components::header::HeaderItem; use crate::components::header::HeaderItems; use crate::models; use crate::models::HoldPosition; -use crate::models::Wall; +use leptos::Params; use leptos::ev::Event; use leptos::html::Input; use leptos::prelude::*; +use leptos_router::params::Params; use serde::Deserialize; use serde::Serialize; use server_fn::codec::Cbor; @@ -15,17 +15,28 @@ use wasm_bindgen::JsCast; use wasm_bindgen::prelude::*; use web_sys::FileList; +#[derive(Params, PartialEq, Clone)] +struct RouteParams { + wall_uid: Option, +} + #[component] pub fn EditWall() -> impl leptos::IntoView { - let load = async move { - // TODO: What to do about this unwrap? - load_initial_data().await.unwrap() - }; + let params = leptos_router::hooks::use_params::(); + let wall_uid = Signal::derive(move || { + params + .get() + .expect("gets wall_uid from URL") + .wall_uid + .expect("wall_uid param is never None") + }); - let header_items = HeaderItems { + let wall = crate::resources::wall_by_uid(wall_uid); + + let header_items = move || HeaderItems { left: vec![HeaderItem { text: "← Ascend".to_string(), - link: Some("/".to_string()), + link: Some(format!("/wall/{}", wall_uid.get())), }], middle: vec![HeaderItem { text: "HOLDS".to_string(), @@ -34,29 +45,43 @@ pub fn EditWall() -> impl leptos::IntoView { right: vec![], }; - // leptos::view! { - //
- // + leptos::view! { +
+ - //
- // - // - // - //
- //
- // } +
+ "Loading..."

} + }> + {move || Suspend::new(async move { + let wall = wall.await; + view! { + + {move || -> Result<_, ServerFnError> { + let wall = wall.clone()?; + Ok(view! { }) + }} + + } + })} +
+
+
+ } } #[component] -fn Ready(data: InitialData) -> impl leptos::IntoView { +fn Ready(wall: models::Wall) -> impl leptos::IntoView { tracing::debug!("ready"); let mut holds = vec![]; - for hold in data.wall.holds.values().cloned() { + for hold in wall.holds.values().cloned() { holds.push(view! { }); } - let grid_classes = format!("grid grid-rows-{} grid-cols-{} gap-3", data.wall.rows, data.wall.cols); + let grid_classes = format!("grid grid-rows-{} grid-cols-{} gap-3", wall.rows, wall.cols); view! {
@@ -137,29 +162,12 @@ fn Hold(hold: models::Hold) -> impl leptos::IntoView { } } -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct InitialData { - wall: Wall, -} - #[derive(Debug, Serialize, Deserialize, Clone)] pub struct Image { file_name: String, file_contents: Vec, } -#[server( - input = Ron, - output = Ron, - custom = RonEncoded -)] -#[tracing::instrument(skip_all, err)] -async fn load_initial_data() -> Result, ServerFnError> { - todo!() - // let wall = state.persistent.with(|s| s.wall.clone()).await; - // Ok(RonCodec::new(InitialData { wall })) -} - #[server(name = SetImage, input = Cbor)] #[tracing::instrument(skip(image), err)] async fn set_image(hold_position: HoldPosition, image: Image) -> Result { diff --git a/crates/ascend/src/pages/routes.rs b/crates/ascend/src/pages/routes.rs index d2725a7..4e6e68a 100644 --- a/crates/ascend/src/pages/routes.rs +++ b/crates/ascend/src/pages/routes.rs @@ -1,4 +1,3 @@ -use crate::codec::ron::Ron; use crate::components; use crate::components::header::HeaderItem; use crate::components::header::HeaderItems; @@ -65,20 +64,14 @@ pub fn Routes() -> impl leptos::IntoView { each=problems_sample key=|problem| problem.uid children=move |problem: models::Problem| { - view! { - - } + view! { } } />
}) }; - view! { - - {v} - - } + view! { {v} } }) }; @@ -87,11 +80,8 @@ pub fn Routes() -> impl leptos::IntoView {
- {move || view! { }} - - "loading"

}> - {suspend} -
+ {move || view! { }} + "loading"

}>{suspend}
} @@ -104,7 +94,7 @@ fn Problem(#[prop(into)] dim: Signal, #[prop(into)] prob view! { -

{ move || problem.get().name.clone() }

+

{move || problem.get().name.clone()}

} } diff --git a/crates/ascend/src/pages/wall.rs b/crates/ascend/src/pages/wall.rs index 8e400d6..ba84109 100644 --- a/crates/ascend/src/pages/wall.rs +++ b/crates/ascend/src/pages/wall.rs @@ -59,7 +59,7 @@ pub fn Wall() -> impl IntoView { {move || Suspend::new(async move { let wall: Option = wall.get().and_then(Result::ok); wall.map(|wall| { - view! { } + view! { } }) })} @@ -121,9 +121,9 @@ fn Ready(wall: models::Wall) -> impl leptos::IntoView {
-
// TODO: + // TODO: //

{current_problem.read().as_ref().map(|p| p.name.clone())}

- //

{current_problem.read().as_ref().map(|p| p.set_by.clone())}

+
//

{current_problem.read().as_ref().map(|p| p.set_by.clone())}