@wordpress/server-side-render
Version:
The component used with WordPress to server-side render a preview of dynamic blocks to display in the editor.
120 lines (118 loc) • 4.95 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// packages/server-side-render/src/server-side-render.js
var server_side_render_exports = {};
__export(server_side_render_exports, {
ServerSideRender: () => ServerSideRender,
ServerSideRenderWithPostId: () => ServerSideRenderWithPostId
});
module.exports = __toCommonJS(server_side_render_exports);
var import_element = require("@wordpress/element");
var import_i18n = require("@wordpress/i18n");
var import_components = require("@wordpress/components");
var import_data = require("@wordpress/data");
var import_hook = require("./hook");
var import_jsx_runtime = require("react/jsx-runtime");
var EMPTY_OBJECT = {};
function DefaultEmptyResponsePlaceholder({ className }) {
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Placeholder, { className, children: (0, import_i18n.__)("Block rendered as empty.") });
}
function DefaultErrorResponsePlaceholder({ message, className }) {
const errorMessage = (0, import_i18n.sprintf)(
// translators: %s: error message describing the problem
(0, import_i18n.__)("Error loading block: %s"),
message
);
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Placeholder, { className, children: errorMessage });
}
function DefaultLoadingResponsePlaceholder({ children }) {
const [showLoader, setShowLoader] = (0, import_element.useState)(false);
(0, import_element.useEffect)(() => {
const timeout = setTimeout(() => {
setShowLoader(true);
}, 1e3);
return () => clearTimeout(timeout);
}, []);
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { position: "relative" }, children: [
showLoader && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
"div",
{
style: {
position: "absolute",
top: "50%",
left: "50%",
marginTop: "-9px",
marginLeft: "-9px"
},
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Spinner, {})
}
),
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { opacity: showLoader ? "0.3" : 1 }, children })
] });
}
function ServerSideRender(props) {
const prevContentRef = (0, import_element.useRef)("");
const {
className,
EmptyResponsePlaceholder = DefaultEmptyResponsePlaceholder,
ErrorResponsePlaceholder = DefaultErrorResponsePlaceholder,
LoadingResponsePlaceholder = DefaultLoadingResponsePlaceholder,
...restProps
} = props;
const { content, status, error } = (0, import_hook.useServerSideRender)(restProps);
(0, import_element.useEffect)(() => {
if (content) {
prevContentRef.current = content;
}
}, [content]);
if (status === "loading") {
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoadingResponsePlaceholder, { ...props, children: !!prevContentRef.current && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_element.RawHTML, { className, children: prevContentRef.current }) });
}
if (status === "success" && !content) {
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyResponsePlaceholder, { ...props });
}
if (status === "error") {
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ErrorResponsePlaceholder, { message: error, ...props });
}
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_element.RawHTML, { className, children: content });
}
function ServerSideRenderWithPostId({
urlQueryArgs = EMPTY_OBJECT,
...props
}) {
const currentPostId = (0, import_data.useSelect)((select) => {
const postId = select("core/editor")?.getCurrentPostId();
return postId && typeof postId === "number" ? postId : null;
}, []);
const newUrlQueryArgs = (0, import_element.useMemo)(() => {
if (!currentPostId) {
return urlQueryArgs;
}
return {
post_id: currentPostId,
...urlQueryArgs
};
}, [currentPostId, urlQueryArgs]);
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ServerSideRender, { urlQueryArgs: newUrlQueryArgs, ...props });
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
ServerSideRender,
ServerSideRenderWithPostId
});
//# sourceMappingURL=server-side-render.js.map