From c633c92f03aeea8a4ae08468bd8e896149e4fdee Mon Sep 17 00:00:00 2001 From: Xiaoji Chen Date: Thu, 7 Feb 2019 14:35:36 -0800 Subject: [PATCH] Consolidate InteractiveContext and StaticContext into one (#718) --- src/components/base-control.js | 16 +++++---------- src/components/interactive-map.js | 10 +++------- src/components/map-context.js | 19 ++++++++++++++++++ src/components/static-map.js | 25 +++++++++++------------ src/index.js | 2 +- test/src/components/marker.spec.js | 32 +++++++++++++++--------------- 6 files changed, 56 insertions(+), 48 deletions(-) create mode 100644 src/components/map-context.js diff --git a/src/components/base-control.js b/src/components/base-control.js index 97ccec1b..4178fc5f 100644 --- a/src/components/base-control.js +++ b/src/components/base-control.js @@ -20,8 +20,7 @@ // THE SOFTWARE. import {PureComponent, createElement, createRef} from 'react'; import PropTypes from 'prop-types'; -import {InteractiveContext} from './interactive-map'; -import {StaticContext} from './static-map'; +import MapContext from './map-context'; import type {MjolnirEvent} from 'mjolnir.js'; @@ -132,15 +131,10 @@ export default class BaseControl extends PureComponent { render() { return ( - createElement(InteractiveContext.Consumer, null, - (interactiveContext) => { - // Save event manager - return createElement(StaticContext.Consumer, null, - (staticContext) => { - this._context = Object.assign({}, interactiveContext, staticContext); - return this._render(); - } - ); + createElement(MapContext.Consumer, null, + context => { + this._context = context; + return this._render(); } ) ); diff --git a/src/components/interactive-map.js b/src/components/interactive-map.js index 03b57fcc..fecac442 100644 --- a/src/components/interactive-map.js +++ b/src/components/interactive-map.js @@ -1,5 +1,5 @@ // @flow -import {PureComponent, createElement, createContext, createRef} from 'react'; +import {PureComponent, createElement, createRef} from 'react'; import PropTypes from 'prop-types'; import StaticMap from './static-map'; @@ -7,6 +7,7 @@ import {MAPBOX_LIMITS} from '../utils/map-state'; import WebMercatorViewport from 'viewport-mercator-project'; import TransitionManager from '../utils/transition-manager'; +import MapContext from './map-context'; import {EventManager} from 'mjolnir.js'; import MapController from '../utils/map-controller'; @@ -16,11 +17,6 @@ import type {ViewState} from '../mapbox/mapbox'; import type {StaticMapProps} from './static-map'; import type {MjolnirEvent} from 'mjolnir.js'; -export const InteractiveContext = createContext({ - eventManager: null, - isDragging: false -}); - const propTypes = Object.assign({}, StaticMap.propTypes, { // Additional props on top of StaticMap @@ -442,7 +438,7 @@ export default class InteractiveMap extends PureComponent { map: this._map }; - return createElement(StaticContext.Provider, {value: staticContext}, - createElement('div', { - key: 'map-overlays', - className: 'overlays', - style: CONTAINER_STYLE, - children: this.props.children - }) + return createElement(MapContext.Consumer, null, interactiveContext => + createElement(MapContext.Provider, + {value: Object.assign(staticContext, interactiveContext)}, + createElement('div', { + key: 'map-overlays', + className: 'overlays', + style: CONTAINER_STYLE, + children: this.props.children + }) + ) ); } diff --git a/src/index.js b/src/index.js index fe6633a0..bd031a74 100644 --- a/src/index.js +++ b/src/index.js @@ -44,4 +44,4 @@ export { export {default as MapController} from './utils/map-controller'; // Experimental Features (May change in minor version bumps, use at your own risk) -export {StaticContext as _MapContext} from './components/static-map'; +export {default as _MapContext} from './components/map-context'; diff --git a/test/src/components/marker.spec.js b/test/src/components/marker.spec.js index 3cdc261d..abbfc4a9 100644 --- a/test/src/components/marker.spec.js +++ b/test/src/components/marker.spec.js @@ -5,8 +5,7 @@ import WebMercatorViewport from 'viewport-mercator-project'; import sinon from 'sinon'; import test from 'tape-catch'; -import {StaticContext} from 'react-map-gl/components/static-map'; -import {InteractiveContext} from 'react-map-gl/components/interactive-map'; +import {_MapContext as MapContext} from 'react-map-gl'; const mockStaticContext = { viewport: new WebMercatorViewport({ @@ -17,30 +16,31 @@ const mockStaticContext = { zoom: 14 }) }; -const mockInteractiveContext = { +const mockInteractiveContext = Object.assign({}, mockStaticContext, { eventManager: { on: sinon.spy(), off: sinon.spy() } -}; +}); test('Marker#renders children', t => { t.ok(Marker, 'Marker is defined'); - const staticUsage = React.createElement(StaticContext.Provider, - {value: mockStaticContext}, - React.createElement( - Marker, - { - latitude: 37, - longitude: -122 - }, - React.createElement('div', {className: 'test-marker'}, ['hello']) - ) + const marker = React.createElement( + Marker, + { + latitude: 37, + longitude: -122 + }, + React.createElement('div', {className: 'test-marker'}, ['hello']) ); - const interactiveUsage = React.createElement(InteractiveContext.Provider, + const staticUsage = React.createElement(MapContext.Provider, + {value: mockStaticContext}, + marker + ); + const interactiveUsage = React.createElement(MapContext.Provider, {value: mockInteractiveContext}, - [staticUsage] + marker ); const result = ReactTestRenderer.create(staticUsage);