2023-09-21 09:26:32 -04:00
/******/ ( function ( ) { // webpackBootstrap
2022-04-11 08:04:30 -04:00
/******/ "use strict" ;
/******/ // The require scope
/******/ var _ _webpack _require _ _ = { } ;
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
2023-09-21 09:26:32 -04:00
/******/ ! function ( ) {
2022-04-11 08:04:30 -04:00
/******/ // getDefaultExport function for compatibility with non-harmony modules
2023-09-21 09:26:32 -04:00
/******/ _ _webpack _require _ _ . n = function ( module ) {
2022-04-11 08:04:30 -04:00
/******/ var getter = module && module . _ _esModule ?
2023-09-21 09:26:32 -04:00
/******/ function ( ) { return module [ 'default' ] ; } :
/******/ function ( ) { return module ; } ;
2022-04-11 08:04:30 -04:00
/******/ _ _webpack _require _ _ . d ( getter , { a : getter } ) ;
/******/ return getter ;
/******/ } ;
2023-09-21 09:26:32 -04:00
/******/ } ( ) ;
2022-04-11 08:04:30 -04:00
/******/
/******/ /* webpack/runtime/define property getters */
2023-09-21 09:26:32 -04:00
/******/ ! function ( ) {
2022-04-11 08:04:30 -04:00
/******/ // define getter functions for harmony exports
2023-09-21 09:26:32 -04:00
/******/ _ _webpack _require _ _ . d = function ( exports , definition ) {
2022-04-11 08:04:30 -04:00
/******/ for ( var key in definition ) {
/******/ if ( _ _webpack _require _ _ . o ( definition , key ) && ! _ _webpack _require _ _ . o ( exports , key ) ) {
/******/ Object . defineProperty ( exports , key , { enumerable : true , get : definition [ key ] } ) ;
/******/ }
/******/ }
2019-09-19 11:19:18 -04:00
/******/ } ;
2023-09-21 09:26:32 -04:00
/******/ } ( ) ;
2022-04-11 08:04:30 -04:00
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
2023-09-21 09:26:32 -04:00
/******/ ! function ( ) {
/******/ _ _webpack _require _ _ . o = function ( obj , prop ) { return Object . prototype . hasOwnProperty . call ( obj , prop ) ; }
/******/ } ( ) ;
2022-04-11 08:04:30 -04:00
/******/
/******/ /* webpack/runtime/make namespace object */
2023-09-21 09:26:32 -04:00
/******/ ! function ( ) {
2022-04-11 08:04:30 -04:00
/******/ // define __esModule on exports
2023-09-21 09:26:32 -04:00
/******/ _ _webpack _require _ _ . r = function ( exports ) {
2022-04-11 08:04:30 -04:00
/******/ if ( typeof Symbol !== 'undefined' && Symbol . toStringTag ) {
/******/ Object . defineProperty ( exports , Symbol . toStringTag , { value : 'Module' } ) ;
/******/ }
/******/ Object . defineProperty ( exports , '__esModule' , { value : true } ) ;
/******/ } ;
2023-09-21 09:26:32 -04:00
/******/ } ( ) ;
2022-04-11 08:04:30 -04:00
/******/
2019-09-19 11:19:18 -04:00
/************************************************************************/
2022-04-11 08:04:30 -04:00
var _ _webpack _exports _ _ = { } ;
2020-06-29 07:50:29 -04:00
// ESM COMPAT FLAG
2019-09-19 11:19:18 -04:00
_ _webpack _require _ _ . r ( _ _webpack _exports _ _ ) ;
2020-06-29 07:50:29 -04:00
// EXPORTS
2022-04-11 08:04:30 -04:00
_ _webpack _require _ _ . d ( _ _webpack _exports _ _ , {
2023-09-21 09:26:32 -04:00
MediaUpload : function ( ) { return /* reexport */ media _upload ; } ,
uploadMedia : function ( ) { return /* reexport */ uploadMedia ; }
2022-04-11 08:04:30 -04:00
} ) ;
; // CONCATENATED MODULE: external ["wp","element"]
2023-09-21 09:26:32 -04:00
var external _wp _element _namespaceObject = window [ "wp" ] [ "element" ] ;
2022-04-11 08:04:30 -04:00
; // CONCATENATED MODULE: external ["wp","i18n"]
2023-09-21 09:26:32 -04:00
var external _wp _i18n _namespaceObject = window [ "wp" ] [ "i18n" ] ;
2022-04-11 08:04:30 -04:00
; // CONCATENATED MODULE: ./node_modules/@wordpress/media-utils/build-module/components/media-upload/index.js
2019-09-19 11:19:18 -04:00
/ * *
* WordPress dependencies
* /
2021-05-19 11:09:27 -04:00
const DEFAULT _EMPTY _GALLERY = [ ] ;
2020-02-17 18:02:14 -05:00
/ * *
* Prepares the Featured Image toolbars and frames .
*
2023-02-07 02:04:52 -05:00
* @ return { window . wp . media . view . MediaFrame . Select } The default media workflow .
2020-02-17 18:02:14 -05:00
* /
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
const getFeaturedImageMediaFrame = ( ) => {
2023-02-07 02:04:52 -05:00
const {
wp
} = window ;
2019-09-19 11:19:18 -04:00
return wp . media . view . MediaFrame . Select . extend ( {
/ * *
* Enables the Set Featured Image Button .
*
* @ param { Object } toolbar toolbar for featured image state
* @ return { void }
* /
2021-05-19 11:09:27 -04:00
featuredImageToolbar ( toolbar ) {
2019-09-19 11:19:18 -04:00
this . createSelectToolbar ( toolbar , {
text : wp . media . view . l10n . setFeaturedImage ,
state : this . options . state
} ) ;
} ,
2020-02-17 18:02:14 -05:00
/ * *
* Handle the edit state requirements of selected media item .
*
* @ return { void }
* /
2021-05-19 11:09:27 -04:00
editState ( ) {
const selection = this . state ( 'featured-image' ) . get ( 'selection' ) ;
const view = new wp . media . view . EditImage ( {
2020-02-17 18:02:14 -05:00
model : selection . single ( ) ,
controller : this
} ) . render ( ) ; // Set the view to the EditImage frame using the selected image.
this . content . set ( view ) ; // After bringing in the frame, load the actual editor via an ajax call.
view . loadEditor ( ) ;
} ,
2019-09-19 11:19:18 -04:00
/ * *
* Create the default states .
*
* @ return { void }
* /
createStates : function createStates ( ) {
this . on ( 'toolbar:create:featured-image' , this . featuredImageToolbar , this ) ;
2020-02-17 18:02:14 -05:00
this . on ( 'content:render:edit-image' , this . editState , this ) ;
this . states . add ( [ new wp . media . controller . FeaturedImage ( ) , new wp . media . controller . EditImage ( {
model : this . options . editImage
} ) ] ) ;
2019-09-19 11:19:18 -04:00
}
} ) ;
2020-02-17 18:02:14 -05:00
} ;
/ * *
* Prepares the Gallery toolbars and frames .
*
2023-02-07 02:04:52 -05:00
* @ return { window . wp . media . view . MediaFrame . Post } The default media workflow .
2020-02-17 18:02:14 -05:00
* /
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
const getGalleryDetailsMediaFrame = ( ) => {
2023-02-07 02:04:52 -05:00
const {
wp
} = window ;
2019-09-19 11:19:18 -04:00
/ * *
* Custom gallery details frame .
*
* @ see https : //github.com/xwp/wp-core-media-widgets/blob/905edbccfc2a623b73a93dac803c5335519d7837/wp-admin/js/widgets/media-gallery-widget.js
* @ class GalleryDetailsMediaFrame
* @ class
* /
2023-02-07 02:04:52 -05:00
2020-02-24 19:18:15 -05:00
return wp . media . view . MediaFrame . Post . extend ( {
2020-02-17 18:02:14 -05:00
/ * *
* Set up gallery toolbar .
*
* @ return { void }
* /
2021-05-19 11:09:27 -04:00
galleryToolbar ( ) {
const editing = this . state ( ) . get ( 'editing' ) ;
2020-02-17 18:02:14 -05:00
this . toolbar . set ( new wp . media . view . Toolbar ( {
controller : this ,
items : {
insert : {
style : 'primary' ,
text : editing ? wp . media . view . l10n . updateGallery : wp . media . view . l10n . insertGallery ,
priority : 80 ,
requires : {
library : true
} ,
/ * *
* @ fires wp . media . controller . State # update
* /
2021-05-19 11:09:27 -04:00
click ( ) {
const controller = this . controller ,
state = controller . state ( ) ;
2020-02-17 18:02:14 -05:00
controller . close ( ) ;
state . trigger ( 'update' , state . get ( 'library' ) ) ; // Restore and reset the default state.
controller . setState ( controller . options . state ) ;
controller . reset ( ) ;
}
2021-05-19 11:09:27 -04:00
2020-02-17 18:02:14 -05:00
}
}
} ) ) ;
} ,
/ * *
* Handle the edit state requirements of selected media item .
*
* @ return { void }
* /
2021-05-19 11:09:27 -04:00
editState ( ) {
const selection = this . state ( 'gallery' ) . get ( 'selection' ) ;
const view = new wp . media . view . EditImage ( {
2020-02-17 18:02:14 -05:00
model : selection . single ( ) ,
controller : this
} ) . render ( ) ; // Set the view to the EditImage frame using the selected image.
this . content . set ( view ) ; // After bringing in the frame, load the actual editor via an ajax call.
view . loadEditor ( ) ;
} ,
2019-09-19 11:19:18 -04:00
/ * *
* Create the default states .
*
* @ return { void }
* /
createStates : function createStates ( ) {
2020-02-17 18:02:14 -05:00
this . on ( 'toolbar:create:main-gallery' , this . galleryToolbar , this ) ;
this . on ( 'content:render:edit-image' , this . editState , this ) ;
2019-09-19 11:19:18 -04:00
this . states . add ( [ new wp . media . controller . Library ( {
id : 'gallery' ,
title : wp . media . view . l10n . createGalleryTitle ,
priority : 40 ,
toolbar : 'main-gallery' ,
filterable : 'uploaded' ,
multiple : 'add' ,
editable : false ,
2022-09-20 11:43:29 -04:00
library : wp . media . query ( {
type : 'image' ,
... this . options . library
} )
2020-02-17 18:02:14 -05:00
} ) , new wp . media . controller . EditImage ( {
model : this . options . editImage
2019-09-19 11:19:18 -04:00
} ) , new wp . media . controller . GalleryEdit ( {
library : this . options . selection ,
editing : this . options . editing ,
menu : 'gallery' ,
displaySettings : false ,
multiple : true
} ) , new wp . media . controller . GalleryAdd ( ) ] ) ;
}
} ) ;
2022-04-12 11:12:47 -04:00
} ; // The media library image object contains numerous attributes
// we only need this set to display the image in the library.
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
const slimImageObject = img => {
const attrSet = [ 'sizes' , 'mime' , 'type' , 'subtype' , 'id' , 'url' , 'alt' , 'link' , 'caption' ] ;
2022-09-20 11:43:29 -04:00
return attrSet . reduce ( ( result , key ) => {
2023-06-27 10:24:19 -04:00
if ( img ? . hasOwnProperty ( key ) ) {
2022-09-20 11:43:29 -04:00
result [ key ] = img [ key ] ;
}
return result ;
} , { } ) ;
2019-09-19 11:19:18 -04:00
} ;
2021-05-19 11:09:27 -04:00
const getAttachmentsCollection = ids => {
2023-02-07 02:04:52 -05:00
const {
wp
} = window ;
2019-09-19 11:19:18 -04:00
return wp . media . query ( {
order : 'ASC' ,
orderby : 'post__in' ,
post _ _in : ids ,
posts _per _page : - 1 ,
query : true ,
type : 'image'
} ) ;
} ;
2022-04-11 08:04:30 -04:00
class MediaUpload extends external _wp _element _namespaceObject . Component {
2023-06-27 10:24:19 -04:00
constructor ( {
allowedTypes ,
gallery = false ,
unstableFeaturedImageFlow = false ,
modalClass ,
multiple = false ,
title = ( 0 , external _wp _i18n _namespaceObject . _ _ ) ( 'Select or Upload Media' )
} ) {
2021-05-19 11:09:27 -04:00
super ( ... arguments ) ;
this . openModal = this . openModal . bind ( this ) ;
this . onOpen = this . onOpen . bind ( this ) ;
this . onSelect = this . onSelect . bind ( this ) ;
this . onUpdate = this . onUpdate . bind ( this ) ;
this . onClose = this . onClose . bind ( this ) ;
2023-02-07 02:04:52 -05:00
const {
wp
} = window ;
2019-09-19 11:19:18 -04:00
if ( gallery ) {
2021-05-19 11:09:27 -04:00
this . buildAndSetGalleryFrame ( ) ;
2019-09-19 11:19:18 -04:00
} else {
2021-05-19 11:09:27 -04:00
const frameConfig = {
title ,
multiple
2019-09-19 11:19:18 -04:00
} ;
if ( ! ! allowedTypes ) {
frameConfig . library = {
type : allowedTypes
} ;
}
2021-05-19 11:09:27 -04:00
this . frame = wp . media ( frameConfig ) ;
2019-09-19 11:19:18 -04:00
}
if ( modalClass ) {
2021-05-19 11:09:27 -04:00
this . frame . $el . addClass ( modalClass ) ;
2019-09-19 11:19:18 -04:00
}
if ( unstableFeaturedImageFlow ) {
2021-05-19 11:09:27 -04:00
this . buildAndSetFeatureImageFrame ( ) ;
2019-09-19 11:19:18 -04:00
}
2021-05-19 11:09:27 -04:00
this . initializeListeners ( ) ;
2019-09-19 11:19:18 -04:00
}
2021-05-19 11:09:27 -04:00
initializeListeners ( ) {
// When an image is selected in the media frame...
this . frame . on ( 'select' , this . onSelect ) ;
this . frame . on ( 'update' , this . onUpdate ) ;
this . frame . on ( 'open' , this . onOpen ) ;
this . frame . on ( 'close' , this . onClose ) ;
}
/ * *
* Sets the Gallery frame and initializes listeners .
*
* @ return { void }
* /
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
buildAndSetGalleryFrame ( ) {
const {
addToGallery = false ,
allowedTypes ,
multiple = false ,
value = DEFAULT _EMPTY _GALLERY
} = this . props ; // If the value did not changed there is no need to rebuild the frame,
// we can continue to use the existing one.
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
if ( value === this . lastGalleryValue ) {
return ;
2019-09-19 11:19:18 -04:00
}
2020-02-17 18:02:14 -05:00
2023-02-07 02:04:52 -05:00
const {
wp
} = window ;
2021-05-19 11:09:27 -04:00
this . lastGalleryValue = value ; // If a frame already existed remove it.
if ( this . frame ) {
2019-09-19 11:19:18 -04:00
this . frame . remove ( ) ;
}
2021-05-19 11:09:27 -04:00
let currentState ;
if ( addToGallery ) {
currentState = 'gallery-library' ;
} else {
currentState = value && value . length ? 'gallery-edit' : 'gallery' ;
2019-09-19 11:19:18 -04:00
}
2021-05-19 11:09:27 -04:00
if ( ! this . GalleryDetailsMediaFrame ) {
this . GalleryDetailsMediaFrame = getGalleryDetailsMediaFrame ( ) ;
2019-09-19 11:19:18 -04:00
}
2021-04-15 11:19:43 -04:00
2021-05-19 11:09:27 -04:00
const attachments = getAttachmentsCollection ( value ) ;
const selection = new wp . media . model . Selection ( attachments . models , {
props : attachments . props . toJSON ( ) ,
multiple
} ) ;
this . frame = new this . GalleryDetailsMediaFrame ( {
mimeType : allowedTypes ,
state : currentState ,
multiple ,
selection ,
editing : value && value . length ? true : false
} ) ;
wp . media . frame = this . frame ;
this . initializeListeners ( ) ;
}
/ * *
* Initializes the Media Library requirements for the featured image flow .
*
* @ return { void }
* /
2019-09-19 11:19:18 -04:00
2021-04-15 11:19:43 -04:00
2021-05-19 11:09:27 -04:00
buildAndSetFeatureImageFrame ( ) {
2023-02-07 02:04:52 -05:00
const {
wp
} = window ;
2021-05-19 11:09:27 -04:00
const featuredImageFrame = getFeaturedImageMediaFrame ( ) ;
const attachments = getAttachmentsCollection ( this . props . value ) ;
const selection = new wp . media . model . Selection ( attachments . models , {
props : attachments . props . toJSON ( )
} ) ;
this . frame = new featuredImageFrame ( {
mimeType : this . props . allowedTypes ,
state : 'featured-image' ,
multiple : this . props . multiple ,
selection ,
editing : this . props . value ? true : false
} ) ;
wp . media . frame = this . frame ;
}
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
componentWillUnmount ( ) {
this . frame . remove ( ) ;
}
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
onUpdate ( selections ) {
const {
onSelect ,
multiple = false
} = this . props ;
const state = this . frame . state ( ) ;
const selectedImages = selections || state . get ( 'selection' ) ;
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
if ( ! selectedImages || ! selectedImages . models . length ) {
return ;
2019-09-19 11:19:18 -04:00
}
2021-05-19 11:09:27 -04:00
if ( multiple ) {
onSelect ( selectedImages . models . map ( model => slimImageObject ( model . toJSON ( ) ) ) ) ;
} else {
onSelect ( slimImageObject ( selectedImages . models [ 0 ] . toJSON ( ) ) ) ;
2019-09-19 11:19:18 -04:00
}
2021-05-19 11:09:27 -04:00
}
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
onSelect ( ) {
const {
onSelect ,
multiple = false
2022-04-12 11:12:47 -04:00
} = this . props ; // Get media attachment details from the frame state.
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
const attachment = this . frame . state ( ) . get ( 'selection' ) . toJSON ( ) ;
onSelect ( multiple ? attachment : attachment [ 0 ] ) ;
}
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
onOpen ( ) {
2023-02-07 02:04:52 -05:00
const {
wp
} = window ;
2022-09-20 11:43:29 -04:00
const {
value
} = this . props ;
this . updateCollection ( ) ; //Handle active tab in media model on model open.
2019-09-19 11:19:18 -04:00
2022-09-20 11:43:29 -04:00
if ( this . props . mode ) {
this . frame . content . mode ( this . props . mode ) ;
} // Handle both this.props.value being either (number[]) multiple ids
2021-05-19 11:09:27 -04:00
// (for galleries) or a (number) singular id (e.g. image block).
2019-09-19 11:19:18 -04:00
2022-09-20 11:43:29 -04:00
2023-06-27 10:24:19 -04:00
const hasMedia = Array . isArray ( value ) ? ! ! value ? . length : ! ! value ;
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
if ( ! hasMedia ) {
return ;
}
2019-09-19 11:19:18 -04:00
2021-11-08 09:29:21 -05:00
const isGallery = this . props . gallery ;
const selection = this . frame . state ( ) . get ( 'selection' ) ;
2022-09-20 11:43:29 -04:00
const valueArray = Array . isArray ( value ) ? value : [ value ] ;
2021-11-08 09:29:21 -05:00
if ( ! isGallery ) {
2022-09-20 11:43:29 -04:00
valueArray . forEach ( id => {
2021-05-19 11:09:27 -04:00
selection . add ( wp . media . attachment ( id ) ) ;
} ) ;
2021-11-08 09:29:21 -05:00
} // Load the images so they are available in the media modal.
2022-09-20 11:43:29 -04:00
const attachments = getAttachmentsCollection ( valueArray ) ; // Once attachments are loaded, set the current selection.
2019-09-19 11:19:18 -04:00
2021-11-08 09:29:21 -05:00
attachments . more ( ) . done ( function ( ) {
2023-06-27 10:24:19 -04:00
if ( isGallery && attachments ? . models ? . length ) {
2021-11-08 09:29:21 -05:00
selection . add ( attachments . models ) ;
}
} ) ;
2021-05-19 11:09:27 -04:00
}
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
onClose ( ) {
const {
onClose
} = this . props ;
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
if ( onClose ) {
onClose ( ) ;
}
}
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
updateCollection ( ) {
const frameContent = this . frame . content . get ( ) ;
2021-04-15 11:19:43 -04:00
2021-05-19 11:09:27 -04:00
if ( frameContent && frameContent . collection ) {
2022-04-12 11:12:47 -04:00
const collection = frameContent . collection ; // Clean all attachments we have in memory.
2019-09-19 11:19:18 -04:00
2022-04-12 11:12:47 -04:00
collection . toArray ( ) . forEach ( model => model . trigger ( 'destroy' , model ) ) ; // Reset has more flag, if library had small amount of items all items may have been loaded before.
2019-09-19 11:19:18 -04:00
2022-04-12 11:12:47 -04:00
collection . mirroring . _hasMore = true ; // Request items.
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
collection . more ( ) ;
}
}
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
openModal ( ) {
if ( this . props . gallery ) {
this . buildAndSetGalleryFrame ( ) ;
}
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
this . frame . open ( ) ;
}
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
render ( ) {
return this . props . render ( {
open : this . openModal
} ) ;
}
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
}
2019-09-19 11:19:18 -04:00
2023-09-21 09:26:32 -04:00
/* harmony default export */ var media _upload = ( MediaUpload ) ;
2020-02-06 16:03:31 -05:00
2022-04-11 08:04:30 -04:00
; // CONCATENATED MODULE: ./node_modules/@wordpress/media-utils/build-module/components/index.js
2020-02-06 16:03:31 -05:00
2020-06-26 09:33:47 -04:00
2022-04-11 08:04:30 -04:00
; // CONCATENATED MODULE: external ["wp","apiFetch"]
2023-09-21 09:26:32 -04:00
var external _wp _apiFetch _namespaceObject = window [ "wp" ] [ "apiFetch" ] ;
2022-04-11 08:04:30 -04:00
var external _wp _apiFetch _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( external _wp _apiFetch _namespaceObject ) ;
; // CONCATENATED MODULE: external ["wp","blob"]
2023-09-21 09:26:32 -04:00
var external _wp _blob _namespaceObject = window [ "wp" ] [ "blob" ] ;
2022-04-11 08:04:30 -04:00
; // CONCATENATED MODULE: ./node_modules/@wordpress/media-utils/build-module/utils/upload-media.js
2019-09-19 11:19:18 -04:00
/ * *
* WordPress dependencies
* /
2022-09-20 11:43:29 -04:00
const noop = ( ) => { } ;
2019-09-19 11:19:18 -04:00
/ * *
* Browsers may use unexpected mime types , and they differ from browser to browser .
* This function computes a flexible array of mime types from the mime type structured provided by the server .
* Converts { jpg | jpeg | jpe : "image/jpeg" } into [ "image/jpeg" , "image/jpg" , "image/jpeg" , "image/jpe" ]
* The computation of this array instead of directly using the object ,
* solves the problem in chrome where mp3 files have audio / mp3 as mime type instead of audio / mpeg .
* https : //bugs.chromium.org/p/chromium/issues/detail?id=227004
*
* @ param { ? Object } wpMimeTypesObject Mime type object received from the server .
* Extensions are keys separated by '|' and values are mime types associated with an extension .
*
* @ return { ? Array } An array of mime types or the parameter passed if it was "falsy" .
* /
2022-09-20 11:43:29 -04:00
2019-09-19 11:19:18 -04:00
function getMimeTypesArray ( wpMimeTypesObject ) {
if ( ! wpMimeTypesObject ) {
return wpMimeTypesObject ;
}
2023-06-27 10:24:19 -04:00
return Object . entries ( wpMimeTypesObject ) . map ( ( [ extensionsString , mime ] ) => {
2021-05-19 11:09:27 -04:00
const [ type ] = mime . split ( '/' ) ;
const extensions = extensionsString . split ( '|' ) ;
2022-09-20 11:43:29 -04:00
return [ mime , ... extensions . map ( extension => ` ${ type } / ${ extension } ` ) ] ;
} ) . flat ( ) ;
2019-09-19 11:19:18 -04:00
}
/ * *
* Media Upload is used by audio , image , gallery , video , and file blocks to
* handle uploading a media file when a file upload button is activated .
*
* TODO : future enhancement to add an upload indicator .
*
2021-11-08 09:29:21 -05:00
* @ param { Object } $0 Parameters object passed to the function .
* @ param { ? Array } $0 . allowedTypes Array with the types of media that can be uploaded , if unset all types are allowed .
* @ param { ? Object } $0 . additionalData Additional data to include in the request .
* @ param { Array } $0 . filesList List of files .
* @ param { ? number } $0 . maxUploadFileSize Maximum upload size in bytes allowed for the site .
* @ param { Function } $0 . onError Function called when an error happens .
* @ param { Function } $0 . onFileChange Function called each time a file or a temporary representation of the file is available .
* @ param { ? Object } $0 . wpAllowedMimeTypes List of allowed mime types and file extensions .
2019-09-19 11:19:18 -04:00
* /
2023-06-27 10:24:19 -04:00
async function uploadMedia ( {
allowedTypes ,
additionalData = { } ,
filesList ,
maxUploadFileSize ,
onError = noop ,
onFileChange ,
wpAllowedMimeTypes = null
} ) {
2022-04-12 11:12:47 -04:00
// Cast filesList to array.
2021-05-19 11:09:27 -04:00
const files = [ ... filesList ] ;
const filesSet = [ ] ;
const setAndUpdateFiles = ( idx , value ) => {
2023-06-27 10:24:19 -04:00
( 0 , external _wp _blob _namespaceObject . revokeBlobURL ) ( filesSet [ idx ] ? . url ) ;
2021-05-19 11:09:27 -04:00
filesSet [ idx ] = value ;
2022-09-20 11:43:29 -04:00
onFileChange ( filesSet . filter ( Boolean ) ) ;
2022-04-12 11:12:47 -04:00
} ; // Allowed type specified by consumer.
2021-05-19 11:09:27 -04:00
const isAllowedType = fileType => {
if ( ! allowedTypes ) {
return true ;
}
2019-09-19 11:19:18 -04:00
2022-09-20 11:43:29 -04:00
return allowedTypes . some ( allowedType => {
2021-05-19 11:09:27 -04:00
// If a complete mimetype is specified verify if it matches exactly the mime type of the file.
2022-09-20 11:43:29 -04:00
if ( allowedType . includes ( '/' ) ) {
2021-05-19 11:09:27 -04:00
return allowedType === fileType ;
} // Otherwise a general mime type is used and we should verify if the file mimetype starts with it.
2019-09-19 11:19:18 -04:00
2022-09-20 11:43:29 -04:00
return fileType . startsWith ( ` ${ allowedType } / ` ) ;
2021-05-19 11:09:27 -04:00
} ) ;
2022-04-12 11:12:47 -04:00
} ; // Allowed types for the current WP_User.
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
const allowedMimeTypesForUser = getMimeTypesArray ( wpAllowedMimeTypes ) ;
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
const isAllowedMimeTypeForUser = fileType => {
2022-09-20 11:43:29 -04:00
return allowedMimeTypesForUser . includes ( fileType ) ;
2021-05-19 11:09:27 -04:00
} ;
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
const validFiles = [ ] ;
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
for ( const mediaFile of files ) {
// Verify if user is allowed to upload this mime type.
// Defer to the server when type not detected.
if ( allowedMimeTypesForUser && mediaFile . type && ! isAllowedMimeTypeForUser ( mediaFile . type ) ) {
2022-09-20 11:43:29 -04:00
onError ( {
2021-05-19 11:09:27 -04:00
code : 'MIME_TYPE_NOT_ALLOWED_FOR_USER' ,
2022-09-20 11:43:29 -04:00
message : ( 0 , external _wp _i18n _namespaceObject . sprintf ) ( // translators: %s: file name.
( 0 , external _wp _i18n _namespaceObject . _ _ ) ( '%s: Sorry, you are not allowed to upload this file type.' ) , mediaFile . name ) ,
2021-05-19 11:09:27 -04:00
file : mediaFile
} ) ;
continue ;
} // Check if the block supports this mime type.
// Defer to the server when type not detected.
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
if ( mediaFile . type && ! isAllowedType ( mediaFile . type ) ) {
2022-09-20 11:43:29 -04:00
onError ( {
2021-05-19 11:09:27 -04:00
code : 'MIME_TYPE_NOT_SUPPORTED' ,
2022-09-20 11:43:29 -04:00
message : ( 0 , external _wp _i18n _namespaceObject . sprintf ) ( // translators: %s: file name.
( 0 , external _wp _i18n _namespaceObject . _ _ ) ( '%s: Sorry, this file type is not supported here.' ) , mediaFile . name ) ,
2021-05-19 11:09:27 -04:00
file : mediaFile
} ) ;
continue ;
2022-04-12 11:12:47 -04:00
} // Verify if file is greater than the maximum file upload size allowed for the site.
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
if ( maxUploadFileSize && mediaFile . size > maxUploadFileSize ) {
2022-09-20 11:43:29 -04:00
onError ( {
2021-05-19 11:09:27 -04:00
code : 'SIZE_ABOVE_LIMIT' ,
2022-09-20 11:43:29 -04:00
message : ( 0 , external _wp _i18n _namespaceObject . sprintf ) ( // translators: %s: file name.
( 0 , external _wp _i18n _namespaceObject . _ _ ) ( '%s: This file exceeds the maximum upload size for this site.' ) , mediaFile . name ) ,
2021-05-19 11:09:27 -04:00
file : mediaFile
} ) ;
continue ;
} // Don't allow empty files to be uploaded.
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
if ( mediaFile . size <= 0 ) {
2022-09-20 11:43:29 -04:00
onError ( {
2021-05-19 11:09:27 -04:00
code : 'EMPTY_FILE' ,
2022-09-20 11:43:29 -04:00
message : ( 0 , external _wp _i18n _namespaceObject . sprintf ) ( // translators: %s: file name.
( 0 , external _wp _i18n _namespaceObject . _ _ ) ( '%s: This file is empty.' ) , mediaFile . name ) ,
2021-05-19 11:09:27 -04:00
file : mediaFile
} ) ;
continue ;
}
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
validFiles . push ( mediaFile ) ; // Set temporary URL to create placeholder media file, this is replaced
2022-04-12 11:12:47 -04:00
// with final file from media gallery when upload is `done` below.
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
filesSet . push ( {
2022-04-11 08:04:30 -04:00
url : ( 0 , external _wp _blob _namespaceObject . createBlobURL ) ( mediaFile )
2021-05-19 11:09:27 -04:00
} ) ;
onFileChange ( filesSet ) ;
}
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
for ( let idx = 0 ; idx < validFiles . length ; ++ idx ) {
const mediaFile = validFiles [ idx ] ;
2019-09-19 11:19:18 -04:00
2021-05-19 11:09:27 -04:00
try {
2023-06-27 10:24:19 -04:00
var _savedMedia$caption$r ;
2022-09-20 11:43:29 -04:00
const savedMedia = await createMediaFromFile ( mediaFile , additionalData ) ; // eslint-disable-next-line camelcase
const {
alt _text ,
source _url ,
... savedMediaProps
} = savedMedia ;
const mediaObject = { ... savedMediaProps ,
2021-05-19 11:09:27 -04:00
alt : savedMedia . alt _text ,
2023-06-27 10:24:19 -04:00
caption : ( _savedMedia$caption$r = savedMedia . caption ? . raw ) !== null && _savedMedia$caption$r !== void 0 ? _savedMedia$caption$r : '' ,
2021-05-19 11:09:27 -04:00
title : savedMedia . title . raw ,
url : savedMedia . source _url
} ;
setAndUpdateFiles ( idx , mediaObject ) ;
} catch ( error ) {
// Reset to empty on failure.
setAndUpdateFiles ( idx , null ) ;
let message ;
2022-09-20 11:43:29 -04:00
if ( error . message ) {
message = error . message ;
2021-05-19 11:09:27 -04:00
} else {
2022-04-11 08:04:30 -04:00
message = ( 0 , external _wp _i18n _namespaceObject . sprintf ) ( // translators: %s: file name
( 0 , external _wp _i18n _namespaceObject . _ _ ) ( 'Error while uploading file %s to the media library.' ) , mediaFile . name ) ;
2019-09-19 11:19:18 -04:00
}
2021-05-19 11:09:27 -04:00
onError ( {
code : 'GENERAL' ,
message ,
file : mediaFile
} ) ;
}
}
2019-09-19 11:19:18 -04:00
}
2021-05-19 11:09:27 -04:00
/ * *
* @ param { File } file Media File to Save .
* @ param { ? Object } additionalData Additional data to include in the request .
*
* @ return { Promise } Media Object Promise .
* /
2019-09-19 11:19:18 -04:00
function createMediaFromFile ( file , additionalData ) {
2022-04-12 11:12:47 -04:00
// Create upload payload.
2021-05-19 11:09:27 -04:00
const data = new window . FormData ( ) ;
2019-09-19 11:19:18 -04:00
data . append ( 'file' , file , file . name || file . type . replace ( '/' , '.' ) ) ;
2022-09-20 11:43:29 -04:00
if ( additionalData ) {
2023-06-27 10:24:19 -04:00
Object . entries ( additionalData ) . forEach ( ( [ key , value ] ) => data . append ( key , value ) ) ;
2022-09-20 11:43:29 -04:00
}
2021-01-27 21:04:13 -05:00
return external _wp _apiFetch _default ( ) ( {
2019-09-19 11:19:18 -04:00
path : '/wp/v2/media' ,
body : data ,
method : 'POST'
} ) ;
}
2022-04-11 08:04:30 -04:00
; // CONCATENATED MODULE: ./node_modules/@wordpress/media-utils/build-module/utils/index.js
2021-05-20 08:20:04 -04:00
2022-04-11 08:04:30 -04:00
; // CONCATENATED MODULE: ./node_modules/@wordpress/media-utils/build-module/index.js
2021-05-20 08:20:04 -04:00
2019-09-19 11:19:18 -04:00
2022-04-11 08:04:30 -04:00
( window . wp = window . wp || { } ) . mediaUtils = _ _webpack _exports _ _ ;
/******/ } ) ( )
;