11
2- import React from "react" ;
2+ import React , { useRef , useState , useLayoutEffect } from "react" ;
33import styled from "styled-components" ;
44import Customers from "../../reusecore/Blockquote/Blockquote-image" ;
55import Slider from "react-slick" ;
@@ -33,28 +33,22 @@ const settings = {
3333 {
3434 breakpoint : 1300 ,
3535 settings : {
36- slidesToShow : 2.5 ,
36+ slidesToShow : 2 ,
37+ slidesToScroll : 1 ,
3738 }
3839 } ,
3940 {
4041 breakpoint : 1024 ,
4142 settings : {
4243 slidesToShow : 2 ,
44+ slidesToScroll : 1 ,
4345 }
4446 } ,
4547 {
4648 breakpoint : 800 ,
47- settings : {
48- slidesToShow : 1.5 ,
49- slidesToScroll : 0.5 ,
50- }
51- } ,
52- {
53- breakpoint : 600 ,
5449 settings : {
5550 slidesToShow : 1 ,
5651 slidesToScroll : 1 ,
57- autoplaySpeed : 2000 ,
5852 }
5953 }
6054 ]
@@ -81,15 +75,80 @@ max-width: 100%;
8175 opacity: 1;
8276 }
8377
78+ /* Prevent extreme shrinking on mobile */
79+ .slick-slide > div { min-width: 0; }
80+ .slider .type-one-wrapper { width: 100%; max-width: none; margin: 0 0.5rem; }
81+
82+ @media (max-width: 768px) {
83+ .type-one-wrapper.type-one-wrapper-boxed { max-width: none; padding: 0; }
84+ .type-one-quote .type-one-quote-base,
85+ .type-two-quote .type-two-quote-base { padding-left: 30px; padding-right: 30px; }
86+ }
87+
8488` ;
8589
8690
8791const Reviews = ( ) => {
92+ const [ isClient , setIsClient ] = useState ( false ) ;
93+ const [ slidesToShowState , setSlidesToShowState ] = useState ( null ) ;
94+ const sliderRef = useRef ( null ) ;
95+
96+ const mergedSettings = {
97+ ...settings ,
98+ slidesToShow : slidesToShowState || 1 ,
99+ slidesToScroll : 1 ,
100+ responsive : [ ]
101+ } ;
102+
103+ const computeSlides = ( ) => {
104+ const w = typeof window !== "undefined" ? ( window . innerWidth || document . documentElement . clientWidth ) : 1200 ;
105+ if ( w <= 800 ) return 1 ;
106+ if ( w <= 1024 ) return 2 ;
107+ return 3 ;
108+ } ;
109+
110+ useLayoutEffect ( ( ) => {
111+
112+ setIsClient ( true ) ;
113+ setSlidesToShowState ( computeSlides ( ) ) ;
114+
115+ let resizeTimeout = null ;
116+ const onResizeDebounced = ( ) => {
117+ clearTimeout ( resizeTimeout ) ;
118+ resizeTimeout = setTimeout ( ( ) => {
119+ const slides = computeSlides ( ) ;
120+ setSlidesToShowState ( ( prev ) => {
121+ if ( prev !== slides ) return slides ;
122+ return prev ;
123+ } ) ;
124+ if ( sliderRef . current && sliderRef . current . innerSlider && typeof sliderRef . current . innerSlider . onWindowResized === "function" ) {
125+ sliderRef . current . innerSlider . onWindowResized ( ) ;
126+ }
127+ } , 100 ) ;
128+ } ;
129+
130+ const onLoad = ( ) => onResizeDebounced ( ) ;
131+
132+ window . addEventListener ( "resize" , onResizeDebounced ) ;
133+ window . addEventListener ( "load" , onLoad ) ;
134+ const imgs = document . querySelectorAll ( ".slider img" ) ;
135+ imgs . forEach ( ( img ) => img . addEventListener ( "load" , onLoad ) ) ;
136+
137+ return ( ) => {
138+ window . removeEventListener ( "resize" , onResizeDebounced ) ;
139+ window . removeEventListener ( "load" , onLoad ) ;
140+ imgs . forEach ( ( img ) => img . removeEventListener ( "load" , onLoad ) ) ;
141+ clearTimeout ( resizeTimeout ) ;
142+ } ;
143+ } , [ ] ) ;
144+
145+ if ( ! isClient || slidesToShowState === null ) return null ;
146+
88147 return (
89148 < ReviewsWrapper >
90149 < div className = "slider" >
91150 < h2 > Hear what other users have to say...</ h2 >
92- < Slider { ...settings } >
151+ < Slider key = { `review-slider- ${ slidesToShowState } ` } ref = { sliderRef } { ...mergedSettings } >
93152 { /* <Customers
94153 type="1"
95154 quote="The Meshery Extension transforms Docker Desktop into a powerful load generation utility, conveniently enabling me to deploy and configure any service mesh with a click of the button and invoke and control load-based performance tests from my desktop."
0 commit comments