Skip to content
Snippets Groups Projects
registration.py 4.69 KiB
# Copyright (c) 2019 Nico Alt
# SPDX-License-Identifier: AGPL-3.0-only
# License-Filename: LICENSE.md

from gettext import gettext as _

from gi.repository import GLib

from briar_gtk.container import Container
from briar_gtk.define import APP


class RegistrationContainer(Container):

    REGISTRATION_UI = "registration.ui"
    STACK_NAME = "registration_flow_stack"
    HEADERS_NAME = "registration_flow_headers"

    def __init__(self, window):
        super().__init__()
        self._window = window
        self._setup_view()

    def _setup_view(self):
        self._add_from_resource(self.REGISTRATION_UI)
        self.builder.connect_signals(self)

        self._setup_registration_flow_stack()
        self._setup_registration_flow_headers()
        self._setup_nickname_enter_listener()

    def _setup_registration_flow_stack(self):
        self.registration_flow_stack = self.builder.get_object(self.STACK_NAME)
        self.registration_flow_stack.show_all()
        self.add(self.registration_flow_stack)

    def _setup_registration_flow_headers(self):
        registration_flow_headers = self.builder.get_object(self.HEADERS_NAME)
        registration_flow_headers.show_all()
        self._window.set_titlebar(registration_flow_headers)

    def _setup_nickname_enter_listener(self):
        nickname_entry = self.builder.get_object("nickname_entry")
        nickname_entry.connect("activate", self._on_nickname_enter)

    # pylint: disable=unused-argument
    def _on_nickname_enter(self, event):
        self.on_nickname_next_pressed(None)

    # pylint: disable=unused-argument
    def on_nickname_next_pressed(self, button):
        nickname_error_label = self.builder.get_object("nickname_error_label")
        if self._nickname_is_empty():
            nickname_error_label.show()
            return
        nickname_error_label.hide()
        self._show_passwords_page()

    def _nickname_is_empty(self):
        nickname = self.builder.get_object("nickname_entry").get_text()
        return len(nickname) == 0

    def _show_passwords_page(self):
        passwords_page = self.builder.get_object("passwords_page")
        self.registration_flow_stack.set_visible_child(passwords_page)

        self._focus_password_entry()
        self._setup_passwords_enter_listener()

    def _focus_password_entry(self):
        password_entry = self.builder.get_object("password_entry")
        password_entry.grab_focus()

    def _setup_passwords_enter_listener(self):
        password_confirm_entry = self.builder.get_object(
            "password_confirm_entry")
        password_confirm_entry.connect(
            "activate", self._on_passwords_enter)

    # pylint: disable=unused-argument
    def _on_passwords_enter(self, event):
        self.on_create_account_pressed(None)

    # pylint: disable=unused-argument
    def on_create_account_back_pressed(self, button):
        self._show_nickname_page()

    def _show_nickname_page(self):
        nickname_page = self.builder.get_object("nickname_page")
        self.registration_flow_stack.set_visible_child(nickname_page)

    # pylint: disable=unused-argument
    def on_create_account_pressed(self, button):
        if not self._passwords_match():
            self._show_error_message(_("The passwords do not match"))
            return
        passwords_error_label = self.builder.get_object(
            "passwords_error_label")
        passwords_error_label.hide()
        self._show_loading_animation()
        self._register()

    def _passwords_match(self):
        password = self.builder.get_object("password_entry").get_text()
        password_confirm = self.builder.get_object(
            "password_confirm_entry").get_text()
        return password == password_confirm

    def _show_loading_animation(self):
        loading_animation = self.builder.get_object("loading_animation")
        self.registration_flow_stack.set_visible_child(loading_animation)

    def _register(self):
        nickname = self.builder.get_object("nickname_entry").get_text()
        password = self.builder.get_object("password_entry").get_text()
        APP().api.register((nickname, password),
                           self._registration_completed)

    def _registration_completed(self, succeeded):
        function = self._registration_failed
        if succeeded:
            function = self._window.show_main_container
        GLib.idle_add(function)

    def _registration_failed(self):
        self._show_error_message(_("Couldn't register account"))
        self._show_passwords_page()

    def _show_error_message(self, error_message):
        passwords_error_label = self.builder.get_object(
            "passwords_error_label")
        passwords_error_label.set_label(error_message)
        passwords_error_label.show()