diff options
Diffstat (limited to 'src/components')
-rw-r--r-- | src/components/app.rs | 133 | ||||
-rw-r--r-- | src/components/editor/mod.rs | 25 | ||||
-rw-r--r-- | src/components/layout/mod.rs | 56 | ||||
-rw-r--r-- | src/components/mod.rs | 12 | ||||
-rw-r--r-- | src/components/renderer/mod.rs | 23 |
5 files changed, 71 insertions, 178 deletions
diff --git a/src/components/app.rs b/src/components/app.rs deleted file mode 100644 index 2814562..0000000 --- a/src/components/app.rs +++ /dev/null @@ -1,133 +0,0 @@ -use std::collections::HashMap; - -use leptos::prelude::*; -use leptos::Params; -use leptos_meta::{provide_meta_context, MetaTags, Stylesheet, Title}; -use leptos_router::hooks::use_params; -use leptos_router::params::Params; -use leptos_router::{ - components::{ParentRoute, Route, Router, Routes}, - path, -}; - -use super::editor::WikiEditor; -use super::renderer::WikiPage; -use crate::components::layout::Layout; -use crate::data::{Namespace, Page, PageData, PageUuid}; - -pub fn shell(options: LeptosOptions) -> impl IntoView { - view! { - <!DOCTYPE html> - <html lang="en"> - <head> - <meta charset="utf-8"/> - <meta name="viewport" content="width=device-width, initial-scale=1"/> - <AutoReload options=options.clone() /> - <HydrationScripts options islands=true/> - <MetaTags/> - </head> - <body> - <App/> - </body> - </html> - } -} - -#[component] -pub fn App() -> impl IntoView { - // Provides context that manages stylesheets, titles, meta tags, etc. - provide_meta_context(); - - view! { - // injects a stylesheet into the document <head> - // id=leptos means cargo-leptos will hot-reload this stylesheet - <Stylesheet id="leptos" href="/_/stormscribe.css"/> - - // sets the document title - <Title text="Welcome to Leptos"/> - - // content for this welcome page - <Router> - <Routes fallback=|| "Page not found.".into_view()> - <ParentRoute path=path!("/") view=Layout> - <Route path=path!("/~/*path") view=PageRender/> - <Route path=path!("/edit/*path") view=PageEdit/> - </ParentRoute> - </Routes> - </Router> - } -} - -#[derive(Params, PartialEq)] -struct PageParams { - path: Option<String>, -} - -#[server] -async fn get_namespace() -> Result<Namespace, ServerFnError> { - use crate::data::StormscribeData; - - Ok(StormscribeData::get_namespace().await) -} - -#[server] -async fn get_pages() -> Result<HashMap<PageUuid, Page>, ServerFnError> { - use crate::data::StormscribeData; - - Ok(StormscribeData::get_all_pages().await) -} - -#[server] -async fn lookup_page(path: String) -> Result<PageData, ServerFnError> { - use crate::data::StormscribeData; - - Ok(StormscribeData::get_page_data(path).await) -} - -// Renders a page -#[component] -fn PageRender() -> impl IntoView { - let params = use_params::<PageParams>(); - - let page_path = params - .read() - .as_ref() - .ok() - .map(|params| params.path.clone().unwrap_or("Unknown path".to_string())) - .unwrap_or("Could not read params".to_string()); - - let page_resource = Resource::new( - move || page_path.clone(), - |page_path| async move { lookup_page(page_path).await }, - ); - - view! { - <Suspense - fallback=move || view! { <p>"Loading..."</p> } - > - {move || page_resource.get() - .map(|page| view! { - <pre>{format!("{page:#?}")}</pre> - }) - } - </Suspense> - } - .into_any() -} - -// Renders a page -#[component] -fn PageEdit() -> impl IntoView { - let params = use_params::<PageParams>(); - - let page_path = params - .read() - .as_ref() - .ok() - .map(|params| params.path.clone().unwrap_or("Unknown path".to_string())) - .unwrap_or("Could not read params".to_string()); - - view! { - <WikiEditor url_path=page_path /> - } -} diff --git a/src/components/editor/mod.rs b/src/components/editor/mod.rs index 05e45d3..4d38c69 100644 --- a/src/components/editor/mod.rs +++ b/src/components/editor/mod.rs @@ -1,13 +1,18 @@ -use leptos::prelude::*; -use leptos::{island, view, IntoView}; +use std::path::PathBuf; +use morgana::{morx, Component, RenderNode}; -#[island] -pub fn WikiEditor( - url_path: String, -) -> impl IntoView { - view! { - <h1>Article (Editing)</h1> - <p>Page render</p> - <pre>{url_path}</pre> +stylance::import_crate_style!(styles, "src/components/layout/layout.module.css"); + +pub struct Editor { + page_path: PathBuf, +} + +impl Component for Editor { + fn render(self: Box<Self>) -> RenderNode { + morx! { + h1= "Article (Editing)" + p= "Page render" + pre= {self.page_path.to_string_lossy()} + } } } diff --git a/src/components/layout/mod.rs b/src/components/layout/mod.rs index e688f5f..cc524e9 100644 --- a/src/components/layout/mod.rs +++ b/src/components/layout/mod.rs @@ -1,25 +1,41 @@ -use leptos::prelude::*; -use leptos::component; -use leptos_router::components::Outlet; +use morgana::{morx, Component, RenderNode}; stylance::import_crate_style!(styles, "src/components/layout/layout.module.css"); -#[component] -pub fn Layout() -> impl IntoView { - view! { - <div class=styles::layout> - <header> - <a href="/" id="siteTitle">Site Title</a> - </header> - <nav> - <p>Nav</p> - </nav> - <main> - <Outlet/> - </main> - <footer> - <p>Footer</p> - </footer> - </div> +pub struct Layout { + pub children: Vec<RenderNode>, + pub page_title: String, + pub site_title: String, +} + +impl Component for Layout { + fn render(self: Box<Self>) -> RenderNode { + morx! { + html lang="html" { + head { + title ={self.page_title} + } + body { + div class={styles::layout} { + header { + a href="/" id="siteTitle" { + ={self.site_title} + } + } + + nav { + p= "Nav" + } + + main ={self.children} + + footer { + p= "Footer" + } + } + } + } + } } } + diff --git a/src/components/mod.rs b/src/components/mod.rs index 2015a2e..1058018 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -1,7 +1,7 @@ -pub mod editor; -pub mod layout; -pub mod renderer; +mod editor; +mod layout; +mod renderer; -pub mod app; - -pub use app::App; +pub use editor::Editor; +pub use renderer::PageRenderer; +pub use layout::Layout; diff --git a/src/components/renderer/mod.rs b/src/components/renderer/mod.rs index 5a30c2e..e790924 100644 --- a/src/components/renderer/mod.rs +++ b/src/components/renderer/mod.rs @@ -1,12 +1,17 @@ -use leptos::prelude::*; -use leptos::{component, view, IntoView}; +use std::path::PathBuf; +use morgana::{morx, Component, RenderNode}; -#[component] -pub fn WikiPage(// page_data: Page, - // parent_namespaces: Vec<Namespace> -) -> impl IntoView { - view! { - <h1>Article (Viewing)</h1> - <p>Page render</p> +stylance::import_crate_style!(styles, "src/components/layout/layout.module.css"); + +pub struct PageRenderer { + page_path: PathBuf, +} + +impl Component for PageRenderer { + fn render(self: Box<Self>) -> RenderNode { + morx! { + h1= "Article (Viewing)" + p= "Page render" + } } } |