proxy-based Twister client written with react-js
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

279 lines
8.3 KiB

/*
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')
10 years ago
, 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');
9 years ago
var Hashtag = require('./other/Hashtag.js');
var Settings = require('./other/Settings.js');
var AppSettingsMixin = require('./common/AppSettingsMixin.js');
App = React.createClass({
10 years ago
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;
10 years ago
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"}
},
10 years ago
clearCache: function () {
localStorage.setItem("twister-cache", null);
},
saveCache: function () {
var timestamp = Date.now()/1000 - 60*60*24*14;
Twister.trimCache(timestamp);
10 years ago
localStorage.setItem("twister-cache", JSON.stringify(Twister.serializeCache()))
},
switchAccount: function (newaccoutname) {
//console.log(newaccoutname);
10 years ago
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]; }
10 years ago
//console.log(state);
return state;
10 years ago
},
componentDidMount: function () {
this.setInterval(this.saveCache,300000);
},
render: function() {
10 years ago
var firstroute = this.context.router.getCurrentRoutes()[1].name;
//console.log(firstroute);
var userbuttons = [];
for (var i in this.state.accounts) {
userbuttons.push(
<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]}</MenuItem>
);
}
return (
10 years ago
<Grid>
<Row>
<Col xs={12} sm={10} smOffset={1} md={8} mdOffset={2} lg={6} lgOffset={3}>
<ButtonGroup justified>
<Button
href='#'
bsStyle={firstroute=="home" ? 'primary' : 'default'}
><Glyphicon glyph="home"/></Button>
<Button
href='#/profile'
bsStyle={firstroute=="profile-active" ? 'primary' : 'default'}
><Glyphicon glyph="user"/></Button>
<Button href='#/directmessages'><Glyphicon glyph="transfer"/></Button>
<DropdownButton title={this.state.activeAccount}>
{userbuttons}
</DropdownButton>
<DropdownButton title={<Glyphicon glyph="menu-hamburger"/>}>
<MenuItem
onClick={this.clearCache}
href="javascript:void(0);"
>Clear Cache</MenuItem>
<MenuItem href="#/search" >Search</MenuItem>
<MenuItem href="#/settings" >Settings</MenuItem>
<MenuItem href="#/howtofollow" >How to Follow</MenuItem>
<MenuItem href="#/trendinghashtags" >Trending Hashtags</MenuItem>
</DropdownButton>
</ButtonGroup>
<br/>
<RouteHandler
activeAccount={this.state.activeAccount}
key={this.getHandlerKey()}
/>
</Col>
</Row>
</Grid>
);
}
});
var routes = (
<Route handler={App} path="/">
10 years ago
<Route name="profile-active" path="/profile" handler={Profile}>
<Route name="profile-active-timeline" path="timeline" handler={Timeline} />
<Route name="profile-active-followings" path="followings" handler={Followings} />
<Route name="profile-active-mentions" path="mentions" handler={Mentions} />
<DefaultRoute name="profile-active-timeline-default" handler={Timeline} />
</Route>
<Route name="profile" path="/profile/:username" handler={Profile}>
<Route name="profile-timeline" path="timeline" handler={Timeline} />
<Route name="profile-followings" path="followings" handler={Followings} />
<Route name="profile-mentions" path="mentions" handler={Mentions} />
<DefaultRoute name="profile-timeline-default" handler={Timeline} />
</Route>
<Route name="conversation" path="/conversation/:username/:postid" handler={Conversation}/>
9 years ago
<Route name="hashtag" path="/hashtag/:hashtag" handler={Hashtag}/>
<Route name="settings" path="/settings" handler={Settings}/>
10 years ago
<DefaultRoute name="home" handler={Home} />
</Route>
);
initializeApp = function () {
Router.run(routes, function (Handler) {
React.render(<Handler/>, document.getElementById('content'));
});
10 years ago
}
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();
}
10 years ago
////// INIT EVENTLISTENERS ON WINDOW
window.onscroll = function(ev) {
10 years ago
if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight - 50) {
10 years ago
var event = new Event('scrolledtobottom');
10 years ago
//alert("scrolled to bottom")
10 years ago
window.dispatchEvent(event);
}
};