From ad2a9a0101c838831f31a932a32cb37d3316c153 Mon Sep 17 00:00:00 2001 From: Harry Date: Tue, 19 Mar 2019 18:50:13 -0700 Subject: [PATCH] fix(Popover): touch not opening popover on mobile (#1425) (#1426) For Popovers/Tooltips with trigger="click" or trigger="legacy", touches on mobile were triggering touchstart and then click, which caused them to open briefly and then immediately close. This removes the touchstart event handling to fix behaviour on mobile. --- src/TooltipPopoverWrapper.js | 8 ++--- src/__tests__/TooltipPopoverWrapper.spec.js | 38 +++++++++++++++++++++ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/TooltipPopoverWrapper.js b/src/TooltipPopoverWrapper.js index 7442712ea..413730fe5 100644 --- a/src/TooltipPopoverWrapper.js +++ b/src/TooltipPopoverWrapper.js @@ -222,9 +222,7 @@ class TooltipPopoverWrapper extends React.Component { let triggers = this.props.trigger.split(' '); if (triggers.indexOf('manual') === -1) { if (triggers.indexOf('click') > -1 || triggers.indexOf('legacy') > -1) { - ['click', 'touchstart'].forEach(event => - document.addEventListener(event, this.handleDocumentClick, true) - ); + document.addEventListener('click', this.handleDocumentClick, true); } if (this._target) { @@ -267,9 +265,7 @@ class TooltipPopoverWrapper extends React.Component { this._target.removeEventListener('focusout', this.hide, true); } - ['click', 'touchstart'].forEach(event => - document.removeEventListener(event, this.handleDocumentClick, true) - ); + document.removeEventListener('click', this.handleDocumentClick, true) } updateTarget() { diff --git a/src/__tests__/TooltipPopoverWrapper.spec.js b/src/__tests__/TooltipPopoverWrapper.spec.js index fadbae5ec..06d003c8c 100644 --- a/src/__tests__/TooltipPopoverWrapper.spec.js +++ b/src/__tests__/TooltipPopoverWrapper.spec.js @@ -229,6 +229,44 @@ describe('Tooltip', () => { wrapper.detach(); }); + it('should open after receiving single touchstart and single click', () => { + const wrapper = mount( + + Tooltip Content + , + { attachTo: container } + ); + + expect(isOpen).toBe(false); + target.dispatchEvent(new Event('touchstart')); + jest.runTimersToTime(20); + target.dispatchEvent(new Event('click')); + jest.runTimersToTime(200); + expect(isOpen).toBe(true); + + wrapper.detach(); + }); + + it('should close after receiving single touchstart and single click', () => { + isOpen = true; + + const wrapper = mount( + + Tooltip Content + , + { attachTo: container } + ); + + expect(isOpen).toBe(true); + target.dispatchEvent(new Event('touchstart')); + jest.runTimersToTime(20); + target.dispatchEvent(new Event('click')); + jest.runTimersToTime(200); + expect(isOpen).toBe(false); + + wrapper.detach(); + }); + it('should pass down custom modifiers', () => { const wrapper = mount(