bitque/jirs-client/src/sign_up.rs

149 lines
4.3 KiB
Rust
Raw Normal View History

2020-04-17 16:28:02 +02:00
use seed::{prelude::*, *};
use jirs_data::{SignUpFieldId, WsMsg};
2020-04-17 20:44:55 +02:00
use crate::api::send_ws_msg;
2020-04-17 16:28:02 +02:00
use crate::model::{Page, PageContent, SignUpPage};
use crate::shared::styled_button::StyledButton;
use crate::shared::styled_field::StyledField;
use crate::shared::styled_form::StyledForm;
use crate::shared::styled_icon::{Icon, StyledIcon};
use crate::shared::styled_input::StyledInput;
use crate::shared::styled_link::StyledLink;
use crate::shared::{outer_layout, ToNode};
use crate::validations::is_email;
use crate::{model, FieldId, Msg};
pub fn update(msg: Msg, model: &mut model::Model, _orders: &mut impl Orders<Msg>) {
if model.page != Page::SignUp {
return;
}
2020-05-05 08:33:40 +02:00
match msg {
Msg::ChangePage(Page::SignUp) => {
model.page_content = PageContent::SignUp(Box::new(SignUpPage::default()));
return;
}
_ => (),
};
2020-04-17 16:28:02 +02:00
let page = match &mut model.page_content {
PageContent::SignUp(page) => page,
_ => return,
};
match msg {
Msg::StrInputChanged(FieldId::SignUp(SignUpFieldId::Username), value) => {
2020-04-17 16:28:02 +02:00
page.username = value;
page.username_touched = true;
}
Msg::StrInputChanged(FieldId::SignUp(SignUpFieldId::Email), value) => {
2020-04-17 16:28:02 +02:00
page.email = value;
page.email_touched = true;
}
2020-04-17 20:44:55 +02:00
Msg::SignUpRequest => {
send_ws_msg(WsMsg::SignUpRequest(
page.email.clone(),
page.username.clone(),
));
}
2020-04-17 16:28:02 +02:00
Msg::WsMsg(WsMsg::SignUpSuccess) => {
page.sign_up_success = true;
}
2020-04-17 20:44:55 +02:00
Msg::WsMsg(WsMsg::SignUpPairTaken) => {
page.error = "Pair you give is either taken or is not matching".to_string();
}
2020-04-17 16:28:02 +02:00
_ => (),
}
}
pub fn view(model: &model::Model) -> Node<Msg> {
let page = match &model.page_content {
PageContent::SignUp(page) => page,
_ => return empty![],
};
let username = StyledInput::build(FieldId::SignUp(SignUpFieldId::Username))
.value(page.username.as_str())
.valid(!page.username_touched || page.username.len() > 1)
.build()
.into_node();
let username_field = StyledField::build()
.label("Username")
.input(username)
.build()
.into_node();
let email = StyledInput::build(FieldId::SignUp(SignUpFieldId::Email))
.value(page.email.as_str())
.valid(!page.email_touched || is_email(page.email.as_str()))
.build()
.into_node();
let email_field = StyledField::build()
.label("E-Mail")
.input(email)
.build()
.into_node();
let submit = if page.sign_up_success {
StyledButton::build()
.success()
.text("✓ Please check your mail")
} else {
StyledButton::build()
.primary()
.text("Register")
2020-04-17 20:44:55 +02:00
.on_click(mouse_ev(Ev::Click, |_| Msg::SignUpRequest))
2020-04-17 16:28:02 +02:00
}
.build()
.into_node();
let sign_in_link = StyledLink::build()
.text("Sign In")
.href("/login")
2020-04-17 20:44:55 +02:00
.add_class("signInLink")
2020-04-17 16:28:02 +02:00
.build()
.into_node();
let submit_field = StyledField::build()
.input(div![class!["twoRow"], submit, sign_in_link,])
.build()
.into_node();
let help_icon = StyledIcon::build(Icon::Help)
.add_class("noPasswordHelp")
.size(22)
.build()
.into_node();
let no_pass_section = div![
class!["noPasswordSection"],
attrs![At::Title => "We don't believe password is helping anyone. Instead after user provide correct login and e-mail he'll receive mail with 1-use token."],
help_icon,
span!["Why I don't see password?"]
];
2020-04-17 20:44:55 +02:00
let error_row = if page.error.is_empty() {
empty![]
} else {
div![class!["error"], p![page.error]]
};
2020-04-17 16:28:02 +02:00
let sign_up_form = StyledForm::build()
.heading("Sign In to your account")
.on_submit(ev(Ev::Submit, |ev| {
ev.stop_propagation();
ev.prevent_default();
2020-04-17 20:44:55 +02:00
Msg::SignUpRequest
2020-04-17 16:28:02 +02:00
}))
.add_field(username_field)
.add_field(email_field)
.add_field(submit_field)
.add_field(no_pass_section)
2020-04-17 20:44:55 +02:00
.add_field(error_row)
2020-04-17 16:28:02 +02:00
.build()
.into_node();
let children = vec![sign_up_form];
outer_layout(model, "register", children)
}