Guest User

Untitled

a guest
Jul 18th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.99 KB | None | 0 0
  1. import { Component, Fragment } from 'react';
  2. import { translate } from 'react-i18next';
  3.  
  4. import { SectionTitle } from '../SectionTitle/SectionTitle';
  5. import getId from '../../lib/idGenerator';
  6. import styles from './Portfolio.scss';
  7.  
  8. const ProjectTile = props => (
  9. <div
  10. role="button"
  11. className={ props.tileClasses }
  12. data-id={ props.dataKey }
  13. onClick={ props.onTileClick }
  14. onTouchEnd={ props.onTileClick }
  15. onAnimationEnd={ props.onAnimationEnd }
  16. >
  17. <div className={ styles.position }>
  18. <p>{ props.position }</p>
  19. </div>
  20. <div className={ [styles.tileBlock, props.activeTile ? styles.active : ''].join(' ') }>
  21. <div className={ styles.half }>
  22. <div className={ styles.titleWrap }>
  23. <p className={ styles.title }>{ props.title }</p>
  24. </div>
  25. </div>
  26. <div className={ styles.half }>
  27. <div className={ styles.descriptionWrap }>
  28. <div className={ styles.description }>
  29. { props.description.map(d => <p key={ getId() }>{ d }</p>) }
  30. </div>
  31. <p className={ styles.arrow }>></p>
  32. </div>
  33. </div>
  34. </div>
  35. </div>
  36. );
  37.  
  38. class Portfolio extends Component {
  39. state = {
  40. tileClasses: [styles.projectTile],
  41. activeTile: null,
  42. }
  43.  
  44. onProjectClick = e => {
  45. const target = e.currentTarget || e.target;
  46. const tileId = Number(target.attributes['data-id'].value);
  47. const classes = [...this.state.tileClasses, styles.animateSlide];
  48.  
  49. this.setState({
  50. activeTile: tileId,
  51. tileClasses: classes,
  52. }, () => this.props.onSwipe(tileId - 1));
  53. }
  54.  
  55. animateHandler = e => {
  56. const target = e.currentTarget || e.target;
  57. const tileId = Number(target.attributes['data-id'].value);
  58. const lastId = this.props.projects[this.props.projects.length - 1].id;
  59.  
  60. if (tileId === lastId) {
  61. const tileClasses = [styles.projectTile, styles.hide];
  62.  
  63. this.props.onSwipeMain(true);
  64. this.setState(
  65. { tileClasses },
  66. () => setTimeout(() => (
  67. this.setState({
  68. tileClasses: [styles.projectTile],
  69. activeTile: null,
  70. })
  71. ), 1000),
  72. );
  73. }
  74. }
  75.  
  76. renderProjects = () => (
  77. this.props.projects.map(project => (
  78. <ProjectTile
  79. dataKey={ project.id }
  80. key={ getId() }
  81. position={ project.position }
  82. title={ project.title }
  83. description={ project.description.map(d => this.props.t(d)) }
  84. tileClasses={ this.state.tileClasses.join(' ') }
  85. onTileClick={ this.onProjectClick }
  86. onAnimationEnd={ this.animateHandler }
  87. activeTile={ this.state.activeTile === project.id }
  88. />
  89. ))
  90. );
  91.  
  92. render() {
  93. return (
  94. <Fragment>
  95. <SectionTitle title={ this.props.t('main:portfolio-section') } />
  96. <div className={ styles.portfolioBlock }>
  97. <div className={ styles.projectWrapper }>
  98. { this.renderProjects() }
  99. </div>
  100. </div>
  101. </Fragment>
  102. );
  103. }
  104. }
  105.  
  106. export default translate(['projects', 'main'])(Portfolio);
Add Comment
Please, Sign In to add comment