commit:be0647e6531fec4b4b50a1a0c0d4e826e5e6f16b
author:Chip Black
committer:Chip Black
date:Sun Apr 15 16:02:56 2012 -0700
parents:21db04ef3e4f66d7b5c4c9be2be36703b18cbcaa
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
line changes: +53/-0
index 04e7ff9..2fb9561
--- 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
line changes: +27/-3
index 080e644..2a571a8
--- 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
line changes: +33/-8
index 4ef8a41..508cd60
--- 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);
 	}
 });