feat: implemented auto login after account verification

This commit is contained in:
antifallobst 2023-10-08 13:57:56 +02:00
parent d39277e182
commit 815d5face5
Signed by: antifallobst
GPG Key ID: 2B4F402172791BAF
3 changed files with 42 additions and 28 deletions

View File

@ -32,3 +32,8 @@ pub enum AccountRegisterCriteriaProblemResponse {
Email,
Password,
}
#[derive(Deserialize)]
pub struct AccountVerifyResponse {
pub token: String,
}

View File

@ -64,16 +64,10 @@ impl Session {
let response = request.send().await?;
match response.status() {
200 => {
let token = response
.json::<data::AccountAuthenticateResponse>()
.await?
.token;
set_auth_cookie(&token);
Ok(token)
}
200 => Ok(response
.json::<data::AccountAuthenticateResponse>()
.await?
.token),
400 => Err(Error::msg(format!("Bad request"))),
401 => Err(Error::msg(format!("Wrong password!"))),
403 => Err(Error::msg(format!("You're not allowed to do this!"))),
@ -83,9 +77,7 @@ impl Session {
}
};
wasm_bindgen_futures::spawn_local(
async move { callback.emit(call.await) },
);
wasm_bindgen_futures::spawn_local(async move { callback.emit(call.await) });
}
pub fn register(
@ -145,7 +137,7 @@ impl Session {
wasm_bindgen_futures::spawn_local(async move { callback.emit(call.await) });
}
pub fn verify(&self, token: String, callback: Callback<Result<()>>) {
pub fn verify(&self, token: String, callback: Callback<Result<String>>) {
let url = format!("{}/account/verify", &self.base_url);
let body = json!({
@ -160,7 +152,10 @@ impl Session {
let response = request.send().await?;
match response.status() {
200 => Ok(()),
200 => {
let auth_token = response.json::<data::AccountVerifyResponse>().await?.token;
Ok(auth_token)
}
400 => Err(Error::msg(format!("Bad request"))),
403 => Err(Error::msg(format!("You're not allowed to do this!"))),
404 => Err(Error::msg(format!("Unknown Token!"))),
@ -172,6 +167,7 @@ impl Session {
}
pub fn set_token(&mut self, token: String) {
set_auth_cookie(&token);
self.auth_token = Some(token);
}

View File

@ -1,4 +1,5 @@
use crate::backend::Session;
use crate::Callbacks;
use anyhow::Result;
use std::ops::Deref;
use wasm_bindgen::JsCast;
@ -39,6 +40,7 @@ pub struct Props {
#[function_component]
pub fn SignUp(props: &Props) -> Html {
let state = use_state(|| Data::default());
let callbacks = use_context::<Callbacks>().expect("Callbacks context not available!");
let session = use_context::<Session>().unwrap_or_default();
let cloned_state = state.clone();
@ -107,20 +109,31 @@ pub fn SignUp(props: &Props) -> Html {
});
let cloned_state = state.clone();
let callback = props.close.clone();
let on_api_response = Callback::from(move |response: Result<()>| {
let on_sign_up_api_response = Callback::from(move |response: Result<()>| {
let mut state = cloned_state.deref().clone();
state.submitted = false;
match state.view {
View::SignUp => match response {
Ok(_) => state.view = View::Verify,
Err(e) => state.status = e.to_string(),
},
View::Verify => match response {
Ok(_) => callback.emit(()),
Err(e) => state.status = e.to_string(),
},
match response {
Ok(_) => state.view = View::Verify,
Err(e) => state.status = e.to_string(),
}
cloned_state.set(state);
});
let cloned_state = state.clone();
let close_callback = props.close.clone();
let sign_in_callback = callbacks.sign_in.clone();
let on_verify_api_response = Callback::from(move |response: Result<String>| {
let mut state = cloned_state.deref().clone();
state.submitted = false;
match response {
Ok(token) => {
sign_in_callback.emit(token);
close_callback.emit(())
}
Err(e) => state.status = e.to_string(),
}
cloned_state.set(state);
@ -138,9 +151,9 @@ pub fn SignUp(props: &Props) -> Html {
state.username.clone(),
state.password.clone(),
state.email.clone(),
on_api_response.clone(),
on_sign_up_api_response.clone(),
),
View::Verify => session.verify(state.token.clone(), on_api_response.clone()),
View::Verify => session.verify(state.token.clone(), on_verify_api_response.clone()),
}
cloned_state.set(state);