/* (1) Initialise ---------------------------------------------------------*/ /* (1) Default data structure */ gs.set('login', { // fields username: { model: '', timeout: '', error: '', validate: (_username) => /^[a-z0-9_-]{3,20}$/i.test(_username) }, password: { model: '', timeout: '', error: '', validate: (_password) => /^[^<>\/\\]{8,50}$/.test(_password) }, // functions func: { print_err(_field, _message, _duration){}, login(){}, forgot_pass(){}, press_enter(){} } }); /* (2) Manage error messages * * @_field Field to print errors to * @_message Error message to print * @_duration Durations (sec) for the message to be displayed * ---------------------------------------------------------*/ gs.get.login.func.print_err = function(_field, _message='error', _duration=null){ /* (1) Fail: invalid _field */ if( typeof _field !== 'string' || this[_field] == null ) return false; /* (2) Fail: invalid _message */ if( typeof _message !== 'string' ) return false; /* (3) Fail: invalid _message */ if( isNaN(_duration) ) return false; /* (4) Clear timeout if exists */ !isNaN(this[_field].err_to) && clearTimeout(this[_field].err_to); /* (5) Display error */ this[_field].error = _message; /* (6) No timeout if _duration if null */ if( _duration === null ) return true; /* (7) Setup Timeout */ this[_field].err_to = setTimeout( function(){ this.error = ''; }.bind(this[_field]), _duration*1000); return true; }.bind(gs.get.login); /* (3) Login attempt * ---------------------------------------------------------*/ gs.get.login.func.login = function(){ /* (1) Cache fields' values */ let username = this.username.model; let password = this.password.model; /* (2) Manage errors */ let errors = false; // username error if( !this.username.validate(username) ){ errors = true; this.func.print_err('username', '3 characters are required: letters, numbers, dot'); }else this.func.print_err('username', '', 0); // password error if( !this.password.validate(password) ){ errors = true; this.func.print_err('password', '8 characters are required'); }else this.func.print_err('password', '', 0); // if errors -> fail if( errors ) return false; /* (3) API bindings */ api.call('GET /user/token', {}, function(rs){ // manage error if( rs.error !== 0 || rs.token == null ){ this.func.print_err('username', 'Invalid combination'); this.func.print_err('password', 'Invalid combination'); return; } // store TOKEN + user data auth.token = rs.token; auth.user = { uid: null, // todo username: username }; document.location = ''; }.bind(this), encodeURI(`${username}:${password}`)); }.bind(gs.get.login); /* (4) Manage pressing on enter * ---------------------------------------------------------*/ gs.get.login.func.press_enter = function(e){ // if enter -> launch login if( e.keyCode === 13 ) this.func.login(); }.bind(gs.get.login);