Skip to content

Commit

Permalink
Merge 2ccfc7c into b65c68c
Browse files Browse the repository at this point in the history
  • Loading branch information
victorhmp committed Aug 15, 2019
2 parents b65c68c + 2ccfc7c commit 67ff1b9
Show file tree
Hide file tree
Showing 10 changed files with 50 additions and 29 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.

## [Unreleased]

### Added

- Better handling of `Float` values in `next` and `prev` function calls in the Slider component.

## [0.6.0] - 2019-08-02

### Added
Expand Down
5 changes: 4 additions & 1 deletion manifest.json
Expand Up @@ -8,8 +8,11 @@
"scripts": {
"postreleasy": "vtex publish --verbose"
},
"dependencies": {
"vtex.device-detector": "0.x"
},
"builders": {
"react": "3.x"
},
"$schema": "https://raw.githubusercontent.com/vtex/node-vtex-api/master/gen/manifest.schema"
}
}
9 changes: 9 additions & 0 deletions react/__mocks__/vtex.device-detector.js
@@ -0,0 +1,9 @@
import React from 'react'

export const withDevice = Component => {
const ExtendedComponent = props => <Component isMobile {...props} />

ExtendedComponent.displayName = Component.displayName

return ExtendedComponent
}
2 changes: 1 addition & 1 deletion react/__tests__/SliderContainer.test.js
@@ -1,5 +1,5 @@
import React from 'react'
import { render, fireEvent } from '@vtex/test-tools/react'
import { render } from '@vtex/test-tools/react'

