+use email_address::EmailAddress;
use reqwest::Url;
use std::cell::RefCell;
use std::rc::Rc;
+use std::str::FromStr;
use sys_locale::get_locale;
use super::activity_stack::UtilityActivity;
use super::types::{Account, Application, Instance};
use super::TopLevelError;
-#[derive(Default)]
-struct MandatoryString(String);
+struct Username {
+ name: String,
+ domain: Rc<RefCell<String>>,
+}
-impl MandatoryString {
+impl Username {
fn ok(&self) -> bool {
- !self.0.is_empty()
+ !self.name.is_empty()
}
}
-impl EditableMenuLineData for MandatoryString {
+impl EditableMenuLineData for Username {
fn display(&self) -> ColouredString {
- if self.0.is_empty() {
+ if self.name.is_empty() {
ColouredString::uniform("none", 'r')
} else {
- ColouredString::plain(&self.0)
+ ColouredString::plain(&self.name)
+ + ColouredString::uniform(
+ &format!("@{}", self.domain.borrow()),
+ 'f',
+ )
}
}
fn to_text(&self) -> String {
- self.0.clone()
+ self.name.clone()
}
fn update(&mut self, text: &str) {
- *self = Self(text.to_owned());
+ let text = text
+ .split_once('@')
+ .map_or(text, |(prefix, _)| prefix)
+ .trim();
+ self.name = text.to_owned();
+ }
+}
+
+struct Email {
+ addr: String,
+}
+
+impl Email {
+ fn ok(&self) -> bool {
+ EmailAddress::is_valid(&self.addr)
+ }
+}
+
+impl EditableMenuLineData for Email {
+ fn display(&self) -> ColouredString {
+ if self.addr.is_empty() {
+ ColouredString::uniform("none", 'r')
+ } else if self.ok() {
+ ColouredString::plain(&self.addr)
+ + ColouredString::uniform(" valid", 'f')
+ } else {
+ ColouredString::plain(&self.addr)
+ + ColouredString::uniform(" invalid!", 'r')
+ }
+ }
+
+ fn to_text(&self) -> String {
+ self.addr.clone()
+ }
+
+ fn update(&mut self, text: &str) {
+ self.addr = match EmailAddress::from_str(text) {
+ Ok(addr) => addr.as_str().to_owned(),
+ Err(_) => text.to_owned(),
+ };
}
}
para_login_url: Paragraph,
el_logincode: EditableMenuLine<String>,
para_login_outcome: Paragraph,
- el_username: EditableMenuLine<MandatoryString>,
- el_email: EditableMenuLine<MandatoryString>,
+ el_username: EditableMenuLine<Username>,
+ el_email: EditableMenuLine<Email>,
el_password: EditableMenuLine<Password>,
el_password_confirm: EditableMenuLine<Password>,
ml_rules: MenuKeypressLine,
let el_username = EditableMenuLine::new(
Pr('N'),
ColouredString::plain("Name of your new account: "),
- MandatoryString::default(),
+ Username {
+ name: "".to_owned(),
+ domain: Rc::new(RefCell::new("".to_owned())),
+ },
);
let el_email = EditableMenuLine::new(
Pr('E'),
ColouredString::plain("Email address to associate with account: "),
- MandatoryString::default(),
+ Email {
+ addr: "".to_owned(),
+ },
);
let password1 = Rc::new(RefCell::new("".to_owned()));
let password2 = Rc::new(RefCell::new("".to_owned()));
);
self.para_server_id
.push_text(ColouredString::uniform(".", 'H'), false);
+ *self.el_username.get_data().domain.borrow_mut() =
+ instance.domain.clone();
self.state = LoginState::ServerValid;
LogicalAction::Nothing
}
// Send the account registration request
let token = client.register_account(
- &self.el_username.get_data().0,
- &self.el_email.get_data().0,
+ &self.el_username.get_data().name,
+ &self.el_email.get_data().addr,
&self.el_password.get_data().this.borrow(),
&language,
)?;
false,
);
self.para_login_outcome.push_text(
- ColouredString::uniform(&self.el_email.get_data().0, 'K'),
+ ColouredString::uniform(
+ &self.el_email.get_data().addr,
+ 'K',
+ ),
false,
);
self.para_login_outcome.push_text(