summaryrefslogtreecommitdiff
path: root/src/login_window.c
diff options
context:
space:
mode:
authornirav <nirav@teisuu.com>2019-03-10 13:30:19 +0530
committerDandelion <nirav@teisuu.com>2019-03-10 13:30:19 +0530
commit7e8ea36eb8106b4847af13a27a3e8f3177d25809 (patch)
tree084b59cf020d82985cdcb09bad18721cd5ecdf7e /src/login_window.c
parentbd7b0be8978cfd30ac72cf36021153b2a7d68051 (diff)
downloadap_client-7e8ea36eb8106b4847af13a27a3e8f3177d25809.tar.gz
ap_client-7e8ea36eb8106b4847af13a27a3e8f3177d25809.zip
Refactor main.c and auth.c
Diffstat (limited to 'src/login_window.c')
-rw-r--r--src/login_window.c156
1 files changed, 156 insertions, 0 deletions
diff --git a/src/login_window.c b/src/login_window.c
new file mode 100644
index 0000000..32f88a0
--- /dev/null
+++ b/src/login_window.c
@@ -0,0 +1,156 @@
+#define _POSIX_C_SOURCE 200809L
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <gtk-3.0/gtk/gtk.h>
+#include "auth.h"
+#include "http.h"
+#include "timeline.h"
+#include "timeline_window.h"
+
+GtkApplication *application;
+static GtkWidget *window;
+static GtkWidget *box;
+static GtkWidget *instance_name_box, *email_box, *password_box;
+static GtkWidget *submit_button;
+static GtkWidget *spinner;
+
+static void window_removed(
+ GtkApplication *application, GtkWindow *w, gpointer user_data)
+{
+ gtk_widget_destroy(GTK_WIDGET(w));
+}
+
+static void login_callback(bool success)
+{
+ if (!success) {
+ fprintf(stderr, "login_callback(): login failed\n");
+ gtk_spinner_stop(GTK_SPINNER(spinner));
+ return;
+ }
+
+ printf("login success\n");
+ gtk_spinner_stop(GTK_SPINNER(spinner));
+ create_timeline_window(application, NULL);
+ gtk_window_close(GTK_WINDOW(window));
+ gtk_application_remove_window(
+ GTK_APPLICATION(application), GTK_WINDOW(window));
+}
+
+static void register_callback(bool success)
+{
+ if (!success) {
+ gtk_spinner_stop(GTK_SPINNER(spinner));
+ fprintf(stderr, "register_callback(): register failed\n");
+ return;
+ }
+ printf("register success\n");
+
+ const char *email, *password;
+ email = gtk_entry_get_text(GTK_ENTRY(email_box));
+ password = gtk_entry_get_text(GTK_ENTRY(password_box));
+
+ if (login(email, password, &login_callback)) {
+ gtk_spinner_stop(GTK_SPINNER(spinner));
+ return;
+ }
+}
+
+static void submit_login_form()
+{
+ gtk_spinner_start(GTK_SPINNER(spinner));
+ const char *instance_name;
+ instance_name = gtk_entry_get_text(GTK_ENTRY(instance_name_box));
+ if (register_app(instance_name, &register_callback)) {
+ gtk_spinner_stop(GTK_SPINNER(spinner));
+ return;
+ }
+ return;
+}
+
+static bool is_form_valid()
+{
+ if (strlen(gtk_entry_get_text(GTK_ENTRY(instance_name_box))) < 1 ||
+ strlen(gtk_entry_get_text(GTK_ENTRY(email_box))) < 1 ||
+ strlen(gtk_entry_get_text(GTK_ENTRY(password_box))) < 1)
+ return false;
+ return true;
+}
+
+static void submit_button_clicked(GtkButton *button, gpointer user_data)
+{
+ if (is_form_valid())
+ submit_login_form();
+}
+
+static void form_on_activate(GtkEntry *entry, gpointer user_data)
+{
+ if (is_form_valid())
+ submit_login_form();
+}
+
+static void on_form_changed(GtkWidget *widget, gpointer data)
+{
+ if (is_form_valid())
+ gtk_widget_set_sensitive(GTK_WIDGET(submit_button), true);
+ else
+ gtk_widget_set_sensitive(GTK_WIDGET(submit_button), false);
+}
+
+void create_login_window(GtkApplication *app, gpointer user_data)
+{
+ application = app;
+ window = gtk_application_window_new(app);
+ gtk_window_set_title(GTK_WINDOW(window), "ap_client");
+ gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
+ gtk_container_set_border_width(GTK_CONTAINER(window), 10);
+ g_signal_connect(app, "window-removed", G_CALLBACK(window_removed), NULL);
+
+ box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
+ gtk_widget_set_valign(GTK_WIDGET(box), GTK_ALIGN_CENTER);
+ gtk_widget_set_halign(GTK_WIDGET(box), GTK_ALIGN_CENTER);
+
+ instance_name_box = gtk_entry_new();
+ gtk_entry_set_placeholder_text(
+ GTK_ENTRY(instance_name_box), "Instance domain");
+ g_signal_connect(GTK_ENTRY(instance_name_box), "activate",
+ G_CALLBACK(form_on_activate), NULL);
+ g_signal_connect(G_OBJECT(instance_name_box), "changed",
+ G_CALLBACK(on_form_changed), NULL);
+
+ email_box = gtk_entry_new();
+ gtk_entry_set_placeholder_text(GTK_ENTRY(email_box), "Email");
+ gtk_entry_set_input_purpose(GTK_ENTRY(email_box), GTK_INPUT_PURPOSE_EMAIL);
+ g_signal_connect(GTK_ENTRY(email_box), "activate",
+ G_CALLBACK(form_on_activate), NULL);
+ g_signal_connect(
+ G_OBJECT(email_box), "changed", G_CALLBACK(on_form_changed), NULL);
+
+ password_box = gtk_entry_new();
+ gtk_entry_set_placeholder_text(GTK_ENTRY(password_box), "Password");
+ gtk_entry_set_input_purpose(
+ GTK_ENTRY(password_box), GTK_INPUT_PURPOSE_PASSWORD);
+ gtk_entry_set_visibility(GTK_ENTRY(password_box), false);
+ g_signal_connect(GTK_ENTRY(password_box), "activate",
+ G_CALLBACK(form_on_activate), NULL);
+ g_signal_connect(G_OBJECT(password_box), "changed",
+ G_CALLBACK(on_form_changed), NULL);
+
+ submit_button = gtk_button_new();
+ g_signal_connect(GTK_BUTTON(submit_button), "clicked",
+ G_CALLBACK(submit_button_clicked), G_OBJECT(window));
+ gtk_button_set_label(GTK_BUTTON(submit_button), "Submit");
+ gtk_widget_set_sensitive(GTK_WIDGET(submit_button), false);
+
+ spinner = gtk_spinner_new();
+
+ gtk_container_add(GTK_CONTAINER(window), box);
+ gtk_container_add(GTK_CONTAINER(box), instance_name_box);
+ gtk_container_add(GTK_CONTAINER(box), email_box);
+ gtk_container_add(GTK_CONTAINER(box), password_box);
+ gtk_container_add(GTK_CONTAINER(box), submit_button);
+ gtk_container_add(GTK_CONTAINER(box), spinner);
+
+ gtk_widget_show_all(window);
+}