Update to Enyo and Onyx 2.0-beta4
[blerg.git] / www / jssrc / blerg / User.js
index 5bcdbd0..57366fb 100644 (file)
 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, onNavigate: "startStalking"},
-                       {name: "unstalkLink", kind: "blerg.Link", content: "[stop stalking]", showing: false, onNavigate: "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",
-                onSubscriptionStatus: "gotStalkStatus"}
-       ],
-       statics: {
-               locationDetect: function(l) {
-                       var m = l.hash.match(/^#([A-Za-z0-9_-]+)(?:\/(\d+))?$/);
-                       if (m) {
-                               return {
-                                       kind: "blerg.User",
-                                       username: m[1],
-                                       permalink: m[2] != undefined,
-                                       record: parseInt(m[2])
-                               };
-                       }
-               }
-       },
-       create: function() {
-               this.inherited(arguments);
-               this.usernameChanged();
-       },
-       usernameChanged: function() {
-               this.bubble('onSetTitle', {section: '@' + this.username});
-               this.$.records.destroyComponents();
-               this.lastRecord = null;
-               this.$.loadMoreButton.hide();
-               this.$.chatterLink.setHref('/#/ref/' + this.username);
-               this.$.rssLink.setHref('/rss/' + this.username);
-               this.getStalkStatus();
+    name: "blerg.User",
+    kind: "blerg.Pager",
+    listKind: "blerg.Record",
+    handlers: {
+        onLogin: "getStalkStatus",
+        onLogout: "getStalkStatus",
+        onReload: "usernameChanged"
+    },
+    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, onNavigate: "startStalking"},
+            {name: "unstalkLink", kind: "blerg.Link", content: "[stop stalking]", showing: false, onNavigate: "stopStalking"},
+            {name: "rssLink", kind: "blerg.Link", components: [
+                {tag: null, content: "["},
+                {kind: "Image", src: "/images/rss.png", attributes: {width: 16, height: 16}},
+                {tag: null, content: "RSS]"}
+            ]}
+        ]},
+        {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: {
+        locationDetect: function(l) {
+            var m = l.hash.match(/^#([A-Za-z0-9_-]+)(?:\/(\d+))?$/);
+            if (m) {
+                return {
+                    kind: "blerg.User",
+                    username: m[1],
+                    permalink: m[2] != undefined,
+                    record: parseInt(m[2])
+                };
+            }
+        }
+    },
+    create: function() {
+        this.inherited(arguments);
+        this.usernameChanged();
+    },
+    usernameChanged: function() {
+        this.bubble('onSetTitle', {section: '@' + this.username});
+        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 {
-                       this.loadMore();
-               }
-       },
-       loadItems: function(from, to) {
-               this.inherited(arguments);
-               this.$.api.loadUserRecords(this.username, from, to);
-       },
-       itemsLoaded: function(inSender, inEvent) {
-               if (this.permalink) {
-                       this.$.loadMoreButton.hide();
-               } else {
-                       this.$.loadMoreButton.show();
-               }
+        if (this.permalink) {
+            this.loadItems(this.record, this.record);
+        } else {
+            this.loadMore();
+        }
+    },
+    loadItems: function(from, to) {
+        this.inherited(arguments);
+        this.$.api.loadUserRecords(this.username, from, to);
+    },
+    itemsLoaded: function(inSender, inEvent) {
+        this.$.userNotFoundMessage.hide();
+        if (this.permalink) {
+            this.$.loadMoreButton.hide();
+        } else {
+            this.$.loadMoreButton.show();
+        }
 
-               for (var i = 0; i < inEvent.entries.length; i++) {
-                       inEvent.entries[i].author = this.username;
-               }
+        for (var i = 0; i < inEvent.entries.length; i++) {
+            inEvent.entries[i].author = this.username;
+        }
 
-               this.addItems(inEvent.entries);
-       },
-       getStalkStatus: function() {
-               if (!blerg.API.loggedIn) {
-                       this.$.stalkLink.hide();
-                       this.$.unstalkLink.hide();
-                       return;
-               }
-               this.$.api.getSubscriptionStatus(this.username);
-       },
-       gotStalkStatus: function(inSender, inEvent) {
-               if (inEvent.subscribed) {
-                       this.$.stalkLink.hide();
-                       this.$.unstalkLink.show();
-               } else {
-                       this.$.stalkLink.show();
-                       this.$.unstalkLink.hide();
-               }
-       },
-       startStalking: function() {
-               this.$.api.subscribe(this.username);
-       },
-       stopStalking: function() {
-               this.$.api.unsubscribe(this.username);
-       }
+        this.addItems(inEvent.entries);
+        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();
+            this.$.unstalkLink.hide();
+            return;
+        }
+        this.$.api.getSubscriptionStatus(this.username);
+    },
+    gotStalkStatus: function(inSender, inEvent) {
+        if (inEvent.subscribed) {
+            this.$.stalkLink.hide();
+            this.$.unstalkLink.show();
+        } else {
+            this.$.stalkLink.show();
+            this.$.unstalkLink.hide();
+        }
+    },
+    startStalking: function() {
+        this.$.api.subscribe(this.username);
+    },
+    stopStalking: function() {
+        this.$.api.unsubscribe(this.username);
+    }
 });