From dca34c60a0cb8214d0d15e14426ccf5b3562a5a0 Mon Sep 17 00:00:00 2001 From: Amanda Graven Date: Mon, 23 Nov 2020 17:18:05 +0100 Subject: [PATCH] Finish basic login prompt --- Cargo.toml | 2 +- src/main.rs | 1 + src/matrix.rs | 17 ++++++++++++ src/ui.rs | 76 +++++++++++++++++++++++++++++++++++++-------------- 4 files changed, 74 insertions(+), 22 deletions(-) create mode 100644 src/matrix.rs diff --git a/Cargo.toml b/Cargo.toml index 41ce9d7..ceb3ef8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,5 +7,5 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -iced = "0.1" +iced = { version = "0.1", features = ["debug"] } matrix-sdk = { git = "https://github.com/matrix-org/matrix-rust-sdk", rev = "27c6f30" } diff --git a/src/main.rs b/src/main.rs index 3a97d8f..ea9c0ba 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ use iced::Sandbox; +pub mod matrix; pub mod ui; fn main() { diff --git a/src/matrix.rs b/src/matrix.rs new file mode 100644 index 0000000..83943d9 --- /dev/null +++ b/src/matrix.rs @@ -0,0 +1,17 @@ +use matrix_sdk::{reqwest::Url, Client, SyncSettings}; + +async fn login( + username: &str, + password: &str, + server: &str, +) -> Result> { + let url = Url::parse(server)?; + let client = Client::new(url)?; + + client + .login(username, password, None, Some("retrix")) + .await?; + client.sync(SyncSettings::new()).await; + + Ok(client) +} diff --git a/src/ui.rs b/src/ui.rs index 7c327b7..44039d2 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,16 +1,18 @@ use iced::{ text_input::{self, TextInput}, - Column, Container, Element, Row, Sandbox, Settings, Text, + Button, Column, Container, Element, Sandbox, Text, }; #[derive(Debug, Clone)] pub enum Retrix { Prompt { user_input: text_input::State, - user: String, password_input: text_input::State, - password: String, server_input: text_input::State, + login_button: iced::button::State, + + user: String, + password: String, server: String, }, LoggedIn, @@ -21,6 +23,7 @@ pub enum Message { SetUser(String), SetPassword(String), SetServer(String), + Login, } impl Sandbox for Retrix { @@ -29,10 +32,12 @@ impl Sandbox for Retrix { fn new() -> Self { Retrix::Prompt { user_input: text_input::State::new(), - user: String::new(), password_input: text_input::State::new(), - password: String::new(), server_input: text_input::State::new(), + login_button: Default::default(), + + user: String::new(), + password: String::new(), server: String::new(), } } @@ -41,35 +46,64 @@ impl Sandbox for Retrix { String::from("Retrix matrix client") } - fn update(&mut self, message: Self::Message) {} + fn update(&mut self, message: Self::Message) { + match *self { + Retrix::Prompt { + ref mut user, + ref mut password, + ref mut server, + .. + } => match message { + Message::SetUser(u) => *user = u, + Message::SetPassword(p) => *password = p, + Message::SetServer(s) => *server = s, + Message::Login => (), + }, + _ => (), + } + } fn view(&mut self) -> Element { match *self { Retrix::Prompt { ref mut user_input, - ref user, ref mut password_input, - ref password, ref mut server_input, + ref mut login_button, + ref user, + ref password, ref server, } => { let content = Column::new() + .width(500.into()) .push(Text::new("Username")) - .push(TextInput::new(user_input, "Username", user, |val| { - Message::SetUser(val) - })) + .push( + TextInput::new(user_input, "Username", user, |val| Message::SetUser(val)) + .padding(5), + ) .push(Text::new("Password")) - .push(TextInput::new( - password_input, - "Password", - password, - |val| Message::SetPassword(val), - )) + .push( + TextInput::new(password_input, "Password", password, |val| { + Message::SetPassword(val) + }) + .password() + .padding(5), + ) .push(Text::new("Homeserver")) - .push(TextInput::new(server_input, "Server", server, |val| { - Message::SetServer(val) - })); - content.into() + .push( + TextInput::new(server_input, "Server", server, |val| { + Message::SetServer(val) + }) + .padding(5), + ) + .push(Button::new(login_button, Text::new("Login")).on_press(Message::Login)); + + Container::new(content) + .center_x() + .center_y() + .width(iced::Length::Fill) + .height(iced::Length::Fill) + .into() } _ => Text::new("Beep").into(), }