modules/ui/sections/react_container.js (20 lines of code) (raw):

import React from 'react'; import ReactDom from 'react-dom'; import { uiSection } from '../section'; import ReactComponent from './ReactComponent'; import _debounce from 'lodash-es/debounce'; export function uiSectionReactContainer(context) { let reRenderCount = 0; const chooseBackground = (source) => { context.background().baseLayerSource(source); document.activeElement.blur(); }; const content = (selection) => { const sources = context.background() .sources(context.map().extent(), context.map().zoom(), true) .filter(d => !d.isHidden() && !d.overlay); selection .append('div') .attr('id', 'react-component'); ReactDom.render( <ReactComponent reRenderCount={reRenderCount} sources={sources} selectSourceHandler={chooseBackground}/>, document.getElementById('react-component') ); }; const section = uiSection('react-container', context) .label('A React Component') .disclosureContent(content); context.map() .on('move.react_container', _debounce(() => { reRenderCount++; window.requestIdleCallback(section.reRender); }, 1000) ); return section; }