Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prevent swipe action when intended action is scroll #194

Open
idrisadetunmbi opened this issue Jul 26, 2020 · 9 comments
Open

Prevent swipe action when intended action is scroll #194

idrisadetunmbi opened this issue Jul 26, 2020 · 9 comments

Comments

@idrisadetunmbi
Copy link

I have a container that is vertically scrollable and also includes a onSwipedUp action. When the container is vertically scrolled, the action gets called but that is not the intention at that point. I know it is possible to track the scrolling and prevent the swipe up action until the container is at scroll end, but is there a prop to achieve this internally?

const handlers  = useSwipeable({ onSwipedUp: () => { /* action gets called on scroll as well */ } })

<div {...handlers} style={{ overflowY: "scroll" }}></div> // container is scrollable but onSwipedUp gets called as well```
@hartzis
Copy link
Collaborator

hartzis commented Aug 12, 2020

@idrisadetunmbi There is such a prop, preventDefaultTouchmoveEvent, that calls e.preventDefault for touch move events that have an associated swipe handler.

It is not the best named prop, but should accomplish what you're looking for.

Please let me know if this works for your use case. Cheers.

@hartzis
Copy link
Collaborator

hartzis commented Nov 6, 2020

@idrisadetunmbi We additionally just released v6 which may help with this.

We also added some documentation on possibly using touch-action to prevent scrolling

@hartzis hartzis closed this as completed Mar 2, 2021
@diegohaz
Copy link

diegohaz commented Mar 7, 2022

@hartzis I think the question was the opposite: preventing the swipe event when the user is scrolling.

@idrisadetunmbi How did you solve the problem?

@hartzis
Copy link
Collaborator

hartzis commented Mar 9, 2022

@diegohaz I think you're absolutely right. I dont know where my head was 1½ years ago lol.
@idrisadetunmbi apologies for miss-understanding your question.

🤔 though this is still still quite tricky, how do you decipher a swipe intent vs a scroll intent?

Maybe the new swipeDuration i'm working on in v7 could help?

@hartzis hartzis reopened this Mar 9, 2022
@arifemir
Copy link

is there any solution right now ?

@arifemir
Copy link

is there any solution right now ?

i have a solution its little bit awkward:

  1. create ref from swipeable element.
    <SwipeableComp {...handlers} ref={myRef}/>
  2. when onTouchMove "scroll component", unload the handler's ref
    <ScrollingComp onTouchMove={() => handlers.ref()} />
  3. fill SwipeableComp with myRef while onTouchMove
    <SwipeableComp {...handlers} ref={myRef} onTouchMove={() => handlers.ref(myRef)}

@hartzis
Copy link
Collaborator

hartzis commented Apr 27, 2022

@moshfeu
Copy link

moshfeu commented Jul 25, 2022

For me it didn't help because there is a visual implication on onSwiping.

ezgif.com-gif-maker.mp4

I wish to have a way to prevent swipe up and down which conflicts with vertical scrolling.

I found a way to do it in a hacky way: settings big numbers for delta's up and down. e.g.

delta: {
  up: 1000,
  down: 1000,
},

@guillermodlpa
Copy link

Using swipeDuration: 250 combined with onSwipedDown worked perfectly for me, to enable a user to scroll up and down a dialog but also be able to close it by swiping it down. Thanks @hartzis !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants