@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
JavaScript
;
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