diff --git a/smart-house-web/backend/Cargo.toml b/smart-house-web/backend/Cargo.toml index 666690e..fdb8186 100644 --- a/smart-house-web/backend/Cargo.toml +++ b/smart-house-web/backend/Cargo.toml @@ -12,4 +12,4 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" [dev-dependencies] -reqwest = { version = "0.13.3", features = ["json"] } +reqwest = { version = "0.13", features = ["json"] } diff --git a/smart-house-web/frontend/Cargo.toml b/smart-house-web/frontend/Cargo.toml index 99dffc0..91f1117 100644 --- a/smart-house-web/frontend/Cargo.toml +++ b/smart-house-web/frontend/Cargo.toml @@ -4,7 +4,9 @@ version = "0.1.0" edition = "2021" [dependencies] -dioxus = { version = "0.7.1", features = [] } +dioxus = { version = "0.7", features = [] } +reqwest = { version = "0.13", features = ["json"] } +serde = { version = "1.0", features = ["derive"] } [features] default = ["web"] diff --git a/smart-house-web/frontend/assets/main.css b/smart-house-web/frontend/assets/main.css index e69de29..972a921 100644 --- a/smart-house-web/frontend/assets/main.css +++ b/smart-house-web/frontend/assets/main.css @@ -0,0 +1,155 @@ +html, +body { + background-color: #0e0e0e; + color: white; + font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; + height: 100%; + width: 100%; + overflow: hidden; + margin: 0; +} + +#main { + display: flex; + flex-direction: column; + height: 100%; + justify-content: space-between; +} + +#dogview { + max-height: 80vh; + flex-grow: 1; + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +#dogview img { + display: block; + max-width: 50%; + max-height: 50%; + transform: scale(1.8); + border-radius: 5px; + border: 1px solid rgb(233, 233, 233); + box-shadow: 0px 0px 5px 1px rgb(216, 216, 216, 0.5); +} + +#title { + text-align: center; + padding-top: 10px; + border-bottom: 1px solid #a8a8a8; + display: flex; + flex-direction: row; + justify-content: space-evenly; + align-items: center; +} + +#title a { + text-decoration: none; + color: white; +} + +a#heart { + background-color: white; + color: red; + padding: 5px; + border-radius: 5px; +} + +#title span { + width: 20px; +} + +#title h1 { + margin: 0.25em; + font-style: italic; +} + +#buttons { + display: flex; + flex-direction: row; + justify-content: center; + gap: 20px; + /* padding-top: 20px; */ + padding-bottom: 20px; +} + +#skip { + background-color: gray; +} +#save { + background-color: green; +} + +#skip, +#save { + padding: 5px 30px 5px 30px; + border-radius: 3px; + font-size: 2rem; + font-weight: bold; + color: rgb(230, 230, 230); +} + +#navbar { + border: 1px solid rgb(233, 233, 233); + border-width: 1px 0px 0px 0px; + display: flex; + flex-direction: row; + justify-content: space-evenly; + padding: 20px; + gap: 20px; +} + +#navbar a { + background-color: #a8a8a8; + border-radius: 5px; + border: 1px solid black; + text-decoration: none; + color: black; + padding: 10px 30px 10px 30px; +} + +#favorites { + flex-grow: 1; + overflow: hidden; + display: flex; + flex-direction: column; + padding: 10px; +} + +#favorites-container { + overflow-y: auto; + overflow-x: hidden; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + gap: 10px; + padding: 10px; +} + +.favorite-dog { + max-height: 180px; + max-width: 60%; + position: relative; +} + +.favorite-dog img { + max-height: 150px; + border-radius: 5px; + margin: 5px; +} + +.favorite-dog:hover button { + display: block; +} + +.favorite-dog button { + display: none; + position: absolute; + bottom: 10px; + left: 10px; + z-index: 10; +} diff --git a/smart-house-web/frontend/src/main.rs b/smart-house-web/frontend/src/main.rs index fc22783..23107f6 100644 --- a/smart-house-web/frontend/src/main.rs +++ b/smart-house-web/frontend/src/main.rs @@ -1,21 +1,60 @@ use dioxus::prelude::*; +const FAVICON: Asset = asset!("/assets/favicon.ico"); +const MAIN_CSS: Asset = asset!("/assets/main.css"); + fn main() { dioxus::launch(App); } +#[derive(Clone)] +struct TitleState(String); + #[component] fn App() -> Element { + use_context_provider(|| TitleState("HotDog".to_string())); + rsx! { + document::Link { rel: "icon", href: FAVICON } + document::Stylesheet { href: MAIN_CSS } + Title { } + DogView { } + } +} + +#[component] +fn Title() -> Element { + let title = use_context::(); rsx! { div { id: "title", - h1 { "HotDog! 🌭" } - } - div { id: "dogview", - img { src: "https://images.dog.ceo/breeds/pitbull/dog-3981540_1280.jpg" } - } - div { id: "buttons", - button { id: "skip", "skip" } - button { id: "save", "save!" } + h1 { "{title.0}! 🌭" } + } + } +} + +#[derive(serde::Deserialize)] +struct DogApi { + message: String, +} + +#[component] +fn DogView() -> Element { + let mut img_src = use_resource(|| async move { + reqwest::get("https://dog.ceo/api/breeds/image/random") + .await + .unwrap() + .json::() + .await + .unwrap() + .message + }); + + rsx! { + div { id: "dogview", + img { src: img_src.cloned().unwrap_or_default() } + } + div { id: "buttons", + button { onclick: move |_| img_src.restart(), id: "skip", "skip" } + button { onclick: move |_| img_src.restart(), id: "save", "save!" } } } }