UNPKG

@vandrei977/react-native-render-html

Version:

The hackable, full-featured Open Source HTML rendering solution for React Native.

140 lines (136 loc) 5.58 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.renderSourcePropTypes = exports.default = void 0; var _equals = _interopRequireDefault(require("ramda/src/equals")); var _react = _interopRequireWildcard(require("react")); var _reactNative = require("react-native"); var _propTypes = _interopRequireDefault(require("prop-types")); var _ttreeEventsContext = _interopRequireDefault(require("./context/ttreeEventsContext")); var _isUriSource = _interopRequireDefault(require("./helpers/isUriSource")); var _SourceLoaderUri = _interopRequireDefault(require("./SourceLoaderUri")); var _SourceLoaderInline = _interopRequireDefault(require("./SourceLoaderInline")); var _SourceLoaderDom = _interopRequireDefault(require("./SourceLoaderDom")); var _debugMessages = _interopRequireDefault(require("./debugMessages")); var _contentWidthContext = _interopRequireDefault(require("./context/contentWidthContext")); var _isDomSource = _interopRequireDefault(require("./helpers/isDomSource")); var _useProfiler = _interopRequireDefault(require("./hooks/useProfiler")); var _jsxRuntime = require("react/jsx-runtime"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const renderSourcePropTypes = exports.renderSourcePropTypes = { source: _propTypes.default.oneOfType([_propTypes.default.shape({ html: _propTypes.default.string.isRequired, baseUrl: _propTypes.default.string }), _propTypes.default.shape({ dom: _propTypes.default.object.isRequired, baseUrl: _propTypes.default.string }), _propTypes.default.shape({ uri: _propTypes.default.string.isRequired, method: _propTypes.default.string, body: _propTypes.default.any, headers: _propTypes.default.object })]), onTTreeChange: _propTypes.default.func, onHTMLLoaded: _propTypes.default.func, onDocumentMetadataLoaded: _propTypes.default.func, contentWidth: _propTypes.default.number }; function isEmptySource(source) { return !source || typeof source.uri !== 'string' && typeof source.html !== 'string' && !source.dom; } function RawSourceLoader({ source, ...props }) { if (isEmptySource(source)) { /* istanbul ignore next */ if (typeof __DEV__ === 'boolean' && __DEV__) { console.warn(_debugMessages.default.noSource); } return null; } if ((0, _isUriSource.default)(source)) { return /*#__PURE__*/_react.default.createElement(_SourceLoaderUri.default, { source, ...props }); } if ((0, _isDomSource.default)(source)) { return /*#__PURE__*/_react.default.createElement(_SourceLoaderDom.default, { source, ...props }); } return /*#__PURE__*/_react.default.createElement(_SourceLoaderInline.default, { source, ...props }); } // check if for each key of two objects, the values are equal function shallowEqual(prop1, prop2) { if (!(0, _equals.default)(Object.keys(prop1), Object.keys(prop2))) { return false; } for (const key in prop1) { if (prop1[key] !== prop2[key]) { return false; } } return true; } /** * A React component to render HTML snippets. * * @remarks This component is useful when you have to load dozens of HTML * snippets with the same config. Performance is expected to improve in such * scenarios. * * @warning This component requires to have {@link TRenderEngineProvider} * and {@link RenderHTMLConfigProvider} as parents. */ const RenderHTMLSource = /*#__PURE__*/(0, _react.memo)(function RenderHtmlSource({ onDocumentMetadataLoaded, onTTreeChange, contentWidth, ...props }) { const profile = (0, _useProfiler.default)({ prop: 'onDocumentMetadataLoaded or onTTreeChange' }); const ttreeEvents = (0, _react.useMemo)(() => { typeof __DEV__ === 'boolean' && __DEV__ && profile(); return { onDocumentMetadataLoaded, onTTreeChange }; }, [onDocumentMetadataLoaded, onTTreeChange, profile]); if (typeof __DEV__ === 'boolean' && __DEV__) { if (!(typeof contentWidth === 'number')) { console.warn(_debugMessages.default.contentWidth); } } return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ttreeEventsContext.default.Provider, { value: ttreeEvents, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_contentWidthContext.default.Provider, { value: contentWidth || _reactNative.Dimensions.get('window').width, children: /*#__PURE__*/_react.default.createElement(RawSourceLoader, props) }) }); }, ({ source: prevSource, ...prev }, { source: currSource, ...curr }) => { return shallowEqual(prevSource, currSource) && shallowEqual(prev, curr); }); /** * @ignore */ RenderHTMLSource.propTypes = renderSourcePropTypes; var _default = exports.default = RenderHTMLSource; //# sourceMappingURL=RenderHTMLSource.js.map