summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-09-26 17:43:43 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-09-26 17:43:43 +0200
commit32847efa04029d81f9d8cf7a37999cb3cbb1e145 (patch)
tree8a0a7bc135643a6fbf45bf48141d9dfcb2085183 /src
downloadweb-client-32847efa04029d81f9d8cf7a37999cb3cbb1e145.zip
chore: Initial Commit
Diffstat (limited to '')
-rw-r--r--src/components/mod.rs1
-rw-r--r--src/lib.rs59
-rw-r--r--src/main.rs13
-rw-r--r--src/pages/home.rs95
-rw-r--r--src/pages/mod.rs2
-rw-r--r--src/pages/not_found.rs6
6 files changed, 176 insertions, 0 deletions
diff --git a/src/components/mod.rs b/src/components/mod.rs
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/components/mod.rs
@@ -0,0 +1 @@
+
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..7d58735
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,59 @@
+#![expect(
+ unreachable_pub,
+ reason = "leptos' component macro generates this warning"
+)]
+#![expect(
+ clippy::must_use_candidate,
+ reason = "Can't add it to leptos' components"
+)]
+
+mod components;
+mod pages;
+
+use std::sync::Arc;
+
+use leptos::prelude::{AddAnyAttr, IntoView, component, view};
+use leptos_meta::{Html, Meta, Title, provide_meta_context};
+use leptos_router::{
+ components::{Route, Router, Routes},
+ path,
+};
+use rocie_client::apis::configuration::Configuration;
+
+use crate::pages::home::Home;
+
+#[component]
+pub fn App() -> impl IntoView {
+ // Provides context that manages stylesheets, titles, meta tags, etc.
+ provide_meta_context();
+
+ let config = {
+ let mut config = Configuration::new();
+
+ config.user_agent = Some("rocie-mobile".to_owned());
+ config.base_path = "http://127.0.0.1:8080".to_owned();
+
+ Arc::new(config)
+ };
+
+ view! {
+ <Html attr:lang="en" attr:dir="ltr" attr:data-theme="light" />
+
+ <Title text="Welcome to Leptos CSR" />
+
+ <Meta charset="UTF-8" />
+ <Meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
+ <Router>
+ <Routes fallback=|| view! { NotFound }>
+ <Route
+ path=path!("/")
+ view=move || {
+ let local_config = Arc::clone(&config);
+ view! { <Home config=local_config /> }
+ }
+ />
+ </Routes>
+ </Router>
+ }
+}
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..c377484
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,13 @@
+use leptos::prelude::{mount_to_body, view};
+
+use rocie_mobile::App;
+
+fn main() {
+ // set up logging
+ _ = console_log::init_with_level(log::Level::Debug);
+ console_error_panic_hook::set_once();
+
+ mount_to_body(|| {
+ view! { <App /> }
+ });
+}
diff --git a/src/pages/home.rs b/src/pages/home.rs
new file mode 100644
index 0000000..9c86833
--- /dev/null
+++ b/src/pages/home.rs
@@ -0,0 +1,95 @@
+use std::sync::Arc;
+
+use leptos::{
+ IntoView, component,
+ error::ErrorBoundary,
+ prelude::{
+ ClassAttribute, CollectView, ElementChild, Get, Read, ReadSignal, Set, With, signal,
+ },
+ reactive::spawn_local,
+ server::{LocalResource, Resource},
+ view,
+};
+use rocie_client::apis::{
+ api_get_product_api::{ProductsError, products},
+ configuration::Configuration,
+};
+
+#[component]
+pub fn Home(config: Arc<Configuration>) -> impl IntoView {
+ let (read_status, write_status) = signal("Loading..".to_owned());
+
+ {
+ let local_config = Arc::clone(&config);
+
+ spawn_local(async move {
+ let products = products(&local_config).await;
+
+ write_status.set(
+ products
+ .as_ref()
+ .map(move |products| {
+ let products_num = products.len();
+ let plural_s = if products_num == 1 { "" } else { "s" };
+ let products_value = 2;
+ let products_currency = "EUR";
+ format!(
+ "You have {products_num} product{plural_s} \
+ in stock with a value \
+ of {products_value} {products_currency}.",
+ )
+ })
+ .unwrap(),
+ );
+ });
+ }
+
+ view! {
+ <ErrorBoundary fallback=|errors| {
+ view! {
+ <h1>"Uh oh! Something went wrong!"</h1>
+
+ <p>"Errors: "</p>
+ // Render a list of errors as strings - good for development purposes
+ <ul>
+ {move || {
+ errors
+ .get()
+ .into_iter()
+ .map(|(_, e)| view! { <li>{e.to_string()}</li> })
+ .collect_view()
+ }}
+ </ul>
+ }
+ }>
+
+ <nav>
+ <div class="nav">
+ <img
+ src="https://raw.githubusercontent.com/leptos-rs/leptos/main/docs/logos/Leptos_logo_RGB.svg"
+ alt="Rocie Logo"
+ height="200"
+ width="400"
+ />
+ <h1>Rocie</h1>
+ </div>
+ </nav>
+
+ <div class="container">
+ <div class="container">
+ <h1>"Inventory"</h1>
+
+ <p>{read_status}</p>
+ </div>
+
+ <div class="container">
+ <h1>"Recipies"</h1>
+ </div>
+
+ <div class="container">
+ <h1>"Shopping list"</h1>
+ </div>
+ </div>
+ </ErrorBoundary>
+ }
+}
diff --git a/src/pages/mod.rs b/src/pages/mod.rs
new file mode 100644
index 0000000..8829694
--- /dev/null
+++ b/src/pages/mod.rs
@@ -0,0 +1,2 @@
+pub mod home;
+pub mod not_found;
diff --git a/src/pages/not_found.rs b/src/pages/not_found.rs
new file mode 100644
index 0000000..7b5c127
--- /dev/null
+++ b/src/pages/not_found.rs
@@ -0,0 +1,6 @@
+use leptos::{IntoView, component, prelude::ElementChild, view};
+
+#[component]
+pub fn NotFound() -> impl IntoView {
+ view! { <h1>"Uh oh!" <br /> "We couldn't find that page!"</h1> }
+}