diff --git a/gui/src/api.rs b/gui/src/api.rs index b983df6..40939eb 100644 --- a/gui/src/api.rs +++ b/gui/src/api.rs @@ -12,17 +12,6 @@ pub struct LoginResponse { pub token: Option } -#[allow(non_snake_case)] -pub struct Backend { - pub id: Option, - pub backend: Option, - pub name: Option, - pub description: Option, - pub connectionDetails: Option, - - pub logs: Option> -} - impl NextAPIClient { pub fn login(&self, email: &str, password: &str, mut callback: impl 'static + Send + FnMut(LoginResponse)) { let json_data = json!({ diff --git a/gui/src/components/log_in.rs b/gui/src/components/log_in.rs new file mode 100644 index 0000000..1f7c986 --- /dev/null +++ b/gui/src/components/log_in.rs @@ -0,0 +1,46 @@ +use std::sync::Arc; +use eframe::egui; + +use crate::api; +use crate::ApplicationState; + +pub fn main(state: &mut ApplicationState, api: &api::NextAPIClient, ctx: &eframe::egui::Context) { + egui::Window::new("Log In").show(ctx, move |ui| { + ui.heading("Login"); + ui.horizontal(|ui| { + ui.label("Email: "); + ui.text_edit_singleline(&mut state.username); + }); + + ui.horizontal(|ui| { + let label = ui.label("Password: "); + ui.add(egui::TextEdit::singleline(&mut state.password).password(true)) + .labelled_by(label.id); + }); + + if ui.button("Login").clicked() { + let token_clone = Arc::clone(&state.token); + api.login(state.username.as_str(), state.password.as_str(), Box::new(move |res: api::LoginResponse| { + match res.token { + Some(x) => { + let mut token = token_clone.lock().unwrap(); + *token = x; + }, + None => { + let mut token = token_clone.lock().unwrap(); + *token = "".to_string(); + } + } + })); + } + + match state.token.lock() { + Ok(x) => { + ui.label(format!("Token: {:?}", *x)); + }, + Err(_) => { + ui.label(format!("No token.")); + } + } + }); +} \ No newline at end of file diff --git a/gui/src/components/mod.rs b/gui/src/components/mod.rs new file mode 100644 index 0000000..c1b4734 --- /dev/null +++ b/gui/src/components/mod.rs @@ -0,0 +1 @@ +pub mod log_in; \ No newline at end of file diff --git a/gui/src/main.rs b/gui/src/main.rs index f987748..c8bbcb5 100644 --- a/gui/src/main.rs +++ b/gui/src/main.rs @@ -1,60 +1,38 @@ use std::sync::{Arc, Mutex}; use eframe::egui; +mod components; mod api; +pub struct ApplicationState { + token: Arc>, + username: String, + password: String, +} + fn main() -> Result<(), eframe::Error> { let api = api::new("http://localhost:3000".to_string()); let options = eframe::NativeOptions { - viewport: egui::ViewportBuilder::default().with_inner_size([320.0, 240.0]), + viewport: egui::ViewportBuilder::default().with_inner_size([1280.0, 720.0]), ..Default::default() }; - // Our application state: - let mut username: String = "replace@gmail.com".to_owned(); - let mut password: String = "replace123".to_owned(); + let mut app_state: ApplicationState = ApplicationState { + token: Arc::new(Mutex::new("".to_string())), + + // /!\ NOT THREAD SAFE FIELDS /!\ + // These are used internally for each application (immediate mode + functions which are stateless, + // and we need *a* state somehow) - let token: Arc> = Arc::new(Mutex::new("".to_string())); + // components/log_in.rs + username: "replace@gmail.com".to_owned(), + password: "replace123".to_owned() + }; eframe::run_simple_native("NextNet GUI", options, move |ctx, _frame| { - egui::CentralPanel::default().show(ctx, |ui| { - ui.heading("Login"); - ui.horizontal(|ui| { - ui.label("Email: "); - ui.text_edit_singleline(&mut username); - }); - - ui.horizontal(|ui| { - let label = ui.label("Password: "); - ui.add(egui::TextEdit::singleline(&mut password).password(true)) - .labelled_by(label.id); - }); - - if ui.button("Login").clicked() { - let token_clone = Arc::clone(&token); - api.login(username.as_str(), password.as_str(), Box::new(move |res: api::LoginResponse| { - match res.token { - Some(x) => { - let mut token = token_clone.lock().unwrap(); - *token = x; - }, - None => { - let mut token = token_clone.lock().unwrap(); - *token = "".to_string(); - } - } - })); - } - - match token.lock() { - Ok(x) => { - ui.label(format!("Token: {:?}", *x)); - }, - Err(_) => { - ui.label(format!("No token.")); - } - } + egui::CentralPanel::default().show(ctx, |_ui| { + components::log_in::main(&mut app_state, &api, ctx); }); }) } \ No newline at end of file