From: Chip Black Date: Sun, 15 Apr 2012 23:02:56 +0000 (-0700) Subject: Implement login/logout X-Git-Tag: v1.7~2^2~35 X-Git-Url: http://git.bytex64.net/?a=commitdiff_plain;h=be0647e6531fec4b4b50a1a0c0d4e826e5e6f16b;p=blerg.git Implement login/logout Added API calls and UI events to handle logging in and logging out --- diff --git a/www/jssrc/blerg/API.js b/www/jssrc/blerg/API.js index 04e7ff9..2fb9561 100644 --- a/www/jssrc/blerg/API.js +++ b/www/jssrc/blerg/API.js @@ -1,6 +1,59 @@ +var baseURL = ''; + enyo.kind({ name: "blerg.API", + loggedIn: false, + username: "", create: function() { this.inherited(arguments); + if (enyo.getCookie('auth') && enyo.getCookie('username')) { + this.loggedIn = true; + this.username = enyo.getCookie('username'); + // Defer the signal until everything's initialized + setTimeout(function() { + this.bubble('onLoginSuccessful', {username: this.username}); + }.bind(this), 0); + } + }, + login: function(username, password) { + var req = new enyo.Ajax({ + url: baseURL + '/login', + method: 'POST' + }); + req.response(function(inSender, inResponse) { + if (inResponse.status == 'success') { + this.loggedIn = true; + this.username = username; + enyo.setCookie('username', username); + this.bubble('onLoginSuccessful', {username: username}); + } else { + enyo.setCookie('username', '', {"Max-Age": 0}); + this.bubble('onLoginFailed'); + } + }.bind(this)); + req.go({ + username: username, + password: password + }); + }, + logout: function() { + var req = new enyo.Ajax({ + url: baseURL + '/logout', + method: 'POST' + }); + req.response(function(inSender, inResponse) { + this.loggedIn = false; + enyo.setCookie('auth', '', {"Max-Age": 0}); + this.bubble('onLogoutSuccessful'); + }.bind(this)); + req.go({ + username: this.username + }); + enyo.setCookie('username', '', {"Max-Age": 0}); + }, + requestFeedStatus: function() { + if (!this.loggedIn) + throw new Error('Cannot request feed status when not logged in'); + // TODO } }); diff --git a/www/jssrc/blerg/Blerg.js b/www/jssrc/blerg/Blerg.js index 080e644..2a571a8 100644 --- a/www/jssrc/blerg/Blerg.js +++ b/www/jssrc/blerg/Blerg.js @@ -5,19 +5,24 @@ enyo.kind({ handlers: { onStartSignup: "showSignupDialog", onTryLogin: "tryLogin", + onTryLogout: "tryLogout", onSetTitle: "setTitle" }, components: [ {classes: "blerg-header", components: [ - {kind: "blerg.Title"}, - {kind: "blerg.Controls"}, + {name: "title", kind: "blerg.Title"}, + {name: "controls", kind: "blerg.Controls"}, {style: "clear: both"}, {name: "post", kind: "blerg.Post", showing: false}, {name: "help", kind: "blerg.Help"} ]}, {name: "main", kind: "blerg.Main"}, {name: "signupDialog", kind: "blerg.SignupDialog"}, - {name: "passwdDialog", kind: "blerg.PasswdDialog"} + {name: "passwdDialog", kind: "blerg.PasswdDialog"}, + {name: "api", kind: "blerg.API", + onLoginSuccessful: "loginSuccessful", + onLoginFailed: "loginFailed", + onLogoutSuccessful: "logout"} ], urlmap: [ ['search', /^\?post\/([^/]+)\/(.+)/, "blerg.ExternalURLPost"], @@ -78,5 +83,24 @@ enyo.kind({ this.$.title.hideControls(); }, tryLogin: function(inSender, inEvent) { + this.$.api.login(inEvent.username, inEvent.password); + }, + tryLogout: function(inSender, inEvent) { + this.$.api.logout(); + }, + loginSuccessful: function(inSender, inEvent) { + this.$.api.requestFeedStatus(); + this.feedStatusUpdateInterval = setInterval(function() { + this.$.api.requestFeedStatus(); + }.bind(this), 900000); + this.waterfall('onLogin', inEvent); + }, + loginFailed: function(inSender, inEvent) { + alert('Login failed'); + this.logout(); + }, + logout: function(inSender, inEvent) { + clearInterval(this.feedStatusUpdateInterval); + this.waterfall('onLogout'); } }); diff --git a/www/jssrc/blerg/Controls.js b/www/jssrc/blerg/Controls.js index 4ef8a41..508cd60 100644 --- a/www/jssrc/blerg/Controls.js +++ b/www/jssrc/blerg/Controls.js @@ -3,12 +3,17 @@ enyo.kind({ kind: "Control", style: "float: right", classes: "blerg-controls", + username: null, published: { loggedIn: false }, + handlers: { + onLogin: "login", + onLogout: "logout" + }, components: [ {name: "loggedOutControls", components: [ - {tag: "form", onsubmit: "doLogin", classes: "login", components: [ + {tag: "form", onsubmit: "loginClicked", classes: "login", components: [ {kind: "onyx.Groupbox", components: [ {kind: "onyx.InputDecorator", components: [ {name: "username", kind: "onyx.Input", placeholder: "Username"} @@ -17,15 +22,20 @@ enyo.kind({ {name: "password", kind: "onyx.Input", placeholder: "Password", type: "password"} ]}, ]}, - {kind: "onyx.Button", content: "Login", onclick: "doLogin"} + {kind: "onyx.Button", content: "Login", onclick: "loginClicked"} ]} ]}, {name: "loggedInControls", showing: false, components: [ - {name: "greeting"}, - {kind: "onyx.Toolbar", components: [ - {kind: "onyx.Button", content: "Write", onClick: "writeClicked"}, - {kind: "onyx.Button", content: "Hearsay", onClick: "chatterClicked"}, - {kind: "onyx.Button", content: "Stalking", onClick: "feedClicked"} + {name: "greeting", components: [ + {noDom: true, content: "Hello, "}, + {name: "userlink", tag: "a"}, + {noDom: true, content: "."} + ]}, + {classes: "onyx-toolbar-inline", components: [ + {kind: "onyx.Button", content: "Write", onclick: "writeClicked"}, + {kind: "onyx.Button", content: "Hearsay", onclick: "chatterClicked"}, + {kind: "onyx.Button", content: "Stalking", onclick: "feedClicked"}, + {kind: "onyx.Button", content: "Logout", onclick: "logoutClicked"} ]}, {components: [ {name: "rssButton", showing: false, kind: "blerg.Link", components: [ @@ -52,10 +62,25 @@ enyo.kind({ this.$.loggedInControls.hide(); } }, - doLogin: function() { + loginClicked: function(inSender, inEvent) { this.bubble('onTryLogin', { username: this.$.username.getValue(), password: this.$.password.getValue() }); + inEvent.preventDefault(); + return true; + }, + logoutClicked: function() { + this.bubble('onTryLogout'); + }, + login: function(inSender, inEvent) { + this.$.password.setValue(''); + this.setLoggedIn(true); + this.$.userlink.setAttribute('href', '/#' + inEvent.username); + this.$.userlink.setContent('@' + inEvent.username); + this.username = inEvent.username; + }, + logout: function(inSender, inEvent) { + this.setLoggedIn(false); } });