You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

229 line
8.6 KiB

  1. import React from 'react';
  2. import Slider from "react-slick";
  3. import * as Icon from 'react-feather';
  4. const NextArrow = (props) => {
  5. const { onClick } = props;
  6. return (
  7. <button
  8. className="next-arrow slick-arrow"
  9. onClick={onClick}
  10. >
  11. <Icon.ArrowRight />
  12. </button>
  13. );
  14. }
  15. const PrevArrow = (props) => {
  16. const { onClick } = props;
  17. return (
  18. <button
  19. className="prev-arrow slick-arrow"
  20. onClick={onClick}
  21. >
  22. <Icon.ArrowLeft />
  23. </button>
  24. );
  25. }
  26. class Feedback extends React.Component {
  27. state = {
  28. imagesSlider: null,
  29. thumbnailsSlider: null,
  30. oldSlide: 0,
  31. activeSlide: 0,
  32. activeSlide2: 0
  33. };
  34. componentDidMount() {
  35. this.setState({
  36. imagesSlider: this.slider1,
  37. thumbnailsSlider: this.slider2
  38. });
  39. }
  40. renderSliderFullContent = () => {
  41. return DEFAULT_PROPS.map(({name,profession,image,content}) => {
  42. return (
  43. <div key={name}>
  44. <div className="item">
  45. <div className="single-feedback">
  46. <div className="client-img">
  47. <img src={image} alt="image" />
  48. </div>
  49. <h3>{name}</h3>
  50. <span>{profession}</span>
  51. <p>{content}</p>
  52. </div>
  53. </div>
  54. </div>
  55. )
  56. })
  57. }
  58. renderSliderImages = () => {
  59. return DEFAULT_PROPS.map(({name, image}) => {
  60. return (
  61. <div key={name}>
  62. <div className="item">
  63. <div className="img-fill">
  64. <img src={image} alt="client" />
  65. </div>
  66. </div>
  67. </div>
  68. )
  69. })
  70. }
  71. render() {
  72. const sliderSettings1 = {
  73. speed: 100,
  74. slidesToShow: 1,
  75. slidesToScroll: 1,
  76. cssEase: 'linear',
  77. fade: true,
  78. autoplay: true,
  79. draggable: true,
  80. asNavFor: this.state.thumbnailsSlider,
  81. draggable: false,
  82. arrows: false,
  83. nextArrow: false,
  84. prevArrow: false
  85. }
  86. const sliderSettings2 = {
  87. speed: 300,
  88. slidesToShow: 5,
  89. slidesToScroll: 1,
  90. cssEase: 'linear',
  91. autoplay: true,
  92. centerMode: true,
  93. draggable: false,
  94. focusOnSelect: true,
  95. asNavFor: this.state.imagesSlider,
  96. nextArrow: <NextArrow />,
  97. prevArrow: <PrevArrow />,
  98. beforeChange: (current, next) => this.setState({ oldSlide: current, activeSlide: next }),
  99. afterChange: current => this.setState({ activeSlide2: current })
  100. }
  101. return (
  102. <section className="feedback-area ptb-80 bg-f7fafd">
  103. <div className="container">
  104. <div className="section-title">
  105. <h2>What users Saying</h2>
  106. <div className="bar"></div>
  107. <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
  108. </div>
  109. <div className="feedback-slides">
  110. <div className="client-feedback">
  111. <div>
  112. <Slider
  113. ref={slider => (this.slider1 = slider)}
  114. {...sliderSettings1}
  115. >
  116. {
  117. this.renderSliderFullContent()
  118. }
  119. </Slider>
  120. </div>
  121. </div>
  122. <div className="client-thumbnails">
  123. <div>
  124. <Slider
  125. ref={slider => (this.slider2 = slider)}
  126. {...sliderSettings2}
  127. >
  128. {
  129. this.renderSliderImages()
  130. }
  131. </Slider>
  132. </div>
  133. </div>
  134. </div>
  135. </div>
  136. <div className="shape1">
  137. <img src="/images/shape1.png" alt="shape" />
  138. </div>
  139. <div className="shape2 rotateme">
  140. <img src="/images/shape2.svg" alt="shape" />
  141. </div>
  142. <div className="shape4">
  143. <img src="/images/shape4.svg" alt="shape" />
  144. </div>
  145. <div className="shape5">
  146. <img src="/images/shape5.png" alt="shape" />
  147. </div>
  148. <div className="shape6 rotateme">
  149. <img src="/images/shape4.svg" alt="shape" />
  150. </div>
  151. <div className="shape7">
  152. <img src="/images/shape4.svg" alt="shape" />
  153. </div>
  154. <div className="shape8 rotateme">
  155. <img src="/images/shape2.svg" alt="shape" />
  156. </div>
  157. </section>
  158. );
  159. }
  160. }
  161. const DEFAULT_PROPS = [
  162. {
  163. name: 'David Gale',
  164. profession: 'Web Developer',
  165. image: '/images/client-image/client2.jpg',
  166. content: 'Quis ipsum suspendisse ultrices gravida. Risus commodo viverra maecenas accumsan lacus vel facilisis. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
  167. },
  168. {
  169. name: 'Matt Damon',
  170. profession: 'Software Engineer',
  171. image: '/images/client-image/client4.jpg',
  172. content: 'Quis ipsum suspendisse ultrices gravida. Risus commodo viverra maecenas accumsan lacus vel facilisis. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
  173. },
  174. {
  175. name: 'Nicky Parsons',
  176. profession: 'Fictional Character',
  177. image: '/images/client-image/client1.jpg',
  178. content: 'Quis ipsum suspendisse ultrices gravida. Risus commodo viverra maecenas accumsan lacus vel facilisis. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
  179. },
  180. {
  181. name: 'Jason Momoa',
  182. profession: 'American Actor',
  183. image: '/images/client-image/client5.jpg',
  184. content: 'Quis ipsum suspendisse ultrices gravida. Risus commodo viverra maecenas accumsan lacus vel facilisis. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
  185. },
  186. {
  187. name: 'Gennady Korotkevich',
  188. profession: 'Sport Programmer',
  189. image: '/images/client-image/client3.jpg',
  190. content: 'Quis ipsum suspendisse ultrices gravida. Risus commodo viverra maecenas accumsan lacus vel facilisis. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
  191. },
  192. {
  193. name: 'Petr Mitrichev',
  194. profession: 'Russian Programmer',
  195. image: '/images/client-image/client3.jpg',
  196. content: 'Quis ipsum suspendisse ultrices gravida. Risus commodo viverra maecenas accumsan lacus vel facilisis. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
  197. },
  198. {
  199. name: 'Reid W. Barton',
  200. profession: 'Mathematics',
  201. image: '/images/client-image/client2.jpg',
  202. content: 'Quis ipsum suspendisse ultrices gravida. Risus commodo viverra maecenas accumsan lacus vel facilisis. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
  203. },
  204. {
  205. name: 'Lisa Sauermann',
  206. profession: 'Mathematician',
  207. image: '/images/client-image/client1.jpg',
  208. content: 'Quis ipsum suspendisse ultrices gravida. Risus commodo viverra maecenas accumsan lacus vel facilisis. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
  209. }
  210. ];
  211. export default Feedback;