summary refs log tree commit diff
path: root/src/components
diff options
context:
space:
mode:
Diffstat (limited to 'src/components')
-rw-r--r--src/components/app.rs133
-rw-r--r--src/components/editor/mod.rs25
-rw-r--r--src/components/layout/mod.rs56
-rw-r--r--src/components/mod.rs12
-rw-r--r--src/components/renderer/mod.rs23
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"
+        }
     }
 }