import Slider from '../components/Slider.js'
import Slide from '../components/Slide.js'
Expand Down
1 change: 0 additions & 1 deletion react/__tests__/__snapshots__/Dots.test.js.snap
Expand Up @@ -4,7 +4,6 @@ exports[`<Dots /> component should match snapshot 1`] = `
<DocumentFragment>
<ul
class="dotsContainer absolute ma0 pa0 dib list"
resizedebounce="250"
>
<li
class="dib "
Expand Down
2 changes: 1 addition & 1 deletion react/__tests__/__snapshots__/Slider.test.js.snap
Expand Up @@ -17,7 +17,7 @@ exports[`<Slider /> component should match snapshot 1`] = `
>
<ul
class="sliderFrame list pa0 h-100 ma0 flex"
style="width: 400%; transform: translate3d(0, 0, 0); transition: all 0ms ease-out; cursor: default;"
style="width: 400%; transform: translate3d(-18.75%, 0, 0); transition: all 0ms ease-out; cursor: default;"
>
<li
class="inline-flex h-100 relative overflow-hidden"
Expand Down
4 changes: 2 additions & 2 deletions react/__tests__/__snapshots__/SliderContainer.test.js.snap
Expand Up @@ -13,7 +13,7 @@ exports[`<SliderContainer /> component should match snapshot 1`] = `
>
<ul
class="sliderFrame list pa0 h-100 ma0 flex"
style="width: 200%; transform: translate3d(0, 0, 0); transition: all 0ms ease-out; cursor: default;"
style="width: 200%; transform: translate3d(-37.5%, 0, 0); transition: all 0ms ease-out; cursor: default;"
>
<li
class="inline-flex h-100 relative overflow-hidden"
Expand Down Expand Up @@ -54,7 +54,7 @@ exports[`<SliderContainer /> component should match snapshot with another tag 1`
>
<ul
class="sliderFrame list pa0 h-100 ma0 flex"
style="width: 200%; transform: translate3d(0, 0, 0); transition: all 0ms ease-out; cursor: default;"
style="width: 200%; transform: translate3d(-37.5%, 0, 0); transition: all 0ms ease-out; cursor: default;"
>
<li
class="inline-flex h-100 relative overflow-hidden"
Expand Down
2 changes: 0 additions & 2 deletions react/components/Dots.js
Expand Up @@ -111,7 +111,6 @@ class Dots extends PureComponent {
perPage,
totalSlides,
dotSize,
...otherProps
} = this.props

const classes = {
Expand All @@ -134,7 +133,6 @@ class Dots extends PureComponent {
classes.root,
'absolute ma0 pa0 dib list'
)}
{...otherProps}
>
<EventListener target="window" onResize={this.handleResize} />
{this.slideIndeces.map(i => {
Expand Down
47 changes: 28 additions & 19 deletions react/components/Slider.js
Expand Up @@ -5,7 +5,7 @@ import PropTypes from 'prop-types'
import EventListener from 'react-event-listener'
import styles from './styles.css'
import resolveSlidesNumber from '../utils/resolveSlidesNumber'
import { withRuntimeContext } from 'vtex.render-runtime'
import { withDevice } from 'vtex.device-detector'

import {
getStylingTransition,
Expand Down Expand Up @@ -68,8 +68,8 @@ class Slider extends PureComponent {
threshold: PropTypes.number,
/** If should scroll by page or one item at a time */
scrollByPage: PropTypes.bool,
/** Render runtime context */
runtime: PropTypes.object,
/** Check if on mobile using vtex.device-detector */
isMobile: PropTypes.bool,
draggable: PropTypes.bool,
}

Expand Down Expand Up @@ -110,7 +110,7 @@ class Slider extends PureComponent {
const perPage = resolveSlidesNumber(
nextProps.minPerPage,
nextProps.perPage,
nextProps.runtime
nextProps.isMobile
)
const currentSlideIsClone =
currentSlide < perPage ||
Expand Down Expand Up @@ -143,7 +143,7 @@ class Slider extends PureComponent {
this.perPage = resolveSlidesNumber(
props.minPerPage,
props.perPage,
props.runtime
props.isMobile
)

this.state = {
Expand Down Expand Up @@ -206,7 +206,7 @@ class Slider extends PureComponent {
this.perPage = resolveSlidesNumber(
this.props.minPerPage,
this.props.perPage,
this.props.runtime
this.props.isMobile
)
this._sliderFrameWidth = this._sliderFrame.current.getBoundingClientRect().width
}
Expand All @@ -229,7 +229,7 @@ class Slider extends PureComponent {

fit = () => {
const { minPerPage, perPage, currentSlide, onChangeSlide } = this.props
this.perPage = resolveSlidesNumber(minPerPage, perPage, this.props.runtime)
this.perPage = resolveSlidesNumber(minPerPage, perPage, this.props.isMobile)
const newCurrentSlide =
Math.floor(currentSlide / this.perPage) * this.perPage

Expand Down Expand Up @@ -272,8 +272,9 @@ class Slider extends PureComponent {
}

prev = (howManySlides = 1, dragDistance = 0) => {
const howManyInt = Number.parseInt(howManySlides)
const { onChangeSlide, currentSlide, loop } = this.props
let newCurrentSlide = currentSlide
let newCurrentSlide = Number.parseInt(currentSlide)
let stateCurrentSlide
let enableTransition = true

Expand All @@ -282,16 +283,16 @@ class Slider extends PureComponent {
}

if (loop) {
if (this.isNegativeClone(currentSlide - howManySlides)) {
if (this.isNegativeClone(currentSlide - howManyInt)) {
newCurrentSlide = this.getPositiveClone(currentSlide)
enableTransition = false
stateCurrentSlide = newCurrentSlide - howManySlides
stateCurrentSlide = newCurrentSlide - howManyInt
} else {
newCurrentSlide = currentSlide - howManySlides
newCurrentSlide = currentSlide - howManyInt
stateCurrentSlide = newCurrentSlide
}
} else {
newCurrentSlide = Math.max(currentSlide - howManySlides, 0)
newCurrentSlide = Math.max(currentSlide - howManyInt, 0)
stateCurrentSlide = newCurrentSlide
}

Expand All @@ -306,8 +307,9 @@ class Slider extends PureComponent {
}

next = (howManySlides = 1, dragDistance = 0) => {
const howManyInt = Number.parseInt(howManySlides)
const { onChangeSlide, currentSlide, loop } = this.props
let newCurrentSlide = currentSlide
let newCurrentSlide = Number.parseInt(currentSlide)
let stateCurrentSlide
let enableTransition = true

Expand All @@ -316,17 +318,17 @@ class Slider extends PureComponent {
}

if (loop) {
if (this.isPositiveClone(currentSlide + howManySlides)) {
if (this.isPositiveClone(currentSlide + howManyInt)) {
newCurrentSlide = this.getNegativeClone(currentSlide)
enableTransition = false
stateCurrentSlide = newCurrentSlide + howManySlides
stateCurrentSlide = newCurrentSlide + howManyInt
} else {
newCurrentSlide = currentSlide + howManySlides
newCurrentSlide = currentSlide + howManyInt
stateCurrentSlide = newCurrentSlide
}
} else {
newCurrentSlide = Math.min(
currentSlide + howManySlides,
currentSlide + howManyInt,
this.totalSlides - this.perPage
)
stateCurrentSlide = newCurrentSlide
Expand Down Expand Up @@ -546,8 +548,13 @@ class Slider extends PureComponent {
easing,
duration,
cursor,
isMobile,
minPerPage,
} = this.props
const { enableTransition, dragDistance, firstRender } = this.state
const shouldCenterSlideOnMobile = !Number.isInteger(minPerPage)
const CURRENT_SLIDE_CENTER_SHIFT =
isMobile && shouldCenterSlideOnMobile ? 0.75 : 0

const classes = {
...Slider.defaultProps.classes,
Expand All @@ -563,7 +570,9 @@ class Slider extends PureComponent {
width: `${sliderFrameWidth}%`,
...(this.isMultiPage &&
getTranslateProperty(
(currentSlide / this.totalSlides) * -100 + dragDistance
((currentSlide + CURRENT_SLIDE_CENTER_SHIFT) / this.totalSlides) *
-100 +
dragDistance
)),
...getStylingTransition(easing, enableTransition ? duration : 0),
...(this.isMultiPage && { cursor }),
Expand Down Expand Up @@ -615,4 +624,4 @@ class Slider extends PureComponent {
}
}

export default withRuntimeContext(Slider)
export default withDevice(Slider)
3 changes: 1 addition & 2 deletions react/utils/resolveSlidesNumber.js
Expand Up @@ -14,12 +14,11 @@
* @param {number|object} perPage
* @param {number|undefined} minPerPage
*/
function resolveSlidesNumber(minPerPage, perPage, runtime) {
function resolveSlidesNumber(minPerPage, perPage, isMobile) {
let result = minPerPage || 1
if (typeof perPage === 'number') {
result = perPage
} else if (typeof perPage === 'object') {
const isMobile = runtime && runtime.hints && runtime.hints.mobile
const innerWidth = window && window.innerWidth

/** If it's on SSR, use placeholder screen sizes to get an approximate
Expand Down

0 comments on commit 67ff1b9

Please sign in to comment.