From bdc944b683be1076fcb5b08c568c6f235e8a3f29 Mon Sep 17 00:00:00 2001 From: Tommi Pisto Date: Fri, 26 Jan 2018 09:43:13 +0200 Subject: [PATCH] fix(react-core): fixes crash when using with webpack-dev-server and Hot Module Reloading (#694) --- packages/dx-react-core/src/plugged/action.jsx | 3 ++ packages/dx-react-core/src/plugged/getter.jsx | 3 ++ .../src/plugged/plugin-indexer.jsx | 9 ++-- .../src/plugged/plugin-indexer.test.jsx | 49 +++++++------------ .../dx-react-core/src/plugged/template.jsx | 4 +- 5 files changed, 31 insertions(+), 37 deletions(-) diff --git a/packages/dx-react-core/src/plugged/action.jsx b/packages/dx-react-core/src/plugged/action.jsx index 9603f93c12..6f7fa4946f 100644 --- a/packages/dx-react-core/src/plugged/action.jsx +++ b/packages/dx-react-core/src/plugged/action.jsx @@ -1,5 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; +import { INDEXABLE_COMPONENT } from './plugin-indexer'; export class Action extends React.PureComponent { componentWillMount() { @@ -26,6 +27,8 @@ export class Action extends React.PureComponent { } } +Action[INDEXABLE_COMPONENT] = true; + Action.propTypes = { position: PropTypes.func, name: PropTypes.string.isRequired, diff --git a/packages/dx-react-core/src/plugged/getter.jsx b/packages/dx-react-core/src/plugged/getter.jsx index 3fda38e287..15d674dca6 100644 --- a/packages/dx-react-core/src/plugged/getter.jsx +++ b/packages/dx-react-core/src/plugged/getter.jsx @@ -5,6 +5,7 @@ import { getAvailableGetters, getAvailableActions, } from '../utils/plugin-helpers'; +import { INDEXABLE_COMPONENT } from './plugin-indexer'; export const UPDATE_CONNECTION = 'updateConnection'; @@ -59,6 +60,8 @@ export class Getter extends React.PureComponent { } } +Getter[INDEXABLE_COMPONENT] = true; + Getter.propTypes = { position: PropTypes.func, name: PropTypes.string.isRequired, diff --git a/packages/dx-react-core/src/plugged/plugin-indexer.jsx b/packages/dx-react-core/src/plugged/plugin-indexer.jsx index 5f3098b6a3..79aa43f993 100644 --- a/packages/dx-react-core/src/plugged/plugin-indexer.jsx +++ b/packages/dx-react-core/src/plugged/plugin-indexer.jsx @@ -1,8 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Getter } from './getter'; -import { Action } from './action'; -import { Template } from './template'; + +export const INDEXABLE_COMPONENT = Symbol('indexableComponent'); export const PluginIndexer = ( { children }, @@ -19,9 +18,7 @@ export const PluginIndexer = ( return [...calculatedPosition, index]; }; - if (child.type === Getter || - child.type === Action || - child.type === Template) { + if (child.type[INDEXABLE_COMPONENT] === true) { return React.cloneElement(child, { position: childPosition }); } diff --git a/packages/dx-react-core/src/plugged/plugin-indexer.test.jsx b/packages/dx-react-core/src/plugged/plugin-indexer.test.jsx index 16b7f61c29..15fa2654de 100644 --- a/packages/dx-react-core/src/plugged/plugin-indexer.test.jsx +++ b/packages/dx-react-core/src/plugged/plugin-indexer.test.jsx @@ -3,20 +3,10 @@ import PropTypes from 'prop-types'; import { mount } from 'enzyme'; import { setupConsole } from '@devexpress/dx-testing'; -import { PluginIndexer } from './plugin-indexer'; -import { Getter } from './getter'; -import { Template } from './template'; -import { Action } from './action'; +import { PluginIndexer, INDEXABLE_COMPONENT } from './plugin-indexer'; -jest.mock('./getter', () => ({ - Getter: () => null, -})); -jest.mock('./action', () => ({ - Action: () => null, -})); -jest.mock('./template', () => ({ - Template: () => null, -})); +const Test = () => null; +Test[INDEXABLE_COMPONENT] = true; describe('PluginIndexer', () => { let resetConsole; @@ -30,35 +20,33 @@ describe('PluginIndexer', () => { it('should correctly determine plugin position', () => { const tree = mount(( - - -