Login.qml Example File

socialtodos/Login.qml

  /****************************************************************************
  **
  ** Copyright (C) 2015 The Qt Company Ltd.
  ** Contact: http://www.qt.io/licensing/
  **
  ** This file is part of the QtEnginio module of the Qt Toolkit.
  **
  ** $QT_BEGIN_LICENSE:BSD$
  ** You may use this file under the terms of the BSD license as follows:
  **
  ** "Redistribution and use in source and binary forms, with or without
  ** modification, are permitted provided that the following conditions are
  ** met:
  **   * Redistributions of source code must retain the above copyright
  **     notice, this list of conditions and the following disclaimer.
  **   * Redistributions in binary form must reproduce the above copyright
  **     notice, this list of conditions and the following disclaimer in
  **     the documentation and/or other materials provided with the
  **     distribution.
  **   * Neither the name of The Qt Company Ltd nor the names of its
  **     contributors may be used to endorse or promote products derived
  **     from this software without specific prior written permission.
  **
  **
  ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  **
  ** $QT_END_LICENSE$
  **
  ****************************************************************************/

  import QtQuick 2.1
  import QtQuick.Layouts 1.0
  import QtQuick.Controls 1.0 as Controls
  import Enginio 1.0

  Rectangle {
      width: 400
      height: 600

      Rectangle {
          id: header
          anchors.top: parent.top
          width: parent.width
          height: 70 * scaleFactor
          color: "white"

          Row {
              id: logo
              anchors.centerIn: parent
              anchors.horizontalCenterOffset: -4
              spacing: 4
              Image {
                  source: "qrc:images/enginio.png"
                  width: 160 * scaleFactor ; height: 60 * scaleFactor
                  fillMode: Image.PreserveAspectFit
              }
              Text {
                  text: "Todos"
                  anchors.verticalCenter: parent.verticalCenter
                  anchors.verticalCenterOffset: -3
                  font.bold: true
                  font.pixelSize: 46 * scaleFactor
                  color: "#555"
              }
          }
          Rectangle {
              width: parent.width ; height: 1
              anchors.bottom: parent.bottom
              color: "#bbb"
          }
      }

      BorderImage {
          id: input

          width: parent.width
          anchors.top: header.bottom
          anchors.bottom: parent.bottom
          source: "qrc:images/delegate.png"
          border.left: 5; border.top: 5
          border.right: 5; border.bottom: 5

          Rectangle {
              y: -1 ; height: 1
              width: parent.width
              color: "#bbb"
          }
          Rectangle {
              y: 0 ; height: 1
              width: parent.width
              color: "white"
          }
      }

      Column {
          anchors.centerIn: parent
          anchors.alignWhenCentered: true
          width: 360 * scaleFactor
          spacing: 14 * intScaleFactor

          TextField {
              id: nameInput
              onAccepted: passwordInput.forceActiveFocus()
              placeholderText: "Username"
              KeyNavigation.tab: passwordInput
          }

          TextField {
              id: passwordInput
              onAccepted: login()
              placeholderText: "Password"
              echoMode: TextInput.Password
              KeyNavigation.tab: loginButton
          }

          Row {
              // button
              spacing: 20 * scaleFactor
              width: 360 * scaleFactor
              anchors.horizontalCenter: parent.horizontalCenter
              anchors.alignWhenCentered: true
              TouchButton {
                  id: loginButton
                  text: "Login"
                  baseColor: "#7a5"
                  width: (parent.width - parent.spacing)/2
                  onClicked: login()
                  enabled: enginioClient.authenticationState !== Enginio.Authenticating && nameInput.text.length && passwordInput.text.length
                  KeyNavigation.tab: registerButton
              }
              TouchButton {
                  id: registerButton
                  text: "Register"
                  onClicked: registerAndLogin()
                  width: (parent.width - parent.spacing)/2
                  enabled: enginioClient.authenticationState !== Enginio.Authenticating && nameInput.text.length && passwordInput.text.length
                  KeyNavigation.tab: nameInput
              }
          }
      }

      Text {
          id: statusText
          anchors.bottom: parent.bottom
          anchors.horizontalCenter: parent.horizontalCenter
          anchors.bottomMargin: 70 * scaleFactor
          font.pixelSize: 18 * scaleFactor
          color: "#444"
      }

      Component.onCompleted: {
          enginioClient.sessionAuthenticationError.connect(function(reply){
              statusText.text = "Login failed: " + reply.errorString
          })

         enginioClient.sessionAuthenticated.connect(function(reply){
             addUserToAllUsersGroup(reply.data.enginio_data.user.id)
          })
      }

      Controls.Stack.onStatusChanged: {
          if (Controls.Stack.status == Controls.Stack.Activating) {
              nameInput.text = ""
              passwordInput.text = ""
              statusText.text = ""
              nameInput.forceActiveFocus()
          }
      }

      function login() {
          statusText.text = "Logging in..."
          enginioClient.identity = null
          auth.user = nameInput.text
          auth.password = passwordInput.text
          enginioClient.identity = auth
      }

      // Register a new user and add her to the group "allUsers"
      function registerAndLogin() {
          statusText.text = "Creating user account..."
          var createAccount = enginioClient.create({ "username": nameInput.text, "password": passwordInput.text }, Enginio.UserOperation)
          createAccount.finished.connect(function() {
              if (createAccount.errorType !== EnginioReply.NoError) {
                  statusText.text = "Account creation failed: " + createAccount.errorString
              } else {
                  login()
              }
          })
      }

      function addUserToAllUsersGroup(userId) {
          var groupQuery = enginioClient.query({ "query": { "name" : "allUsers" } }, Enginio.UsergroupOperation)

          groupQuery.finished.connect(function(){
              if (groupQuery.errorType !== EnginioReply.NoError) {
                  statusText.text = groupQuery.errorString
              } else if (groupQuery.data.results.length === 0 ){
                  statusText.text = "Usergroup 'allUsers' not found, check required backend configuration from Social Todos example documentation."
              } else {
                  var addUserToGroupData = {
                      "id": groupQuery.data.results[0].id,
                      "member" : {
                          "id": userId,
                          "objectType": "users"
                      }
                  }
                  var addUserToGroup = enginioClient.create(addUserToGroupData, Enginio.UsergroupMembersOperation)
                  addUserToGroup.finished.connect(function(){
                      if (addUserToGroup.errorType === EnginioReply.NoError) {
                          switchToListsView()
                      } else if (addUserToGroup.errorType === EnginioReply.BackendError &&
                                 addUserToGroup.backendStatus === 400) {
                          //User already present in group, OK to proceed
                          switchToListsView()
                      } else {
                          statusText.text = "User add to group failed: " + JSON.stringify(addUserToGroup.data.errors[0])
                      }
                  })
              }
          })
      }

      function switchToListsView() {
          mainView.push({ item: lists, properties: {"username": enginioClient.identity.user}})
      }
  }