Skip to content

Commit 14a1e4f

Browse files
committed
Fix related blogs slider responsiveness
Signed-off-by: DANIEL KATOTO <katotodan@gmail.com>
1 parent a1167b3 commit 14a1e4f

1 file changed

Lines changed: 56 additions & 15 deletions

File tree

src/components/Related-Posts/index.js

Lines changed: 56 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,77 @@
1-
import React from "react";
1+
import React, {useLayoutEffect, useState, useRef} from "react";
22
import { Link } from "gatsby";
33
import { IoIosArrowRoundForward } from "@react-icons/all-files/io/IoIosArrowRoundForward";
44
import Card from "../Card";
55
import RelatedPostsWrapper from "./relatedPosts.style";
66
import { Col } from "../../reusecore/Layout";
77
import Slider from "react-slick";
8-
import useHasMounted from "../../utils/useHasMounted";
98

109
const RelatedPosts = props => {
10+
const [isClient, setIsClient] = useState(false);
11+
const [slidesToShowState, setSlidesToShowState] = useState(null);
12+
const sliderRef = useRef(null);
1113

1214
const { postType , relatedPosts , mainHead , lastCardHead , linkToAllItems } = props;
1315

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+
1566

1667
return (
1768
<RelatedPostsWrapper>
1869
<div className="widgets-title">
1970
<h3>{mainHead}</h3>
2071
</div>
2172
{
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}`}>
3475
{
3576
postType === "blogs" ? relatedPosts.map((item) => {
3677
const post = item.post || item;

0 commit comments

Comments
 (0)