Skip to content

Commit ca5cf1f

Browse files
committed
Add auth
1 parent 814d1f5 commit ca5cf1f

File tree

10 files changed

+46
-33
lines changed

10 files changed

+46
-33
lines changed

devblog/devblog/client/src/api.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub enum Api {
1717
}
1818

1919
impl Api {
20-
pub async fn fetch2(
20+
pub async fn fetch(
2121
&self,
2222
hdrs: Option<Headers>,
2323
body: Option<JsValue>,

devblog/devblog/client/src/helpers.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
// use gloo::console::log;
2+
use crate::store::Store;
13
use crate::{helpers, Api};
24
use crate::{router::Route, User, UserField};
3-
// use gloo::console::log;
45
use gloo_net::http::{Headers, Method, Response};
56
use serde::de::DeserializeOwned;
67
use serde::Serialize;
@@ -9,6 +10,7 @@ use wasm_bindgen::JsValue;
910
use web_sys::{Event, HtmlInputElement, SubmitEvent};
1011
use yew::{Callback, TargetCast, UseStateHandle};
1112
use yew_router::navigator::Navigator;
13+
use yewdux::Dispatch;
1214

1315
pub fn onchange(user: &UseStateHandle<User>, field: UserField) -> Callback<Event> {
1416
let user = user.clone();
@@ -22,21 +24,31 @@ pub fn onchange(user: &UseStateHandle<User>, field: UserField) -> Callback<Event
2224
})
2325
}
2426

25-
pub fn onsubmit(user: &UseStateHandle<User>, nav: Navigator, api: Api) -> Callback<SubmitEvent> {
27+
pub fn onsubmit(
28+
user: &UseStateHandle<User>,
29+
nav: Navigator,
30+
api: Api,
31+
dispatch: Dispatch<Store>,
32+
) -> Callback<SubmitEvent> {
2633
let user = user.clone();
2734
Callback::from(move |e: SubmitEvent| {
2835
e.prevent_default();
36+
let dispatch_clone = dispatch.clone();
2937
let nav = nav.clone();
3038
let user = user.deref().clone();
3139
let hdrs = Headers::new();
3240
hdrs.append("content-type", "application/json");
3341
wasm_bindgen_futures::spawn_local(async move {
3442
let body = Some(helpers::to_jsvalue(user));
35-
let response = api.fetch2(Some(hdrs), body, Method::POST).await;
43+
let response = api.fetch(Some(hdrs), body, Method::POST).await;
3644

3745
// navigate home if the submission is successful
3846
if let Some(res) = response {
3947
if res.status() == 200 {
48+
let obj: Store = serde_json::from_str(&res.text().await.unwrap()).unwrap();
49+
dispatch_clone.reduce_mut(move |store| {
50+
store.token = obj.token;
51+
});
4052
nav.push(&Route::Home);
4153
}
4254
}

devblog/devblog/client/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use crate::router::{switch, Route};
1010
use api::*;
1111
use components::navbar::Navbar;
1212
use models::*;
13+
use store::Store;
1314
use stylist::yew::Global;
1415
use yew::{function_component, html, Html};
1516
use yew_router::{BrowserRouter, Switch};

devblog/devblog/client/src/models.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ pub struct User {
5353
#[serde(rename = "userName")]
5454
pub username: String,
5555
pub email: String,
56-
pub subscribed: bool,
5756
pub password: String,
5857
#[serde(rename = "passwordHash")]
5958
pub password_hash: String,
@@ -77,3 +76,11 @@ pub enum UserField {
7776
PasswordHash,
7877
Email,
7978
}
79+
80+
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug, Default)]
81+
pub struct UserInfo {
82+
#[serde(rename = "userName")]
83+
pub username: String,
84+
pub subscribed: bool,
85+
pub email: String,
86+
}

devblog/devblog/client/src/pages/home.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ pub fn home() -> Html {
1919

2020
use_effect_with((), move |_| {
2121
wasm_bindgen_futures::spawn_local(async move {
22-
let res = Api::GetPost(-1).fetch2(None, None, Method::GET).await;
22+
let res = Api::GetPost(-1).fetch(None, None, Method::GET).await;
2323
helpers::emit(&latest_post_cb, res.unwrap()).await;
2424

25-
let response = Api::GetPostsCount.fetch2(None, None, Method::GET).await;
25+
let response = Api::GetPostsCount.fetch(None, None, Method::GET).await;
2626
helpers::emit(&total_posts_count_cb, response.unwrap()).await;
2727
});
2828
});

devblog/devblog/client/src/pages/insights.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,29 @@
11
use crate::{
22
helpers::{self, CustomCallback},
3-
Api, User,
3+
store::Store,
4+
Api, UserInfo,
45
};
56
use gloo_net::http::{Headers, Method};
67
use stylist::Style;
78
use yew::prelude::*;
9+
use yewdux::prelude::*;
810

911
const STYLE: &str = include_str!("styles/insights.css");
1012

1113
#[function_component(Insights)]
1214
pub fn insights() -> Html {
1315
let style = Style::new(STYLE).unwrap();
14-
let users = use_state(|| vec![User::default()]);
16+
let users = use_state(|| vec![UserInfo::default()]);
1517
let users_cb = CustomCallback::new(&users);
18+
let store = use_store_value::<Store>();
1619

1720
use_effect_with((), move |_| {
1821
wasm_bindgen_futures::spawn_local(async move {
1922
let hdrs = Headers::new();
20-
hdrs.append("Authorization", "Bearer ");
23+
let auth = format!("Bearer {}", store.token.clone());
24+
hdrs.append("Authorization", &auth);
2125

22-
let res = Api::GetUsers.fetch2(None, None, Method::GET).await;
26+
let res = Api::GetUsers.fetch(Some(hdrs), None, Method::GET).await;
2327
helpers::emit(&users_cb, res.unwrap()).await;
2428
});
2529
});

devblog/devblog/client/src/pages/posts.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ pub fn posts() -> Html {
2424

2525
use_effect_with((), move |_| {
2626
wasm_bindgen_futures::spawn_local(async move {
27-
let res = Api::GetPostsCount.fetch2(None, None, Method::GET).await;
27+
let res = Api::GetPostsCount.fetch(None, None, Method::GET).await;
2828
helpers::emit(&total_posts_count_cb, res.unwrap()).await;
2929

30-
let res = Api::GetPagesCount.fetch2(None, None, Method::GET).await;
30+
let res = Api::GetPagesCount.fetch(None, None, Method::GET).await;
3131
helpers::emit(&total_pages_count_cb, res.unwrap()).await;
3232
});
3333
});
@@ -38,7 +38,7 @@ pub fn posts() -> Html {
3838
wasm_bindgen_futures::spawn_local(async move {
3939
loading_clone.set(false);
4040
let num = *page_num_clone as u32;
41-
let res = Api::GetPage(num).fetch2(None, None, Method::GET).await;
41+
let res = Api::GetPage(num).fetch(None, None, Method::GET).await;
4242
helpers::emit(&posts_cb, res.unwrap()).await;
4343
loading_clone.set(true);
4444
});

devblog/devblog/client/src/pages/sign_in.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
use crate::{components::items::text_input::TextInput, helpers, Api, User, UserField};
1+
use crate::{components::items::text_input::TextInput, helpers, Api, Store, User, UserField};
22
use stylist::Style;
33
use yew::prelude::*;
44
use yew_router::hooks::use_navigator;
5+
use yewdux::prelude::*;
56

67
const STYLE: &str = include_str!("styles/signIn.css");
78

@@ -10,17 +11,13 @@ pub fn sign_in() -> Html {
1011
let style = Style::new(STYLE).unwrap();
1112
let user = use_state(User::default);
1213
let nav = use_navigator().unwrap();
13-
// let (_state, dispatch) = use_store::<Store>();
14-
// let onsubmit = { helpers::onsubmit(&user, nav, Api::SignIn) };
14+
let (_, dispatch) = use_store::<Store>();
1515

1616
html! {
1717
<div class={style}>
1818
<div class="sign-in-container">
19-
2019
// {error && <span>{error}</span>}
21-
22-
<form onsubmit={helpers::onsubmit(&user, nav, Api::SignIn)} class="sign-in">
23-
// <form {onsubmit}>
20+
<form onsubmit={helpers::onsubmit(&user, nav, Api::SignIn, dispatch)} class="sign-in">
2421
<TextInput label="username" input_type="text" value={user.username.clone()} onchange={helpers::onchange(&user, UserField::Username)}/>
2522
<TextInput label="password" input_type="password" value={user.password.clone()} onchange={helpers::onchange(&user, UserField::Password)}/>
2623
<button>{"Login"}</button>

devblog/devblog/client/src/pages/sign_up.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
use crate::{components::items::text_input::TextInput, helpers, Api, Store, User, UserField};
12
use stylist::Style;
23
use yew::prelude::*;
34
use yew_router::hooks::use_navigator;
4-
5-
use crate::{components::items::text_input::TextInput, helpers, Api, User, UserField};
5+
use yewdux::prelude::*;
66

77
const STYLE: &str = include_str!("styles/signUp.css");
88

@@ -11,11 +11,12 @@ pub fn sign_up() -> Html {
1111
let style = Style::new(STYLE).unwrap();
1212
let user = use_state(User::default);
1313
let nav = use_navigator().unwrap();
14+
let (_, dispatch) = use_store::<Store>();
1415

1516
html! {
1617
<div class={style}>
1718
<div class="sign-up-container">
18-
<form onsubmit={helpers::onsubmit(&user, nav, Api::SignUp)}>
19+
<form onsubmit={helpers::onsubmit(&user, nav, Api::SignUp, dispatch)}>
1920
<TextInput label="username" input_type="text" value={user.username.clone()} onchange={helpers::onchange(&user, UserField::Username)}/>
2021
<TextInput label="email" input_type="text" value={user.email.clone()} onchange={helpers::onchange(&user, UserField::Email)}/>
2122
<TextInput label="password" input_type="password" value={user.password_hash.clone()} onchange={helpers::onchange(&user, UserField::PasswordHash)}/>

devblog/devblog/client/src/store.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,3 @@ pub struct Store {
88
pub token: String,
99
pub expiration: String,
1010
}
11-
12-
impl Store {
13-
pub fn add_to_store(&self, dispatch: Dispatch<Store>) {
14-
dispatch.reduce_mut(move |store| {
15-
store.username = self.username.clone();
16-
store.token = self.token.clone();
17-
});
18-
}
19-
}

0 commit comments

Comments
 (0)