Advertisement
dfghgfhplkjbv

src/components/AllJobs/AllJobs.js

Feb 25th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.38 KB | None | 0 0
  1. import React, { Component } from 'react'
  2. import styles from './AllJobs.module.scss'
  3. import posed, { PoseGroup } from 'react-pose'
  4. import shuffle from 'src/shuffle'
  5. import { Link } from 'gatsby'
  6. import { getLink } from 'src/utils'
  7.  
  8. const Item = posed.div({
  9. flip: {
  10. scale: 1,
  11. transition: {
  12. scale: {
  13. type: 'spring',
  14. velocity: 3,
  15. },
  16. default: {
  17. type: 'spring',
  18. },
  19. },
  20. // transition: { type: 'spring', stiffness: 100 },
  21. },
  22. })
  23.  
  24. class AllJobs extends Component {
  25. constructor(props) {
  26. super(props)
  27. this.defaultExperienceOption = this.props.locale === 'ru' ? 'Уровень опыта' : 'Experience level'
  28. this.searchInputRef = React.createRef()
  29. }
  30.  
  31. state = {
  32. preparedJobs: this.props.jobs.filter(({ node: slug }) => slug !== '_'),
  33. selectedExperience: this.defaultExperienceOption,
  34. }
  35.  
  36. handleTagClick = (tagTitle) => {
  37. this.setState(
  38. {
  39. preparedJobs: this.props.jobs.filter(
  40. ({
  41. node: {
  42. tag: { title },
  43. },
  44. }) => title === tagTitle,
  45. ),
  46. },
  47. () =>
  48. this.setState({
  49. preparedJobs: shuffle(
  50. this.props.jobs.filter(
  51. ({
  52. node: {
  53. tag: { title },
  54. },
  55. }) => title === tagTitle,
  56. ),
  57. ),
  58. }),
  59. )
  60. }
  61.  
  62. handleExperienceChange = (event) => {
  63. const selectedExperience = event.target.value
  64. const filteredJobs = this.props.jobs.filter(({ node: { experienceLevel: { title: experience } } }) => {
  65. if (selectedExperience === experience) {
  66. return true
  67. }
  68. if (selectedExperience === this.defaultExperienceOption) {
  69. return true
  70. }
  71. })
  72. this.setState({ preparedJobs: filteredJobs, selectedExperience: selectedExperience })
  73. }
  74.  
  75. handleClearFiltersClick = () => {
  76. this.searchInputRef.current.value = ''
  77. this.setState({ preparedJobs: this.props.jobs, selectedExperience: this.defaultExperienceOption })
  78. }
  79.  
  80. handleSubmit = (event) => {
  81. event.preventDefault()
  82. this.setState({ selectedExperience: this.defaultExperienceOption })
  83. this.searchByKeyWord(this.searchInputRef.current.value)
  84. }
  85.  
  86. searchByKeyWord = (query) => {
  87. const result = this.props.jobs.filter(({ node: { title } }) => {
  88. if (title.toLocaleLowerCase().indexOf(query.toLocaleLowerCase()) >= 0) {
  89. return true
  90. }
  91. return false
  92. })
  93. this.setState({ preparedJobs: result })
  94. }
  95.  
  96. render() {
  97. const { preparedJobs } = this.state
  98. const { jobTags, experienceLevels, locale } = this.props
  99.  
  100. return (
  101. <>
  102. <div className={styles.cover} />
  103. <div className={styles.root}>
  104. <div className={styles.inner}>
  105. <div className={styles.categoriesInnerContainer}>
  106. <h1>Select job categories: </h1>
  107. <div className={styles.tags}>
  108. {jobTags.map(({ node: { id, title } }) => (
  109. <button className={styles.tag} key={id} onClick={() => this.handleTagClick(title)}>
  110. {title}
  111. </button>
  112. ))}
  113. </div>
  114. <div className={styles.filters}>
  115. <form className={styles.filtersForm} onSubmit={this.handleSubmit}>
  116. <div className={styles.filtersContainer}>
  117. <select
  118. className={styles.level}
  119. value={this.state.selectedExperience}
  120. onChange={this.handleExperienceChange}
  121. >
  122. <option key="default" value={this.defaultExperienceOption}>
  123. {this.defaultExperienceOption}
  124. </option>
  125. {experienceLevels.map(({ node: { id, title } }) => (
  126. <option key={id} value={title}>
  127. {title}
  128. </option>
  129. ))}
  130. </select>
  131. <input className={styles.search} ref={this.searchInputRef} placeholder="Search by keyword" />
  132. </div>
  133. </form>
  134. <button className={styles.clear} onClick={this.handleClearFiltersClick}>
  135. Clear filters
  136. </button>
  137. </div>
  138. </div>
  139. </div>
  140. <div className={styles.jobsContainer}>
  141. <div className={styles.listContainer}>
  142. <div className={styles.total}>
  143. <h3>NYC TECH JOBS AND STARTUP JOBS</h3>
  144. <span>{preparedJobs.length}</span>
  145. </div>
  146. <div className={styles.listJobs}>
  147. <PoseGroup>
  148. {preparedJobs.map(
  149. ({
  150. node: {
  151. title,
  152. description,
  153. locationDescription,
  154. companyLogo: { url: companyLogo },
  155. slug,
  156. id,
  157. },
  158. }) => (
  159. <Item key={id}>
  160. <Link to={getLink(locale, `job/${slug}`)} key={title} className={styles.jobLink}>
  161. <div className={styles.oneJob}>
  162. <div className={styles.companyLogo}>
  163. <img src={companyLogo} alt="" />
  164. </div>
  165. <div className={styles.jobInfo}>
  166. <div className={styles.title}>{title}</div>
  167. <div>
  168. <div className={styles.location}>{locationDescription}</div>
  169. <div className={styles.description}>
  170. {description.length >= 245 ? `${description.substring(0, 245)}...` : description}
  171. </div>
  172. </div>
  173. </div>
  174. </div>
  175. </Link>
  176. </Item>
  177. ),
  178. )}
  179. </PoseGroup>
  180. </div>
  181. </div>
  182. </div>
  183. </div>
  184. </>
  185. )
  186. }
  187. }
  188.  
  189. export default AllJobs
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement