diff --git a/build-buffer/.module-cache/04de173f1f09e92fe10ba2856499079d37de45f7.js b/build-buffer/.module-cache/04de173f1f09e92fe10ba2856499079d37de45f7.js
new file mode 100755
index 0000000..8f69855
--- /dev/null
+++ b/build-buffer/.module-cache/04de173f1f09e92fe10ba2856499079d37de45f7.js
@@ -0,0 +1,139 @@
+
+var ReactBootstrap = require('react-bootstrap')
+ , Grid = ReactBootstrap.Grid
+ , Col = ReactBootstrap.Col
+ , Row = ReactBootstrap.Row
+ , ListGroupItem = ReactBootstrap.ListGroupItem
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , OverlayTrigger = ReactBootstrap.OverlayTrigger
+ , Tooltip = ReactBootstrap.Tooltip
+
+var React = require('react');
+
+var SetIntervalMixin = require("../common/SetIntervalMixin.js");
+var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
+
+module.exports = Post = React.createClass({displayName: "Post",
+ mixins: [SetIntervalMixin,SafeStateChangeMixin],
+ getInitialState: function() {
+
+ return {
+ avatar: "img/genericPerson.png",
+ fullname: "",
+ timeAgo: "",
+ retwistingUser: this.props.post.username
+ };
+ },
+ updateTimeAgo: function() {
+ var secondsAgo = Date.now()/1000-this.props.post.timestamp;
+
+ var newTimeAgo = "";
+
+ if (secondsAgo<45) {newTimeAgo="1m"}
+ else if (secondsAgo<45*60) {newTimeAgo=Math.round(secondsAgo/60)+"m"}
+ else if (secondsAgo<18*60*60) {newTimeAgo=Math.round(secondsAgo/60/60)+"h"}
+ else if (secondsAgo<26*24*60*60) {newTimeAgo=Math.round(secondsAgo/24/60/60)+"d"}
+ else if (secondsAgo<9*30.5*24*60*60) {newTimeAgo=Math.round(secondsAgo/30.5/24/60/60)+"mo"}
+ else {newTimeAgo=Math.round(secondsAgo/365/24/60/60)+"y"}
+
+ this.setStateSafe({timeAgo: newTimeAgo});
+
+ },
+ componentDidMount: function () {
+
+ var thisComponent = this;
+
+ var post = Twister.getUser(this.props.post.username).getPost(this.props.post.id);
+
+ if (post.isRetwist()) {
+
+ post.getUser().doProfile(function(profile){
+ thisComponent.setStateSafe({retwistingUser: profile.getField("fullname")});
+ });
+
+ post=post.getRetwistedPost();
+
+ }
+
+ //console.log(this.props.post.username+":post"+this.props.post.id);
+ post.getUser().doAvatar(function(avatar){
+ if (avatar.getUrl()) {
+ thisComponent.setStateSafe({avatar: avatar.getUrl()});
+ }
+ });
+
+ post.getUser().doProfile(function(profile){
+ thisComponent.setStateSafe({fullname: profile.getField("fullname")});
+ });
+
+ this.updateTimeAgo();
+
+ this.setInterval(this.updateTimeAgo,60000);
+
+ },
+ render: function() {
+
+ var post = Twister.getUser(this.props.post.username).getPost(this.props.post.id);
+ var retwist = false;
+
+ if (post.isRetwist()) {
+ retwist = true;
+ post=post.getRetwistedPost();
+
+ }
+
+ if (post.isReply()) {
+ var conversationLink = (
+ React.createElement(OverlayTrigger, {placement: "left", overlay:
+ React.createElement(Tooltip, null, "View Conversation")
+ },
+ React.createElement("small", null, React.createElement("a", {href: "#/conversation/"+post.getUsername()+"/"+post.getId(), className: "link-button-gray"}, React.createElement(Glyphicon, {glyph: "comment"})))
+ )
+ );
+ } else {
+ var conversationLink = (React.createElement("span", null));
+ }
+
+ return (
+ React.createElement(ListGroupItem, null,
+ React.createElement(Row, {className: "nomargin"},
+ React.createElement(Col, {xs: 2, md: 2, className: "fullytight"},
+ React.createElement("a", {href: "#/profile/"+post.getUsername()},
+ React.createElement("img", {className: "img-responsive", src: this.state.avatar})
+ )
+ ),
+ React.createElement(Col, {xs: 9, md: 9},
+ React.createElement("strong", null, this.state.fullname), " ",
+ post.getContent()
+ ),
+ React.createElement(Col, {xs: 1, md: 1, className: "fullytight text-align-right"}, this.state.timeAgo)
+ ),
+ React.createElement(Row, {className: "nomargin"},
+ React.createElement(Col, {xs: 6, md: 6, className: "fullytight"},
+ retwist && React.createElement("small", null, React.createElement("em", null, " retwisted by ", this.state.retwistingUser))
+
+ ),
+ React.createElement(Col, {xs: 6, md: 6, className: "fullytight text-align-right"}, conversationLink)
+ )
+
+ )
+ );
+ }
+});
+
+/*
+
+
+
+
+
+ {this.state.fullname}
+ @{post.username} - {post.id}
+
+
+
{post.timestamp}
+
{post.content}
+
+
+
+ */
\ No newline at end of file
diff --git a/build-buffer/.module-cache/0aff40b9075c302cd82ad792ae85b2edb98547f2.js b/build-buffer/.module-cache/0aff40b9075c302cd82ad792ae85b2edb98547f2.js
new file mode 100755
index 0000000..2862c2c
--- /dev/null
+++ b/build-buffer/.module-cache/0aff40b9075c302cd82ad792ae85b2edb98547f2.js
@@ -0,0 +1,188 @@
+var React = require('react');
+var Postboard = require("../common/Postboard.js");
+var NewPostModalButton = require("../home/NewPostModalButton.js");
+var SetIntervalMixin = require("../common/SetIntervalMixin.js");
+var StreamMixin = require("../common/StreamMixin.js");
+var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
+var EventListenerMixin = require('../common/EventListenerMixin.js');
+var AppSettingsMixin = require('../common/AppSettingsMixin.js');
+
+
+var ReactBootstrap = require('react-bootstrap')
+ , NavItem = ReactBootstrap.NavItem
+ , Nav = ReactBootstrap.Nav
+ , ListGroup = ReactBootstrap.ListGroup
+ , ListGroupItem = ReactBootstrap.ListGroupItem
+ , Panel = ReactBootstrap.Panel
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , Button = ReactBootstrap.Button
+
+module.exports = Home = React.createClass({displayName: "Home",
+
+ mixins: [
+ AppSettingsMixin,
+ StreamMixin,
+ SetIntervalMixin,
+ SafeStateChangeMixin,
+ EventListenerMixin('scrolledtobottom'),
+ EventListenerMixin('newpostbyuser')
+ ],
+ contextTypes: {
+ router: React.PropTypes.func
+ },
+ getInitialState: function() {
+ return {
+ data: [],
+ postIdentifiers: {},
+ usernames: [],
+ postrange: ( Date.now()/1000 - 12*60*60 ),
+ min_posts: 30,
+ loading: true
+ };
+ },
+ addUser: function(username) {
+
+ var thisComponent = this;
+ this.setStateSafe(function(previousState, currentProps){
+
+ previousState.usernames.push(username);
+ return previousState;
+
+ },function(){
+
+ Twister.getUser(username).doLatestPostsUntil(function(post){
+
+ if(post.getTimestamp()
+
+
+
+
+ {this.state.fullname}
+ @{post.username} - {post.id}
+
+
+
{post.timestamp}
+
{post.content}
+
+
+
+ */
\ No newline at end of file
diff --git a/build-buffer/.module-cache/357b3c976317bd30460a76a5b582d2a806fd0a52.js b/build-buffer/.module-cache/357b3c976317bd30460a76a5b582d2a806fd0a52.js
new file mode 100755
index 0000000..0d456f6
--- /dev/null
+++ b/build-buffer/.module-cache/357b3c976317bd30460a76a5b582d2a806fd0a52.js
@@ -0,0 +1,125 @@
+
+var ReactBootstrap = require('react-bootstrap')
+ , Grid = ReactBootstrap.Grid
+ , Col = ReactBootstrap.Col
+ , Row = ReactBootstrap.Row
+ , ListGroupItem = ReactBootstrap.ListGroupItem
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , OverlayTrigger = ReactBootstrap.OverlayTrigger
+ , Tooltip = ReactBootstrap.Tooltip
+
+var React = require('react');
+
+var SetIntervalMixin = require("../common/SetIntervalMixin.js");
+var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
+
+module.exports = Post = React.createClass({displayName: "Post",
+ mixins: [SetIntervalMixin,SafeStateChangeMixin],
+ getInitialState: function() {
+
+
+
+ return {
+ avatar: "img/genericPerson.png",
+ fullname: "",
+ timeAgo: ""
+ };
+ },
+ updateTimeAgo: function() {
+ var secondsAgo = Date.now()/1000-this.props.post.timestamp;
+
+ var newTimeAgo = "";
+
+ if (secondsAgo<45) {newTimeAgo="1m"}
+ else if (secondsAgo<45*60) {newTimeAgo=Math.round(secondsAgo/60)+"m"}
+ else if (secondsAgo<18*60*60) {newTimeAgo=Math.round(secondsAgo/60/60)+"h"}
+ else if (secondsAgo<26*24*60*60) {newTimeAgo=Math.round(secondsAgo/24/60/60)+"d"}
+ else if (secondsAgo<9*30.5*24*60*60) {newTimeAgo=Math.round(secondsAgo/30.5/24/60/60)+"mo"}
+ else {newTimeAgo=Math.round(secondsAgo/365/24/60/60)+"y"}
+
+ this.setStateSafe({timeAgo: newTimeAgo});
+
+ },
+ componentDidMount: function () {
+ var thisComponent = this;
+
+ //console.log(this.props.post.username+":post"+this.props.post.id);
+ Twister.getUser(this.props.post.username).doAvatar(function(avatar){
+ if (avatar.getUrl()) {
+ thisComponent.setStateSafe({avatar: avatar.getUrl()});
+ }
+ });
+
+ Twister.getUser(this.props.post.username).doProfile(function(profile){
+ thisComponent.setStateSafe({fullname: profile.getField("fullname")});
+ });
+
+ if (this.props.post.isRetwist) {
+ Twister.getUser(this.props.post.retwistingUser).doProfile(function(profile){
+ thisComponent.setStateSafe({retwistingUser: profile.getField("fullname")});
+ });
+ }
+
+ this.updateTimeAgo();
+
+ this.setInterval(this.updateTimeAgo,60000);
+
+ },
+ render: function() {
+ var post = Twister.getUser(this.props.post.username).getPost(this.props.post.id);
+
+ if (post.isReply()) {
+ var conversationLink = (
+ React.createElement(OverlayTrigger, {placement: "left", overlay:
+ React.createElement(Tooltip, null, "View Conversation")
+ },
+ React.createElement("small", null, React.createElement("a", {href: "#/conversation/"+post.replyUsername()+"/"+post.replyId(), className: "link-button-gray"}, React.createElement(Glyphicon, {glyph: "comment"})))
+ )
+ );
+ } else {
+ var conversationLink = (React.createElement("span", null));
+ }
+
+ return (
+ React.createElement(ListGroupItem, null,
+ React.createElement(Row, {className: "nomargin"},
+ React.createElement(Col, {xs: 2, md: 2, className: "fullytight"},
+ React.createElement("a", {href: "#/profile/"+post.getUsername()},
+ React.createElement("img", {className: "img-responsive", src: this.state.avatar})
+ )
+ ),
+ React.createElement(Col, {xs: 9, md: 9},
+ React.createElement("strong", null, this.state.fullname), " ",
+ post.getContent()
+ ),
+ React.createElement(Col, {xs: 1, md: 1, className: "fullytight text-align-right"}, this.state.timeAgo)
+ ),
+ React.createElement(Row, {className: "nomargin"},
+ React.createElement(Col, {xs: 6, md: 6, className: "fullytight"},
+ post.isRetwist() && React.createElement("small", null, React.createElement(Glyphicon, {glyph: "retweet", "aria-hidden": "true"}), React.createElement("em", null, " retwisted by ", this.state.retwistingUser))
+
+ ),
+ React.createElement(Col, {xs: 6, md: 6, className: "fullytight text-align-right"}, conversationLink)
+ )
+
+ )
+ );
+ }
+});
+
+/*
+
+
+
+
+
+ {this.state.fullname}
+ @{post.username} - {post.id}
+
+
+
{post.timestamp}
+
{post.content}
+
+
+
+ */
\ No newline at end of file
diff --git a/build-buffer/.module-cache/3ba2c49efd95be4ad717e6f9972efb105398eaaf.js b/build-buffer/.module-cache/3ba2c49efd95be4ad717e6f9972efb105398eaaf.js
new file mode 100755
index 0000000..9029e2a
--- /dev/null
+++ b/build-buffer/.module-cache/3ba2c49efd95be4ad717e6f9972efb105398eaaf.js
@@ -0,0 +1,41 @@
+module.exports = StreamMixin = {
+
+ addPost: function(post) {
+
+ var postid = post.getUsername() + ":post" + post.getId();
+
+ if (!this.state.postIdentifiers[postid]) {
+
+ this.setStateSafe(function(previousState, currentProps) {
+
+ previousState.postIdentifiers[postid] = true;
+
+ var postdata = {
+ username: post.getUsername(),
+ id: post.getId(),
+ timestamp: post.getTimestamp()
+ }
+
+ previousState.data.push(postdata)
+
+ var compare = function (a,b) {
+ if (a.timestamp < b.timestamp)
+ return 1;
+ if (a.timestamp > b.timestamp)
+ return -1;
+ return 0;
+ }
+
+ previousState.data.sort(compare);
+
+ return {data: previousState.data, postIdentifiers: previousState.postIdentifiers };
+ });
+
+ } else {
+
+
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/3bfa39aabb13db53498065a81a9dfd035d6bcd3f.js b/build-buffer/.module-cache/3bfa39aabb13db53498065a81a9dfd035d6bcd3f.js
new file mode 100755
index 0000000..8a59264
--- /dev/null
+++ b/build-buffer/.module-cache/3bfa39aabb13db53498065a81a9dfd035d6bcd3f.js
@@ -0,0 +1,255 @@
+
+
+/*
+var Router = require('react-router')
+ , RouteHandler = Router.RouteHandler
+ , Route = Router.Route;
+
+
+var ReactRouterBootstrap = require('react-router-bootstrap')
+ , NavItemLink = ReactRouterBootstrap.NavItemLink
+ , ButtonLink = ReactRouterBootstrap.ButtonLink
+ , ListGroupItemLink = ReactRouterBootstrap.ListGroupItemLink;
+*/
+
+var ReactBootstrap = require('react-bootstrap')
+ , DropdownButton = ReactBootstrap.DropdownButton
+ , MenuItem = ReactBootstrap.MenuItem
+ , Button = ReactBootstrap.Button
+ , ButtonGroup = ReactBootstrap.ButtonGroup
+ , OverlayTrigger = ReactBootstrap.OverlayTrigger
+ , Popover = ReactBootstrap.Popover
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , Grid = ReactBootstrap.Grid
+ , Col = ReactBootstrap.Col
+ , Row = ReactBootstrap.Row
+
+var React = require('react');
+var Router = require('react-router');
+var { Route, DefaultRoute, RouteHandler, Link } = Router;
+
+var Home = require("./home/Home.js");
+var Profile = require("./profile/Profile.js");
+var SetIntervalMixin = require("./common/SetIntervalMixin.js");
+var SafeStateChangeMixin = require('./common/SafeStateChangeMixin.js');
+var Timeline = require('./profile/Timeline.js');
+var Followings = require('./profile/Followings.js');
+var Mentions = require('./profile/Mentions.js');
+var Conversation = require('./other/Conversation.js');
+var Settings = require('./other/Settings.js');
+var AppSettingsMixin = require('./common/AppSettingsMixin.js');
+
+App = React.createClass({displayName: "App",
+
+ mixins: [AppSettingsMixin,SetIntervalMixin,SafeStateChangeMixin],
+
+ contextTypes: {
+ router: React.PropTypes.func
+ },
+
+ getHandlerKey: function () {
+ var childDepth = 1; // assuming App is top-level route
+ var { router } = this.context;
+ //console.log(router.getCurrentParams())
+ if ( router.getCurrentRoutes()[childDepth] ) {
+ var key = router.getCurrentRoutes()[childDepth].name;
+ if (key=="home" || key=="profile-active" || key=="accountProfileMore") {key=key+"/"+this.state.activeAccount;}
+ var id = JSON.stringify(router.getCurrentParams());
+ if (id) { key += id; }
+ //console.log(key);
+ return key;
+ } else {return "none"}
+ },
+
+ clearCache: function () {
+ localStorage.setItem("twister-cache", null);
+ },
+
+ saveCache: function () {
+ localStorage.setItem("twister-cache", JSON.stringify(Twister.serializeCache()))
+ },
+
+ switchAccount: function (newaccoutname) {
+
+ //console.log(newaccoutname);
+
+ var thisComponent = this;
+
+ Twister.getAccount(newaccoutname).activateTorrents(function(){
+ thisComponent.setStateSafe({activeAccount: newaccoutname},function(){
+ localStorage.setItem("twister-react-activeAccount", newaccoutname);
+ });
+ });
+
+ },
+
+ getInitialState: function () {
+
+ var state={};
+
+ state.activeAccount = localStorage.getItem("twister-react-activeAccount")
+
+ state.accounts = Twister.getAccounts();
+
+ if (!state.activeAccount) { state.activeAccount=state.accounts[0]; }
+
+ //console.log(state);
+
+ return state;
+
+ },
+
+ componentDidMount: function () {
+
+ this.setInterval(this.saveCache,300000);
+
+ },
+
+ render: function() {
+
+ var firstroute = this.context.router.getCurrentRoutes()[1].name;
+
+ //console.log(firstroute);
+
+ var userbuttons = [];
+ for (var i in this.state.accounts) {
+ userbuttons.push(
+ React.createElement(MenuItem, {
+ key: this.state.accounts[i],
+ bsStyle: this.state.accounts[i]==this.state.activeAccount ? 'primary' : 'default',
+ onClick: this.switchAccount.bind(this,this.state.accounts[i]),
+ href: "javascript:void(0);"
+ }, this.state.accounts[i])
+ );
+ }
+
+ return (
+ React.createElement(Grid, null,
+ React.createElement(Row, null,
+ React.createElement(Col, {xs: 12, sm: 10, smOffset: 1, md: 8, mdOffset: 2, lg: 6, lgOffset: 3},
+ React.createElement(ButtonGroup, {justified: true},
+ React.createElement(Button, {
+ href: "#",
+ bsStyle: firstroute=="home" ? 'primary' : 'default'
+ }, React.createElement(Glyphicon, {glyph: "home"})),
+ React.createElement(Button, {
+ href: "#/profile",
+ bsStyle: firstroute=="profile-active" ? 'primary' : 'default'
+ }, React.createElement(Glyphicon, {glyph: "user"})),
+ React.createElement(Button, {href: "#/directmessages"}, React.createElement(Glyphicon, {glyph: "transfer"})),
+ React.createElement(DropdownButton, {title: this.state.activeAccount},
+ userbuttons
+ ),
+ React.createElement(DropdownButton, {title: React.createElement(Glyphicon, {glyph: "menu-hamburger"})},
+ React.createElement(MenuItem, {
+ onClick: this.clearCache,
+ href: "javascript:void(0);"
+ }, "Clear Cache"),
+ React.createElement(MenuItem, {href: "#/search"}, "Search"),
+ React.createElement(MenuItem, {href: "#/settings"}, "Settings"),
+ React.createElement(MenuItem, {href: "#/howtofollow"}, "How to Follow"),
+ React.createElement(MenuItem, {href: "#/trendinghashtags"}, "Trending Hashtags")
+ )
+ ),
+ React.createElement("br", null),
+ React.createElement(RouteHandler, {
+ activeAccount: this.state.activeAccount,
+ key: this.getHandlerKey()}
+ )
+ )
+ )
+ )
+ );
+ }
+});
+
+
+var routes = (
+ React.createElement(Route, {handler: App, path: "/"},
+ React.createElement(Route, {name: "profile-active", path: "/profile", handler: Profile},
+ React.createElement(Route, {name: "profile-active-timeline", path: "timeline", handler: Timeline}),
+ React.createElement(Route, {name: "profile-active-followings", path: "followings", handler: Followings}),
+ React.createElement(Route, {name: "profile-active-mentions", path: "mentions", handler: Mentions}),
+ React.createElement(DefaultRoute, {name: "profile-active-timeline-default", handler: Timeline})
+ ),
+ React.createElement(Route, {name: "profile", path: "/profile/:username", handler: Profile},
+ React.createElement(Route, {name: "profile-timeline", path: "timeline", handler: Timeline}),
+ React.createElement(Route, {name: "profile-followings", path: "followings", handler: Followings}),
+ React.createElement(Route, {name: "profile-mentions", path: "mentions", handler: Mentions}),
+ React.createElement(DefaultRoute, {name: "profile-timeline-default", handler: Timeline})
+ ),
+ React.createElement(Route, {name: "conversation", path: "/conversation/:username/:postid", handler: Conversation}),
+ React.createElement(Route, {name: "settings", path: "/settings", handler: Settings}),
+ React.createElement(DefaultRoute, {name: "home", handler: Home})
+ )
+);
+
+
+initializeApp = function () {
+
+ Router.run(routes, function (Handler) {
+ React.render(React.createElement(Handler, null), document.getElementById('content'));
+ });
+
+}
+
+Twister.deserializeCache(JSON.parse(localStorage.getItem("twister-cache")));
+
+var accounts = Twister.getAccounts();
+
+if (accounts.length==0) {
+
+ if (!localStorage.getItem("twister-react-settings")) {
+
+ var appSettings = {
+
+ pollInterval:60,
+ pollIntervalProfile: 3600,
+ ignoredUsers: "nobody",
+ host: "http://user:pwd@localhost:28332"
+
+ };
+
+ } else {
+
+ var appSettings = JSON.parse(localStorage.getItem("twister-react-settings"));
+
+ }
+
+ Twister.setup({
+ host: appSettings.host,
+ logfunc: function(log){console.log(log)},
+ outdatedLimit: appSettings.pollInterval,
+ querySettingsByType: {
+
+ outdatedLimit: {
+ pubkey: appSettings.pollIntervalProfile,
+ profile: appSettings.pollIntervalProfile,
+ avatar: appSettings.pollIntervalProfile,
+ torrent: appSettings.pollIntervalProfile,
+ followings: appSettings.pollIntervalProfile
+ }
+
+ }
+ });
+
+ Twister.loadServerAccounts(function(){
+
+ initializeApp();
+
+ });
+
+} else {
+
+ initializeApp();
+}
+
+////// INIT EVENTLISTENERS ON WINDOW
+
+window.onscroll = function(ev) {
+ if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight - 50) {
+ var event = new Event('scrolledtobottom');
+ //alert("scrolled to bottom")
+ window.dispatchEvent(event);
+ }
+};
\ No newline at end of file
diff --git a/build-buffer/.module-cache/3dcaf4ec25180cdbb6808472deab30e3b335c5af.js b/build-buffer/.module-cache/3dcaf4ec25180cdbb6808472deab30e3b335c5af.js
new file mode 100755
index 0000000..2df5530
--- /dev/null
+++ b/build-buffer/.module-cache/3dcaf4ec25180cdbb6808472deab30e3b335c5af.js
@@ -0,0 +1,141 @@
+
+var ReactBootstrap = require('react-bootstrap')
+ , Grid = ReactBootstrap.Grid
+ , Col = ReactBootstrap.Col
+ , Row = ReactBootstrap.Row
+ , ListGroupItem = ReactBootstrap.ListGroupItem
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , OverlayTrigger = ReactBootstrap.OverlayTrigger
+ , Tooltip = ReactBootstrap.Tooltip
+
+var React = require('react');
+
+var SetIntervalMixin = require("../common/SetIntervalMixin.js");
+var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
+
+module.exports = Post = React.createClass({displayName: "Post",
+ mixins: [SetIntervalMixin,SafeStateChangeMixin],
+ getInitialState: function() {
+
+
+
+ return {
+ avatar: "img/genericPerson.png",
+ fullname: "",
+ timeAgo: "",
+ retwistingUser: this.props.post.username
+ };
+ },
+ updateTimeAgo: function() {
+ var secondsAgo = Date.now()/1000-this.props.post.timestamp;
+
+ var newTimeAgo = "";
+
+ if (secondsAgo<45) {newTimeAgo="1m"}
+ else if (secondsAgo<45*60) {newTimeAgo=Math.round(secondsAgo/60)+"m"}
+ else if (secondsAgo<18*60*60) {newTimeAgo=Math.round(secondsAgo/60/60)+"h"}
+ else if (secondsAgo<26*24*60*60) {newTimeAgo=Math.round(secondsAgo/24/60/60)+"d"}
+ else if (secondsAgo<9*30.5*24*60*60) {newTimeAgo=Math.round(secondsAgo/30.5/24/60/60)+"mo"}
+ else {newTimeAgo=Math.round(secondsAgo/365/24/60/60)+"y"}
+
+ this.setStateSafe({timeAgo: newTimeAgo});
+
+ },
+ componentDidMount: function () {
+
+ var thisComponent = this;
+
+ var post = Twister.getUser(this.props.post.username).getPost(this.props.post.id);
+
+ if (post.isRetwist()) {
+
+ post.getUser().doProfile(function(profile){
+ thisComponent.setStateSafe({retwistingUser: profile.getField("fullname")});
+ });
+
+ post=post.getRetwistedPost();
+
+ }
+
+ //console.log(this.props.post.username+":post"+this.props.post.id);
+ post.getUser().doAvatar(function(avatar){
+ if (avatar.getUrl()) {
+ thisComponent.setStateSafe({avatar: avatar.getUrl()});
+ }
+ });
+
+ post.getUser().doProfile(function(profile){
+ thisComponent.setStateSafe({fullname: profile.getField("fullname")});
+ });
+
+ this.updateTimeAgo();
+
+ this.setInterval(this.updateTimeAgo,60000);
+
+ },
+ render: function() {
+
+ var post = Twister.getUser(this.props.post.username).getPost(this.props.post.id);
+ var retwist = false;
+
+ if (post.isRetwist()) {
+ retwist = true;
+ post=post.getRetwistedPost();
+
+ }
+
+ if (post.isReply()) {
+ var conversationLink = (
+ React.createElement(OverlayTrigger, {placement: "left", overlay:
+ React.createElement(Tooltip, null, "View Conversation")
+ },
+ React.createElement("small", null, React.createElement("a", {href: "#/conversation/"+post.getReplyUsername()+"/"+post.getReplyId(), className: "link-button-gray"}, React.createElement(Glyphicon, {glyph: "comment"})))
+ )
+ );
+ } else {
+ var conversationLink = (React.createElement("span", null));
+ }
+
+ return (
+ React.createElement(ListGroupItem, null,
+ React.createElement(Row, {className: "nomargin"},
+ React.createElement(Col, {xs: 2, md: 2, className: "fullytight"},
+ React.createElement("a", {href: "#/profile/"+post.getUsername()},
+ React.createElement("img", {className: "img-responsive", src: this.state.avatar})
+ )
+ ),
+ React.createElement(Col, {xs: 9, md: 9},
+ React.createElement("strong", null, this.state.fullname), " ",
+ post.getContent()
+ ),
+ React.createElement(Col, {xs: 1, md: 1, className: "fullytight text-align-right"}, this.state.timeAgo)
+ ),
+ React.createElement(Row, {className: "nomargin"},
+ React.createElement(Col, {xs: 6, md: 6, className: "fullytight"},
+ retwist && React.createElement("small", null, React.createElement("em", null, " retwisted by ", this.state.retwistingUser))
+
+ ),
+ React.createElement(Col, {xs: 6, md: 6, className: "fullytight text-align-right"}, conversationLink)
+ )
+
+ )
+ );
+ }
+});
+
+/*
+
+
+
+
+
+ {this.state.fullname}
+ @{post.username} - {post.id}
+
+
+
{post.timestamp}
+
{post.content}
+
+
+
+ */
\ No newline at end of file
diff --git a/build-buffer/.module-cache/3f2a37f90e1ee545b33bb432426bc5b3b8b5bddd.js b/build-buffer/.module-cache/3f2a37f90e1ee545b33bb432426bc5b3b8b5bddd.js
new file mode 100755
index 0000000..9d2b3a3
--- /dev/null
+++ b/build-buffer/.module-cache/3f2a37f90e1ee545b33bb432426bc5b3b8b5bddd.js
@@ -0,0 +1,188 @@
+var React = require('react');
+var Postboard = require("../common/Postboard.js");
+var NewPostModalButton = require("../home/NewPostModalButton.js");
+var SetIntervalMixin = require("../common/SetIntervalMixin.js");
+var StreamMixin = require("../common/StreamMixin.js");
+var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
+var EventListenerMixin = require('../common/EventListenerMixin.js');
+var AppSettingsMixin = require('../common/AppSettingsMixin.js');
+
+
+var ReactBootstrap = require('react-bootstrap')
+ , NavItem = ReactBootstrap.NavItem
+ , Nav = ReactBootstrap.Nav
+ , ListGroup = ReactBootstrap.ListGroup
+ , ListGroupItem = ReactBootstrap.ListGroupItem
+ , Panel = ReactBootstrap.Panel
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , Button = ReactBootstrap.Button
+
+module.exports = Home = React.createClass({displayName: "Home",
+
+ mixins: [
+ AppSettingsMixin,
+ StreamMixin,
+ SetIntervalMixin,
+ SafeStateChangeMixin,
+ EventListenerMixin('scrolledtobottom'),
+ EventListenerMixin('newpostbyuser')
+ ],
+ contextTypes: {
+ router: React.PropTypes.func
+ },
+ getInitialState: function() {
+ return {
+ data: [],
+ postIdentifiers: {},
+ usernames: [],
+ postrange: ( Date.now()/1000 - 12*60*60 ),
+ min_posts: 30,
+ loading: true
+ };
+ },
+ addUser: function(username) {
+
+ var thisComponent = this;
+ this.setStateSafe(function(previousState, currentProps){
+
+ previousState.usernames.push(username);
+ return previousState;
+
+ },function(){
+
+ Twister.getUser(username).doLatestPostsUntil(function(post){
+
+ if(post.getTimestamp() b.timestamp)
+ return -1;
+ return 0;
+ }
+
+ previousState.data.sort(compare);
+
+ return {data: previousState.data, postIdentifiers: previousState.postIdentifiers };
+ });
+
+ } else {
+
+
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/48711d4fe85cb25a78d9966e1fc3826535c72c7e.js b/build-buffer/.module-cache/48711d4fe85cb25a78d9966e1fc3826535c72c7e.js
new file mode 100755
index 0000000..32da7c3
--- /dev/null
+++ b/build-buffer/.module-cache/48711d4fe85cb25a78d9966e1fc3826535c72c7e.js
@@ -0,0 +1,72 @@
+module.exports = StreamMixin = {
+
+ addPost: function(post) {
+
+ var postid = post.getUsername() + ":post" + post.getId();
+
+ if (!this.state.postIdentifiers[postid]) {
+
+ this.setStateSafe(function(previousState, currentProps) {
+
+ previousState.postIdentifiers[postid] = true;
+
+ if (post.isRetwist()){
+
+
+ var postdata = {
+ username: post.getRetwistedUsername(),
+ retwistingUser: post.getUsername(),
+ content: post.getRetwistedContent(),
+ id: post.getRetwistedId(),
+ timestamp: post.getTimestamp(),
+ postid: postid,
+ isRetwist: true
+ }
+
+ } else {
+
+ var postdata = {
+ username: post.getUsername(),
+ content: post.getContent(),
+ id: post.getId(),
+ timestamp: post.getTimestamp(),
+ postid: postid,
+ isRetwist: false
+
+ }
+
+ }
+
+ if (post.isReply()) {
+
+ postdata.isReply = true;
+ postdata.replyUsername = post.getReplyUsername();
+ postdata.replyId = post.getReplyId();
+
+ } else {
+
+ postdata.isReply = false;
+
+ }
+
+ previousState.data.push(postdata)
+
+ var compare = function (a,b) {
+ if (a.timestamp < b.timestamp)
+ return 1;
+ if (a.timestamp > b.timestamp)
+ return -1;
+ return 0;
+ }
+
+ previousState.data.sort(compare);
+
+ return {data: previousState.data, postIdentifiers: previousState.postIdentifiers };
+ });
+
+ } else {
+
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/53c695924055d7f153218cbf005457df27ff7b91.js b/build-buffer/.module-cache/53c695924055d7f153218cbf005457df27ff7b91.js
new file mode 100755
index 0000000..80cc471
--- /dev/null
+++ b/build-buffer/.module-cache/53c695924055d7f153218cbf005457df27ff7b91.js
@@ -0,0 +1,188 @@
+var React = require('react');
+var Postboard = require("../common/Postboard.js");
+var NewPostModalButton = require("../home/NewPostModalButton.js");
+var SetIntervalMixin = require("../common/SetIntervalMixin.js");
+var StreamMixin = require("../common/StreamMixin.js");
+var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
+var EventListenerMixin = require('../common/EventListenerMixin.js');
+var AppSettingsMixin = require('../common/AppSettingsMixin.js');
+
+
+var ReactBootstrap = require('react-bootstrap')
+ , NavItem = ReactBootstrap.NavItem
+ , Nav = ReactBootstrap.Nav
+ , ListGroup = ReactBootstrap.ListGroup
+ , ListGroupItem = ReactBootstrap.ListGroupItem
+ , Panel = ReactBootstrap.Panel
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , Button = ReactBootstrap.Button
+
+module.exports = Home = React.createClass({displayName: "Home",
+
+ mixins: [
+ AppSettingsMixin,
+ StreamMixin,
+ SetIntervalMixin,
+ SafeStateChangeMixin,
+ EventListenerMixin('scrolledtobottom'),
+ EventListenerMixin('newpostbyuser')
+ ],
+ contextTypes: {
+ router: React.PropTypes.func
+ },
+ getInitialState: function() {
+ return {
+ data: [],
+ postIdentifiers: {},
+ usernames: [],
+ postrange: ( Date.now()/1000 - 12*60*60 ),
+ min_posts: 30,
+ loading: true
+ };
+ },
+ addUser: function(username) {
+
+ var thisComponent = this;
+ this.setStateSafe(function(previousState, currentProps){
+
+ previousState.usernames.push(username);
+ return previousState;
+
+ },function(){
+
+ Twister.getUser(username).doLatestPostsUntil(function(post){
+
+ if(post.getTimestamp() b.timestamp)
+ return -1;
+ return 0;
+ }
+
+ previousState.data.sort(compare);
+
+ return {data: previousState.data, postIdentifiers: previousState.postIdentifiers };
+ });
+
+ } else {
+
+
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/5a283d802f5720e888ae8bc435b87432d5fe0e4f.js b/build-buffer/.module-cache/5a283d802f5720e888ae8bc435b87432d5fe0e4f.js
new file mode 100755
index 0000000..47d8aae
--- /dev/null
+++ b/build-buffer/.module-cache/5a283d802f5720e888ae8bc435b87432d5fe0e4f.js
@@ -0,0 +1,257 @@
+
+
+/*
+var Router = require('react-router')
+ , RouteHandler = Router.RouteHandler
+ , Route = Router.Route;
+
+
+var ReactRouterBootstrap = require('react-router-bootstrap')
+ , NavItemLink = ReactRouterBootstrap.NavItemLink
+ , ButtonLink = ReactRouterBootstrap.ButtonLink
+ , ListGroupItemLink = ReactRouterBootstrap.ListGroupItemLink;
+*/
+
+var ReactBootstrap = require('react-bootstrap')
+ , DropdownButton = ReactBootstrap.DropdownButton
+ , MenuItem = ReactBootstrap.MenuItem
+ , Button = ReactBootstrap.Button
+ , ButtonGroup = ReactBootstrap.ButtonGroup
+ , OverlayTrigger = ReactBootstrap.OverlayTrigger
+ , Popover = ReactBootstrap.Popover
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , Grid = ReactBootstrap.Grid
+ , Col = ReactBootstrap.Col
+ , Row = ReactBootstrap.Row
+
+var React = require('react');
+var Router = require('react-router');
+var { Route, DefaultRoute, RouteHandler, Link } = Router;
+
+var Home = require("./home/Home.js");
+var Profile = require("./profile/Profile.js");
+var SetIntervalMixin = require("./common/SetIntervalMixin.js");
+var SafeStateChangeMixin = require('./common/SafeStateChangeMixin.js');
+var Timeline = require('./profile/Timeline.js');
+var Followings = require('./profile/Followings.js');
+var Mentions = require('./profile/Mentions.js');
+var Conversation = require('./other/Conversation.js');
+var Settings = require('./other/Settings.js');
+var AppSettingsMixin = require('./common/AppSettingsMixin.js');
+
+App = React.createClass({displayName: "App",
+
+ mixins: [AppSettingsMixin,SetIntervalMixin,SafeStateChangeMixin],
+
+ contextTypes: {
+ router: React.PropTypes.func
+ },
+
+ getHandlerKey: function () {
+ var childDepth = 1; // assuming App is top-level route
+ var { router } = this.context;
+ //console.log(router.getCurrentParams())
+ if ( router.getCurrentRoutes()[childDepth] ) {
+ var key = router.getCurrentRoutes()[childDepth].name;
+ if (key=="home" || key=="profile-active" || key=="accountProfileMore") {key=key+"/"+this.state.activeAccount;}
+ var id = JSON.stringify(router.getCurrentParams());
+ if (id) { key += id; }
+ //console.log(key);
+ return key;
+ } else {return "none"}
+ },
+
+ clearCache: function () {
+ localStorage.setItem("twister-cache", null);
+ },
+
+ saveCache: function () {
+ localStorage.setItem("twister-cache", JSON.stringify(Twister.serializeCache()))
+ },
+
+ switchAccount: function (newaccoutname) {
+
+ //console.log(newaccoutname);
+
+ var thisComponent = this;
+
+ Twister.getAccount(newaccoutname).activateTorrents(function(){
+ thisComponent.setStateSafe({activeAccount: newaccoutname},function(){
+ localStorage.setItem("twister-react-activeAccount", newaccoutname);
+ });
+ });
+
+ },
+
+ getInitialState: function () {
+
+ var state={};
+
+ state.activeAccount = localStorage.getItem("twister-react-activeAccount")
+
+ state.accounts = Twister.getAccounts();
+
+ if (!state.activeAccount) { state.activeAccount=state.accounts[0]; }
+
+ //console.log(state);
+
+ return state;
+
+ },
+
+ componentDidMount: function () {
+
+ this.setInterval(this.saveCache,300000);
+
+ },
+
+ render: function() {
+
+ var firstroute = this.context.router.getCurrentRoutes()[1].name;
+
+ //console.log(firstroute);
+
+ var userbuttons = [];
+ for (var i in this.state.accounts) {
+ userbuttons.push(
+ React.createElement(MenuItem, {
+ key: this.state.accounts[i],
+ bsStyle: this.state.accounts[i]==this.state.activeAccount ? 'primary' : 'default',
+ onClick: this.switchAccount.bind(this,this.state.accounts[i]),
+ href: "javascript:void(0);"
+ }, this.state.accounts[i])
+ );
+ }
+
+ return (
+ React.createElement(Grid, null,
+ React.createElement(Row, null,
+ React.createElement(Col, {xs: 12, sm: 10, smOffset: 1, md: 8, mdOffset: 2, lg: 6, lgOffset: 3},
+ React.createElement(ButtonGroup, {justified: true},
+ React.createElement(Button, {
+ href: "#",
+ bsStyle: firstroute=="home" ? 'primary' : 'default'
+ }, React.createElement(Glyphicon, {glyph: "home"})),
+ React.createElement(Button, {
+ href: "#/profile",
+ bsStyle: firstroute=="profile-active" ? 'primary' : 'default'
+ }, React.createElement(Glyphicon, {glyph: "user"})),
+ React.createElement(Button, {href: "#/directmessages"}, React.createElement(Glyphicon, {glyph: "transfer"})),
+ React.createElement(DropdownButton, {title: this.state.activeAccount},
+ userbuttons
+ ),
+ React.createElement(DropdownButton, {title: React.createElement(Glyphicon, {glyph: "menu-hamburger"})},
+ React.createElement(MenuItem, {
+ onClick: this.clearCache,
+ href: "javascript:void(0);"
+ }, "Clear Cache"),
+ React.createElement(MenuItem, {href: "#/search"}, "Search"),
+ React.createElement(MenuItem, {href: "#/settings"}, "Settings"),
+ React.createElement(MenuItem, {href: "#/howtofollow"}, "How to Follow"),
+ React.createElement(MenuItem, {href: "#/trendinghashtags"}, "Trending Hashtags")
+ )
+ ),
+ React.createElement("br", null),
+ React.createElement(RouteHandler, {
+ activeAccount: this.state.activeAccount,
+ key: this.getHandlerKey()}
+ )
+ )
+ )
+ )
+ );
+ }
+});
+
+
+var routes = (
+ React.createElement(Route, {handler: App, path: "/"},
+ React.createElement(Route, {name: "profile-active", path: "/profile", handler: Profile},
+ React.createElement(Route, {name: "profile-active-timeline", path: "timeline", handler: Timeline}),
+ React.createElement(Route, {name: "profile-active-followings", path: "followings", handler: Followings}),
+ React.createElement(Route, {name: "profile-active-mentions", path: "mentions", handler: Mentions}),
+ React.createElement(DefaultRoute, {name: "profile-active-timeline-default", handler: Timeline})
+ ),
+ React.createElement(Route, {name: "profile", path: "/profile/:username", handler: Profile},
+ React.createElement(Route, {name: "profile-timeline", path: "timeline", handler: Timeline}),
+ React.createElement(Route, {name: "profile-followings", path: "followings", handler: Followings}),
+ React.createElement(Route, {name: "profile-mentions", path: "mentions", handler: Mentions}),
+ React.createElement(DefaultRoute, {name: "profile-timeline-default", handler: Timeline})
+ ),
+ React.createElement(Route, {name: "conversation", path: "/conversation/:username/:postid", handler: Conversation}),
+ React.createElement(Route, {name: "settings", path: "/settings", handler: Settings}),
+ React.createElement(DefaultRoute, {name: "home", handler: Home})
+ )
+);
+
+
+initializeApp = function () {
+
+ Router.run(routes, function (Handler) {
+ React.render(React.createElement(Handler, null), document.getElementById('content'));
+ });
+
+}
+
+Twister.deserializeCache(JSON.parse(localStorage.getItem("twister-cache")));
+
+Twister.setup({logfunc: function(log){console.log(log)}})
+
+var accounts = Twister.getAccounts();
+
+if (accounts.length==0) {
+
+ if (!localStorage.getItem("twister-react-settings")) {
+
+ var appSettings = {
+
+ pollInterval:60,
+ pollIntervalProfile: 3600,
+ ignoredUsers: "nobody",
+ host: "http://user:pwd@localhost:28332"
+
+ };
+
+ } else {
+
+ var appSettings = JSON.parse(localStorage.getItem("twister-react-settings"));
+
+ }
+
+ Twister.setup({
+ host: appSettings.host,
+ //logfunc: function(log){console.log(log)},
+ outdatedLimit: appSettings.pollInterval,
+ querySettingsByType: {
+
+ outdatedLimit: {
+ pubkey: appSettings.pollIntervalProfile,
+ profile: appSettings.pollIntervalProfile,
+ avatar: appSettings.pollIntervalProfile,
+ torrent: appSettings.pollIntervalProfile,
+ followings: appSettings.pollIntervalProfile
+ }
+
+ }
+ });
+
+ Twister.loadServerAccounts(function(){
+
+ initializeApp();
+
+ });
+
+} else {
+
+ initializeApp();
+}
+
+////// INIT EVENTLISTENERS ON WINDOW
+
+window.onscroll = function(ev) {
+ if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight - 50) {
+ var event = new Event('scrolledtobottom');
+ //alert("scrolled to bottom")
+ window.dispatchEvent(event);
+ }
+};
\ No newline at end of file
diff --git a/build-buffer/.module-cache/5c8b7e3107de4f3ad8c663314f339598adcc4c09.js b/build-buffer/.module-cache/5c8b7e3107de4f3ad8c663314f339598adcc4c09.js
new file mode 100755
index 0000000..675c159
--- /dev/null
+++ b/build-buffer/.module-cache/5c8b7e3107de4f3ad8c663314f339598adcc4c09.js
@@ -0,0 +1,72 @@
+var React = require('react');
+var SetIntervalMixin = require("../common/SetIntervalMixin.js");
+var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
+var EventListenerMixin = require('../common/EventListenerMixin.js');
+var AppSettingsMixin = require('../common/AppSettingsMixin.js');
+
+
+var ReactBootstrap = require('react-bootstrap')
+ , NavItem = ReactBootstrap.NavItem
+ , Nav = ReactBootstrap.Nav
+ , ListGroup = ReactBootstrap.ListGroup
+ , ListGroupItem = ReactBootstrap.ListGroupItem
+ , Panel = ReactBootstrap.Panel
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , Button = ReactBootstrap.Button
+ , Input = ReactBootstrap.Input
+
+module.exports = Home = React.createClass({displayName: "Home",
+
+ mixins: [
+ SetIntervalMixin,
+ SafeStateChangeMixin,
+ AppSettingsMixin
+ ],
+ contextTypes: {
+ router: React.PropTypes.func
+ },
+ handeSettingsUpdate: function (e) {
+ e.preventDefault();
+
+ var newsettings = {}
+
+ newsettings.pollInterval = $(this.getDOMNode()).find(".settings-pollInterval").val();
+ newsettings.pollIntervalProfile = $(this.getDOMNode()).find(".settings-pollIntervalProfile").val();
+ newsettings.ignoredUsers = $(this.getDOMNode()).find(".settings-ignoredUsers").val();
+ newsettings.host = $(this.getDOMNode()).find(".settings-host").val();
+ newsettings.logging = $(this.getDOMNode()).find(".settings-logging").attr('checked');
+
+ console.log(newsettings)
+
+ localStorage.setItem("twister-react-settings",JSON.stringify(newsettings));
+
+ var event = new CustomEvent('appsettingschanged',{detail: newsettings});
+ window.dispatchEvent(event);
+
+ return;
+ },
+ render: function() {
+ return (
+ React.createElement(ListGroup, null,
+ React.createElement(ListGroupItem, null, "Settings"),
+ React.createElement(ListGroupItem, null,
+ React.createElement("form", {onSubmit: this.handeSettingsUpdate, className: "form-horizontal"},
+ React.createElement(Input, {type: "text", label: "pollInterval",
+ defaultValue: this.state.appSettings.pollInterval, labelClassName: "col-xs-4",
+ wrapperClassName: "col-xs-8", className: "settings-pollInterval"}),
+ React.createElement(Input, {type: "text", label: "pollIntervalProfile",
+ defaultValue: this.state.appSettings.pollIntervalProfile, labelClassName: "col-xs-4",
+ wrapperClassName: "col-xs-8", className: "settings-pollIntervalProfile"}),
+ React.createElement(Input, {type: "text", label: "ignoredUsers",
+ defaultValue: this.state.appSettings.ignoredUsers, labelClassName: "col-xs-4",
+ wrapperClassName: "col-xs-8", className: "settings-ignoredUsers"}),
+ React.createElement(Input, {type: "text", label: "host",
+ defaultValue: this.state.appSettings.host, labelClassName: "col-xs-4",
+ wrapperClassName: "col-xs-8", className: "settings-host"}),
+ React.createElement(Input, {type: "submit", value: "Save", wrapperClassName: "col-xs-offset-10 col-xs-2"})
+ )
+ )
+ )
+ );
+ }
+});
\ No newline at end of file
diff --git a/build-buffer/.module-cache/5d2323f47209b1542a4f6d1ff69e887836c4d7ef.js b/build-buffer/.module-cache/5d2323f47209b1542a4f6d1ff69e887836c4d7ef.js
new file mode 100755
index 0000000..9e16780
--- /dev/null
+++ b/build-buffer/.module-cache/5d2323f47209b1542a4f6d1ff69e887836c4d7ef.js
@@ -0,0 +1,162 @@
+
+var ReactBootstrap = require('react-bootstrap')
+ , Grid = ReactBootstrap.Grid
+ , Col = ReactBootstrap.Col
+ , Row = ReactBootstrap.Row
+ , ListGroupItem = ReactBootstrap.ListGroupItem
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , OverlayTrigger = ReactBootstrap.OverlayTrigger
+ , Tooltip = ReactBootstrap.Tooltip
+
+var React = require('react');
+
+var SetIntervalMixin = require("../common/SetIntervalMixin.js");
+var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
+
+module.exports = Post = React.createClass({displayName: "Post",
+ mixins: [SetIntervalMixin,SafeStateChangeMixin],
+ getInitialState: function() {
+
+ if (post.isRetwist()){
+
+
+ var postdata = {
+ username: post.getRetwistedUser(),
+ retwistingUser: post.getUsername(),
+ content: post.getRetwistedContent(),
+ id: post.getRetwistedId(),
+ timestamp: post.getTimestamp(),
+ postid: postid,
+ isRetwist: true
+ }
+
+ } else {
+
+ var postdata = {
+ username: post.getUsername(),
+ content: post.getContent(),
+ id: post.getId(),
+ timestamp: post.getTimestamp(),
+ postid: postid,
+ isRetwist: false
+
+ }
+
+ }
+
+ if (post.isReply()) {
+
+ postdata.isReply = true;
+ postdata.replyUser = post.getReplyUser();
+ postdata.replyId = post.getReplyId();
+
+ } else {
+
+ postdata.isReply = false;
+
+ }
+
+ return {
+ avatar: "img/genericPerson.png",
+ fullname: "",
+ timeAgo: ""
+ };
+ },
+ updateTimeAgo: function() {
+ var secondsAgo = Date.now()/1000-this.props.post.timestamp;
+
+ var newTimeAgo = "";
+
+ if (secondsAgo<45) {newTimeAgo="1m"}
+ else if (secondsAgo<45*60) {newTimeAgo=Math.round(secondsAgo/60)+"m"}
+ else if (secondsAgo<18*60*60) {newTimeAgo=Math.round(secondsAgo/60/60)+"h"}
+ else if (secondsAgo<26*24*60*60) {newTimeAgo=Math.round(secondsAgo/24/60/60)+"d"}
+ else if (secondsAgo<9*30.5*24*60*60) {newTimeAgo=Math.round(secondsAgo/30.5/24/60/60)+"mo"}
+ else {newTimeAgo=Math.round(secondsAgo/365/24/60/60)+"y"}
+
+ this.setStateSafe({timeAgo: newTimeAgo});
+
+ },
+ componentDidMount: function () {
+ var thisComponent = this;
+
+ //console.log(this.props.post.username+":post"+this.props.post.id);
+ Twister.getUser(this.props.post.username).doAvatar(function(avatar){
+ if (avatar.getUrl()) {
+ thisComponent.setStateSafe({avatar: avatar.getUrl()});
+ }
+ });
+
+ Twister.getUser(this.props.post.username).doProfile(function(profile){
+ thisComponent.setStateSafe({fullname: profile.getField("fullname")});
+ });
+
+ if (this.props.post.isRetwist) {
+ Twister.getUser(this.props.post.retwistingUser).doProfile(function(profile){
+ thisComponent.setStateSafe({retwistingUser: profile.getField("fullname")});
+ });
+ }
+
+ this.updateTimeAgo();
+
+ this.setInterval(this.updateTimeAgo,60000);
+
+ },
+ render: function() {
+ var post = Twister.getUser(this.props.post.username).getPost(this.props.post.id);
+
+ if (post.isReply()) {
+ var conversationLink = (
+ React.createElement(OverlayTrigger, {placement: "left", overlay:
+ React.createElement(Tooltip, null, "View Conversation")
+ },
+ React.createElement("small", null, React.createElement("a", {href: "#/conversation/"+post.replyUsername()+"/"+post.replyId(), className: "link-button-gray"}, React.createElement(Glyphicon, {glyph: "comment"})))
+ )
+ );
+ } else {
+ var conversationLink = (React.createElement("span", null));
+ }
+
+ return (
+ React.createElement(ListGroupItem, null,
+ React.createElement(Row, {className: "nomargin"},
+ React.createElement(Col, {xs: 2, md: 2, className: "fullytight"},
+ React.createElement("a", {href: "#/profile/"+post.getUsername()},
+ React.createElement("img", {className: "img-responsive", src: this.state.avatar})
+ )
+ ),
+ React.createElement(Col, {xs: 9, md: 9},
+ React.createElement("strong", null, this.state.fullname), " ",
+ post.getContent()
+ ),
+ React.createElement(Col, {xs: 1, md: 1, className: "fullytight text-align-right"}, this.state.timeAgo)
+ ),
+ React.createElement(Row, {className: "nomargin"},
+ React.createElement(Col, {xs: 6, md: 6, className: "fullytight"},
+ post.isRetwist() && React.createElement("small", null, React.createElement(Glyphicon, {glyph: "retweet", "aria-hidden": "true"}), React.createElement("em", null, " retwisted by ", this.state.retwistingUser))
+
+ ),
+ React.createElement(Col, {xs: 6, md: 6, className: "fullytight text-align-right"}, conversationLink)
+ )
+
+ )
+ );
+ }
+});
+
+/*
+
+
+
+
+
+ {this.state.fullname}
+ @{post.username} - {post.id}
+
+
+
{post.timestamp}
+
{post.content}
+
+
+
+ */
\ No newline at end of file
diff --git a/build-buffer/.module-cache/65d8380a32674e1bd91226089e1490e0965ce788.js b/build-buffer/.module-cache/65d8380a32674e1bd91226089e1490e0965ce788.js
new file mode 100755
index 0000000..a36bba5
--- /dev/null
+++ b/build-buffer/.module-cache/65d8380a32674e1bd91226089e1490e0965ce788.js
@@ -0,0 +1,256 @@
+
+
+/*
+var Router = require('react-router')
+ , RouteHandler = Router.RouteHandler
+ , Route = Router.Route;
+
+
+var ReactRouterBootstrap = require('react-router-bootstrap')
+ , NavItemLink = ReactRouterBootstrap.NavItemLink
+ , ButtonLink = ReactRouterBootstrap.ButtonLink
+ , ListGroupItemLink = ReactRouterBootstrap.ListGroupItemLink;
+*/
+
+var ReactBootstrap = require('react-bootstrap')
+ , DropdownButton = ReactBootstrap.DropdownButton
+ , MenuItem = ReactBootstrap.MenuItem
+ , Button = ReactBootstrap.Button
+ , ButtonGroup = ReactBootstrap.ButtonGroup
+ , OverlayTrigger = ReactBootstrap.OverlayTrigger
+ , Popover = ReactBootstrap.Popover
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , Grid = ReactBootstrap.Grid
+ , Col = ReactBootstrap.Col
+ , Row = ReactBootstrap.Row
+
+var React = require('react');
+var Router = require('react-router');
+var { Route, DefaultRoute, RouteHandler, Link } = Router;
+
+var Home = require("./home/Home.js");
+var Profile = require("./profile/Profile.js");
+var SetIntervalMixin = require("./common/SetIntervalMixin.js");
+var SafeStateChangeMixin = require('./common/SafeStateChangeMixin.js');
+var Timeline = require('./profile/Timeline.js');
+var Followings = require('./profile/Followings.js');
+var Mentions = require('./profile/Mentions.js');
+var Conversation = require('./other/Conversation.js');
+var Settings = require('./other/Settings.js');
+var AppSettingsMixin = require('./common/AppSettingsMixin.js');
+
+App = React.createClass({displayName: "App",
+
+ mixins: [AppSettingsMixin,SetIntervalMixin,SafeStateChangeMixin],
+
+ contextTypes: {
+ router: React.PropTypes.func
+ },
+
+ getHandlerKey: function () {
+ var childDepth = 1; // assuming App is top-level route
+ var { router } = this.context;
+ //console.log(router.getCurrentParams())
+ if ( router.getCurrentRoutes()[childDepth] ) {
+ var key = router.getCurrentRoutes()[childDepth].name;
+ if (key=="home" || key=="profile-active" || key=="accountProfileMore") {key=key+"/"+this.state.activeAccount;}
+ var id = JSON.stringify(router.getCurrentParams());
+ if (id) { key += id; }
+ //console.log(key);
+ return key;
+ } else {return "none"}
+ },
+
+ clearCache: function () {
+ localStorage.setItem("twister-cache", null);
+ },
+
+ saveCache: function () {
+ localStorage.setItem("twister-cache", JSON.stringify(Twister.serializeCache()))
+ },
+
+ switchAccount: function (newaccoutname) {
+
+ //console.log(newaccoutname);
+
+ var thisComponent = this;
+
+ Twister.getAccount(newaccoutname).activateTorrents(function(){
+ thisComponent.setStateSafe({activeAccount: newaccoutname},function(){
+ localStorage.setItem("twister-react-activeAccount", newaccoutname);
+ });
+ });
+
+ },
+
+ getInitialState: function () {
+
+ var state={};
+
+ state.activeAccount = localStorage.getItem("twister-react-activeAccount")
+
+ state.accounts = Twister.getAccounts();
+
+ if (!state.activeAccount) { state.activeAccount=state.accounts[0]; }
+
+ //console.log(state);
+
+ return state;
+
+ },
+
+ componentDidMount: function () {
+
+ this.setInterval(this.saveCache,300000);
+
+ },
+
+ render: function() {
+
+ var firstroute = this.context.router.getCurrentRoutes()[1].name;
+
+ //console.log(firstroute);
+
+ var userbuttons = [];
+ for (var i in this.state.accounts) {
+ userbuttons.push(
+ React.createElement(MenuItem, {
+ key: this.state.accounts[i],
+ bsStyle: this.state.accounts[i]==this.state.activeAccount ? 'primary' : 'default',
+ onClick: this.switchAccount.bind(this,this.state.accounts[i]),
+ href: "javascript:void(0);"
+ }, this.state.accounts[i])
+ );
+ }
+
+ return (
+ React.createElement(Grid, null,
+ React.createElement(Row, null,
+ React.createElement(Col, {xs: 12, sm: 10, smOffset: 1, md: 8, mdOffset: 2, lg: 6, lgOffset: 3},
+ React.createElement(ButtonGroup, {justified: true},
+ React.createElement(Button, {
+ href: "#",
+ bsStyle: firstroute=="home" ? 'primary' : 'default'
+ }, React.createElement(Glyphicon, {glyph: "home"})),
+ React.createElement(Button, {
+ href: "#/profile",
+ bsStyle: firstroute=="profile-active" ? 'primary' : 'default'
+ }, React.createElement(Glyphicon, {glyph: "user"})),
+ React.createElement(Button, {href: "#/directmessages"}, React.createElement(Glyphicon, {glyph: "transfer"})),
+ React.createElement(DropdownButton, {title: this.state.activeAccount},
+ userbuttons
+ ),
+ React.createElement(DropdownButton, {title: React.createElement(Glyphicon, {glyph: "menu-hamburger"})},
+ React.createElement(MenuItem, {
+ onClick: this.clearCache,
+ href: "javascript:void(0);"
+ }, "Clear Cache"),
+ React.createElement(MenuItem, {href: "#/search"}, "Search"),
+ React.createElement(MenuItem, {href: "#/settings"}, "Settings"),
+ React.createElement(MenuItem, {href: "#/howtofollow"}, "How to Follow"),
+ React.createElement(MenuItem, {href: "#/trendinghashtags"}, "Trending Hashtags")
+ )
+ ),
+ React.createElement("br", null),
+ React.createElement(RouteHandler, {
+ activeAccount: this.state.activeAccount,
+ key: this.getHandlerKey()}
+ )
+ )
+ )
+ )
+ );
+ }
+});
+
+
+var routes = (
+ React.createElement(Route, {handler: App, path: "/"},
+ React.createElement(Route, {name: "profile-active", path: "/profile", handler: Profile},
+ React.createElement(Route, {name: "profile-active-timeline", path: "timeline", handler: Timeline}),
+ React.createElement(Route, {name: "profile-active-followings", path: "followings", handler: Followings}),
+ React.createElement(Route, {name: "profile-active-mentions", path: "mentions", handler: Mentions}),
+ React.createElement(DefaultRoute, {name: "profile-active-timeline-default", handler: Timeline})
+ ),
+ React.createElement(Route, {name: "profile", path: "/profile/:username", handler: Profile},
+ React.createElement(Route, {name: "profile-timeline", path: "timeline", handler: Timeline}),
+ React.createElement(Route, {name: "profile-followings", path: "followings", handler: Followings}),
+ React.createElement(Route, {name: "profile-mentions", path: "mentions", handler: Mentions}),
+ React.createElement(DefaultRoute, {name: "profile-timeline-default", handler: Timeline})
+ ),
+ React.createElement(Route, {name: "conversation", path: "/conversation/:username/:postid", handler: Conversation}),
+ React.createElement(Route, {name: "settings", path: "/settings", handler: Settings}),
+ React.createElement(DefaultRoute, {name: "home", handler: Home})
+ )
+);
+
+
+initializeApp = function () {
+
+ Router.run(routes, function (Handler) {
+ React.render(React.createElement(Handler, null), document.getElementById('content'));
+ });
+
+}
+
+Twister.deserializeCache(JSON.parse(localStorage.getItem("twister-cache")));
+
+var accounts = Twister.getAccounts();
+
+if (accounts.length==0) {
+
+ if (!localStorage.getItem("twister-react-settings")) {
+
+ var appSettings = {
+
+ pollInterval:60,
+ pollIntervalProfile: 3600,
+ ignoredUsers: "nobody",
+ host: "http://user:pwd@localhost:28332",
+ logging: false
+
+ };
+
+ } else {
+
+ var appSettings = JSON.parse(localStorage.getItem("twister-react-settings"));
+
+ }
+
+ Twister.setup({
+ host: appSettings.host,
+ logfunc: function(log){console.log(log)},
+ outdatedLimit: appSettings.pollInterval,
+ querySettingsByType: {
+
+ outdatedLimit: {
+ pubkey: appSettings.pollIntervalProfile,
+ profile: appSettings.pollIntervalProfile,
+ avatar: appSettings.pollIntervalProfile,
+ torrent: appSettings.pollIntervalProfile,
+ followings: appSettings.pollIntervalProfile
+ }
+
+ }
+ });
+
+ Twister.loadServerAccounts(function(){
+
+ initializeApp();
+
+ });
+
+} else {
+
+ initializeApp();
+}
+
+////// INIT EVENTLISTENERS ON WINDOW
+
+window.onscroll = function(ev) {
+ if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight - 50) {
+ var event = new Event('scrolledtobottom');
+ //alert("scrolled to bottom")
+ window.dispatchEvent(event);
+ }
+};
\ No newline at end of file
diff --git a/build-buffer/.module-cache/6bb48745ac4429d537d53382f5dcec3d67511fef.js b/build-buffer/.module-cache/6bb48745ac4429d537d53382f5dcec3d67511fef.js
new file mode 100755
index 0000000..21bb417
--- /dev/null
+++ b/build-buffer/.module-cache/6bb48745ac4429d537d53382f5dcec3d67511fef.js
@@ -0,0 +1,12 @@
+module.exports = SetIntervalMixin = {
+ componentWillMount: function() {
+ this.intervals = [];
+ },
+ setInterval: function() {
+ console.log(arguments)
+ this.intervals.push(setInterval.apply(null, arguments));
+ },
+ componentWillUnmount: function() {
+ this.intervals.map(clearInterval);
+ }
+};
\ No newline at end of file
diff --git a/build-buffer/.module-cache/6ce0d3c4885a6fcfa77bee2f167ed69ace239ce9.js b/build-buffer/.module-cache/6ce0d3c4885a6fcfa77bee2f167ed69ace239ce9.js
new file mode 100755
index 0000000..1df29a5
--- /dev/null
+++ b/build-buffer/.module-cache/6ce0d3c4885a6fcfa77bee2f167ed69ace239ce9.js
@@ -0,0 +1,15 @@
+module.exports = SetIntervalMixin = {
+ componentWillMount: function() {
+ this.intervals = [];
+ },
+ setInterval: function() {
+ if (arguments[1]) {
+ this.intervals.push(setInterval.apply(null, arguments));
+ } else {
+ console.log("setInterval requested with malformed interval argument");
+ }
+ },
+ componentWillUnmount: function() {
+ this.intervals.map(clearInterval);
+ }
+};
\ No newline at end of file
diff --git a/build-buffer/.module-cache/6e932fafed6e3b7d13a9dccfcc8012f5e12eb595.js b/build-buffer/.module-cache/6e932fafed6e3b7d13a9dccfcc8012f5e12eb595.js
new file mode 100755
index 0000000..6510287
--- /dev/null
+++ b/build-buffer/.module-cache/6e932fafed6e3b7d13a9dccfcc8012f5e12eb595.js
@@ -0,0 +1,188 @@
+var React = require('react');
+var Postboard = require("../common/Postboard.js");
+var NewPostModalButton = require("../home/NewPostModalButton.js");
+var SetIntervalMixin = require("../common/SetIntervalMixin.js");
+var StreamMixin = require("../common/StreamMixin.js");
+var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
+var EventListenerMixin = require('../common/EventListenerMixin.js');
+var AppSettingsMixin = require('../common/AppSettingsMixin.js');
+
+
+var ReactBootstrap = require('react-bootstrap')
+ , NavItem = ReactBootstrap.NavItem
+ , Nav = ReactBootstrap.Nav
+ , ListGroup = ReactBootstrap.ListGroup
+ , ListGroupItem = ReactBootstrap.ListGroupItem
+ , Panel = ReactBootstrap.Panel
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , Button = ReactBootstrap.Button
+
+module.exports = Home = React.createClass({displayName: "Home",
+
+ mixins: [
+ AppSettingsMixin,
+ StreamMixin,
+ SetIntervalMixin,
+ SafeStateChangeMixin,
+ EventListenerMixin('scrolledtobottom'),
+ EventListenerMixin('newpostbyuser')
+ ],
+ contextTypes: {
+ router: React.PropTypes.func
+ },
+ getInitialState: function() {
+ return {
+ data: [],
+ postIdentifiers: {},
+ usernames: [],
+ postrange: ( Date.now()/1000 - 12*60*60 ),
+ min_posts: 30,
+ loading: true
+ };
+ },
+ addUser: function(username) {
+
+ var thisComponent = this;
+ this.setStateSafe(function(previousState, currentProps){
+
+ previousState.usernames.push(username);
+ return previousState;
+
+ },function(){
+
+ Twister.getUser(username).doLatestPostsUntil(function(post){
+
+ if(post.getTimestamp() b.timestamp)
+ return -1;
+ return 0;
+ }
+
+ previousState.data.sort(compare);
+
+ return {data: previousState.data, postIdentifiers: previousState.postIdentifiers };
+ });
+
+ } else {
+
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/8d60c25c4e017f1ce02928c7e2a5fe595549ca8c.js b/build-buffer/.module-cache/8d60c25c4e017f1ce02928c7e2a5fe595549ca8c.js
new file mode 100755
index 0000000..f112697
--- /dev/null
+++ b/build-buffer/.module-cache/8d60c25c4e017f1ce02928c7e2a5fe595549ca8c.js
@@ -0,0 +1,188 @@
+var React = require('react');
+var Postboard = require("../common/Postboard.js");
+var NewPostModalButton = require("../home/NewPostModalButton.js");
+var SetIntervalMixin = require("../common/SetIntervalMixin.js");
+var StreamMixin = require("../common/StreamMixin.js");
+var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
+var EventListenerMixin = require('../common/EventListenerMixin.js');
+var AppSettingsMixin = require('../common/AppSettingsMixin.js');
+
+
+var ReactBootstrap = require('react-bootstrap')
+ , NavItem = ReactBootstrap.NavItem
+ , Nav = ReactBootstrap.Nav
+ , ListGroup = ReactBootstrap.ListGroup
+ , ListGroupItem = ReactBootstrap.ListGroupItem
+ , Panel = ReactBootstrap.Panel
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , Button = ReactBootstrap.Button
+
+module.exports = Home = React.createClass({displayName: "Home",
+
+ mixins: [
+ AppSettingsMixin,
+ StreamMixin,
+ SetIntervalMixin,
+ SafeStateChangeMixin,
+ EventListenerMixin('scrolledtobottom'),
+ EventListenerMixin('newpostbyuser')
+ ],
+ contextTypes: {
+ router: React.PropTypes.func
+ },
+ getInitialState: function() {
+ return {
+ data: [],
+ postIdentifiers: {},
+ usernames: [],
+ postrange: ( Date.now()/1000 - 12*60*60 ),
+ min_posts: 30,
+ loading: true
+ };
+ },
+ addUser: function(username) {
+
+ var thisComponent = this;
+ this.setStateSafe(function(previousState, currentProps){
+
+ previousState.usernames.push(username);
+ return previousState;
+
+ },function(){
+
+ Twister.getUser(username).doLatestPostsUntil(function(post){
+
+ if(post.getTimestamp()= document.body.offsetHeight - 50) {
+ var event = new Event('scrolledtobottom');
+ //alert("scrolled to bottom")
+ window.dispatchEvent(event);
+ }
+};
\ No newline at end of file
diff --git a/build-buffer/.module-cache/98dd8434ca1efe630f32b3f5db7c4977ccc91302.js b/build-buffer/.module-cache/98dd8434ca1efe630f32b3f5db7c4977ccc91302.js
new file mode 100755
index 0000000..54b8c04
--- /dev/null
+++ b/build-buffer/.module-cache/98dd8434ca1efe630f32b3f5db7c4977ccc91302.js
@@ -0,0 +1,42 @@
+module.exports = StreamMixin = {
+
+ addPost: function(post) {
+
+ var postid = post.getUsername() + ":post" + post.getId();
+
+ if (!this.state.postIdentifiers[postid]) {
+
+ this.setStateSafe(function(previousState, currentProps) {
+
+ previousState.postIdentifiers[postid] = true;
+
+ var postdata = {
+ username: post.getUsername(),
+ id: post.getId(),
+ timestamp: post.getTimestamp(),
+ postid: postid
+ }
+
+ previousState.data.push(postdata)
+
+ var compare = function (a,b) {
+ if (a.timestamp < b.timestamp)
+ return 1;
+ if (a.timestamp > b.timestamp)
+ return -1;
+ return 0;
+ }
+
+ previousState.data.sort(compare);
+
+ return {data: previousState.data, postIdentifiers: previousState.postIdentifiers };
+ });
+
+ } else {
+
+
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/a1d3510314875c02aa598cbd3b7cde5d488c828f.js b/build-buffer/.module-cache/a1d3510314875c02aa598cbd3b7cde5d488c828f.js
new file mode 100755
index 0000000..dd71603
--- /dev/null
+++ b/build-buffer/.module-cache/a1d3510314875c02aa598cbd3b7cde5d488c828f.js
@@ -0,0 +1,102 @@
+var React = require('react');
+var Postboard = require("../common/Postboard.js");
+var SetIntervalMixin = require("../common/SetIntervalMixin.js");
+var StreamMixin = require("../common/StreamMixin.js");
+var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
+var EventListenerMixin = require('../common/EventListenerMixin.js');
+var AppSettingsMixin = require('../common/AppSettingsMixin.js');
+
+var ReactBootstrap = require('react-bootstrap')
+ , NavItem = ReactBootstrap.NavItem
+ , Nav = ReactBootstrap.Nav
+ , ListGroup = ReactBootstrap.ListGroup
+ , ListGroupItem = ReactBootstrap.ListGroupItem
+ , Panel = ReactBootstrap.Panel
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , Button = ReactBootstrap.Button
+
+module.exports = Timeline = React.createClass({displayName: "Timeline",
+
+ mixins:[
+ AppSettingsMixin,
+ StreamMixin,
+ SetIntervalMixin,
+ SafeStateChangeMixin,
+ EventListenerMixin('newpostbyuser')
+ ],
+ contextTypes: {
+ router: React.PropTypes.func
+ },
+ getInitialState: function() {
+ return {
+ username: this.context.router.getCurrentParams().username,
+ postid: parseInt(this.context.router.getCurrentParams().postid),
+ data: [],
+ postIdentifiers: {},
+ loading: true
+ };
+ },
+ updatePosts: function(outdatedLimit) {
+
+ //console.log(this.state.username+":post"+this.state.postid)
+
+ if (!outdatedLimit) {outdatedLimit=this.state.appSettings.pollInterval/2;}
+
+ var thisComponent = this;
+ var thisUsername = this.state.username;
+
+ var goUpConversation = function (post) {
+
+
+
+ if (post.isReply()) {
+
+ post.doPostRepliedTo(goUpConversation);
+
+ } else {
+
+ thisComponent.addPost(post);
+
+ thisComponent.setStateSafe({loading: false});
+
+ post.doReplies(doRepliesRecursive);
+
+ }
+ }
+
+ var doRepliesRecursive = function (replies) {
+
+ for (var i in replies) {
+ replies[i].doReplies(doRepliesRecursive);
+ thisComponent.addPost(replies[i]);
+ //console.log(replies[i].getContent())
+ }
+
+ };
+
+ Twister.getUser(this.state.username).doPost(this.state.postid,goUpConversation,{outdatedLimit: outdatedLimit, logfunc: function(log){console.log(log)}});
+
+ },
+ componentDidMount: function() {
+
+ this.updatePosts(2*this.state.appSettings.pollInterval);
+ this.setInterval(this.updatePosts, this.state.appSettings.pollInterval*1000);
+
+ },
+ onnewpostbyuser: function (event) {
+
+ //alert("got event")
+
+ this.updatePosts(-1);
+
+ },
+ render: function() {
+ return (
+ React.createElement(Postboard, {header:
+ React.createElement(ListGroupItem, null,
+ "Conversation"
+ ),
+ data: this.state.data, loading: this.state.loading})
+ );
+ }
+});
\ No newline at end of file
diff --git a/build-buffer/.module-cache/a4b107445cccc7ecd58b53b98715784e2eda3990.js b/build-buffer/.module-cache/a4b107445cccc7ecd58b53b98715784e2eda3990.js
new file mode 100755
index 0000000..a7b077d
--- /dev/null
+++ b/build-buffer/.module-cache/a4b107445cccc7ecd58b53b98715784e2eda3990.js
@@ -0,0 +1,123 @@
+
+var ReactBootstrap = require('react-bootstrap')
+ , Grid = ReactBootstrap.Grid
+ , Col = ReactBootstrap.Col
+ , Row = ReactBootstrap.Row
+ , ListGroupItem = ReactBootstrap.ListGroupItem
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , OverlayTrigger = ReactBootstrap.OverlayTrigger
+ , Tooltip = ReactBootstrap.Tooltip
+
+var React = require('react');
+
+var SetIntervalMixin = require("../common/SetIntervalMixin.js");
+var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
+
+module.exports = Post = React.createClass({displayName: "Post",
+ mixins: [SetIntervalMixin,SafeStateChangeMixin],
+ getInitialState: function() {
+ return {
+ avatar: "img/genericPerson.png",
+ fullname: "",
+ retwistingUser: this.props.post.retwistingUser,
+ timeAgo: ""
+ };
+ },
+ updateTimeAgo: function() {
+ var secondsAgo = Date.now()/1000-this.props.post.timestamp;
+
+ var newTimeAgo = "";
+
+ if (secondsAgo<45) {newTimeAgo="1m"}
+ else if (secondsAgo<45*60) {newTimeAgo=Math.round(secondsAgo/60)+"m"}
+ else if (secondsAgo<18*60*60) {newTimeAgo=Math.round(secondsAgo/60/60)+"h"}
+ else if (secondsAgo<26*24*60*60) {newTimeAgo=Math.round(secondsAgo/24/60/60)+"d"}
+ else if (secondsAgo<9*30.5*24*60*60) {newTimeAgo=Math.round(secondsAgo/30.5/24/60/60)+"mo"}
+ else {newTimeAgo=Math.round(secondsAgo/365/24/60/60)+"y"}
+
+ this.setStateSafe({timeAgo: newTimeAgo});
+
+ },
+ componentDidMount: function () {
+ var thisComponent = this;
+
+ //console.log(this.props.post.username+":post"+this.props.post.id);
+ Twister.getUser(this.props.post.username).doAvatar(function(avatar){
+ if (avatar.getUrl()) {
+ thisComponent.setStateSafe({avatar: avatar.getUrl()});
+ }
+ });
+
+ Twister.getUser(this.props.post.username).doProfile(function(profile){
+ thisComponent.setStateSafe({fullname: profile.getField("fullname")});
+ });
+
+ if (this.props.post.isRetwist) {
+ Twister.getUser(this.props.post.retwistingUser).doProfile(function(profile){
+ thisComponent.setStateSafe({retwistingUser: profile.getField("fullname")});
+ });
+ }
+
+ this.updateTimeAgo();
+
+ this.setInterval(this.updateTimeAgo,60000);
+
+ },
+ render: function() {
+ var post = this.props.post;
+
+ if (post.isReply) {
+ var conversationLink = (
+ React.createElement(OverlayTrigger, {placement: "left", overlay:
+ React.createElement(Tooltip, null, "View Conversation")
+ },
+ React.createElement("small", null, React.createElement("a", {href: "#/conversation/"+post.replyUsername+"/"+post.replyId, className: "link-button-gray"}, React.createElement(Glyphicon, {glyph: "comment"})))
+ )
+ );
+ } else {
+ var conversationLink = (React.createElement("span", null));
+ }
+
+ return (
+ React.createElement(ListGroupItem, null,
+ React.createElement(Row, {className: "nomargin"},
+ React.createElement(Col, {xs: 2, md: 2, className: "fullytight"},
+ React.createElement("a", {href: "#/profile/"+this.props.post.username},
+ React.createElement("img", {className: "img-responsive", src: this.state.avatar})
+ )
+ ),
+ React.createElement(Col, {xs: 9, md: 9},
+ React.createElement("strong", null, this.state.fullname), " ",
+ post.content
+ ),
+ React.createElement(Col, {xs: 1, md: 1, className: "fullytight text-align-right"}, this.state.timeAgo)
+ ),
+ React.createElement(Row, {className: "nomargin"},
+ React.createElement(Col, {xs: 6, md: 6, className: "fullytight"},
+ post.isRetwist && React.createElement("small", null, React.createElement(Glyphicon, {glyph: "retweet", "aria-hidden": "true"}), React.createElement("em", null, " retwisted by ", this.state.retwistingUser))
+
+ ),
+ React.createElement(Col, {xs: 6, md: 6, className: "fullytight text-align-right"}, conversationLink)
+ )
+
+ )
+ );
+ }
+});
+
+/*
+
+
+
+
+
+ {this.state.fullname}
+ @{post.username} - {post.id}
+
+
+
{post.timestamp}
+
{post.content}
+
+
+
+ */
\ No newline at end of file
diff --git a/build-buffer/.module-cache/af9f96e2470eb5c2f3be2acf762ee2e95f6e3ee2.js b/build-buffer/.module-cache/af9f96e2470eb5c2f3be2acf762ee2e95f6e3ee2.js
new file mode 100755
index 0000000..cd283d8
--- /dev/null
+++ b/build-buffer/.module-cache/af9f96e2470eb5c2f3be2acf762ee2e95f6e3ee2.js
@@ -0,0 +1,125 @@
+
+var ReactBootstrap = require('react-bootstrap')
+ , Grid = ReactBootstrap.Grid
+ , Col = ReactBootstrap.Col
+ , Row = ReactBootstrap.Row
+ , ListGroupItem = ReactBootstrap.ListGroupItem
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , OverlayTrigger = ReactBootstrap.OverlayTrigger
+ , Tooltip = ReactBootstrap.Tooltip
+
+var React = require('react');
+
+var SetIntervalMixin = require("../common/SetIntervalMixin.js");
+var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
+
+module.exports = Post = React.createClass({displayName: "Post",
+ mixins: [SetIntervalMixin,SafeStateChangeMixin],
+ getInitialState: function() {
+
+
+
+ return {
+ avatar: "img/genericPerson.png",
+ fullname: "",
+ timeAgo: ""
+ };
+ },
+ updateTimeAgo: function() {
+ var secondsAgo = Date.now()/1000-this.props.post.timestamp;
+
+ var newTimeAgo = "";
+
+ if (secondsAgo<45) {newTimeAgo="1m"}
+ else if (secondsAgo<45*60) {newTimeAgo=Math.round(secondsAgo/60)+"m"}
+ else if (secondsAgo<18*60*60) {newTimeAgo=Math.round(secondsAgo/60/60)+"h"}
+ else if (secondsAgo<26*24*60*60) {newTimeAgo=Math.round(secondsAgo/24/60/60)+"d"}
+ else if (secondsAgo<9*30.5*24*60*60) {newTimeAgo=Math.round(secondsAgo/30.5/24/60/60)+"mo"}
+ else {newTimeAgo=Math.round(secondsAgo/365/24/60/60)+"y"}
+
+ this.setStateSafe({timeAgo: newTimeAgo});
+
+ },
+ componentDidMount: function () {
+ var thisComponent = this;
+
+ //console.log(this.props.post.username+":post"+this.props.post.id);
+ Twister.getUser(this.props.post.username).doAvatar(function(avatar){
+ if (avatar.getUrl()) {
+ thisComponent.setStateSafe({avatar: avatar.getUrl()});
+ }
+ });
+
+ Twister.getUser(this.props.post.username).doProfile(function(profile){
+ thisComponent.setStateSafe({fullname: profile.getField("fullname")});
+ });
+
+ if (this.props.post.isRetwist) {
+ Twister.getUser(this.props.post.retwistingUser).doProfile(function(profile){
+ thisComponent.setStateSafe({retwistingUser: profile.getField("fullname")});
+ });
+ }
+
+ this.updateTimeAgo();
+
+ this.setInterval(this.updateTimeAgo,60000);
+
+ },
+ render: function() {
+ var post = Twister.getUser(this.props.post.username).getPost(this.props.post.id);
+
+ if (post.isReply()) {
+ var conversationLink = (
+ React.createElement(OverlayTrigger, {placement: "left", overlay:
+ React.createElement(Tooltip, null, "View Conversation")
+ },
+ React.createElement("small", null, React.createElement("a", {href: "#/conversation/"+post.getReplyUsername()+"/"+post.getReplyId(), className: "link-button-gray"}, React.createElement(Glyphicon, {glyph: "comment"})))
+ )
+ );
+ } else {
+ var conversationLink = (React.createElement("span", null));
+ }
+
+ return (
+ React.createElement(ListGroupItem, null,
+ React.createElement(Row, {className: "nomargin"},
+ React.createElement(Col, {xs: 2, md: 2, className: "fullytight"},
+ React.createElement("a", {href: "#/profile/"+post.getUsername()},
+ React.createElement("img", {className: "img-responsive", src: this.state.avatar})
+ )
+ ),
+ React.createElement(Col, {xs: 9, md: 9},
+ React.createElement("strong", null, this.state.fullname), " ",
+ post.getContent()
+ ),
+ React.createElement(Col, {xs: 1, md: 1, className: "fullytight text-align-right"}, this.state.timeAgo)
+ ),
+ React.createElement(Row, {className: "nomargin"},
+ React.createElement(Col, {xs: 6, md: 6, className: "fullytight"},
+ post.isRetwist() && React.createElement("small", null, React.createElement(Glyphicon, {glyph: "retweet", "aria-hidden": "true"}), React.createElement("em", null, " retwisted by ", this.state.retwistingUser))
+
+ ),
+ React.createElement(Col, {xs: 6, md: 6, className: "fullytight text-align-right"}, conversationLink)
+ )
+
+ )
+ );
+ }
+});
+
+/*
+
+
+
+
+
+ {this.state.fullname}
+ @{post.username} - {post.id}
+
+
+
{post.timestamp}
+
{post.content}
+
+
+
+ */
\ No newline at end of file
diff --git a/build-buffer/.module-cache/b4a73e16454e22c3fe63de8dc592a66eeeba019e.js b/build-buffer/.module-cache/b4a73e16454e22c3fe63de8dc592a66eeeba019e.js
new file mode 100755
index 0000000..36daa4e
--- /dev/null
+++ b/build-buffer/.module-cache/b4a73e16454e22c3fe63de8dc592a66eeeba019e.js
@@ -0,0 +1,188 @@
+var React = require('react');
+var Postboard = require("../common/Postboard.js");
+var NewPostModalButton = require("../home/NewPostModalButton.js");
+var SetIntervalMixin = require("../common/SetIntervalMixin.js");
+var StreamMixin = require("../common/StreamMixin.js");
+var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
+var EventListenerMixin = require('../common/EventListenerMixin.js');
+var AppSettingsMixin = require('../common/AppSettingsMixin.js');
+
+
+var ReactBootstrap = require('react-bootstrap')
+ , NavItem = ReactBootstrap.NavItem
+ , Nav = ReactBootstrap.Nav
+ , ListGroup = ReactBootstrap.ListGroup
+ , ListGroupItem = ReactBootstrap.ListGroupItem
+ , Panel = ReactBootstrap.Panel
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , Button = ReactBootstrap.Button
+
+module.exports = Home = React.createClass({displayName: "Home",
+
+ mixins: [
+ AppSettingsMixin,
+ StreamMixin,
+ SetIntervalMixin,
+ SafeStateChangeMixin,
+ EventListenerMixin('scrolledtobottom'),
+ EventListenerMixin('newpostbyuser')
+ ],
+ contextTypes: {
+ router: React.PropTypes.func
+ },
+ getInitialState: function() {
+ return {
+ data: [],
+ postIdentifiers: {},
+ usernames: [],
+ postrange: ( Date.now()/1000 - 12*60*60 ),
+ min_posts: 30,
+ loading: true
+ };
+ },
+ addUser: function(username) {
+
+ var thisComponent = this;
+ this.setStateSafe(function(previousState, currentProps){
+
+ previousState.usernames.push(username);
+ return previousState;
+
+ },function(){
+
+ Twister.getUser(username).doLatestPostsUntil(function(post){
+
+ if(post.getTimestamp()
+
+
+
+
+ {this.state.fullname}
+ @{post.username} - {post.id}
+
+
+
{post.timestamp}
+
{post.content}
+
+
+
+ */
\ No newline at end of file
diff --git a/build-buffer/.module-cache/bfd014f2b9b75cbb8a352f92628468e74b00789c.js b/build-buffer/.module-cache/bfd014f2b9b75cbb8a352f92628468e74b00789c.js
new file mode 100755
index 0000000..fccd1f1
--- /dev/null
+++ b/build-buffer/.module-cache/bfd014f2b9b75cbb8a352f92628468e74b00789c.js
@@ -0,0 +1,188 @@
+var React = require('react');
+var Postboard = require("../common/Postboard.js");
+var NewPostModalButton = require("../home/NewPostModalButton.js");
+var SetIntervalMixin = require("../common/SetIntervalMixin.js");
+var StreamMixin = require("../common/StreamMixin.js");
+var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
+var EventListenerMixin = require('../common/EventListenerMixin.js');
+var AppSettingsMixin = require('../common/AppSettingsMixin.js');
+
+
+var ReactBootstrap = require('react-bootstrap')
+ , NavItem = ReactBootstrap.NavItem
+ , Nav = ReactBootstrap.Nav
+ , ListGroup = ReactBootstrap.ListGroup
+ , ListGroupItem = ReactBootstrap.ListGroupItem
+ , Panel = ReactBootstrap.Panel
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , Button = ReactBootstrap.Button
+
+module.exports = Home = React.createClass({displayName: "Home",
+
+ mixins: [
+ AppSettingsMixin,
+ StreamMixin,
+ SetIntervalMixin,
+ SafeStateChangeMixin,
+ EventListenerMixin('scrolledtobottom'),
+ EventListenerMixin('newpostbyuser')
+ ],
+ contextTypes: {
+ router: React.PropTypes.func
+ },
+ getInitialState: function() {
+ return {
+ data: [],
+ postIdentifiers: {},
+ usernames: [],
+ postrange: ( Date.now()/1000 - 12*60*60 ),
+ min_posts: 30,
+ loading: true
+ };
+ },
+ addUser: function(username) {
+
+ var thisComponent = this;
+ this.setStateSafe(function(previousState, currentProps){
+
+ previousState.usernames.push(username);
+ return previousState;
+
+ },function(){
+
+ Twister.getUser(username).doLatestPostsUntil(function(post){
+
+ if(post.getTimestamp()= document.body.offsetHeight - 50) {
+ var event = new Event('scrolledtobottom');
+ //alert("scrolled to bottom")
+ window.dispatchEvent(event);
+ }
+};
\ No newline at end of file
diff --git a/build-buffer/.module-cache/d93282f77fea36519cc3fba804c7292c040979d8.js b/build-buffer/.module-cache/d93282f77fea36519cc3fba804c7292c040979d8.js
new file mode 100755
index 0000000..7d3cc35
--- /dev/null
+++ b/build-buffer/.module-cache/d93282f77fea36519cc3fba804c7292c040979d8.js
@@ -0,0 +1,75 @@
+var React = require('react');
+var SetIntervalMixin = require("../common/SetIntervalMixin.js");
+var SafeStateChangeMixin = require('../common/SafeStateChangeMixin.js');
+var EventListenerMixin = require('../common/EventListenerMixin.js');
+var AppSettingsMixin = require('../common/AppSettingsMixin.js');
+
+
+var ReactBootstrap = require('react-bootstrap')
+ , NavItem = ReactBootstrap.NavItem
+ , Nav = ReactBootstrap.Nav
+ , ListGroup = ReactBootstrap.ListGroup
+ , ListGroupItem = ReactBootstrap.ListGroupItem
+ , Panel = ReactBootstrap.Panel
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , Button = ReactBootstrap.Button
+ , Input = ReactBootstrap.Input
+
+module.exports = Home = React.createClass({displayName: "Home",
+
+ mixins: [
+ SetIntervalMixin,
+ SafeStateChangeMixin,
+ AppSettingsMixin
+ ],
+ contextTypes: {
+ router: React.PropTypes.func
+ },
+ handeSettingsUpdate: function (e) {
+ e.preventDefault();
+
+ var newsettings = {}
+
+ newsettings.pollInterval = $(this.getDOMNode()).find(".settings-pollInterval").val();
+ newsettings.pollIntervalProfile = $(this.getDOMNode()).find(".settings-pollIntervalProfile").val();
+ newsettings.ignoredUsers = $(this.getDOMNode()).find(".settings-ignoredUsers").val();
+ newsettings.host = $(this.getDOMNode()).find(".settings-host").val();
+ newsettings.logging = $(this.getDOMNode()).find(".settings-logging").attr('checked');
+
+ console.log(newsettings)
+
+ localStorage.setItem("twister-react-settings",JSON.stringify(newsettings));
+
+ var event = new CustomEvent('appsettingschanged',{detail: newsettings});
+ window.dispatchEvent(event);
+
+ return;
+ },
+ render: function() {
+ return (
+ React.createElement(ListGroup, null,
+ React.createElement(ListGroupItem, null, "Settings"),
+ React.createElement(ListGroupItem, null,
+ React.createElement("form", {onSubmit: this.handeSettingsUpdate, className: "form-horizontal"},
+ React.createElement(Input, {type: "text", label: "pollInterval",
+ defaultValue: this.state.appSettings.pollInterval, labelClassName: "col-xs-4",
+ wrapperClassName: "col-xs-8", className: "settings-pollInterval"}),
+ React.createElement(Input, {type: "text", label: "pollIntervalProfile",
+ defaultValue: this.state.appSettings.pollIntervalProfile, labelClassName: "col-xs-4",
+ wrapperClassName: "col-xs-8", className: "settings-pollIntervalProfile"}),
+ React.createElement(Input, {type: "text", label: "ignoredUsers",
+ defaultValue: this.state.appSettings.ignoredUsers, labelClassName: "col-xs-4",
+ wrapperClassName: "col-xs-8", className: "settings-ignoredUsers"}),
+ React.createElement(Input, {type: "text", label: "host",
+ defaultValue: this.state.appSettings.host, labelClassName: "col-xs-4",
+ wrapperClassName: "col-xs-8", className: "settings-host"}),
+ React.createElement(Input, {type: "checkbox", label: "logging",
+ defaultValue: this.state.appSettings.logging, labelClassName: "col-xs-4",
+ wrapperClassName: "col-xs-8", className: "settings-logging"}),
+ React.createElement(Input, {type: "submit", value: "Save", wrapperClassName: "col-xs-offset-10 col-xs-2"})
+ )
+ )
+ )
+ );
+ }
+});
\ No newline at end of file
diff --git a/build-buffer/.module-cache/ea7f68127890ce0eff601e5a493003416edfe535.js b/build-buffer/.module-cache/ea7f68127890ce0eff601e5a493003416edfe535.js
new file mode 100755
index 0000000..8392772
--- /dev/null
+++ b/build-buffer/.module-cache/ea7f68127890ce0eff601e5a493003416edfe535.js
@@ -0,0 +1,275 @@
+
+
+/*
+var Router = require('react-router')
+ , RouteHandler = Router.RouteHandler
+ , Route = Router.Route;
+
+
+var ReactRouterBootstrap = require('react-router-bootstrap')
+ , NavItemLink = ReactRouterBootstrap.NavItemLink
+ , ButtonLink = ReactRouterBootstrap.ButtonLink
+ , ListGroupItemLink = ReactRouterBootstrap.ListGroupItemLink;
+*/
+
+var ReactBootstrap = require('react-bootstrap')
+ , DropdownButton = ReactBootstrap.DropdownButton
+ , MenuItem = ReactBootstrap.MenuItem
+ , Button = ReactBootstrap.Button
+ , ButtonGroup = ReactBootstrap.ButtonGroup
+ , OverlayTrigger = ReactBootstrap.OverlayTrigger
+ , Popover = ReactBootstrap.Popover
+ , Glyphicon = ReactBootstrap.Glyphicon
+ , Grid = ReactBootstrap.Grid
+ , Col = ReactBootstrap.Col
+ , Row = ReactBootstrap.Row
+
+var React = require('react');
+var Router = require('react-router');
+var { Route, DefaultRoute, RouteHandler, Link } = Router;
+
+var Home = require("./home/Home.js");
+var Profile = require("./profile/Profile.js");
+var SetIntervalMixin = require("./common/SetIntervalMixin.js");
+var SafeStateChangeMixin = require('./common/SafeStateChangeMixin.js');
+var Timeline = require('./profile/Timeline.js');
+var Followings = require('./profile/Followings.js');
+var Mentions = require('./profile/Mentions.js');
+var Conversation = require('./other/Conversation.js');
+var Settings = require('./other/Settings.js');
+var AppSettingsMixin = require('./common/AppSettingsMixin.js');
+
+App = React.createClass({displayName: "App",
+
+ mixins: [AppSettingsMixin,SetIntervalMixin,SafeStateChangeMixin],
+
+ contextTypes: {
+ router: React.PropTypes.func
+ },
+
+ getHandlerKey: function () {
+ var childDepth = 1; // assuming App is top-level route
+ var { router } = this.context;
+ //console.log(router.getCurrentParams())
+ if ( router.getCurrentRoutes()[childDepth] ) {
+ var key = router.getCurrentRoutes()[childDepth].name;
+ if (key=="home" || key=="profile-active" || key=="accountProfileMore") {key=key+"/"+this.state.activeAccount;}
+ var id = JSON.stringify(router.getCurrentParams());
+ if (id) { key += id; }
+ //console.log(key);
+ return key;
+ } else {return "none"}
+ },
+
+ clearCache: function () {
+ localStorage.setItem("twister-cache", null);
+ },
+
+ saveCache: function () {
+ localStorage.setItem("twister-cache", JSON.stringify(Twister.serializeCache()))
+ },
+
+ switchAccount: function (newaccoutname) {
+
+ //console.log(newaccoutname);
+
+ var thisComponent = this;
+
+ Twister.getAccount(newaccoutname).activateTorrents(function(){
+ thisComponent.setStateSafe({activeAccount: newaccoutname},function(){
+ localStorage.setItem("twister-react-activeAccount", newaccoutname);
+ });
+ });
+
+ },
+
+ getInitialState: function () {
+
+ var state={};
+
+ state.activeAccount = localStorage.getItem("twister-react-activeAccount")
+
+ state.accounts = Twister.getAccounts();
+
+ if (!state.activeAccount) { state.activeAccount=state.accounts[0]; }
+
+ //console.log(state);
+
+ return state;
+
+ },
+
+ componentDidMount: function () {
+
+ this.setInterval(this.saveCache,300000);
+
+ },
+
+ render: function() {
+
+ var firstroute = this.context.router.getCurrentRoutes()[1].name;
+
+ //console.log(firstroute);
+
+ var userbuttons = [];
+ for (var i in this.state.accounts) {
+ userbuttons.push(
+ React.createElement(MenuItem, {
+ key: this.state.accounts[i],
+ bsStyle: this.state.accounts[i]==this.state.activeAccount ? 'primary' : 'default',
+ onClick: this.switchAccount.bind(this,this.state.accounts[i]),
+ href: "javascript:void(0);"
+ }, this.state.accounts[i])
+ );
+ }
+
+ return (
+ React.createElement(Grid, null,
+ React.createElement(Row, null,
+ React.createElement(Col, {xs: 12, sm: 10, smOffset: 1, md: 8, mdOffset: 2, lg: 6, lgOffset: 3},
+ React.createElement(ButtonGroup, {justified: true},
+ React.createElement(Button, {
+ href: "#",
+ bsStyle: firstroute=="home" ? 'primary' : 'default'
+ }, React.createElement(Glyphicon, {glyph: "home"})),
+ React.createElement(Button, {
+ href: "#/profile",
+ bsStyle: firstroute=="profile-active" ? 'primary' : 'default'
+ }, React.createElement(Glyphicon, {glyph: "user"})),
+ React.createElement(Button, {href: "#/directmessages"}, React.createElement(Glyphicon, {glyph: "transfer"})),
+ React.createElement(DropdownButton, {title: this.state.activeAccount},
+ userbuttons
+ ),
+ React.createElement(DropdownButton, {title: React.createElement(Glyphicon, {glyph: "menu-hamburger"})},
+ React.createElement(MenuItem, {
+ onClick: this.clearCache,
+ href: "javascript:void(0);"
+ }, "Clear Cache"),
+ React.createElement(MenuItem, {href: "#/search"}, "Search"),
+ React.createElement(MenuItem, {href: "#/settings"}, "Settings"),
+ React.createElement(MenuItem, {href: "#/howtofollow"}, "How to Follow"),
+ React.createElement(MenuItem, {href: "#/trendinghashtags"}, "Trending Hashtags")
+ )
+ ),
+ React.createElement("br", null),
+ React.createElement(RouteHandler, {
+ activeAccount: this.state.activeAccount,
+ key: this.getHandlerKey()}
+ )
+ )
+ )
+ )
+ );
+ }
+});
+
+
+var routes = (
+ React.createElement(Route, {handler: App, path: "/"},
+ React.createElement(Route, {name: "profile-active", path: "/profile", handler: Profile},
+ React.createElement(Route, {name: "profile-active-timeline", path: "timeline", handler: Timeline}),
+ React.createElement(Route, {name: "profile-active-followings", path: "followings", handler: Followings}),
+ React.createElement(Route, {name: "profile-active-mentions", path: "mentions", handler: Mentions}),
+ React.createElement(DefaultRoute, {name: "profile-active-timeline-default", handler: Timeline})
+ ),
+ React.createElement(Route, {name: "profile", path: "/profile/:username", handler: Profile},
+ React.createElement(Route, {name: "profile-timeline", path: "timeline", handler: Timeline}),
+ React.createElement(Route, {name: "profile-followings", path: "followings", handler: Followings}),
+ React.createElement(Route, {name: "profile-mentions", path: "mentions", handler: Mentions}),
+ React.createElement(DefaultRoute, {name: "profile-timeline-default", handler: Timeline})
+ ),
+ React.createElement(Route, {name: "conversation", path: "/conversation/:username/:postid", handler: Conversation}),
+ React.createElement(Route, {name: "settings", path: "/settings", handler: Settings}),
+ React.createElement(DefaultRoute, {name: "home", handler: Home})
+ )
+);
+
+
+initializeApp = function () {
+
+ Router.run(routes, function (Handler) {
+ React.render(React.createElement(Handler, null), document.getElementById('content'));
+ });
+
+}
+
+Twister.deserializeCache(JSON.parse(localStorage.getItem("twister-cache")));
+
+Twister.setup({logfunc: function(log){console.log(log)}})
+
+var accounts = Twister.getAccounts();
+
+if (accounts.length==0) {
+
+ if (!localStorage.getItem("twister-react-settings")) {
+
+ var appSettings = {
+
+ pollInterval:60,
+ pollIntervalProfile: 3600,
+ ignoredUsers: "nobody",
+ host: "http://user:pwd@localhost:28332"
+
+ };
+
+ } else {
+
+ var appSettings = JSON.parse(localStorage.getItem("twister-react-settings"));
+
+ }
+
+ Twister.setup({
+ host: appSettings.host,
+ //logfunc: function(log){console.log(log)},
+ outdatedLimit: appSettings.pollInterval,
+ querySettingsByType: {
+
+ outdatedLimit: {
+ pubkey: appSettings.pollIntervalProfile,
+ profile: appSettings.pollIntervalProfile,
+ avatar: appSettings.pollIntervalProfile,
+ torrent: appSettings.pollIntervalProfile,
+ followings: appSettings.pollIntervalProfile
+ }
+
+ }
+ });
+
+ Twister.loadServerAccounts(function(){
+
+ var activeAccount = localStorage.getItem("twister-react-activeAccount");
+
+ var accounts = Twister.getAccounts();
+
+ if (!activeAccount) {
+
+ activeAccount = accounts[0];
+ localStorage.setItem("twister-react-activeAccount",activeAccount);
+
+ }
+
+ console.log("active account defaulted to "+activeAccount)
+
+ Twister.getAccount(activeAccount).activateTorrents(function(){
+
+ initializeApp();
+
+ });
+
+ });
+
+} else {
+
+ initializeApp();
+
+}
+
+////// INIT EVENTLISTENERS ON WINDOW
+
+window.onscroll = function(ev) {
+ if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight - 50) {
+ var event = new Event('scrolledtobottom');
+ //alert("scrolled to bottom")
+ window.dispatchEvent(event);
+ }
+};
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/04de173f1f09e92fe10ba2856499079d37de45f7.json b/build-buffer/.module-cache/manifest/04de173f1f09e92fe10ba2856499079d37de45f7.json
new file mode 100755
index 0000000..0f5be55
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/04de173f1f09e92fe10ba2856499079d37de45f7.json
@@ -0,0 +1 @@
+{".js":"04de173f1f09e92fe10ba2856499079d37de45f7.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/0aff40b9075c302cd82ad792ae85b2edb98547f2.json b/build-buffer/.module-cache/manifest/0aff40b9075c302cd82ad792ae85b2edb98547f2.json
new file mode 100755
index 0000000..7859f4c
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/0aff40b9075c302cd82ad792ae85b2edb98547f2.json
@@ -0,0 +1 @@
+{".js":"0aff40b9075c302cd82ad792ae85b2edb98547f2.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/15b953bb2190396fcf451509d39120418f182314.json b/build-buffer/.module-cache/manifest/15b953bb2190396fcf451509d39120418f182314.json
new file mode 100755
index 0000000..3c715f1
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/15b953bb2190396fcf451509d39120418f182314.json
@@ -0,0 +1 @@
+{".js":"15b953bb2190396fcf451509d39120418f182314.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/1f8c40f16c571a231c635fb182d8bf2e7865878a.json b/build-buffer/.module-cache/manifest/1f8c40f16c571a231c635fb182d8bf2e7865878a.json
new file mode 100755
index 0000000..dc44178
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/1f8c40f16c571a231c635fb182d8bf2e7865878a.json
@@ -0,0 +1 @@
+{".js":"1f8c40f16c571a231c635fb182d8bf2e7865878a.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/357b3c976317bd30460a76a5b582d2a806fd0a52.json b/build-buffer/.module-cache/manifest/357b3c976317bd30460a76a5b582d2a806fd0a52.json
new file mode 100755
index 0000000..5bc9441
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/357b3c976317bd30460a76a5b582d2a806fd0a52.json
@@ -0,0 +1 @@
+{".js":"357b3c976317bd30460a76a5b582d2a806fd0a52.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/3ba2c49efd95be4ad717e6f9972efb105398eaaf.json b/build-buffer/.module-cache/manifest/3ba2c49efd95be4ad717e6f9972efb105398eaaf.json
new file mode 100755
index 0000000..f662929
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/3ba2c49efd95be4ad717e6f9972efb105398eaaf.json
@@ -0,0 +1 @@
+{".js":"3ba2c49efd95be4ad717e6f9972efb105398eaaf.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/3bfa39aabb13db53498065a81a9dfd035d6bcd3f.json b/build-buffer/.module-cache/manifest/3bfa39aabb13db53498065a81a9dfd035d6bcd3f.json
new file mode 100755
index 0000000..246a26e
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/3bfa39aabb13db53498065a81a9dfd035d6bcd3f.json
@@ -0,0 +1 @@
+{".js":"3bfa39aabb13db53498065a81a9dfd035d6bcd3f.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/3dcaf4ec25180cdbb6808472deab30e3b335c5af.json b/build-buffer/.module-cache/manifest/3dcaf4ec25180cdbb6808472deab30e3b335c5af.json
new file mode 100755
index 0000000..1348dc8
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/3dcaf4ec25180cdbb6808472deab30e3b335c5af.json
@@ -0,0 +1 @@
+{".js":"3dcaf4ec25180cdbb6808472deab30e3b335c5af.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/3f2a37f90e1ee545b33bb432426bc5b3b8b5bddd.json b/build-buffer/.module-cache/manifest/3f2a37f90e1ee545b33bb432426bc5b3b8b5bddd.json
new file mode 100755
index 0000000..af290ef
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/3f2a37f90e1ee545b33bb432426bc5b3b8b5bddd.json
@@ -0,0 +1 @@
+{".js":"3f2a37f90e1ee545b33bb432426bc5b3b8b5bddd.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/43012ad3b27487f50e721618da9d7e09e8e821db.json b/build-buffer/.module-cache/manifest/43012ad3b27487f50e721618da9d7e09e8e821db.json
new file mode 100755
index 0000000..56a7811
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/43012ad3b27487f50e721618da9d7e09e8e821db.json
@@ -0,0 +1 @@
+{".js":"43012ad3b27487f50e721618da9d7e09e8e821db.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/48711d4fe85cb25a78d9966e1fc3826535c72c7e.json b/build-buffer/.module-cache/manifest/48711d4fe85cb25a78d9966e1fc3826535c72c7e.json
new file mode 100755
index 0000000..293f32b
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/48711d4fe85cb25a78d9966e1fc3826535c72c7e.json
@@ -0,0 +1 @@
+{".js":"48711d4fe85cb25a78d9966e1fc3826535c72c7e.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/53c695924055d7f153218cbf005457df27ff7b91.json b/build-buffer/.module-cache/manifest/53c695924055d7f153218cbf005457df27ff7b91.json
new file mode 100755
index 0000000..d1c08c0
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/53c695924055d7f153218cbf005457df27ff7b91.json
@@ -0,0 +1 @@
+{".js":"53c695924055d7f153218cbf005457df27ff7b91.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/540a938bc19e9f984968a6425280672a470ab63a.json b/build-buffer/.module-cache/manifest/540a938bc19e9f984968a6425280672a470ab63a.json
new file mode 100755
index 0000000..e02ba53
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/540a938bc19e9f984968a6425280672a470ab63a.json
@@ -0,0 +1 @@
+{".js":"540a938bc19e9f984968a6425280672a470ab63a.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/57719eb13f233a593e46a1a236292193339cc9b3.json b/build-buffer/.module-cache/manifest/57719eb13f233a593e46a1a236292193339cc9b3.json
new file mode 100755
index 0000000..298a05e
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/57719eb13f233a593e46a1a236292193339cc9b3.json
@@ -0,0 +1 @@
+{".js":"57719eb13f233a593e46a1a236292193339cc9b3.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/586392bc882293105333126aa2ab09d36c0d3aaa.json b/build-buffer/.module-cache/manifest/586392bc882293105333126aa2ab09d36c0d3aaa.json
new file mode 100755
index 0000000..4d59be8
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/586392bc882293105333126aa2ab09d36c0d3aaa.json
@@ -0,0 +1 @@
+{".js":"586392bc882293105333126aa2ab09d36c0d3aaa.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/5a283d802f5720e888ae8bc435b87432d5fe0e4f.json b/build-buffer/.module-cache/manifest/5a283d802f5720e888ae8bc435b87432d5fe0e4f.json
new file mode 100755
index 0000000..ec39971
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/5a283d802f5720e888ae8bc435b87432d5fe0e4f.json
@@ -0,0 +1 @@
+{".js":"5a283d802f5720e888ae8bc435b87432d5fe0e4f.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/5c8b7e3107de4f3ad8c663314f339598adcc4c09.json b/build-buffer/.module-cache/manifest/5c8b7e3107de4f3ad8c663314f339598adcc4c09.json
new file mode 100755
index 0000000..de6eb38
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/5c8b7e3107de4f3ad8c663314f339598adcc4c09.json
@@ -0,0 +1 @@
+{".js":"5c8b7e3107de4f3ad8c663314f339598adcc4c09.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/5d2323f47209b1542a4f6d1ff69e887836c4d7ef.json b/build-buffer/.module-cache/manifest/5d2323f47209b1542a4f6d1ff69e887836c4d7ef.json
new file mode 100755
index 0000000..b10ef3d
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/5d2323f47209b1542a4f6d1ff69e887836c4d7ef.json
@@ -0,0 +1 @@
+{".js":"5d2323f47209b1542a4f6d1ff69e887836c4d7ef.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/65d8380a32674e1bd91226089e1490e0965ce788.json b/build-buffer/.module-cache/manifest/65d8380a32674e1bd91226089e1490e0965ce788.json
new file mode 100755
index 0000000..bf8fdc4
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/65d8380a32674e1bd91226089e1490e0965ce788.json
@@ -0,0 +1 @@
+{".js":"65d8380a32674e1bd91226089e1490e0965ce788.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/6bb48745ac4429d537d53382f5dcec3d67511fef.json b/build-buffer/.module-cache/manifest/6bb48745ac4429d537d53382f5dcec3d67511fef.json
new file mode 100755
index 0000000..441faba
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/6bb48745ac4429d537d53382f5dcec3d67511fef.json
@@ -0,0 +1 @@
+{".js":"6bb48745ac4429d537d53382f5dcec3d67511fef.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/6ce0d3c4885a6fcfa77bee2f167ed69ace239ce9.json b/build-buffer/.module-cache/manifest/6ce0d3c4885a6fcfa77bee2f167ed69ace239ce9.json
new file mode 100755
index 0000000..013e0ad
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/6ce0d3c4885a6fcfa77bee2f167ed69ace239ce9.json
@@ -0,0 +1 @@
+{".js":"6ce0d3c4885a6fcfa77bee2f167ed69ace239ce9.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/6e932fafed6e3b7d13a9dccfcc8012f5e12eb595.json b/build-buffer/.module-cache/manifest/6e932fafed6e3b7d13a9dccfcc8012f5e12eb595.json
new file mode 100755
index 0000000..8acd913
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/6e932fafed6e3b7d13a9dccfcc8012f5e12eb595.json
@@ -0,0 +1 @@
+{".js":"6e932fafed6e3b7d13a9dccfcc8012f5e12eb595.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/6fc94b273b3f1749ddf8973ab9f769ea5c890b71.json b/build-buffer/.module-cache/manifest/6fc94b273b3f1749ddf8973ab9f769ea5c890b71.json
new file mode 100755
index 0000000..281e7b3
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/6fc94b273b3f1749ddf8973ab9f769ea5c890b71.json
@@ -0,0 +1 @@
+{".js":"6fc94b273b3f1749ddf8973ab9f769ea5c890b71.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/729706f34ff41684dfb3441af0f1e16876635ef6.json b/build-buffer/.module-cache/manifest/729706f34ff41684dfb3441af0f1e16876635ef6.json
new file mode 100755
index 0000000..9beedc2
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/729706f34ff41684dfb3441af0f1e16876635ef6.json
@@ -0,0 +1 @@
+{".js":"729706f34ff41684dfb3441af0f1e16876635ef6.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/8d60c25c4e017f1ce02928c7e2a5fe595549ca8c.json b/build-buffer/.module-cache/manifest/8d60c25c4e017f1ce02928c7e2a5fe595549ca8c.json
new file mode 100755
index 0000000..22df24e
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/8d60c25c4e017f1ce02928c7e2a5fe595549ca8c.json
@@ -0,0 +1 @@
+{".js":"8d60c25c4e017f1ce02928c7e2a5fe595549ca8c.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/92d3322a4ef4431522163222fe51aa41db966a46.json b/build-buffer/.module-cache/manifest/92d3322a4ef4431522163222fe51aa41db966a46.json
new file mode 100755
index 0000000..49a1bd0
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/92d3322a4ef4431522163222fe51aa41db966a46.json
@@ -0,0 +1 @@
+{".js":"92d3322a4ef4431522163222fe51aa41db966a46.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/98d867ea326a51f69b6f3891955118ac23fde8f8.json b/build-buffer/.module-cache/manifest/98d867ea326a51f69b6f3891955118ac23fde8f8.json
new file mode 100755
index 0000000..51465f4
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/98d867ea326a51f69b6f3891955118ac23fde8f8.json
@@ -0,0 +1 @@
+{".js":"98d867ea326a51f69b6f3891955118ac23fde8f8.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/98dd8434ca1efe630f32b3f5db7c4977ccc91302.json b/build-buffer/.module-cache/manifest/98dd8434ca1efe630f32b3f5db7c4977ccc91302.json
new file mode 100755
index 0000000..e6d3d62
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/98dd8434ca1efe630f32b3f5db7c4977ccc91302.json
@@ -0,0 +1 @@
+{".js":"98dd8434ca1efe630f32b3f5db7c4977ccc91302.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/a1d3510314875c02aa598cbd3b7cde5d488c828f.json b/build-buffer/.module-cache/manifest/a1d3510314875c02aa598cbd3b7cde5d488c828f.json
new file mode 100755
index 0000000..5e540ff
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/a1d3510314875c02aa598cbd3b7cde5d488c828f.json
@@ -0,0 +1 @@
+{".js":"a1d3510314875c02aa598cbd3b7cde5d488c828f.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/a4b107445cccc7ecd58b53b98715784e2eda3990.json b/build-buffer/.module-cache/manifest/a4b107445cccc7ecd58b53b98715784e2eda3990.json
new file mode 100755
index 0000000..105233c
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/a4b107445cccc7ecd58b53b98715784e2eda3990.json
@@ -0,0 +1 @@
+{".js":"a4b107445cccc7ecd58b53b98715784e2eda3990.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/af9f96e2470eb5c2f3be2acf762ee2e95f6e3ee2.json b/build-buffer/.module-cache/manifest/af9f96e2470eb5c2f3be2acf762ee2e95f6e3ee2.json
new file mode 100755
index 0000000..a89b1cb
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/af9f96e2470eb5c2f3be2acf762ee2e95f6e3ee2.json
@@ -0,0 +1 @@
+{".js":"af9f96e2470eb5c2f3be2acf762ee2e95f6e3ee2.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/b4a73e16454e22c3fe63de8dc592a66eeeba019e.json b/build-buffer/.module-cache/manifest/b4a73e16454e22c3fe63de8dc592a66eeeba019e.json
new file mode 100755
index 0000000..d86b689
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/b4a73e16454e22c3fe63de8dc592a66eeeba019e.json
@@ -0,0 +1 @@
+{".js":"b4a73e16454e22c3fe63de8dc592a66eeeba019e.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/b4ceb3db3c520b3d0f6b7fe5018c500dd44180fd.json b/build-buffer/.module-cache/manifest/b4ceb3db3c520b3d0f6b7fe5018c500dd44180fd.json
new file mode 100755
index 0000000..d439dd4
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/b4ceb3db3c520b3d0f6b7fe5018c500dd44180fd.json
@@ -0,0 +1 @@
+{".js":"b4ceb3db3c520b3d0f6b7fe5018c500dd44180fd.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/b59a0c4e7d06c25ad079b1440889e933dd52e54f.json b/build-buffer/.module-cache/manifest/b59a0c4e7d06c25ad079b1440889e933dd52e54f.json
new file mode 100755
index 0000000..f214f8c
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/b59a0c4e7d06c25ad079b1440889e933dd52e54f.json
@@ -0,0 +1 @@
+{".js":"b59a0c4e7d06c25ad079b1440889e933dd52e54f.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/bfd014f2b9b75cbb8a352f92628468e74b00789c.json b/build-buffer/.module-cache/manifest/bfd014f2b9b75cbb8a352f92628468e74b00789c.json
new file mode 100755
index 0000000..a4fb169
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/bfd014f2b9b75cbb8a352f92628468e74b00789c.json
@@ -0,0 +1 @@
+{".js":"bfd014f2b9b75cbb8a352f92628468e74b00789c.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/d2536a92767fec2f9de04bd6bf315e18407b7991.json b/build-buffer/.module-cache/manifest/d2536a92767fec2f9de04bd6bf315e18407b7991.json
new file mode 100755
index 0000000..0ac0e25
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/d2536a92767fec2f9de04bd6bf315e18407b7991.json
@@ -0,0 +1 @@
+{".js":"d2536a92767fec2f9de04bd6bf315e18407b7991.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/d93282f77fea36519cc3fba804c7292c040979d8.json b/build-buffer/.module-cache/manifest/d93282f77fea36519cc3fba804c7292c040979d8.json
new file mode 100755
index 0000000..662b477
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/d93282f77fea36519cc3fba804c7292c040979d8.json
@@ -0,0 +1 @@
+{".js":"d93282f77fea36519cc3fba804c7292c040979d8.js"}
\ No newline at end of file
diff --git a/build-buffer/.module-cache/manifest/ea7f68127890ce0eff601e5a493003416edfe535.json b/build-buffer/.module-cache/manifest/ea7f68127890ce0eff601e5a493003416edfe535.json
new file mode 100755
index 0000000..b236bb5
--- /dev/null
+++ b/build-buffer/.module-cache/manifest/ea7f68127890ce0eff601e5a493003416edfe535.json
@@ -0,0 +1 @@
+{".js":"ea7f68127890ce0eff601e5a493003416edfe535.js"}
\ No newline at end of file