UNPKG

@wayz/react-gl

Version:

React Component for DeckGL, Base on AMap, Mapbox GL

53 lines (52 loc) 1.83 kB
import React, { createElement } from 'react'; import { inheritsFrom } from './inherits-from'; import { Layer, View } from '@deck.gl/core'; // recursively wrap render callbacks in `View` function wrapInView(node) { if (!node) { return node; } if (typeof node === 'function') { // React.Children does not traverse functions. // All render callbacks must be protected under a <View> return createElement(View, {}, node); } if (Array.isArray(node)) { return node.map(wrapInView); } if (node.type === React.Fragment) { return wrapInView(node.props.children); } if (inheritsFrom(node.type, View)) { return node; } return node; } // extracts any deck.gl layers masquerading as react elements from props.children export function extractTsxLayers(children) { const jsxLayers = []; // extracted layer from react children, will add to deck.gl layer array // React.children React.Children.forEach(wrapInView(children), (reactElement) => { if (reactElement) { // For some reason Children.forEach doesn't filter out `null`s const ElementType = reactElement.type; if (inheritsFrom(ElementType, Layer)) { const layer = createLayer(ElementType, reactElement.props); jsxLayers.push(layer); } } }); return jsxLayers; } function createLayer(LayerType, reactProps) { const props = {}; // Layer.defaultProps is treated as ReactElement.defaultProps and merged into react props // Remove them const defaultProps = LayerType.defaultProps || {}; for (const key in reactProps) { if (defaultProps[key] !== reactProps[key]) { props[key] = reactProps[key]; } } return new LayerType(props); }