diff --git a/src/cookie.rs b/src/cookie.rs
index 0557e11..e1dce20 100644
--- a/src/cookie.rs
+++ b/src/cookie.rs
@@ -1,42 +1,31 @@
use crate::*;
-#[derive(Properties, Clone, PartialEq)]
-pub struct CookieProps {
- pub cookie: String,
+pub fn acquire_cookie() -> String {
+ let cookie_options = cookies::CookieOptions::default()
+ .expires_after(core::time::Duration::from_secs(
+ 52 * 7 * 24 * 60 * 60
+ ));
+ match cookies::get("test") {
+ Some(Ok(cookie)) => {
+ log!("got cookie");
+ return cookie;
+ }
+ Some(Err(e)) => {
+ log!(format!("cookie error: {}", e));
+ }
+ None => {
+ log!("did not find cookie");
+ }
+ }
+ log!("setting cookie");
+ cookies::set("test", "123", &cookie_options);
+ "123".to_string()
}
-impl CookieProps {
- pub fn acquire_cookie() -> Self {
- let cookie_options = cookies::CookieOptions::default()
- .expires_after(core::time::Duration::from_secs(
- 52 * 7 * 24 * 60 * 60
- ));
- match cookies::get("test") {
- Some(Ok(cookie)) => {
- log!("got cookie");
- return Self { cookie: cookie };
- }
- Some(Err(e)) => {
- log!(format!("cookie error: {}", e));
- }
- None => {
- log!("did not find cookie");
- }
- }
- log!("setting cookie");
- cookies::set("test", "123", &cookie_options);
- let cookie = "123".to_string();
- // XXX Don't do this!! No secrets in logs!
- // log!(&cookie);
- Self { cookie }
- }
-}
-
-#[function_component(Cookie)]
-pub fn cookie(CookieProps { cookie }: &CookieProps) -> Html {
+pub fn render_cookie(cookie: &str) -> Html {
html! {
-
{cookie.clone()}
+
{cookie}
}
}
diff --git a/src/joke.rs b/src/joke.rs
index 1693f5e..ad1bafa 100644
--- a/src/joke.rs
+++ b/src/joke.rs
@@ -10,41 +10,43 @@ pub struct JokeStruct {
}
impl JokeStruct {
- pub async fn get_joke() -> Result {
- http::Request::get("http://localhost:3000/api/v1/joke")
+ pub async fn get_joke() -> Msg {
+ let response = http::Request::get("http://localhost:3000/api/v1/joke")
.send()
- .await?
- .json()
- .await
+ .await;
+ match response {
+ Err(e) => Msg::GotJoke(Err(e)),
+ Ok(data) => Msg::GotJoke(data.json().await),
+ }
}
}
+pub fn format_tags(tags: &HashSet) -> String {
+ let taglist: Vec<&str> = tags.iter().map(String::as_ref).collect();
+ taglist.join(", ")
+}
#[derive(Properties, Clone, PartialEq, serde::Deserialize)]
pub struct JokeProps {
pub joke: JokeStruct,
}
-pub fn format_tags(tags: &HashSet) -> String {
- let taglist: Vec<&str> = tags.iter().map(String::as_ref).collect();
- taglist.join(", ")
-}
-
#[function_component(Joke)]
pub fn joke(joke: &JokeProps) -> Html {
+ let joke = &joke.joke;
html! { <>
{"Knock-Knock!"}
{"Who's there?"}
- {joke.joke.whos_there.clone()}
- {format!("{} who?", &joke.joke.whos_there)}
- {joke.joke.answer_who.clone()}
+ {joke.whos_there.clone()}
+ {format!("{} who?", &joke.whos_there)}
+ {joke.answer_who.clone()}
- {format!("[id: {}", &joke.joke.id)}
- if let Some(ref tags) = joke.joke.tags {
+ {format!("[id: {}", &joke.id)}
+ if let Some(ref tags) = joke.tags {
{format!("; tags: {}", &format_tags(tags))}
}
- if let Some(ref source) = joke.joke.source {
+ if let Some(ref source) = joke.source {
{format!("; source: {}", source)}
}
{"]"}
diff --git a/src/main.rs b/src/main.rs
index 7c9af00..12b5228 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -13,37 +13,55 @@ extern crate wasm_bindgen_futures;
use wasm_cookies as cookies;
use yew::prelude::*;
-#[function_component(App)]
-fn app() -> Html {
- let cookie = use_state(|| CookieProps::acquire_cookie());
+pub type JokeResult = Result;
- let joke = use_state(|| Err(gloo_net::Error::GlooError("uninit".to_string())));
- let get_joke = joke.clone();
- use_effect_with((), move |()| {
- wasm_bindgen_futures::spawn_local(async move {
- let joke = JokeStruct::get_joke().await;
- get_joke.set(joke);
- });
- || ()
- });
+struct App {
+ cookie: String,
+ joke: JokeResult,
+}
- html! {
- <>
- { "Knock-Knock" }
- if false {
-
-
-
+pub enum Msg {
+ GotJoke(JokeResult),
+}
+
+impl Component for App {
+ type Message = Msg;
+ type Properties = ();
+
+ fn create(ctx: &Context) -> Self {
+ let cookie = acquire_cookie();
+ let got_joke = JokeStruct::get_joke();
+ ctx.link().send_future(got_joke);
+ let joke = Err(gloo_net::Error::GlooError("Loading Jokeā¦".to_string()));
+ Self { cookie, joke }
+ }
+
+ fn update(&mut self, _ctx: &Context, msg: Self::Message) -> bool {
+ match msg {
+ Msg::GotJoke(joke) => self.joke = joke,
}
- if let Ok(ref joke) = *joke {
-
+ true
+ }
+
+ fn view(&self, _ctx: &Context) -> Html {
+ let cookie = &self.cookie;
+ let joke = &self.joke;
+ html! {
+ <>
+ { "Knock-Knock" }
+ if false {
+ {render_cookie(cookie)}
+ }
+ if let Ok(ref joke) = joke {
+
+ }
+ if let Err(ref error) = joke {
+
+ {format!("Server Error: {error}")}
+
+ }
+ >
}
- if let Err(ref error) = *joke {
-
- {format!("Server Error: {error}")}
-
- }
- >
}
}