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