1
+ /* global window */
1
2
import React from 'react' ;
2
3
import PropTypes from 'prop-types' ;
4
+ import sortBy from 'lodash.sortby' ;
3
5
4
6
import SliderTrack from './SliderTrack' ;
5
7
import CardWrapper from './CardWrapper' ;
@@ -10,6 +12,14 @@ import SliderList from './SliderList';
10
12
import Dots from './Dots' ;
11
13
import DefaultDot from './Dot' ;
12
14
15
+ if ( typeof window === 'undefined' ) {
16
+ global . window = {
17
+ addEventListener : ( ) => null ,
18
+ removeEventListener : ( ) => null ,
19
+ innerWidth : 1280 ,
20
+ } ;
21
+ }
22
+
13
23
class Slider extends React . Component {
14
24
constructor ( props ) {
15
25
super ( props ) ;
@@ -20,7 +30,12 @@ class Slider extends React.Component {
20
30
this . renderDots = this . renderDots . bind ( this ) ;
21
31
this . renderLeftArrow = this . renderLeftArrow . bind ( this ) ;
22
32
this . renderRightArrow = this . renderRightArrow . bind ( this ) ;
23
- this . state = { initialCard : 0 , childWidth : 0 , cardsToShow : 0 } ;
33
+ this . updateResponsiveView = this . updateResponsiveView . bind ( this ) ;
34
+ this . state = {
35
+ initialCard : 0 ,
36
+ childWidth : 0 ,
37
+ cardsToShow : 0 ,
38
+ } ;
24
39
}
25
40
26
41
componentDidMount ( ) {
@@ -30,7 +45,33 @@ class Slider extends React.Component {
30
45
this . setState ( { // eslint-disable-line react/no-did-mount-set-state
31
46
childWidth,
32
47
cardsToShow : childrenCount ,
33
- } ) ;
48
+ } , ( ) => this . updateResponsiveView ( ) ) ;
49
+ window . addEventListener ( 'resize' , this . updateResponsiveView ) ;
50
+ }
51
+
52
+ componentWillUnmount ( ) {
53
+ window . removeEventListener ( 'resize' , this . updateResponsiveView ) ;
54
+ }
55
+
56
+ updateResponsiveView ( ) {
57
+ const { children } = this . props ;
58
+ let { responsive } = this . props ;
59
+ const numberOfChildren = children ? children . length || 1 : 0 ;
60
+ if ( responsive ) {
61
+ responsive = sortBy ( responsive , 'breakPoint' ) ;
62
+ let updatedCardsToShow = this . state . cardsToShow ;
63
+ responsive . forEach ( ( { breakPoint, cardsToShow } ) => {
64
+ if ( breakPoint <= window . innerWidth ) {
65
+ updatedCardsToShow = cardsToShow ;
66
+ }
67
+ } ) ;
68
+ const updatedInitialCard = ( numberOfChildren - updatedCardsToShow ) < this . state . initialCard ? ( numberOfChildren - updatedCardsToShow ) : this . state . initialCard ;
69
+ this . setState ( {
70
+ cardsToShow : updatedCardsToShow ,
71
+ childWidth : 100 / updatedCardsToShow ,
72
+ initialCard : updatedInitialCard ,
73
+ } ) ;
74
+ }
34
75
}
35
76
36
77
changeInitialCard ( initialCard ) {
@@ -155,6 +196,7 @@ Slider.defaultProps = {
155
196
afterSlide : null ,
156
197
beforeSlide : null ,
157
198
infinite : true ,
199
+ responsive : null ,
158
200
} ;
159
201
160
202
Slider . propTypes = {
@@ -168,6 +210,10 @@ Slider.propTypes = {
168
210
afterSlide : PropTypes . func ,
169
211
beforeSlide : PropTypes . func ,
170
212
infinite : PropTypes . bool ,
213
+ responsive : PropTypes . arrayOf ( PropTypes . shape ( {
214
+ breakPoint : PropTypes . number . isRequired ,
215
+ cardsToShow : PropTypes . number . isRequired ,
216
+ } ) ) ,
171
217
} ;
172
218
173
219
export default Slider ;
0 commit comments