Skip to content

Commit d29e36e

Browse files
committed
fix preventSwipe not being updatable without re-rendering
implemented by @benkaiser 3DJakob#31
1 parent 25158a0 commit d29e36e

1 file changed

Lines changed: 48 additions & 30 deletions

File tree

index.js

Lines changed: 48 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -202,26 +202,14 @@ const TinderCard = React.forwardRef(({ flickOnSwipe = true, children, onSwipe, o
202202
swipeAlreadyReleased.current = false
203203
}, [swipeAlreadyReleased])
204204

205+
const [offset, setOffset] = React.useState({ x: null, y: null })
206+
const [speed, setSpeed] = React.useState({ x: 0, y: 0 })
207+
const [lastLocation, setLastLocation] = React.useState({ x: 0, y: 0, time: new Date().getTime() })
208+
const [mouseIsClicked, setMouseIsClicked] = React.useState(false)
209+
205210
React.useLayoutEffect(() => {
206-
let offset = { x: null, y: null }
207-
let speed = { x: 0, y: 0 }
208-
let lastLocation = { x: 0, y: 0, time: new Date().getTime() }
209-
let mouseIsClicked = false
210211
let swipeThresholdFulfilledDirection = 'none'
211212

212-
element.current.addEventListener(('touchstart'), (ev) => {
213-
ev.preventDefault()
214-
handleSwipeStart()
215-
offset = { x: -touchCoordinatesFromEvent(ev).x, y: -touchCoordinatesFromEvent(ev).y }
216-
})
217-
218-
element.current.addEventListener(('mousedown'), (ev) => {
219-
ev.preventDefault()
220-
mouseIsClicked = true
221-
handleSwipeStart()
222-
offset = { x: -mouseCoordinatesFromEvent(ev).x, y: -mouseCoordinatesFromEvent(ev).y }
223-
})
224-
225213
const handleMove = (coordinates) => {
226214
// Check fulfillment
227215
if (onSwipeRequirementFulfilled || onSwipeRequirementUnfulfilled) {
@@ -243,39 +231,69 @@ const TinderCard = React.forwardRef(({ flickOnSwipe = true, children, onSwipe, o
243231
onCardLocationChange(lastLocation.x, lastLocation.y)
244232
}
245233

246-
element.current.addEventListener(('touchmove'), (ev) => {
234+
const touchStart = (ev) => {
235+
ev.preventDefault()
236+
handleSwipeStart()
237+
setOffset({ x: -touchCoordinatesFromEvent(ev).x, y: -touchCoordinatesFromEvent(ev).y })
238+
}
239+
element.current.addEventListener(('touchstart'), touchStart)
240+
241+
const mouseDown = (ev) => {
242+
ev.preventDefault()
243+
setMouseIsClicked(true)
244+
handleSwipeStart()
245+
setOffset({ x: -mouseCoordinatesFromEvent(ev).x, y: -mouseCoordinatesFromEvent(ev).y })
246+
}
247+
element.current.addEventListener(('mousedown'), mouseDown)
248+
249+
const touchMove = (ev) => {
247250
ev.preventDefault()
248251
handleMove(touchCoordinatesFromEvent(ev))
249-
})
252+
}
253+
element.current.addEventListener(('touchmove'), touchMove)
250254

251-
element.current.addEventListener(('mousemove'), (ev) => {
255+
const mouseMove = (ev) => {
252256
ev.preventDefault()
253257
if (mouseIsClicked) {
254258
handleMove(mouseCoordinatesFromEvent(ev))
255259
}
256-
})
260+
}
261+
element.current.addEventListener(('mousemove'), mouseMove)
257262

258-
element.current.addEventListener(('touchend'), (ev) => {
263+
const touchEnd = (ev) => {
259264
ev.preventDefault()
260265
handleSwipeReleased(element.current, speed)
261-
})
266+
}
267+
element.current.addEventListener(('touchend'), touchEnd)
262268

263-
element.current.addEventListener(('mouseup'), (ev) => {
269+
const mouseUp = (ev) => {
264270
if (mouseIsClicked) {
265271
ev.preventDefault()
266-
mouseIsClicked = false
272+
setMouseIsClicked(false)
267273
handleSwipeReleased(element.current, speed)
268274
}
269-
})
275+
}
276+
element.current.addEventListener(('mouseup'), mouseUp)
270277

271-
element.current.addEventListener(('mouseleave'), (ev) => {
278+
const mouseLeave = (ev) => {
272279
if (mouseIsClicked) {
273280
ev.preventDefault()
274-
mouseIsClicked = false
281+
setMouseIsClicked(false)
275282
handleSwipeReleased(element.current, speed)
276283
}
277-
})
278-
}, []) // TODO fix so swipeRequirementType can be changed on the fly. Pass as dependency cleanup eventlisteners and update new eventlisteners.
284+
}
285+
element.current.addEventListener(('mouseleave'), mouseLeave)
286+
287+
return () => {
288+
element.current.removeEventListener(('touchstart'), touchStart)
289+
element.current.removeEventListener(('mousedown'), mouseDown)
290+
element.current.removeEventListener(('touchmove'), touchMove)
291+
element.current.removeEventListener(('mousemove'), mouseMove)
292+
element.current.removeEventListener(('touchend'), touchEnd)
293+
element.current.removeEventListener(('mouseup'), mouseUp)
294+
element.current.removeEventListener(('mouseleave'), mouseLeave)
295+
}
296+
}, [preventSwipe, offset, speed, lastLocation, mouseIsClicked])
279297

280298
return (
281299
React.createElement('div', { ref: element, className }, children)

0 commit comments

Comments
 (0)