Rework API to provide global state for individual instances
authorChip Black <bytex64@bytex64.net>
Sun, 22 Apr 2012 22:39:40 +0000 (15:39 -0700)
committerChip Black <bytex64@bytex64.net>
Sun, 22 Apr 2012 22:39:40 +0000 (15:39 -0700)
Also add User controls

www/css/blerg.css
www/jssrc/blerg/API.js
www/jssrc/blerg/User.js

index 24bb13e..ed87bc6 100644 (file)
@@ -155,6 +155,22 @@ h1, h2, h3 {
        width: 100%;
 }
 
+.blerg-user-controls {
+       font-size: 14pt;
+       text-align: right;
+}
+
+.blerg-user-controls a {
+       color: inherit;
+       text-decoration: none;
+       margin-left: 4pt;
+}
+
+.blerg-user-controls a:hover {
+       text-decoration: underline;
+}
+
+
 .record {
        margin: 8pt 0 24pt 0;
        font-size: 14pt;
index 2fb9561..1a6b013 100644 (file)
@@ -1,19 +1,36 @@
 var baseURL = '';
 
+// The API state is static so that any instance can use login-dependent API
+// calls
 enyo.kind({
        name: "blerg.API",
-       loggedIn: false,
-       username: "",
+       kind: "Component",
+       statics: {
+               apiInitialized: false,
+               loggedIn: false,
+               username: "",
+       },
        create: function() {
                this.inherited(arguments);
+               if (blerg.API.apiInitialized) {
+                       if (blerg.API.loggedIn) {
+                               setTimeout(function() {
+                                       this.bubble('onLoginSuccessful', {username: blerg.API.username});
+                               }.bind(this), 0);
+                       }
+                       return;
+               }
+
                if (enyo.getCookie('auth') && enyo.getCookie('username')) {
-                       this.loggedIn = true;
-                       this.username = enyo.getCookie('username');
+                       blerg.API.loggedIn = true;
+                       blerg.API.username = enyo.getCookie('username');
                        // Defer the signal until everything's initialized
                        setTimeout(function() {
-                               this.bubble('onLoginSuccessful', {username: this.username});
+                               this.bubble('onLoginSuccessful', {username: blerg.API.username});
                        }.bind(this), 0);
                }
+
+               blerg.API.apiInitialized = true;
        },
        login: function(username, password) {
                var req = new enyo.Ajax({
@@ -22,8 +39,8 @@ enyo.kind({
                });
                req.response(function(inSender, inResponse) {
                        if (inResponse.status == 'success') {
-                               this.loggedIn = true;
-                               this.username = username;
+                               blerg.API.loggedIn = true;
+                               blerg.API.username = username;
                                enyo.setCookie('username', username);
                                this.bubble('onLoginSuccessful', {username: username});
                        } else {
@@ -42,18 +59,36 @@ enyo.kind({
                        method: 'POST'
                });
                req.response(function(inSender, inResponse) {
-                       this.loggedIn = false;
+                       blerg.API.loggedIn = false;
                        enyo.setCookie('auth', '', {"Max-Age": 0});
                        this.bubble('onLogoutSuccessful');
                }.bind(this));
                req.go({
-                       username: this.username
+                       username: blerg.API.username
                });
                enyo.setCookie('username', '', {"Max-Age": 0});
        },
        requestFeedStatus: function() {
-               if (!this.loggedIn)
+               if (!blerg.API.loggedIn)
                        throw new Error('Cannot request feed status when not logged in');
                // TODO
+       },
+       loadUserRecords: function(username, from ,to) {
+               var url;
+               if (from != undefined && to != undefined) {
+                       url = baseURL +  '/get/' + username + '/' + from + '-' + to;
+               } else {
+                       url = baseURL +  '/get/' + username;
+               }
+
+               var req = new enyo.Ajax({
+                       url: url
+               });
+               req.response(function(inSender, inResponse) {
+                       this.bubble('onItemsLoaded', {
+                               entries: inResponse
+                       });
+               }.bind(this));
+               req.go();
        }
 });
index b977fa0..d2d0b83 100644 (file)
@@ -2,11 +2,31 @@ enyo.kind({
        name: "blerg.User",
        kind: "blerg.Pager",
        listKind: "blerg.Record",
+       handlers: {
+               onLogin: "getStalkStatus",
+               onLogout: "getStalkStatus"
+       },
        published: {
                username: "",
                permalink: false,
                record: null,
        },
+       components: [
+               {classes: "blerg-user-controls", components: [
+                       {name: "chatterLink", kind: "blerg.Link", content: "[chatter]"},
+                       {name: "stalkLink", kind: "blerg.Link", content: "[stalk]", showing: false, onclick: "startStalking"},
+                       {name: "unstalkLink", kind: "blerg.Link", content: "[stop stalking]", showing: false, onclick: "stopStalking"},
+                       {name: "rssLink", kind: "blerg.Link", components: [
+                               {noDom: true, content: "["},
+                               {kind: "Image", src: "/images/rss.png", attributes: {width: 16, height: 16}},
+                               {noDom: true, content: "RSS]"}
+                       ]}
+               ]},
+               {name: "records"},
+               {name: "loadMoreButton", kind: "onyx.Button", onclick: "loadMore", content: "Load More"},
+               {name: "api", kind: "blerg.API",
+                onItemsLoaded: "itemsLoaded"}
+       ],
        statics: {
                locationDetect: function(l) {
                        var m = l.hash.match(/^#([A-Za-z0-9_-]+)(?:\/(\d+))?$/);
@@ -29,6 +49,10 @@ enyo.kind({
                this.$.records.destroyComponents();
                this.lastRecord = null;
                this.$.loadMoreButton.hide();
+               this.$.chatterLink.setHref('/#/ref/' + this.username);
+               this.$.rssLink.setHref('/rss/' + this.username);
+               this.getStalkStatus();
+
                if (this.permalink) {
                        this.loadItems(this.record, this.record);
                } else {
@@ -37,30 +61,27 @@ enyo.kind({
        },
        loadItems: function(from, to) {
                this.inherited(arguments);
-
-               var url;
-               if (from != undefined && to != undefined) {
-                       url = baseURL +  '/get/' + this.username + '/' + from + '-' + to;
+               this.$.api.loadUserRecords(this.username, from, to);
+       },
+       itemsLoaded: function(inSender, inEvent) {
+               if (this.permalink) {
+                       this.$.loadMoreButton.hide();
                } else {
-                       url = baseURL +  '/get/' + this.username;
+                       this.$.loadMoreButton.show();
                }
 
-               var req = new enyo.Ajax({
-                       url: url
-               });
-               req.response(function(inSender, inResponse) {
-                       if (this.permalink) {
-                               this.$.loadMoreButton.hide();
-                       } else {
-                               this.$.loadMoreButton.show();
-                       }
-
-                       for (var i = 0; i < inResponse.length; i++) {
-                               inResponse[i].author = this.username;
-                       }
+               for (var i = 0; i < inEvent.entries.length; i++) {
+                       inEvent.entries[i].author = this.username;
+               }
 
-                       this.addItems(inResponse);
-               }.bind(this));
-               req.go();
+               this.addItems(inEvent.entries);
+       },
+       getStalkStatus: function() {
+               if (!blerg.API.loggedIn) {
+                       this.$.stalkLink.hide();
+                       this.$.unstalkLink.hide();
+                       return;
+               }
+               // Make an API call to determine status
        }
 });