Implement login/logout
authorChip Black <bytex64@bytex64.net>
Sun, 15 Apr 2012 23:02:56 +0000 (16:02 -0700)
committerChip Black <bytex64@bytex64.net>
Sun, 15 Apr 2012 23:02:56 +0000 (16:02 -0700)
Added API calls and UI events to handle logging in and logging out

www/jssrc/blerg/API.js
www/jssrc/blerg/Blerg.js
www/jssrc/blerg/Controls.js

index 04e7ff9..2fb9561 100644 (file)
@@ -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
        }
 });
index 080e644..2a571a8 100644 (file)
@@ -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');
        }
 });
index 4ef8a41..508cd60 100644 (file)
@@ -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);
        }
 });