From: Chip Black Date: Tue, 24 Apr 2012 22:13:41 +0000 (-0700) Subject: Finish user signup X-Git-Tag: v1.7~2^2~19 X-Git-Url: http://git.bytex64.net/?a=commitdiff_plain;h=79a8b4304e691959e39d24fe9438d73bcea1badf;p=blerg.git Finish user signup --- diff --git a/www/js/blerg.js b/www/js/blerg.js index 2125c5b..6857bdb 100644 --- a/www/js/blerg.js +++ b/www/js/blerg.js @@ -2,18 +2,6 @@ * BSD-style license. Please see the COPYING file for details. */ -// Config -var baseURL = ''; -var recordTemplate = new Template( - '
#{data}
Posted #{date}. [permalink] [reply]
' -); -var tagRecordTemplate = new Template( - '
#{data}
Posted by @#{author} on #{date}. [permalink] [reply]
' -); -var latestRecordsTemplate = new Template( - '
@#{author} #{data}
' -); - LoginStatus.prototype.post = function(msg) { if (!this.loggedIn) { alert("You are not logged in!"); @@ -45,203 +33,6 @@ LoginStatus.prototype.post = function(msg) { }); } -// Base object for paged data -function Pager() { - this.itemsPerPage = 10; - this.itemCache = new Hash(); - this.pageStart = null; -} - -Pager.prototype.updateState = function(m) { - return false; -} - -Pager.prototype.show = function() { - items.show(); -} - -Pager.prototype.hide = function() { - items.hide(); - items.update(); - $('newer_link').hide(); - $('older_link').hide(); -} - -Pager.prototype.olderPage = function() { - if (this.pageStart >= this.itemsPerPage) { - qlink(this.baseFrag + '/p' + (this.pageStart - this.itemsPerPage)); - } -} - -Pager.prototype.newerPage = function() { - if (this.pageStart + this.itemsPerPage < this.itemCount) { - qlink(this.baseFrag + '/p' + (this.pageStart + this.itemsPerPage)); - } -} - -Pager.prototype.addItems = function(items) { - items.each(function(v) { - if (!this.itemCache[v.id]) - this.itemCache[v.id] = v; - }.bind(this)); -} - -Pager.prototype.displayItems = function() { - if (this.pageStart == undefined) - this.pageStart == this.itemCount - 1; - items.update(); - - if (this.pageStart != undefined && this.itemCache[this.pageStart]) { - var end = (this.pageStart >= this.itemsPerPage ? this.pageStart - this.itemsPerPage + 1 : 0); - for (var i = this.pageStart; i >= end; i--) { - items.insert(this.itemCache[i].html); - } - } else { - items.insert("There doesn't seem to be anything here!"); - } - - if (this.pageStart < this.itemCount - 1) { - $('newer_link').href = baseURL + '/#' + this.baseFrag + '/p' + (this.pageStart + this.itemsPerPage); - $('newer_link').show(); - } else { - $('newer_link').hide(); - } - - if (this.pageStart >= 10) { - $('older_link').href = baseURL + '/#' + this.baseFrag + '/p' + (this.pageStart - this.itemsPerPage); - $('older_link').show(); - } else { - $('older_link').hide(); - } - - document.body.scrollTo(); -} - -Pager.prototype.reload = function() { - this.pageStart = null; - this.loadItems(null, null, Pager.prototype.showPageAt.bind(this, this.itemCount - 1)); -} - -Pager.prototype.showPageAt = function(r) { - var end = (r - 9 > 0 ? r - 9 : 0); - if (this.itemCache[r] && this.itemCache[end]) { - this.pageStart = r; - this.displayItems(); - } else { - this.loadItems((r >= 49 ? r - 49 : 0), r, Pager.prototype.showPageAt.bind(this, r)); - } -} - -Pager.prototype.showRecord = function(r) { - if (this.itemCache[r]) { - $('older_link').hide(); - $('newer_link').hide(); - items.update(this.itemCache[r].html); - } else { - this.loadItems(r, r, Pager.prototype.showRecord.bind(this, r)); - } -} - -Pager.prototype.loadItems = function(from, to, continuation) { } - -function displayError(msg) { - items.innerText = msg; -} - -// Pager for browsing subscription feeds -function Feed(m) { - Pager.call(this); - this.username = loginStatus.username; - this.baseFrag = '/feed'; - this.pageStart = parseInt(m[1]); - - new Ajax.Request(baseURL + '/feed', { - method: 'post', - parameters: { - username: loginStatus.username - }, - onSuccess: function(r) { - var response = r.responseText.evalJSON(); - if (response) { - var maxid = response.length - 1; - response.each(function(v, i) { - v.id = maxid - i; - mangleRecord(v, tagRecordTemplate) - }); - this.addItems(response); - if (!this.pageStart) - this.pageStart = response.length - 1; - this.itemCount = response.length; - loginStatus.requestFeedStatus(); - } - this.displayItems(); - }.bind(this), - onFailure: function(r) { - this.displayItems(); - }.bind(this) - }); -} -Feed.prototype = new Pager(); -Feed.prototype.constructor = Feed; - -Feed.prototype.updateState = function(m) { - this.pageStart = parseInt(m[1]) || this.itemCount - 1; - this.displayItems(); - - return true; -} - -Feed.prototype.show = function() { - Pager.prototype.show.call(this); - $$('[name=section]').each(function(v) { - v.update(' ' + loginStatus.username + "'s spycam"); - }.bind(this)); -} - - -function postPopup(initial) { - if (loginStatus.loggedIn || initial) { - var post = $('post'); - if (post.visible()) { - post.hide(); - } else { - post.show(); - if (initial) { - $('post.content').value = initial; - } else if (!$('post.content').value && currentPager.username && currentPager.username != loginStatus.username) { - $('post.content').value = '@' + currentPager.username + ': '; - } - $('post.content').focus(); - } - } -} - -function signup() { - var username = $('signup.username').value; - var password = $('signup.password').value; - - new Ajax.Request(baseURL + '/create', { - parameters: { - username: username, - password: password - }, - onSuccess: function(r) { - $('signup').hide(); - qlink(username); - - loginStatus.login(username, password); - }, - onFailure: function(r) { - alert("Failed to create user"); - } - }); -} - -function signup_cancel() { - $('signup').hide(); - urlSwitch(); -} - function passwd() { var old_password = $('passwd.old_password').value; var new_password = $('passwd.new_password').value; @@ -272,126 +63,6 @@ function passwd_cancel() { urlSwitch(); } -function subscribe() { - new Ajax.Request(baseURL + '/subscribe/' + currentPager.username, { - method: 'post', - parameters: { - username: loginStatus.username - }, - onSuccess: function(r) { - var response = r.responseText.evalJSON(); - if (response.status == 'success') { - alert("You call " + currentPager.username + " and begin breathing heavily into the handset."); - $$('[name=user.subscribelink]').each(Element.hide); - $$('[name=user.unsubscribelink]').each(Element.show); - } else { - alert('Failed to subscribe. This is probably for the best'); - } - }, - onFailure: function(r) { - alert('Failed to subscribe. This is probably for the best'); - } - }); -} - -function unsubscribe() { - new Ajax.Request(baseURL + '/unsubscribe/' + currentPager.username, { - method: 'post', - parameters: { - username: loginStatus.username - }, - onSuccess: function(r) { - var response = r.responseText.evalJSON(); - if (response.status == 'success') { - alert("You come to your senses."); - $$('[name=user.subscribelink]').each(Element.show); - $$('[name=user.unsubscribelink]').each(Element.hide); - } else { - alert('You are unable to tear yourself away (because something failed on the server)'); - } - }, - onFailure: function(r) { - alert('You are unable to tear yourself away (because something failed on the server)'); - } - }); -} - -var tickerTimer = null; -var tickerHead, tickerTail; - -function tickerFader(a, b, p) { - var p2 = 1 - p; - - a.style.opacity = p; - a.style.lineHeight = (100 * p) + '%'; - - b.style.opacity = p2; - b.style.lineHeight = (100 * p2) + '%'; - if (p == 1.0) - b.hide(); -} - -function ticker() { - tickerHead.show(); - Bytex64.FX.run(tickerFader.curry(tickerHead, tickerTail), 0.5); - tickerHead = tickerHead.nextSibling; - tickerTail = tickerTail.nextSibling; - if (tickerHead == null) { - stopTicker(); - loadLatest.delay(10); - } -} - -function startTicker() { - stopTicker(); - for (var elem = $('latest-posts').firstChild; elem != null; elem = elem.nextSibling) { - elem.hide(); - } - - // Show the first five - tickerHead = $('latest-posts').firstChild; - for (var i = 0; i < 10 && tickerHead; i++) { - tickerHead.show(); - tickerHead = tickerHead.nextSibling; - } - tickerTail = $('latest-posts').firstChild; - tickerTimer = setInterval(ticker, 5000); -} - -function stopTicker() { - if (tickerTimer) - clearInterval(tickerTimer); - tickerTimer = null; -} - -function loadLatest() { - new Ajax.Request(baseURL + '/latest.json', { - method: 'GET', - onSuccess: function(r) { - var j = r.responseText.evalJSON(); - - $('latest-tags').update(); - j.tags.each(function(v) { - var a = new Element('a', {href: baseURL + '/#/tag/' + v}); - a.insert('#' + v); - a.onclick = "return qlink()"; - a.className = 'ref'; - $('latest-tags').insert(a); - $('latest-tags').appendChild(document.createTextNode(' ')); - }); - - $('latest-posts').update(); - j.records.each(function(v) { - v.data = v.data.replace(/&/g, '&').replace(//g, '>'); - v.date = (new Date(v.timestamp * 1000)).toString(); - var html = latestRecordsTemplate.evaluate(v); - $('latest-posts').insert(html); - }); - startTicker(); - } - }); -} - function ExternalURLPost(m) { this.title = decodeURIComponent(m[1]).replace(']','').replace('[',''); this.url = decodeURIComponent(m[2]); diff --git a/www/jssrc/blerg/API.js b/www/jssrc/blerg/API.js index 203706a..a5aa965 100644 --- a/www/jssrc/blerg/API.js +++ b/www/jssrc/blerg/API.js @@ -32,6 +32,26 @@ enyo.kind({ blerg.API.apiInitialized = true; }, + signup: function(username, password) { + var req = new enyo.Ajax({ + url: baseURL + '/create', + method: 'POST' + }); + req.response(function(inSender, inResponse) { + if (inResponse.status == 'success') { + this.bubble('onSignupSuccess', {username: username}); + } else { + this.bubble('onSignupFailure', {username: username}); + } + }.bind(this)); + req.error(function() { + this.bubble('onSignupFailure', {username: username}); + }.bind(this)); + req.go({ + username: username, + password: password, + }); + }, login: function(username, password) { var req = new enyo.Ajax({ url: baseURL + '/login', @@ -88,6 +108,12 @@ enyo.kind({ entries: inResponse }); }.bind(this)); + req.error(function(inSender, inResponse) { + if (inResponse == 404) + this.bubble('onUserNotFound'); + else + this.bubble('onAPIError', {response: inResponse}); + }.bind(this)); req.go(); }, loadTagRecords: function(type, tag) { diff --git a/www/jssrc/blerg/SignupDialog.js b/www/jssrc/blerg/SignupDialog.js index f51e526..3a1660f 100644 --- a/www/jssrc/blerg/SignupDialog.js +++ b/www/jssrc/blerg/SignupDialog.js @@ -8,6 +8,7 @@ enyo.kind({ modal: true, components: [ {tag: "h2", content: "Sign Up"}, + {name: "spinner", kind: "OldSchoolSpinner", showing: false, style: "position: absolute; top: 8px; right: 8px"}, {kind: "onyx.Groupbox", components: [ {kind: "onyx.InputDecorator", components: [ {name: "username", kind: "onyx.Input", placeholder: "Username"} @@ -16,13 +17,43 @@ enyo.kind({ {name: "password", kind: "onyx.Input", placeholder: "Password", type: "password"} ]} ]}, - {kind: "onyx.Button", content: "Signup", onclick: "signupClick", classes: "onyx-affirmative"}, - {kind: "onyx.Button", content: "Cancel", onclick: "cancelClick", classes: "onyx-negative"} + {name: "message", tag: "p", content: "No, really, that's all I need. I don't want to send you email. It's too much work to program in email updates. :-P"}, + {name: "signupError", tag: "p", showing: false, classes: "blerg-error", content: "I couldn't sign you up. That username is already in use, or something went wrong on the backend. *shrug*"}, + {name: "signupButton", kind: "onyx.Button", content: "Signup", onclick: "signupClick", classes: "onyx-affirmative"}, + {kind: "onyx.Button", content: "Cancel", onclick: "cancelClick", classes: "onyx-negative"}, + {name: "api", kind: "blerg.API", + onSignupSuccess: "signupSuccess", + onSignupFailure: "signupFailure"} ], signupClick: function() { - // Do stuff + this.$.signupButton.setDisabled(true); + this.$.spinner.show(); + this.$.spinner.start(); + this.$.api.signup(this.$.username.getValue(), this.$.password.getValue()); }, cancelClick: function() { + this.$.signupError.hide(); + this.$.message.show(); + this.$.username.setValue(''); + this.$.password.setValue(''); this.hide(); + }, + signupSuccess: function(inSender, inEvent) { + this.$.signupButton.setDisabled(false); + this.$.spinner.hide(); + this.$.spinner.stop(); + this.bubble('onTryLogin', { + username: this.$.username.getValue(), + password: this.$.password.getValue() + }); + window.location.href = '/#' + inEvent.username; + this.cancelClick(); + }, + signupFailure: function(inSender, inEvent) { + this.$.signupButton.setDisabled(false); + this.$.spinner.hide(); + this.$.spinner.stop(); + this.$.message.hide(); + this.$.signupError.show(); } }); diff --git a/www/jssrc/blerg/User.js b/www/jssrc/blerg/User.js index 1775d0a..78f5247 100644 --- a/www/jssrc/blerg/User.js +++ b/www/jssrc/blerg/User.js @@ -24,9 +24,13 @@ enyo.kind({ ]}, {name: "records"}, {name: "spinner", kind: "OldSchoolSpinner", showing: false}, + {name: "emptyAccountMessage", showing: false, content: "Hey, there's nothing here!"}, + {name: "userNotFoundMessage", classes: "blerg-error", showing: false, content: "User not found"}, {name: "loadMoreButton", kind: "onyx.Button", onclick: "loadMore", content: "Load More"}, {name: "api", kind: "blerg.API", onItemsLoaded: "itemsLoaded", + onUserNotFound: "userNotFound", + onAPIError: "apiError", onSubscriptionStatus: "gotStalkStatus"} ], statics: { @@ -66,6 +70,7 @@ enyo.kind({ this.$.api.loadUserRecords(this.username, from, to); }, itemsLoaded: function(inSender, inEvent) { + this.$.userNotFoundMessage.hide(); if (this.permalink) { this.$.loadMoreButton.hide(); } else { @@ -77,9 +82,22 @@ enyo.kind({ } this.addItems(inEvent.entries); - if (this.lastRecord == 0) + if (this.lastRecord == 0 || inEvent.entries.length == 0) this.$.loadMoreButton.hide(); }, + addItems: function(items) { + this.$.emptyAccountMessage.setShowing(items.length == 0); + this.inherited(arguments); + }, + userNotFound: function() { + this.addItems([]); + this.$.emptyAccountMessage.hide(); + this.$.userNotFoundMessage.show(); + }, + apiError: function() { + this.addItems([]); + alert('Unknown API Error'); + }, getStalkStatus: function() { if (!blerg.API.loggedIn) { this.$.stalkLink.hide();