diff options
author | nirav <nirav@teisuu.com> | 2019-03-10 13:30:19 +0530 |
---|---|---|
committer | Dandelion <nirav@teisuu.com> | 2019-03-10 13:30:19 +0530 |
commit | 7e8ea36eb8106b4847af13a27a3e8f3177d25809 (patch) | |
tree | 084b59cf020d82985cdcb09bad18721cd5ecdf7e /src/login_window.c | |
parent | bd7b0be8978cfd30ac72cf36021153b2a7d68051 (diff) | |
download | ap_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.c | 156 |
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, ®ister_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); +} |