Advertisement
Guest User

Untitled

a guest
May 26th, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.40 KB | None | 0 0
  1. import React from 'react';
  2. import Relay from 'react-relay';
  3. import SinglePostRoute from '../routes/SinglePostRoute';
  4. import Post from "./Post";
  5.  
  6. const last = arr => arr[arr.length - 1];
  7.  
  8. class Blog extends React.Component {
  9. constructor(props) {
  10. super(props);
  11. this.state = { selectedPost: null };
  12. }
  13.  
  14. selectPost(id) {
  15. this.setState({ selectedPost: id });
  16. }
  17.  
  18. advancePageCursor() {
  19. const { relay, blog: { posts } } = this.props;
  20. const pageSize = relay.variables.pageSize + 3;
  21.  
  22. relay.setVariables({ pageSize });
  23. }
  24.  
  25. renderPagination() {
  26. const { blog: { posts: { pageInfo } } } = this.props;
  27.  
  28. if (!pageInfo.hasNextPage) {
  29. return null;
  30. }
  31.  
  32. return <div><button onClick={() => this.advancePageCursor()}>Next page</button></div>;
  33. }
  34.  
  35. renderPosts() {
  36. const { blog: { posts } } = this.props;
  37. const { selectedPost } = this.state;
  38.  
  39. if (!posts || 0 === posts.edges.length) {
  40. return <p>Sorry, no posts found.</p>;
  41. }
  42.  
  43. return <ol>{posts.edges.map(
  44. ({ node: p }) => <li key={p.id} className={p.id === selectedPost ? "selected" : null}>
  45. <a href="#" onClick={() => this.selectPost(p.id)}>{p.title}</a></li>)}</ol>;
  46. }
  47.  
  48. renderSelectedPost() {
  49. const { selectedPost } = this.state;
  50.  
  51. if (!selectedPost) {
  52. return null;
  53. }
  54.  
  55. return <Relay.RootContainer
  56. Component={Post}
  57. route={new SinglePostRoute({ postId: selectedPost })}
  58. />
  59. }
  60.  
  61. render() {
  62. const { blog: { name } } = this.props;
  63.  
  64. return (
  65. <div>
  66. <h1>{name}</h1>
  67.  
  68. {this.renderPosts()}
  69. {this.renderPagination()}
  70. {this.renderSelectedPost()}
  71. </div>
  72. );
  73. }
  74. }
  75.  
  76. export default Relay.createContainer(Blog, {
  77. initialVariables: {
  78. pageSize: 3
  79. },
  80. fragments: {
  81. blog: () => Relay.QL`
  82. fragment on Blog {
  83. id
  84. name
  85. posts(first: $pageSize) {
  86. pageInfo {
  87. hasNextPage
  88. }
  89. edges {
  90. node {
  91. id
  92. title
  93. }
  94. }
  95. }
  96. }
  97. `
  98. }
  99. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement