Guest User

Untitled

a guest
Jan 4th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.26 KB | None | 0 0
  1. import React from 'react'
  2. import ReactDOM from 'react-dom'
  3. import Library from './components/Library.jsx'
  4. const libraryContainer = document.getElementById('library')
  5. ReactDOM.render(<Library />, libraryContainer)
  6.  
  7. import React from 'react'
  8. import Filters from './Filters.jsx'
  9. import LibraryItem from './LibraryItem.jsx'
  10. import SmoothScroll from 'smooth-scroll'
  11.  
  12. const libraryContainer = document.getElementById('library')
  13. const scroll = new SmoothScroll('a[href*="#"]', { offset: 100 })
  14.  
  15. export default class Library extends React.Component {
  16. state = {
  17. lib: [],
  18. filteredLib: [],
  19. topics: [],
  20. filter: '',
  21. }
  22.  
  23. filterLib = () => {
  24. if (this.state.filter === '') return this.setState({ filteredLib: this.state.lib })
  25.  
  26. this.setState(
  27. {
  28. filteredLib: this.state.lib.filter(item => {
  29. if (item.topics) return item.topics.includes(this.state.filter)
  30. }),
  31. },
  32. () => scroll.animateScroll(libraryContainer),
  33. )
  34. }
  35.  
  36. handleFilters = topic => {
  37. const topicsClone = JSON.parse(JSON.stringify(this.state.topics))
  38. topicsClone.forEach(item => {
  39. if (item.id === topic.id) {
  40. item.active = !item.active
  41. item.active ? null : (topic.name = '')
  42. } else {
  43. item.active = false
  44. }
  45. })
  46. this.setState({ topics: topicsClone, filter: topic.name }, () => {
  47. this.filterLib()
  48. })
  49. }
  50.  
  51. componentDidMount() {
  52. let topicsArr = []
  53.  
  54. fetch('/api')
  55. .then(res => res.json())
  56. .then(data => {
  57. this.setState({ lib: data.lib, filteredLib: data.lib })
  58. data.topics.map((val, key) => {
  59. topicsArr.push({ name: val, id: key, active: false })
  60. })
  61. this.setState({ topics: topicsArr })
  62. })
  63. .catch(err => console.log(err))
  64. }
  65.  
  66. render() {
  67. if (this.state.filteredLib.length > 0) {
  68. return (
  69. <div className="library-container">
  70. <Filters topics={this.state.topics} handler={this.handleFilters} />
  71.  
  72. <div className="column column--content">
  73. <ul className="cards">
  74. {this.state.filteredLib.map(item => {
  75. return <LibraryItem key={item._id} {...item} />
  76. })}
  77. </ul>
  78. </div>
  79. </div>
  80. )
  81. } else {
  82. return <h4>Wir konnten leider nichts finden :(</h4>
  83. }
  84. }
  85. }
  86.  
  87. import React from 'react'
  88.  
  89. export default function Filters(props) {
  90. const handleClick = topic => {
  91. props.handler(topic)
  92. }
  93.  
  94. return (
  95. <div className="column column--filters">
  96. <h3 className="title">Filter</h3>
  97. <ul className="filters">
  98. {props.topics.map(topic => {
  99. return (
  100. <li key={topic.id} className={topic.active ? 'filters__item active' : 'filters__item'} onClick={() => handleClick(topic)}>
  101. {topic.name}
  102. </li>
  103. )
  104. })}
  105. </ul>
  106. </div>
  107. )
  108. }
  109.  
  110. import React from 'react'
  111.  
  112. export default function LibraryItem(props) {
  113. return (
  114. <li className="cards__item card">
  115. <a className="card__link" href={props.slug} />
  116. <div className="card__header">
  117. <p className="type">{props.type}</p>
  118. <h3 className="card__title">{props.title}</h3>
  119. </div>
  120. <div className="card__content">
  121. <p className="content">{props.teaser}</p>
  122. </div>
  123. </li>
  124. )
  125. }
Add Comment
Please, Sign In to add comment