// packages/block-library/src/video/edit.js
import clsx from "clsx";
import { isBlobURL } from "@wordpress/blob";
import {
  Spinner,
  Placeholder,
  __experimentalToolsPanel as ToolsPanel
} from "@wordpress/components";
import {
  BlockControls,
  BlockIcon,
  InspectorControls,
  MediaPlaceholder,
  MediaReplaceFlow,
  useBlockProps,
  useBlockEditingMode
} from "@wordpress/block-editor";
import { useRef, useEffect, useState } from "@wordpress/element";
import { __ } from "@wordpress/i18n";
import { useDispatch } from "@wordpress/data";
import { video as icon } from "@wordpress/icons";
import { store as noticesStore } from "@wordpress/notices";
import { prependHTTPS } from "@wordpress/url";
import { createUpgradedEmbedBlock } from "../embed/util.mjs";
import {
  useUploadMediaFromBlobURL,
  useToolsPanelDropdownMenuProps
} from "../utils/hooks.mjs";
import VideoCommonSettings from "./edit-common-settings.mjs";
import TracksEditor from "./tracks-editor.mjs";
import Tracks from "./tracks.mjs";
import { Caption } from "../utils/caption.mjs";
import PosterImage from "../utils/poster-image.mjs";
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
var ALLOWED_MEDIA_TYPES = ["video"];
function VideoEdit({
  isSelected: isSingleSelected,
  attributes,
  className,
  setAttributes,
  insertBlocksAfter,
  onReplace
}) {
  const videoPlayer = useRef();
  const { id, controls, poster, src, tracks } = attributes;
  const [temporaryURL, setTemporaryURL] = useState(attributes.blob);
  const dropdownMenuProps = useToolsPanelDropdownMenuProps();
  const blockEditingMode = useBlockEditingMode();
  const hasNonContentControls = blockEditingMode === "default";
  useUploadMediaFromBlobURL({
    url: temporaryURL,
    allowedTypes: ALLOWED_MEDIA_TYPES,
    onChange: onSelectVideo,
    onError: onUploadError
  });
  useEffect(() => {
    if (videoPlayer.current) {
      videoPlayer.current.load();
    }
  }, [poster]);
  function onSelectVideo(media) {
    if (!media || !media.url) {
      setAttributes({
        src: void 0,
        id: void 0,
        poster: void 0,
        caption: void 0,
        blob: void 0
      });
      setTemporaryURL();
      return;
    }
    if (isBlobURL(media.url)) {
      setTemporaryURL(media.url);
      return;
    }
    setAttributes({
      blob: void 0,
      src: media.url,
      id: media.id,
      poster: media.image?.src !== media.icon ? media.image?.src : void 0,
      caption: media.caption
    });
    setTemporaryURL();
  }
  function onSelectURL(newSrc) {
    if (newSrc !== src) {
      const url = prependHTTPS(newSrc);
      const embedBlock = createUpgradedEmbedBlock({
        attributes: { url }
      });
      if (void 0 !== embedBlock && onReplace) {
        onReplace(embedBlock);
        return;
      }
      setAttributes({
        blob: void 0,
        src: url,
        id: void 0,
        poster: void 0
      });
      setTemporaryURL();
    }
  }
  const { createErrorNotice } = useDispatch(noticesStore);
  function onUploadError(message) {
    createErrorNotice(message, { type: "snackbar" });
  }
  const placeholder = (content) => {
    return /* @__PURE__ */ jsx(
      Placeholder,
      {
        className: "block-editor-media-placeholder",
        withIllustration: !isSingleSelected,
        icon,
        label: __("Video"),
        instructions: __(
          "Drag and drop a video, upload, or choose from your library."
        ),
        children: content
      }
    );
  };
  const classes = clsx(className, {
    "is-transient": !!temporaryURL
  });
  const blockProps = useBlockProps({
    className: classes
  });
  if (!src && !temporaryURL) {
    return /* @__PURE__ */ jsx("div", { ...blockProps, children: /* @__PURE__ */ jsx(
      MediaPlaceholder,
      {
        icon: /* @__PURE__ */ jsx(BlockIcon, { icon }),
        onSelect: onSelectVideo,
        onSelectURL,
        accept: "video/*",
        allowedTypes: ALLOWED_MEDIA_TYPES,
        value: attributes,
        onError: onUploadError,
        placeholder
      }
    ) });
  }
  return /* @__PURE__ */ jsxs(Fragment, { children: [
    isSingleSelected && /* @__PURE__ */ jsxs(Fragment, { children: [
      /* @__PURE__ */ jsx(BlockControls, { children: /* @__PURE__ */ jsx(
        TracksEditor,
        {
          tracks,
          onChange: (newTracks) => {
            setAttributes({ tracks: newTracks });
          }
        }
      ) }),
      /* @__PURE__ */ jsx(BlockControls, { group: "other", children: /* @__PURE__ */ jsx(
        MediaReplaceFlow,
        {
          mediaId: id,
          mediaURL: src,
          allowedTypes: ALLOWED_MEDIA_TYPES,
          accept: "video/*",
          onSelect: onSelectVideo,
          onSelectURL,
          onError: onUploadError,
          onReset: () => onSelectVideo(void 0),
          variant: "toolbar"
        }
      ) })
    ] }),
    /* @__PURE__ */ jsx(InspectorControls, { children: /* @__PURE__ */ jsxs(
      ToolsPanel,
      {
        label: __("Settings"),
        resetAll: () => {
          setAttributes({
            autoplay: false,
            controls: true,
            loop: false,
            muted: false,
            playsInline: false,
            preload: "metadata",
            poster: void 0
          });
        },
        dropdownMenuProps,
        children: [
          /* @__PURE__ */ jsx(
            VideoCommonSettings,
            {
              setAttributes,
              attributes
            }
          ),
          /* @__PURE__ */ jsx(
            PosterImage,
            {
              poster,
              onChange: (posterImage) => setAttributes({
                poster: posterImage?.url
              })
            }
          )
        ]
      }
    ) }),
    /* @__PURE__ */ jsxs("figure", { ...blockProps, children: [
      /* @__PURE__ */ jsx(
        "video",
        {
          controls,
          inert: !isSingleSelected ? "true" : void 0,
          poster,
          src: src || temporaryURL,
          ref: videoPlayer,
          children: /* @__PURE__ */ jsx(Tracks, { tracks })
        }
      ),
      !!temporaryURL && /* @__PURE__ */ jsx(Spinner, {}),
      /* @__PURE__ */ jsx(
        Caption,
        {
          attributes,
          setAttributes,
          isSelected: isSingleSelected,
          insertBlocksAfter,
          label: __("Video caption text"),
          showToolbarButton: isSingleSelected && hasNonContentControls
        }
      )
    ] })
  ] });
}
var edit_default = VideoEdit;
export {
  edit_default as default
};
//# sourceMappingURL=edit.mjs.map
