@roderickhsiao/react-i13n
Version:
[Experiment] React I13n provides a performant and scalable solution to application instrumentation.
124 lines (102 loc) • 5.53 kB
JavaScript
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
/**
* Copyright 2015 - Present, Yahoo Inc.
* Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
*/
import React, { useContext, useMemo } from 'react';
import hoistNonReactStatics from 'hoist-non-react-statics';
import getDisplayName from '../utils/getDisplayName';
import warnAndPrintTrace from '../utils/warnAndPrintTrace';
import CoreComponent from '../components/core/CoreComponent';
import I13nContext from '../components/core/I13nContext';
import useI13nNode from '../hooks/useI13nNode';
var isFunctionalComponent = TargetComponent => typeof TargetComponent === 'function'; // && !(TargetComponent.prototype && TargetComponent.prototype.isReactComponent);
/**
* createI13nNode higher order function to create a Component with I13nNode functionality
* @param {Object|String} Component the component you want to create a i13nNode
* @param {Object} defaultProps default props
* @param {Object} options
* @param {String} options.displayName display name
* @param {String} options.refToWrappedComponent ref name to wrapped component
* @param {Boolean} options.skipUtilFunctionsByProps true to prevent i13n util function to be passed via props.i13n
* @method createI13nNode
*/
function createI13nNode(Component, defaultProps) {
var _options$displayName;
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
if (!Component) {
warnAndPrintTrace('You are passing a null component into createI13nNode');
return null;
}
var componentName = getDisplayName(Component);
var componentIsFunction = isFunctionalComponent(Component);
var {
refToWrappedComponent
} = options;
var I13nComponentWrapper = props => {
var {
// i13n props
bindClickEvent,
follow,
i13n,
i13nModel,
isLeafNode,
scanLinks,
shouldFollowLink,
children
} = props,
restProps = _objectWithoutProperties(props, ["bindClickEvent", "follow", "i13n", "i13nModel", "isLeafNode", "scanLinks", "shouldFollowLink", "children"]);
var {
executeEvent,
i13nInstance,
i13nNode: parentI13nNode
} = useContext(I13nContext);
var i13nProps = _objectSpread({
bindClickEvent,
componentIsFunction,
follow,
i13n,
i13nModel,
isLeafNode,
scanLinks,
shouldFollowLink
}, refToWrappedComponent ? {
ref: refToWrappedComponent // @TODO, won't work here, need to forwardRef
} : {});
var node = /*#__PURE__*/React.createElement(CoreComponent, i13nProps, /*#__PURE__*/React.createElement(Component, restProps, children));
var {
i13nNode
} = useI13nNode({
parentI13nNode,
i13nInstance,
isLeafNode,
i13nModel
}); // overrides node/parent node
var contextValue = useMemo(() => ({
executeEvent,
i13nInstance,
i13nNode,
parentI13nNode
}), [executeEvent, i13nInstance, i13nNode, parentI13nNode]);
return /*#__PURE__*/React.createElement(I13nContext.Provider, {
value: contextValue
}, node);
};
I13nComponentWrapper.displayName = (_options$displayName = options.displayName) !== null && _options$displayName !== void 0 ? _options$displayName : "I13n".concat(componentName);
I13nComponentWrapper.defaultProps = _objectSpread({
i13nModel: undefined,
isLeafNode: false,
bindClickEvent: false,
follow: false,
scanLinks: undefined
}, defaultProps);
if (componentIsFunction) {
return hoistNonReactStatics(I13nComponentWrapper, Component);
}
return I13nComponentWrapper;
}
export default createI13nNode;