@shopify/react-html
Version:
A component to render your react app with no static HTML.
57 lines (56 loc) • 2.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var react_1 = tslib_1.__importDefault(require("react"));
var react_effect_1 = require("@shopify/react-effect");
var context_1 = require("./context");
var hooks_1 = require("./hooks");
exports.EXTRACT_ID = Symbol('serialize');
function useSerialized(id) {
var manager = react_1.default.useContext(context_1.HtmlContext);
var data = react_1.default.useMemo(function () { return manager.getSerialization(id); }, [
id,
manager,
]);
var Serialize = react_1.default.useMemo(function () {
return function Serialize(_a) {
var data = _a.data;
hooks_1.useServerDomEffect(function (manager) {
var result = data();
var handleResult = manager.setSerialization.bind(manager, id);
return typeof result === 'object' &&
result != null &&
isPromise(result)
? result.then(handleResult)
: handleResult(result);
});
return null;
};
}, [id]);
return [data, Serialize];
}
exports.useSerialized = useSerialized;
function createSerializer(id) {
function Serialize(_a) {
var data = _a.data;
var manager = react_1.default.useContext(context_1.HtmlContext);
react_effect_1.useServerEffect(function () {
var result = data();
var handleResult = manager.setSerialization.bind(manager, id);
return typeof result === 'object' && result != null && isPromise(result)
? result.then(handleResult)
: handleResult(result);
}, manager ? manager.effect : undefined);
return null;
}
function WithSerialized(_a) {
var children = _a.children;
var manager = react_1.default.useContext(context_1.HtmlContext);
return children(manager.getSerialization(id));
}
return { Serialize: Serialize, WithSerialized: WithSerialized };
}
exports.createSerializer = createSerializer;
function isPromise(maybePromise) {
return maybePromise != null && maybePromise.then != null;
}