[ Index ]

PHP Cross Reference of WordPress Trunk (Updated Daily)

Search

title

Body

[close]

/wp-includes/js/dist/ -> server-side-render.js (source)

   1  (function() {
   2  "use strict";
   3  var wp;
   4  (wp ||= {}).serverSideRender = (() => {
   5    var __create = Object.create;
   6    var __defProp = Object.defineProperty;
   7    var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
   8    var __getOwnPropNames = Object.getOwnPropertyNames;
   9    var __getProtoOf = Object.getPrototypeOf;
  10    var __hasOwnProp = Object.prototype.hasOwnProperty;
  11    var __commonJS = (cb, mod) => function __require() {
  12      return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
  13    };
  14    var __export = (target, all) => {
  15      for (var name in all)
  16        __defProp(target, name, { get: all[name], enumerable: true });
  17    };
  18    var __copyProps = (to, from, except, desc) => {
  19      if (from && typeof from === "object" || typeof from === "function") {
  20        for (let key of __getOwnPropNames(from))
  21          if (!__hasOwnProp.call(to, key) && key !== except)
  22            __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  23      }
  24      return to;
  25    };
  26    var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
  27      // If the importer is in node compatibility mode or this is not an ESM
  28      // file that has been converted to a CommonJS file using a Babel-
  29      // compatible transform (i.e. "__esModule" has not been set), then set
  30      // "default" to the CommonJS "module.exports" for node compatibility.
  31      isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
  32      mod
  33    ));
  34    var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
  35  
  36    // package-external:@wordpress/element
  37    var require_element = __commonJS({
  38      "package-external:@wordpress/element"(exports, module) {
  39        module.exports = window.wp.element;
  40      }
  41    });
  42  
  43    // package-external:@wordpress/i18n
  44    var require_i18n = __commonJS({
  45      "package-external:@wordpress/i18n"(exports, module) {
  46        module.exports = window.wp.i18n;
  47      }
  48    });
  49  
  50    // package-external:@wordpress/components
  51    var require_components = __commonJS({
  52      "package-external:@wordpress/components"(exports, module) {
  53        module.exports = window.wp.components;
  54      }
  55    });
  56  
  57    // package-external:@wordpress/data
  58    var require_data = __commonJS({
  59      "package-external:@wordpress/data"(exports, module) {
  60        module.exports = window.wp.data;
  61      }
  62    });
  63  
  64    // package-external:@wordpress/compose
  65    var require_compose = __commonJS({
  66      "package-external:@wordpress/compose"(exports, module) {
  67        module.exports = window.wp.compose;
  68      }
  69    });
  70  
  71    // package-external:@wordpress/api-fetch
  72    var require_api_fetch = __commonJS({
  73      "package-external:@wordpress/api-fetch"(exports, module) {
  74        module.exports = window.wp.apiFetch;
  75      }
  76    });
  77  
  78    // package-external:@wordpress/url
  79    var require_url = __commonJS({
  80      "package-external:@wordpress/url"(exports, module) {
  81        module.exports = window.wp.url;
  82      }
  83    });
  84  
  85    // package-external:@wordpress/blocks
  86    var require_blocks = __commonJS({
  87      "package-external:@wordpress/blocks"(exports, module) {
  88        module.exports = window.wp.blocks;
  89      }
  90    });
  91  
  92    // vendor-external:react/jsx-runtime
  93    var require_jsx_runtime = __commonJS({
  94      "vendor-external:react/jsx-runtime"(exports, module) {
  95        module.exports = window.ReactJSXRuntime;
  96      }
  97    });
  98  
  99    // packages/server-side-render/build-module/index.mjs
 100    var index_exports = {};
 101    __export(index_exports, {
 102      ServerSideRender: () => ServerSideRenderWithPostId,
 103      default: () => index_default,
 104      useServerSideRender: () => useServerSideRender
 105    });
 106  
 107    // packages/server-side-render/build-module/server-side-render.mjs
 108    var import_element2 = __toESM(require_element(), 1);
 109    var import_i18n = __toESM(require_i18n(), 1);
 110    var import_components = __toESM(require_components(), 1);
 111    var import_data = __toESM(require_data(), 1);
 112  
 113    // packages/server-side-render/build-module/hook.mjs
 114    var import_compose = __toESM(require_compose(), 1);
 115    var import_element = __toESM(require_element(), 1);
 116    var import_api_fetch = __toESM(require_api_fetch(), 1);
 117    var import_url = __toESM(require_url(), 1);
 118    var import_blocks = __toESM(require_blocks(), 1);
 119    function rendererPath(block, attributes = null, urlQueryArgs = {}) {
 120      return (0, import_url.addQueryArgs)(`/wp/v2/block-renderer/$block}`, {
 121        context: "edit",
 122        ...null !== attributes ? { attributes } : {},
 123        ...urlQueryArgs
 124      });
 125    }
 126    function removeBlockSupportAttributes(attributes) {
 127      const {
 128        backgroundColor,
 129        borderColor,
 130        fontFamily,
 131        fontSize,
 132        gradient,
 133        textColor,
 134        className,
 135        ...restAttributes
 136      } = attributes;
 137      const {
 138        border,
 139        color,
 140        elements,
 141        shadow,
 142        spacing,
 143        typography,
 144        ...restStyles
 145      } = attributes?.style || {};
 146      return {
 147        ...restAttributes,
 148        style: restStyles
 149      };
 150    }
 151    function useServerSideRender(args) {
 152      const [response, setResponse] = (0, import_element.useState)({
 153        status: "idle"
 154      });
 155      const shouldDebounceRef = (0, import_element.useRef)(false);
 156      const {
 157        attributes,
 158        block,
 159        skipBlockSupportAttributes = false,
 160        httpMethod = "GET",
 161        urlQueryArgs
 162      } = args;
 163      let sanitizedAttributes = attributes && (0, import_blocks.sanitizeBlockAttributes)(block, attributes);
 164      if (skipBlockSupportAttributes && sanitizedAttributes) {
 165        sanitizedAttributes = removeBlockSupportAttributes(sanitizedAttributes);
 166      }
 167      const isPostRequest = "POST" === httpMethod;
 168      const urlAttributes = isPostRequest ? null : sanitizedAttributes;
 169      const path = rendererPath(block, urlAttributes, urlQueryArgs);
 170      const body = isPostRequest ? JSON.stringify({ attributes: sanitizedAttributes ?? null }) : void 0;
 171      (0, import_element.useEffect)(() => {
 172        const controller = new AbortController();
 173        const debouncedFetch = (0, import_compose.debounce)(
 174          function() {
 175            {
 176              setResponse({ status: "loading" });
 177              (0, import_api_fetch.default)({
 178                path,
 179                method: isPostRequest ? "POST" : "GET",
 180                body,
 181                headers: isPostRequest ? {
 182                  "Content-Type": "application/json"
 183                } : {},
 184                signal: controller.signal
 185              }).then((res) => {
 186                setResponse({
 187                  status: "success",
 188                  content: res ? res.rendered : ""
 189                });
 190              }).catch((error) => {
 191                if (error instanceof Error && error.name === "AbortError") {
 192                  return;
 193                }
 194                setResponse({
 195                  status: "error",
 196                  error: error instanceof Error ? error.message : String(error)
 197                });
 198              }).finally(() => {
 199                shouldDebounceRef.current = true;
 200              });
 201            }
 202          },
 203          shouldDebounceRef.current ? 500 : 0
 204        );
 205        debouncedFetch();
 206        return () => {
 207          controller.abort();
 208          debouncedFetch.cancel();
 209        };
 210      }, [path, isPostRequest, body]);
 211      return response;
 212    }
 213  
 214    // packages/server-side-render/build-module/server-side-render.mjs
 215    var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
 216    var EMPTY_OBJECT = {};
 217    function DefaultEmptyResponsePlaceholder({ className }) {
 218      return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Placeholder, { className, children: (0, import_i18n.__)("Block rendered as empty.") });
 219    }
 220    function DefaultErrorResponsePlaceholder({
 221      message,
 222      className
 223    }) {
 224      const errorMessage = (0, import_i18n.sprintf)(
 225        // translators: %s: error message describing the problem
 226        (0, import_i18n.__)("Error loading block: %s"),
 227        message || (0, import_i18n.__)("Unknown error")
 228      );
 229      return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Placeholder, { className, children: errorMessage });
 230    }
 231    function DefaultLoadingResponsePlaceholder({
 232      children
 233    }) {
 234      const [showLoader, setShowLoader] = (0, import_element2.useState)(false);
 235      (0, import_element2.useEffect)(() => {
 236        const timeout = setTimeout(() => {
 237          setShowLoader(true);
 238        }, 1e3);
 239        return () => clearTimeout(timeout);
 240      }, []);
 241      return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { position: "relative" }, children: [
 242        showLoader && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
 243          "div",
 244          {
 245            style: {
 246              position: "absolute",
 247              top: "50%",
 248              left: "50%",
 249              marginTop: "-9px",
 250              marginLeft: "-9px"
 251            },
 252            children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Spinner, {})
 253          }
 254        ),
 255        /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { opacity: showLoader ? "0.3" : 1 }, children })
 256      ] });
 257    }
 258    function ServerSideRender(props) {
 259      const prevContentRef = (0, import_element2.useRef)("");
 260      const {
 261        className,
 262        EmptyResponsePlaceholder = DefaultEmptyResponsePlaceholder,
 263        ErrorResponsePlaceholder = DefaultErrorResponsePlaceholder,
 264        LoadingResponsePlaceholder = DefaultLoadingResponsePlaceholder,
 265        ...restProps
 266      } = props;
 267      const { content, status, error } = useServerSideRender(restProps);
 268      (0, import_element2.useEffect)(() => {
 269        if (content) {
 270          prevContentRef.current = content;
 271        }
 272      }, [content]);
 273      if (status === "loading") {
 274        return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoadingResponsePlaceholder, { ...props, children: !!prevContentRef.current && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_element2.RawHTML, {
 275          className,
 276          // eslint-disable-next-line react-hooks/refs
 277          children: prevContentRef.current
 278        }) });
 279      }
 280      if (status === "success" && !content) {
 281        return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyResponsePlaceholder, { ...props });
 282      }
 283      if (status === "error") {
 284        return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ErrorResponsePlaceholder, { message: error, ...props });
 285      }
 286      return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_element2.RawHTML, { className, children: content || "" });
 287    }
 288    function ServerSideRenderWithPostId({
 289      urlQueryArgs = EMPTY_OBJECT,
 290      ...props
 291    }) {
 292      const currentPostId = (0, import_data.useSelect)((select) => {
 293        const editorStore = select("core/editor");
 294        const postId = editorStore?.getCurrentPostId?.();
 295        return postId && typeof postId === "number" ? postId : null;
 296      }, []);
 297      const newUrlQueryArgs = (0, import_element2.useMemo)(() => {
 298        if (!currentPostId) {
 299          return urlQueryArgs;
 300        }
 301        return {
 302          post_id: currentPostId,
 303          ...urlQueryArgs
 304        };
 305      }, [currentPostId, urlQueryArgs]);
 306      return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ServerSideRender, { urlQueryArgs: newUrlQueryArgs, ...props });
 307    }
 308  
 309    // packages/server-side-render/build-module/index.mjs
 310    var ServerSideRenderCompat = ServerSideRenderWithPostId;
 311    ServerSideRenderCompat.ServerSideRender = ServerSideRenderWithPostId;
 312    ServerSideRenderCompat.useServerSideRender = useServerSideRender;
 313    var index_default = ServerSideRenderCompat;
 314    return __toCommonJS(index_exports);
 315  })();
 316  if (typeof wp.serverSideRender === 'object' && wp.serverSideRender.default) { wp.serverSideRender = wp.serverSideRender.default; }
 317  (window.wp ||= {}).serverSideRender = wp.serverSideRender;
 318  })();


Generated : Thu Aug 13 08:20:23 2026 Cross-referenced by PHPXref