// // Created by selim on 03.01.2022. // #include "LoginWindow.h" #include "MainWindow.h" #include "../services/Api.h" #include #include #include LoginWindow::LoginWindow() { set_title("Login"); set_default_size(640, 480); _emailField.set_placeholder_text("Email"); _passwordField.set_placeholder_text("Password"); _passwordField.set_input_purpose(Gtk::InputPurpose::PASSWORD); _passwordField.set_visibility(false); _emailField.signal_changed().connect(sigc::mem_fun(*this, &LoginWindow::validateFields)); _passwordField.signal_changed().connect(sigc::mem_fun(*this, &LoginWindow::validateFields)); _loginButton.set_margin_top(8); _loginButton.set_margin_bottom(8); _loginButton.set_label("Log in"); _loginButton.signal_clicked().connect(sigc::mem_fun(*this, &LoginWindow::loginClicked)); _loginButton.set_sensitive(false); Gtk::Box box(Gtk::Orientation::VERTICAL, 8); box.set_margin(48); box.set_valign(Gtk::Align::CENTER); box.append(_emailField); box.append(_passwordField); box.append(_loginButton); box.append(_spinner); set_child(box); } void LoginWindow::loginClicked() { auto email = _emailField.get_text(); auto password = _passwordField.get_text(); enableControls(false); _spinner.start(); try { auto user = co_await Api::login(email, password); auto app = this->get_application(); auto mainWindow = new MainWindow(); mainWindow->show(); hide(); app->add_window(*mainWindow); app->remove_window(*this); } catch (std::exception& ex) { enableControls(true); _spinner.stop(); showError(ex.what()); } } void LoginWindow::validateFields() { bool buttonEnabled = _emailField.get_text_length() > 0 && _passwordField.get_text_length() > 0; _loginButton.set_sensitive(buttonEnabled); } void LoginWindow::showError(const std::string& message) { _dialog = std::make_unique("Error", false, Gtk::MessageType::ERROR, Gtk::ButtonsType::OK, true); _dialog->set_secondary_text(message); _dialog->set_transient_for(*this); _dialog->set_hide_on_close(true); _dialog->signal_response().connect(sigc::hide(sigc::mem_fun(*_dialog, &Gtk::Widget::hide))); _dialog->show(); } void LoginWindow::enableControls(bool enable) { _loginButton.set_sensitive(enable); _emailField.set_sensitive(enable); _passwordField.set_sensitive(enable); }