Skip to content

Commit f83e56c

Browse files
committed
fix: slider items to shrink on small devices
Signed-off-by: DANIEL KATOTO <katotodan@gmail.com>
1 parent 0cb6b4c commit f83e56c

1 file changed

Lines changed: 50 additions & 48 deletions

File tree

  • src/sections/Home/So-Special-Section

src/sections/Home/So-Special-Section/index.js

Lines changed: 50 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
import React from "react";
2+
import React, {useLayoutEffect, useState, useRef} from "react";
33
import Slider from "react-slick";
44
import SoSpecialWrapper from "./so-special-style";
55

@@ -9,6 +9,9 @@ import Image from "../../../components/image";
99
// import { useStyledDarkMode } from "../../../theme/app/useStyledDarkMode";
1010

1111
const SoSpecial = () => {
12+
const [isClient, setIsClient] = useState(false);
13+
const [slidesToShowState, setSlidesToShowState] = useState(null);
14+
const sliderRef = useRef(null);
1215
const data = useStaticQuery(
1316
graphql`query newsList {
1417
allMdx(
@@ -53,56 +56,55 @@ const SoSpecial = () => {
5356
}`
5457
);
5558
const settings = {
56-
dots: false,
59+
dots: slidesToShowState <= 1,
5760
infinite: false,
5861
speed: 500,
59-
slidesToShow: 2.5,
6062
swipeToSlide: true,
61-
62-
responsive: [
63-
{
64-
breakpoint: 1200,
65-
settings: {
66-
slidesToShow: 2.2,
67-
68-
}
69-
},
70-
{
71-
breakpoint: 1024,
72-
settings: {
73-
slidesToShow: 2,
74-
75-
}
76-
},
77-
{
78-
breakpoint: 800,
79-
settings: {
80-
slidesToShow: 1.5,
81-
slidesToScroll: 1,
82-
initialSlide: 1
83-
}
84-
},
85-
{
86-
breakpoint: 600,
87-
settings: {
88-
dots: true,
89-
arrows: false,
90-
slidesToShow: 1,
91-
slidesToScroll: 1,
92-
initialSlide: 1
93-
}
94-
},
95-
{
96-
breakpoint: 400,
97-
settings: {
98-
dots: true,
99-
arrows: false,
100-
slidesToShow: 1,
101-
slidesToScroll: 1
102-
}
103-
}
104-
]
63+
slidesToScroll: 1,
64+
arrows: slidesToShowState !== 1,
65+
slidesToShow: slidesToShowState ?? 2.5,
10566
};
67+
68+
const computeSlides = () => {
69+
const w = typeof window !== "undefined" ? (window.innerWidth || document.documentElement.clientWidth) : 1200;
70+
if (w <= 600) return 1;
71+
if (w <= 800) return 1.5;
72+
if (w <= 1024) return 2;
73+
if (w <= 1200) return 2.2;
74+
return 3;
75+
};
76+
77+
useLayoutEffect(() => {
78+
79+
setIsClient(true);
80+
setSlidesToShowState(computeSlides());
81+
82+
let resizeTimeout = null;
83+
const onResizeDebounced = () => {
84+
clearTimeout(resizeTimeout);
85+
resizeTimeout = setTimeout(() => {
86+
const slides = computeSlides();
87+
setSlidesToShowState((prev) => {
88+
if (prev !== slides) return slides;
89+
return prev;
90+
});
91+
if (sliderRef.current && sliderRef.current.innerSlider && typeof sliderRef.current.innerSlider.onWindowResized === "function") {
92+
sliderRef.current.innerSlider.onWindowResized();
93+
}
94+
}, 100);
95+
};
96+
97+
window.addEventListener("resize", onResizeDebounced);
98+
window.addEventListener("load", onResizeDebounced);
99+
100+
return () => {
101+
window.removeEventListener("resize", onResizeDebounced);
102+
window.removeEventListener("load", onResizeDebounced);
103+
clearTimeout(resizeTimeout);
104+
};
105+
}, []);
106+
107+
if (!isClient || slidesToShowState === null) return null;
106108

107109
// const { isDark } = useStyledDarkMode();
108110

@@ -113,7 +115,7 @@ const SoSpecial = () => {
113115
<h1>We're making a splash</h1>
114116
</div>
115117
<div className="special_carousel">
116-
<Slider {...settings}>
118+
<Slider {...settings} key={`review-slider-${slidesToShowState}`} ref={sliderRef}>
117119
{
118120
data.allMdx.nodes.map(({ id, frontmatter, fields }) => (
119121
<Button className="special-cont_btn" $url={fields.slug} key={id}>

0 commit comments

Comments
 (0)