File "blocks.js"

Full path: /home/satitravel/public_html/wp-content/plugins/wp-smushit/_src/js/smush/blocks.js
File size: 3.58 B
MIME-type: text/html
Charset: utf-8

Download   Open   Edit   Advanced Editor &nnbsp; Back

/**
 * BLOCK: extend image block
 */
const { createHigherOrderComponent } = wp.compose,
  { Fragment } = wp.element,
  { InspectorControls } = wp.blockEditor,
  { PanelBody } = wp.components;

/**
 * Transform bytes to human readable format.
 *
 * @param {number} bytes
 * @return {string}  Readable size string.
 */
function humanFileSize(bytes) {
  const thresh = 1024,
    units = ["kB", "MB", "GB", "TB"];

  if (Math.abs(bytes) < thresh) {
    return bytes + " B";
  }

  let u = -1;
  do {
    bytes /= thresh;
    ++u;
  } while (Math.abs(bytes) >= thresh && u < units.length - 1);

  return bytes.toFixed(1) + " " + units[u];
}

/**
 * Generate Smush stats table.
 *
 * @param {number} id
 * @param {Object} stats
 * @return {*}  Smush stats.
 */
export function smushStats(id, stats) {
  if ("undefined" === typeof stats) {
    return window.smush_vars.strings.gb.select_image;
  } else if ("string" === typeof stats) {
    return stats;
  }

  return (
    <div
      id="smush-stats"
      className="sui-smush-media smush-stats-wrapper hidden"
      style={{ display: "block" }}
    >
      <table className="wp-smush-stats-holder">
        <thead>
          <tr>
            <th className="smush-stats-header">
              {window.smush_vars.strings.gb.size}
            </th>
            <th className="smush-stats-header">
              {window.smush_vars.strings.gb.savings}
            </th>
          </tr>
        </thead>
        <tbody>
          {Object.keys(stats.sizes)
            .filter(item => 0 < stats.sizes[item].percent)
            .map((item, i) => (
              <tr key={i}>
                <td>{item.toUpperCase()}</td>
                <td>
                  {humanFileSize(stats.sizes[item].bytes)} ({" "}
                  {stats.sizes[item].percent}% )
                </td>
              </tr>
            ))}
        </tbody>
      </table>
    </div>
  );
}

/**
 * Fetch image data. If image is Smushing, update in 3 seconds.
 *
 * TODO: this could be optimized not to query so much.
 *
 * @param {Object} props
 */
export function fetchProps(props) {
  const image = new wp.api.models.Media({ id: props.attributes.id }),
    smushData = props.attributes.smush;

  image.fetch({ attribute: "smush" }).done(function(img) {
    if ("string" === typeof img.smush) {
      props.setAttributes({ smush: img.smush });
      //setTimeout( () => fetch( props ), 3000 );
    } else if (
      "undefined" !== typeof img.smush &&
      ("undefined" === typeof smushData ||
        JSON.stringify(smushData) !== JSON.stringify(img.smush))
    ) {
      props.setAttributes({ smush: img.smush });
    }
  });
}

/**
 * Modify the block’s edit component.
 * Receives the original block BlockEdit component and returns a new wrapped component.
 */
const smushStatsControl = createHigherOrderComponent(BlockEdit => {
  return props => {
    // If not image block or not selected, return unmodified block.
    if (
      "core/image" !== props.name ||
      !props.isSelected ||
      "undefined" === typeof props.attributes.id
    ) {
      return (
        <Fragment>
          <BlockEdit {...props} />
        </Fragment>
      );
    }

    const smushData = props.attributes.smush;
    fetchProps(props);

    return (
      <Fragment>
        <BlockEdit {...props} />
        <InspectorControls>
          <PanelBody title={window.smush_vars.strings.gb.stats}>
            {smushStats(props.attributes.id, smushData)}
          </PanelBody>
        </InspectorControls>
      </Fragment>
    );
  };
}, "withInspectorControl");

wp.hooks.addFilter(
  "editor.BlockEdit",
  "wp-smush/smush-data-control",
  smushStatsControl
);