11
2- import React from "react" ;
2+ import React , { useLayoutEffect , useState , useRef } from "react" ;
33import Slider from "react-slick" ;
44import SoSpecialWrapper from "./so-special-style" ;
55
@@ -9,6 +9,9 @@ import Image from "../../../components/image";
99// import { useStyledDarkMode } from "../../../theme/app/useStyledDarkMode";
1010
1111const 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