From b7f7ebee3967e15c6637f4251d128e9077384afb Mon Sep 17 00:00:00 2001 From: Andrew Musgrave Date: Thu, 15 Nov 2018 15:37:16 -0500 Subject: [PATCH 1/3] Remove deprecated lifecycle method --- .../EventListener/EventListener.tsx | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/components/EventListener/EventListener.tsx b/src/components/EventListener/EventListener.tsx index b5069663964..dd709642ce2 100644 --- a/src/components/EventListener/EventListener.tsx +++ b/src/components/EventListener/EventListener.tsx @@ -4,25 +4,24 @@ import { removeEventListener, } from '@shopify/javascript-utilities/events'; -export interface Props { +export interface BaseEventProps { event: string; capture?: boolean; - passive?: boolean; handler(event: Event): void; } +export interface Props extends BaseEventProps { + passive?: boolean; +} + // see https://github.com/oliviertassinari/react-event-listener/ export default class EventListener extends React.PureComponent { componentDidMount() { this.attachListener(); } - // eslint-disable-next-line react/no-deprecated - componentWillUpdate() { - this.detachListener(); - } - - componentDidUpdate() { + componentDidUpdate({passive, ...detachProps}: Props) { + this.detachListener(detachProps); this.attachListener(); } @@ -39,8 +38,8 @@ export default class EventListener extends React.PureComponent { addEventListener(window, event, handler, {capture, passive}); } - private detachListener() { - const {event, handler, capture} = this.props; + private detachListener(prevProps?: BaseEventProps) { + const {event, handler, capture} = prevProps || this.props; removeEventListener(window, event, handler, capture); } } From bfadbaa661d914062affd6f2e625c6dcf2a54387 Mon Sep 17 00:00:00 2001 From: Andrew Musgrave Date: Thu, 15 Nov 2018 15:40:59 -0500 Subject: [PATCH 2/3] Add test --- .../EventListener/tests/EventListener.test.tsx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/components/EventListener/tests/EventListener.test.tsx b/src/components/EventListener/tests/EventListener.test.tsx index db674a30f8d..a7855c0e81f 100644 --- a/src/components/EventListener/tests/EventListener.test.tsx +++ b/src/components/EventListener/tests/EventListener.test.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; import {mountWithAppProvider} from 'test-utilities'; +import {noop} from '@shopify/javascript-utilities/other'; import EventListener from '../EventListener'; describe('', () => { @@ -17,6 +18,16 @@ describe('', () => { expect(spy).not.toHaveBeenCalled(); }); + it('removes listener on update', () => { + const spy = jest.fn(); + const eventListener = mountWithAppProvider( + , + ); + eventListener.setProps({event: 'scroll', handler: noop}); + window.dispatchEvent(new Event('resize')); + expect(spy).not.toHaveBeenCalled(); + }); + it('removes listener when unmounted', () => { const spy = jest.fn(); mountWithAppProvider( From 001bdd779ce2f7854232df62183bfee9377ca1c1 Mon Sep 17 00:00:00 2001 From: Andrew Musgrave Date: Thu, 15 Nov 2018 15:51:05 -0500 Subject: [PATCH 3/3] changelog --- UNRELEASED.md | 1 + src/components/EventListener/tests/EventListener.test.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/UNRELEASED.md b/UNRELEASED.md index 2141803d171..108b82afd87 100644 --- a/UNRELEASED.md +++ b/UNRELEASED.md @@ -6,6 +6,7 @@ Use [the changelog guidelines](https://git.io/polaris-changelog-guidelines) to f ### Enhancements +- `EventListener` no longer uses `componentWillUpdate` ([#628](https://github.com/Shopify/polaris-react/pull/628)) - Allowed `Icon` to accept a React Node as a source ([#635](https://github.com/Shopify/polaris-react/pull/635)) (thanks to [@mbriggs](https://github.com/mbriggs) for the [original issue](https://github.com/Shopify/polaris-react/issues/449)) ### Bug fixes diff --git a/src/components/EventListener/tests/EventListener.test.tsx b/src/components/EventListener/tests/EventListener.test.tsx index a7855c0e81f..7921678d5d2 100644 --- a/src/components/EventListener/tests/EventListener.test.tsx +++ b/src/components/EventListener/tests/EventListener.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; -import {mountWithAppProvider} from 'test-utilities'; import {noop} from '@shopify/javascript-utilities/other'; +import {mountWithAppProvider} from 'test-utilities'; import EventListener from '../EventListener'; describe('', () => {