Material-ui: [Tooltip] disableTouchListener not working

Created on 23 Mar 2020  路  8Comments  路  Source: mui-org/material-ui

  • [x] The issue is present in the latest release.
  • [x] I have searched the issues of this repository and believe that this is not a duplicate.

Current Behavior 馃槸

demo:
160

Expected Behavior 馃

given: Tooltip comp with disableTouchListener prop true
when: User touches button
then: Tooltip should not show

Steps to Reproduce 馃暪

https://codesandbox.io/s/material-demo-seecb

bug 馃悰 Tooltip good first issue

Most helpful comment

@weslenng Start by replacing enzyme for testing-library.

All 8 comments

@devhyunjae Thanks for the bug report. I can reproduce the problem. What do you think of this patch?

diff --git a/packages/material-ui/src/Tooltip/Tooltip.js b/packages/material-ui/src/Tooltip/Tooltip.js
index 1d8154194..c16c11122 100644
--- a/packages/material-ui/src/Tooltip/Tooltip.js
+++ b/packages/material-ui/src/Tooltip/Tooltip.js
@@ -388,13 +388,16 @@ const Tooltip = React.forwardRef(function Tooltip(props, ref) {
     }, leaveDelay);
   };

-  const handleTouchStart = (event) => {
+  const detectTouchStart = (event) => {
     ignoreNonTouchEvents.current = true;
     const childrenProps = children.props;
-
     if (childrenProps.onTouchStart) {
       childrenProps.onTouchStart(event);
     }
+  }
+
+  const handleTouchStart = (event) => {
+    detectTouchStart(event);

     clearTimeout(leaveTimer.current);
     clearTimeout(closeTimer.current);
@@ -447,6 +450,7 @@ const Tooltip = React.forwardRef(function Tooltip(props, ref) {
     ...other,
     ...children.props,
     className: clsx(other.className, children.props.className),
+    onTouchStart: detectTouchStart,
   };

   if (!disableTouchListener) {

Do you want to submit a pull request? We would also need a new test case :).

@oliviertassinari Nah i don't want to make more mess in here 馃槄Up to you mate.

@oliviertassinari I can make a pull request for this. I just need to figure out how to make a test.

@oliviertassinari I was working on this issue but I can't break my test
Any suggestions?

diff --git a/packages/material-ui/src/Tooltip/Tooltip.test.js b/packages/material-ui/src/Tooltip/Tooltip.test.js
index f55e60ace..829dbd80c 100644
--- a/packages/material-ui/src/Tooltip/Tooltip.test.js
+++ b/packages/material-ui/src/Tooltip/Tooltip.test.js
@@ -175,6 +175,15 @@ describe('<Tooltip />', () => {
       wrapper.update();
       assert.strictEqual(wrapper.find(Popper).props().open, false);
     });
+
+    it('should not respond with disableTouchListener', () => {
+      const wrapper = mount(<Tooltip {...defaultProps} disableTouchListener />);
+      const children = wrapper.find('#testChild');
+      children.simulate('touchStart');
+      clock.tick(1000);
+      wrapper.update();
+      assert.strictEqual(wrapper.find('[role="tooltip"]').exists(), false);
+    });
   });

   describe('mount', () => {

@weslenng Start by replacing enzyme for testing-library.

I made the test below, but the Tooltip keeps not rendering
So, I think which the disableTouchListener prop is working correctly 馃

diff --git a/packages/material-ui/src/Tooltip/Tooltip.test.js b/packages/material-ui/src/Tooltip/Tooltip.test.js
index f55e60ace..94cd05c45 100644
--- a/packages/material-ui/src/Tooltip/Tooltip.test.js
+++ b/packages/material-ui/src/Tooltip/Tooltip.test.js
@@ -175,6 +175,21 @@ describe('<Tooltip />', () => {
       wrapper.update();
       assert.strictEqual(wrapper.find(Popper).props().open, false);
     });
+
+    it('should not respond with disableTouchListener', () => {
+      const { baseElement } = render(
+        <Tooltip
+          {...defaultProps}
+          disableTouchListener
+        />,
+      );
+      const children = baseElement.querySelector("#testChild");
+      const firstTouch = new Touch({ target: children });
+      fireEvent.touchStart(children, { touches: [firstTouch] });
+      clock.tick(1500);
+      fireEvent.touchEnd(children, { touches: [firstTouch] });
+      expect(baseElement.querySelector('[role="tooltip"]')).to.equal(null);
+    });
   });

   describe('mount', () => {

I tried to dispatch the touch event manually in the given reproduction and the behavior as the same

For reference, the code who I used is here

Note if I remove the disableTouchListener, the Tooltip renders normally, in both test and reproduction

What do you think?

@weslenng I think that we should reproduce the sequence of events that causes the problem, I suspect it's the focus event that makes the tooltip visible, but I'm not sure, need to console the triggered events.

@devhyunjae What was your use case for disabling the tooltip on touch devices?

Was this page helpful?
0 / 5 - 0 ratings

Related issues

iamzhouyi picture iamzhouyi  路  3Comments

ghost picture ghost  路  3Comments

reflog picture reflog  路  3Comments

revskill10 picture revskill10  路  3Comments

sys13 picture sys13  路  3Comments