|
1 | | -import React from "react"; |
| 1 | +import React, {useLayoutEffect, useState, useRef} from "react"; |
2 | 2 | import { Link } from "gatsby"; |
3 | 3 | import { IoIosArrowRoundForward } from "@react-icons/all-files/io/IoIosArrowRoundForward"; |
4 | 4 | import Card from "../Card"; |
5 | 5 | import RelatedPostsWrapper from "./relatedPosts.style"; |
6 | 6 | import { Col } from "../../reusecore/Layout"; |
7 | 7 | import Slider from "react-slick"; |
8 | | -import useHasMounted from "../../utils/useHasMounted"; |
9 | 8 |
|
10 | 9 | const RelatedPosts = props => { |
| 10 | + const [isClient, setIsClient] = useState(false); |
| 11 | + const [slidesToShowState, setSlidesToShowState] = useState(null); |
| 12 | + const sliderRef = useRef(null); |
11 | 13 |
|
12 | 14 | const { postType , relatedPosts , mainHead , lastCardHead , linkToAllItems } = props; |
13 | 15 |
|
14 | | - const hasMounted = useHasMounted(); |
| 16 | + const computeSlides = () => { |
| 17 | + const w = typeof window !== "undefined" ? (window.innerWidth || document.documentElement.clientWidth) : 1200; |
| 18 | + if (w <= 600) return 1; |
| 19 | + if (w <= 800) return 1.5; |
| 20 | + if (w <= 1024) return 2; |
| 21 | + if (w <= 1200) return 3; |
| 22 | + return 3; |
| 23 | + }; |
| 24 | + |
| 25 | + useLayoutEffect(() => { |
| 26 | + setIsClient(true); |
| 27 | + setSlidesToShowState(computeSlides()); |
| 28 | + |
| 29 | + let resizeTimeout = null; |
| 30 | + const onResizeDebounced = () => { |
| 31 | + clearTimeout(resizeTimeout); |
| 32 | + resizeTimeout = setTimeout(() => { |
| 33 | + const slides = computeSlides(); |
| 34 | + setSlidesToShowState((prev) => { |
| 35 | + if (prev !== slides) return slides; |
| 36 | + return prev; |
| 37 | + }); |
| 38 | + if (sliderRef.current && sliderRef.current.innerSlider && typeof sliderRef.current.innerSlider.onWindowResized === "function") { |
| 39 | + sliderRef.current.innerSlider.onWindowResized(); |
| 40 | + } |
| 41 | + }, 100); |
| 42 | + }; |
| 43 | + |
| 44 | + window.addEventListener("resize", onResizeDebounced); |
| 45 | + window.addEventListener("load", onResizeDebounced); |
| 46 | + |
| 47 | + return () => { |
| 48 | + window.removeEventListener("resize", onResizeDebounced); |
| 49 | + window.removeEventListener("load", onResizeDebounced); |
| 50 | + clearTimeout(resizeTimeout); |
| 51 | + }; |
| 52 | + }, []); |
| 53 | + |
| 54 | + const settings = { |
| 55 | + dots: slidesToShowState < 2, |
| 56 | + arrows: slidesToShowState >= 2, |
| 57 | + infinite: false, |
| 58 | + speed: 500, |
| 59 | + slidesToShow: slidesToShowState, |
| 60 | + slidesToScroll: 1, |
| 61 | + swipe: true, |
| 62 | + swipeToSlide: true, |
| 63 | + touchThreshold: 10, |
| 64 | + }; |
| 65 | + |
15 | 66 |
|
16 | 67 | return ( |
17 | 68 | <RelatedPostsWrapper> |
18 | 69 | <div className="widgets-title"> |
19 | 70 | <h3>{mainHead}</h3> |
20 | 71 | </div> |
21 | 72 | { |
22 | | - hasMounted && |
23 | | - <Slider |
24 | | - dots= { window.innerWidth < 992 } |
25 | | - arrows={ window.innerWidth >= 992 } |
26 | | - infinite= {false} |
27 | | - speed= "500" |
28 | | - slidesToShow= {window.innerWidth <= 720 ? 1 : window.innerWidth <= 991 ? 2 : 3} |
29 | | - slidesToScroll= {1} |
30 | | - swipe={true} |
31 | | - swipeToSlide={true} |
32 | | - touchThreshold={10} |
33 | | - > |
| 73 | + isClient && |
| 74 | + <Slider{...settings} ref={sliderRef} key={`review-slider-${slidesToShowState}`}> |
34 | 75 | { |
35 | 76 | postType === "blogs" ? relatedPosts.map((item) => { |
36 | 77 | const post = item.post || item; |
|
0 commit comments