@wayz/react-gl
Version:
React Component for DeckGL, Base on AMap, Mapbox GL
53 lines (52 loc) • 1.83 kB
JavaScript
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);
}