Julian Steinwachs
10 years ago
7 changed files with 39620 additions and 0 deletions
File diff suppressed because one or more lines are too long
@ -0,0 +1,66 @@ |
|||||||
|
.context { |
||||||
|
|
||||||
|
width: 30em; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.post { |
||||||
|
|
||||||
|
padding: 1em; |
||||||
|
background-color: #eee; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.post hr { |
||||||
|
|
||||||
|
|
||||||
|
clear: both; |
||||||
|
} |
||||||
|
|
||||||
|
.post-avatar { |
||||||
|
|
||||||
|
float: left; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.post-avatar img { |
||||||
|
|
||||||
|
width: 3em; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.post-bulk { |
||||||
|
|
||||||
|
float: right; |
||||||
|
width: 23em; |
||||||
|
padding: 0 1em; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.post-timestamp { |
||||||
|
|
||||||
|
font-style: italic; |
||||||
|
font-size: 0.7em; |
||||||
|
float: right; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.post-username { |
||||||
|
|
||||||
|
float: left; |
||||||
|
font-size: 0.7em; |
||||||
|
width: 20em; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.post-id { |
||||||
|
|
||||||
|
float: right; |
||||||
|
font-size: 0.7em; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.post-content { |
||||||
|
clear: both; |
||||||
|
padding: 0.5em 0 0.5em 0; |
||||||
|
} |
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 1.8 KiB |
@ -0,0 +1,290 @@ |
|||||||
|
var Post = React.createClass({ |
||||||
|
getInitialState: function() { |
||||||
|
return {avatar: "img/genericPerson.png", fullname: ""}; |
||||||
|
}, |
||||||
|
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){ |
||||||
|
thisComponent.setState({avatar: avatar}); |
||||||
|
}); |
||||||
|
Twister.getUser(this.props.post.username).doProfile(function(profile){ |
||||||
|
thisComponent.setState({fullname: profile.fullname}); |
||||||
|
}); |
||||||
|
}, |
||||||
|
render: function() { |
||||||
|
var post = this.props.post; |
||||||
|
return ( |
||||||
|
<div className="post"> |
||||||
|
<div className="post-avatar"> |
||||||
|
<img src={this.state.avatar}/> |
||||||
|
</div> |
||||||
|
<div className="post-bulk"> |
||||||
|
<div className="post-username"> |
||||||
|
<span className="post-fullname">{this.state.fullname} </span> |
||||||
|
@{post.username} - {post.id} |
||||||
|
{post.isRetwist && |
||||||
|
<span> retwisted by {post.retwistingUser}</span> |
||||||
|
} |
||||||
|
</div> |
||||||
|
<div className="post-timestamp">{post.timestamp}</div> |
||||||
|
<div className="post-content">{post.content}</div> |
||||||
|
</div> |
||||||
|
<hr/> |
||||||
|
</div> |
||||||
|
); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
var streamMethods = { |
||||||
|
|
||||||
|
addPost: function(post) { |
||||||
|
|
||||||
|
var postid = post.getUsername() + ":post" + post.getId(); |
||||||
|
|
||||||
|
if (!this.state.postIdentifiers[postid] && this.verifyPost(post)) { |
||||||
|
|
||||||
|
this.setState(function(previousState, currentProps) { |
||||||
|
|
||||||
|
previousState.postIdentifiers[postid] = true; |
||||||
|
|
||||||
|
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 |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
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 { |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var UserStream = React.createClass({ |
||||||
|
|
||||||
|
mixins: [streamMethods], |
||||||
|
verifyPost: function (post) { |
||||||
|
return (post.getUsername()==this.state.username) |
||||||
|
}, |
||||||
|
getInitialState: function() { |
||||||
|
return {data: [], postIdentifiers: {}, username: "tschaul", postrange:10}; |
||||||
|
}, |
||||||
|
handleSubmit: function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
var username = React.findDOMNode(this.refs.username).value.trim(); |
||||||
|
if (!username) { |
||||||
|
return; |
||||||
|
} |
||||||
|
this.setState({username: username, data: [], postIdentifiers: {}},function(){ |
||||||
|
this.updatePosts(60); |
||||||
|
}); |
||||||
|
React.findDOMNode(this.refs.username).value = ''; |
||||||
|
|
||||||
|
}, |
||||||
|
updatePosts: function(outdatedLimit) { |
||||||
|
Twister.getUser(this.state.username).doLatestPosts(this.state.postrange,this.addPost,outdatedLimit); |
||||||
|
}, |
||||||
|
componentDidMount: function() { |
||||||
|
this.updatePosts(60); |
||||||
|
setInterval(this.updatePosts, this.props.pollInterval); |
||||||
|
}, |
||||||
|
render: function() { |
||||||
|
return ( |
||||||
|
<div className="UserStream"> |
||||||
|
<form onSubmit={this.handleSubmit}> |
||||||
|
<input type="text" placeholder="put in a username" ref="username" /> |
||||||
|
<input type="submit" value="Post" /> |
||||||
|
</form><br/> |
||||||
|
<h1>Posts by {this.state.username}</h1> |
||||||
|
<Postboard data={this.state.data}/> |
||||||
|
</div> |
||||||
|
); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
var Timeline = React.createClass({ |
||||||
|
|
||||||
|
mixins: [streamMethods], |
||||||
|
verifyPost: function (post) { |
||||||
|
|
||||||
|
var verified = false; |
||||||
|
|
||||||
|
for (var i = 0; i<this.state.usernames.length; i++) { |
||||||
|
|
||||||
|
if (post.getUsername()==this.state.usernames[i]) { verified = true } |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
return verified; |
||||||
|
|
||||||
|
}, |
||||||
|
getInitialState: function() { |
||||||
|
return { |
||||||
|
data: [], |
||||||
|
postIdentifiers: {}, |
||||||
|
usernames: [], |
||||||
|
postrange: ( Date.now()/1000 - 24*60*60 ), |
||||||
|
min_posts: 30 |
||||||
|
}; |
||||||
|
}, |
||||||
|
handleSubmit: function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
var username = React.findDOMNode(this.refs.username).value.trim(); |
||||||
|
if (!username) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
var thisComponent = this; |
||||||
|
|
||||||
|
Twister.getUser(username).doFollowings(function(following){ |
||||||
|
|
||||||
|
thisComponent.addUser(following); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
//this.addUser(username);
|
||||||
|
React.findDOMNode(this.refs.username).value = ''; |
||||||
|
|
||||||
|
}, |
||||||
|
addUser: function(username) { |
||||||
|
|
||||||
|
var thisComponent = this; |
||||||
|
|
||||||
|
this.setState(function(previousState, currentProps){ |
||||||
|
|
||||||
|
previousState.usernames.push(username); |
||||||
|
|
||||||
|
return previousState; |
||||||
|
|
||||||
|
},function(){ |
||||||
|
|
||||||
|
Twister.getUser(username).doPostsSince(thisComponent.state.postrange,thisComponent.addPost,60); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}, |
||||||
|
removeUser: function(username) { |
||||||
|
|
||||||
|
this.setState(function(previousState, currentProps){ |
||||||
|
|
||||||
|
var newusers = []; |
||||||
|
|
||||||
|
for (var i = 0; i<previousState.usernames.length; i++) { |
||||||
|
if (previousState.usernames[i]!=username) { |
||||||
|
newusers.push(previousState.usernames[i]); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
previousState.usernames = newusers; |
||||||
|
|
||||||
|
var newdata = []; |
||||||
|
|
||||||
|
for (var i = 0; i<previousState.data.length; i++) { |
||||||
|
if (previousState.data[i].username!=username) { |
||||||
|
newusers.push(previousState.data[i]); |
||||||
|
} else { |
||||||
|
previousState.postIdentifiers[previousState.data[i].postid]=false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
previousState.data = newdata; |
||||||
|
|
||||||
|
return previousState; |
||||||
|
|
||||||
|
}); |
||||||
|
}, |
||||||
|
updatePosts: function(outdatedLimit) { |
||||||
|
|
||||||
|
for (var i = 0; i<this.state.usernames.length; i++) { |
||||||
|
|
||||||
|
var thisComponent = this; |
||||||
|
var thisUsername = this.state.usernames[i]; |
||||||
|
|
||||||
|
Twister.getUser(this.state.usernames[i]).doPostsSince(this.state.postrange,function(post){ |
||||||
|
|
||||||
|
if (post!==null) { |
||||||
|
thisComponent.addPost(post); |
||||||
|
} else { |
||||||
|
thisComponent.removeUser(thisUsername); |
||||||
|
} |
||||||
|
|
||||||
|
},outdatedLimit); |
||||||
|
|
||||||
|
} |
||||||
|
}, |
||||||
|
componentDidMount: function() { |
||||||
|
this.updatePosts(60); |
||||||
|
setInterval(this.updatePosts, this.props.pollInterval); |
||||||
|
}, |
||||||
|
render: function() { |
||||||
|
return ( |
||||||
|
<div className="UserStream"> |
||||||
|
<form onSubmit={this.handleSubmit}> |
||||||
|
<input type="text" placeholder="put in a username" ref="username" /> |
||||||
|
<input type="submit" value="Post" /> |
||||||
|
</form><br/> |
||||||
|
<h1>Posts by {this.state.username}</h1> |
||||||
|
<Postboard data={this.state.data}/> |
||||||
|
</div> |
||||||
|
); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
|
||||||
|
var Postboard = React.createClass({ |
||||||
|
render: function() { |
||||||
|
var posts = this.props.data.map(function(post, index) { |
||||||
|
return ( |
||||||
|
<Post post={post} key={post.postid} /> |
||||||
|
); |
||||||
|
}); |
||||||
|
return ( |
||||||
|
<div className="Postboard"> |
||||||
|
{posts} |
||||||
|
</div> |
||||||
|
); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
React.render( |
||||||
|
<Timeline pollInterval="60000"/>, |
||||||
|
document.getElementById('content') |
||||||
|
); |
@ -0,0 +1,53 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html> |
||||||
|
<head> |
||||||
|
<link rel="stylesheet" type="text/css" href="css/main.css"> |
||||||
|
|
||||||
|
<script src="../LibTwister/jquery.min.js"></script> |
||||||
|
<script src="../LibTwister/jquery.json-2.4.js"></script> |
||||||
|
<script src="../LibTwister/jquery.jsonrpcclient.js"></script> |
||||||
|
<script src="../LibTwister/Twister.js"></script> |
||||||
|
<script src="../LibTwister/TwisterBinding.js"></script> |
||||||
|
<script src="../LibTwister/TwisterUser.js"></script> |
||||||
|
<script src="../LibTwister/TwisterUsers.js"></script> |
||||||
|
<script src="../LibTwister/TwisterPost.js"></script> |
||||||
|
<script src="build/react.js"></script> |
||||||
|
<script src="build/JSXTransformer.js"></script> |
||||||
|
<script> |
||||||
|
/* |
||||||
|
Twister.dhtget(["tschaul","post35","s"],function(post){console.log(post)}) |
||||||
|
Twister.dhtget(["tschaul","post34","s"],function(post){console.log(post)}) |
||||||
|
Twister.dhtget(["tschaul","post32","s"],function(post){console.log(post)}) |
||||||
|
Twister.dhtget(["tschaul","post31","s"],function(post){console.log(post)}) |
||||||
|
Twister.dhtget(["tschaul","post29","s"],function(post){console.log(post)}) |
||||||
|
Twister.dhtget(["tschaul","post28","s"],function(post){console.log(post)}) |
||||||
|
Twister.dhtget(["tschaul","post27","s"],function(post){console.log(post)}) |
||||||
|
Twister.dhtget(["tschaul","post26","s"],function(post){console.log(post)}) |
||||||
|
Twister.dhtget(["tschaul","post25","s"],function(post){console.log(post)}) |
||||||
|
Twister.dhtget(["tschaul","post24","s"],function(post){console.log(post)}) |
||||||
|
|
||||||
|
|
||||||
|
Twister.dhtget_batch([ |
||||||
|
["tschaul","post35","s"], |
||||||
|
["tschaul","post34","s"], |
||||||
|
["tschaul","post32","s"], |
||||||
|
["tschaul","post31","s"], |
||||||
|
["tschaul","post29","s"], |
||||||
|
["tschaul","post28","s"], |
||||||
|
["tschaul","post27","s"], |
||||||
|
["tschaul","post26","s"], |
||||||
|
["tschaul","post25","s"], |
||||||
|
["tschaul","post24","s"] |
||||||
|
],function(post){console.log(post)}); |
||||||
|
|
||||||
|
|
||||||
|
Twister.getUsers(["mfreitas","yago","d3","mf2","capo","danim","kawuja","urukrain","mf3","twister","manderson","bitcoin","mf1a"]).doLatestPosts(10,function(post){console.log(post)}) |
||||||
|
|
||||||
|
Twister.getUser("tschaul").doFollowings(function(fol){console.log(fol)}) |
||||||
|
*/ |
||||||
|
</script> |
||||||
|
</head> |
||||||
|
<body><div id="content" class="context"></div> |
||||||
|
<script type="text/jsx" src="src/main.js"></script> |
||||||
|
</body> |
||||||
|
</html> |
Loading…
Reference in new issue