@elementor/wp-media 4.1.0-819 → 4.1.0-821
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +16 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/hooks/use-wp-media-frame.ts +22 -3
- package/src/types/wp-media.ts +1 -1
package/dist/index.d.mts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -129,7 +129,9 @@ function createFrame({
|
|
|
129
129
|
mediaTypes,
|
|
130
130
|
selected,
|
|
131
131
|
title,
|
|
132
|
-
mode = "browse"
|
|
132
|
+
mode = "browse",
|
|
133
|
+
currentUrl,
|
|
134
|
+
currentAlt
|
|
133
135
|
}) {
|
|
134
136
|
const frame = media_default()({
|
|
135
137
|
title,
|
|
@@ -140,11 +142,11 @@ function createFrame({
|
|
|
140
142
|
...allowUrlImport ? { frame: "post" } : {}
|
|
141
143
|
}).on("open", () => {
|
|
142
144
|
setTypeCaller(frame);
|
|
143
|
-
applyMode(frame, mode);
|
|
145
|
+
applyMode(frame, mode, currentUrl, currentAlt);
|
|
144
146
|
if (mode !== "url") {
|
|
145
147
|
applySelection(frame, selected);
|
|
146
148
|
}
|
|
147
|
-
}).on("
|
|
149
|
+
}).on("insert select", () => select(frame, multiple, onSelect, onSelectUrl));
|
|
148
150
|
if (allowUrlImport) {
|
|
149
151
|
frame.on("ready open", () => restrictFrameMenu(frame));
|
|
150
152
|
}
|
|
@@ -155,9 +157,19 @@ function cleanupFrame(frame) {
|
|
|
155
157
|
frame?.detach();
|
|
156
158
|
frame?.remove();
|
|
157
159
|
}
|
|
158
|
-
function applyMode(frame, mode = "browse") {
|
|
160
|
+
function applyMode(frame, mode = "browse", currentUrl, currentAlt) {
|
|
159
161
|
if (mode === "url") {
|
|
160
162
|
frame.setState("embed");
|
|
163
|
+
if (currentUrl || currentAlt) {
|
|
164
|
+
setTimeout(() => {
|
|
165
|
+
if (currentUrl) {
|
|
166
|
+
frame.state()?.props?.set("url", currentUrl);
|
|
167
|
+
}
|
|
168
|
+
if (currentAlt) {
|
|
169
|
+
frame.state()?.props?.set("alt", currentAlt);
|
|
170
|
+
}
|
|
171
|
+
}, 0);
|
|
172
|
+
}
|
|
161
173
|
} else {
|
|
162
174
|
frame.content.mode(mode);
|
|
163
175
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/hooks/use-wp-media-attachment.ts","../src/errors.ts","../src/media.ts","../src/normalize.ts","../src/get-media-attachment.ts","../src/hooks/use-wp-media-frame.ts","../src/wp-plupload-settings.ts"],"sourcesContent":["export type { Attachment } from './types/attachment';\nexport type { OpenOptions, MediaType } from './hooks/use-wp-media-frame';\n\nexport { default as useWpMediaAttachment } from './hooks/use-wp-media-attachment';\nexport { default as useWpMediaFrame } from './hooks/use-wp-media-frame';\n\nexport { getMediaAttachment } from './get-media-attachment';\n","import { useQuery } from '@elementor/query';\n\nimport { getMediaAttachment } from '../get-media-attachment';\n\nexport default function useWpMediaAttachment( id: number | null ) {\n\treturn useQuery( {\n\t\tqueryKey: [ 'wp-attachment', id ],\n\t\tqueryFn: () => getMediaAttachment( { id } ),\n\t\tenabled: !! id,\n\t} );\n}\n","import { createError } from '@elementor/utils';\n\nexport const WpMediaNotAvailableError = createError( {\n\tcode: 'wp_media_not_available',\n\tmessage: '`wp.media` is not available, make sure the `media-models` handle is set in the dependencies array',\n} );\n\nexport const WpPluploadSettingsNotAvailableError = createError( {\n\tcode: 'wp_plupload_settings_not_available',\n\tmessage: '`_wpPluploadSettings` is not available, make sure a wp media uploader is open',\n} );\n","import { WpMediaNotAvailableError } from './errors';\nimport { type WpMediaWindow } from './types/wp-media';\n\nconst wpMediaWindow = window as unknown as WpMediaWindow;\n\nexport default () => {\n\tif ( ! wpMediaWindow.wp?.media ) {\n\t\tthrow new WpMediaNotAvailableError();\n\t}\n\n\treturn wpMediaWindow.wp.media;\n};\n","import { type Attachment } from './types/attachment';\nimport { type WpAttachmentJSON } from './types/wp-media';\n\nexport default function normalize( attachment: WpAttachmentJSON ): Attachment {\n\tconst { filesizeInBytes, filesizeHumanReadable, author, authorName, ...rest } = attachment;\n\n\treturn {\n\t\t...rest,\n\t\tfilesize: {\n\t\t\tinBytes: filesizeInBytes,\n\t\t\thumanReadable: filesizeHumanReadable,\n\t\t},\n\t\tauthor: {\n\t\t\tid: parseInt( author ),\n\t\t\tname: authorName,\n\t\t},\n\t};\n}\n","import media from './media';\nimport normalize from './normalize';\n\nexport async function getMediaAttachment( { id }: { id: number | null } ) {\n\tif ( ! id ) {\n\t\treturn null;\n\t}\n\n\tconst model = media().attachment( id );\n\tconst wpAttachment = model.toJSON();\n\n\tconst isFetched = 'url' in wpAttachment;\n\n\tif ( isFetched ) {\n\t\treturn normalize( wpAttachment );\n\t}\n\n\ttry {\n\t\treturn normalize( await model.fetch() );\n\t} catch {\n\t\treturn null;\n\t}\n}\n","import { useEffect, useRef } from 'react';\n\nimport media from '../media';\nimport normalize from '../normalize';\nimport { type Attachment } from '../types/attachment';\nimport { type MediaFrame } from '../types/wp-media';\nimport wpPluploadSettings from '../wp-plupload-settings';\n\nexport type OpenOptions = {\n\tmode?: 'upload' | 'browse' | 'url';\n};\n\nexport type MediaType = 'image' | 'svg' | 'video';\n\ntype Options = {\n\tmediaTypes: MediaType[];\n\ttitle?: string;\n\tallowUrlImport?: boolean;\n\tonSelectUrl?: ( url: string, alt?: string ) => void;\n} & (\n\t| {\n\t\t\tmultiple: true;\n\t\t\tselected: Array< number | null >;\n\t\t\tonSelect: ( val: Attachment[] ) => void;\n\t }\n\t| {\n\t\t\tmultiple: false;\n\t\t\tselected: number | null;\n\t\t\tonSelect: ( val: Attachment ) => void;\n\t }\n);\n\nexport default function useWpMediaFrame( options: Options ) {\n\tconst frame = useRef< MediaFrame >();\n\n\tconst open = ( openOptions: OpenOptions = {} ) => {\n\t\tcleanupFrame( frame.current );\n\n\t\tframe.current = createFrame( { ...options, ...openOptions } );\n\n\t\tframe.current?.open();\n\t};\n\n\tuseEffect( () => {\n\t\treturn () => {\n\t\t\tcleanupFrame( frame.current );\n\t\t};\n\t}, [] );\n\n\treturn {\n\t\topen,\n\t};\n}\n\nfunction createFrame( {\n\tonSelect,\n\tonSelectUrl,\n\tallowUrlImport,\n\tmultiple,\n\tmediaTypes,\n\tselected,\n\ttitle,\n\tmode = 'browse',\n}: Options & OpenOptions ) {\n\tconst frame: MediaFrame = media()( {\n\t\ttitle,\n\t\tmultiple,\n\t\tlibrary: {\n\t\t\ttype: getMimeTypes( mediaTypes ),\n\t\t},\n\t\t...( allowUrlImport ? { frame: 'post' } : {} ),\n\t} )\n\t\t.on( 'open', () => {\n\t\t\tsetTypeCaller( frame );\n\t\t\tapplyMode( frame, mode );\n\t\t\tif ( mode !== 'url' ) {\n\t\t\t\tapplySelection( frame, selected );\n\t\t\t}\n\t\t} )\n\t\t.on( 'close', () => cleanupFrame( frame ) )\n\t\t.on( 'insert select', () => select( frame, multiple, onSelect, onSelectUrl ) );\n\n\tif ( allowUrlImport ) {\n\t\tframe.on( 'ready open', () => restrictFrameMenu( frame ) );\n\t}\n\n\thandleExtensions( frame, mediaTypes );\n\n\treturn frame;\n}\n\nfunction cleanupFrame( frame?: MediaFrame ) {\n\tframe?.detach();\n\tframe?.remove();\n}\n\nfunction applyMode( frame: MediaFrame, mode: OpenOptions[ 'mode' ] = 'browse' ) {\n\tif ( mode === 'url' ) {\n\t\tframe.setState( 'embed' );\n\t} else {\n\t\tframe.content.mode( mode );\n\t}\n}\n\nfunction applySelection( frame: MediaFrame, selected: number | null | Array< number | null > ) {\n\tconst selectedAttachments = ( typeof selected === 'number' ? [ selected ] : selected )\n\t\t?.filter( ( id ) => !! id )\n\t\t.map( ( id ) => media().attachment( id as number ) );\n\n\tframe\n\t\t.state()\n\t\t.get( 'selection' )\n\t\t.set( selectedAttachments || [] );\n}\n\nfunction select(\n\tframe: MediaFrame,\n\tmultiple: boolean,\n\tonSelect: Options[ 'onSelect' ],\n\tonSelectUrl?: Options[ 'onSelectUrl' ]\n) {\n\tconst state = frame.state();\n\n\tif ( state.get( 'id' ) === 'embed' ) {\n\t\tif ( onSelectUrl ) {\n\t\t\tconst url = state.props?.get( 'url' );\n\t\t\tconst alt = state.props?.get( 'alt' );\n\t\t\tif ( url ) {\n\t\t\t\tonSelectUrl( url, alt );\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n\tconst attachments = state.get( 'selection' ).toJSON().map( normalize );\n\n\tconst onSelectFn = onSelect as ( val: Attachment | Attachment[] ) => void;\n\n\tonSelectFn( multiple ? attachments : attachments[ 0 ] );\n}\n\nconst FRAME_MENU_ITEMS_TO_REMOVE = [\n\t'#menu-item-gallery',\n\t'#menu-item-featured-image',\n\t'#menu-item-playlist',\n\t'#menu-item-video-playlist',\n].join( ',' );\n\nfunction restrictFrameMenu( frame: MediaFrame ) {\n\tframe.$el?.find( FRAME_MENU_ITEMS_TO_REMOVE )?.remove();\n}\n\nfunction setTypeCaller( frame: MediaFrame ) {\n\tframe.uploader.uploader.param( 'uploadTypeCaller', 'elementor-wp-media-upload' );\n}\n\nfunction handleExtensions( frame: MediaFrame, mediaTypes: MediaType[] ) {\n\tconst defaultExtensions = wpPluploadSettings().defaults.filters.mime_types?.[ 0 ]?.extensions;\n\n\t// Set extensions by media types\n\tframe.on( 'ready', () => {\n\t\twpPluploadSettings().defaults.filters.mime_types = [ { extensions: getExtensions( mediaTypes ) } ];\n\t} );\n\n\t// Restore default upload extensions\n\tframe.on( 'close', () => {\n\t\twpPluploadSettings().defaults.filters.mime_types = defaultExtensions\n\t\t\t? [ { extensions: defaultExtensions } ]\n\t\t\t: [];\n\t} );\n}\n\nconst imageExtensions = [ 'avif', 'bmp', 'gif', 'ico', 'jpe', 'jpeg', 'jpg', 'png', 'webp' ];\nconst videoExtensions = [ 'mp4', 'webm', 'ogg', 'mov', 'm4v', 'avi', 'wmv', 'mpg', 'mpeg', '3gp', '3g2' ];\n\nfunction getMimeTypes( mediaTypes: MediaType[] ) {\n\tconst mimeTypesPerType: Record< MediaType, string[] > = {\n\t\timage: imageExtensions.map( ( extension ) => `image/${ extension }` ),\n\t\tsvg: [ 'image/svg+xml' ],\n\t\tvideo: [\n\t\t\t'video/mp4',\n\t\t\t'video/webm',\n\t\t\t'video/ogg',\n\t\t\t'video/quicktime',\n\t\t\t'video/x-m4v',\n\t\t\t'video/avi',\n\t\t\t'video/x-ms-wmv',\n\t\t\t'video/mpeg',\n\t\t\t'video/3gpp',\n\t\t\t'video/3gpp2',\n\t\t],\n\t};\n\n\treturn mediaTypes.reduce( ( prev, currentType ) => {\n\t\treturn prev.concat( mimeTypesPerType[ currentType ] );\n\t}, [] as string[] );\n}\n\nfunction getExtensions( mediaTypes: MediaType[] ) {\n\tconst extensionsPerType: Record< MediaType, string[] > = {\n\t\timage: imageExtensions,\n\t\tsvg: [ 'svg' ],\n\t\tvideo: videoExtensions,\n\t};\n\n\tconst extensions = mediaTypes.reduce( ( prev, currentType ) => {\n\t\treturn prev.concat( extensionsPerType[ currentType ] );\n\t}, [] as string[] );\n\n\treturn extensions.join( ',' );\n}\n","import { WpPluploadSettingsNotAvailableError } from './errors';\nimport { type WpPluploadSettingsWindow } from './types/plupload';\n\nconst wpPluploadSettingsWindow = window as unknown as WpPluploadSettingsWindow;\n\nexport default () => {\n\tif ( ! wpPluploadSettingsWindow._wpPluploadSettings ) {\n\t\tthrow new WpPluploadSettingsNotAvailableError();\n\t}\n\n\treturn wpPluploadSettingsWindow._wpPluploadSettings;\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/hooks/use-wp-media-attachment.ts","../src/errors.ts","../src/media.ts","../src/normalize.ts","../src/get-media-attachment.ts","../src/hooks/use-wp-media-frame.ts","../src/wp-plupload-settings.ts"],"sourcesContent":["export type { Attachment } from './types/attachment';\nexport type { OpenOptions, MediaType } from './hooks/use-wp-media-frame';\n\nexport { default as useWpMediaAttachment } from './hooks/use-wp-media-attachment';\nexport { default as useWpMediaFrame } from './hooks/use-wp-media-frame';\n\nexport { getMediaAttachment } from './get-media-attachment';\n","import { useQuery } from '@elementor/query';\n\nimport { getMediaAttachment } from '../get-media-attachment';\n\nexport default function useWpMediaAttachment( id: number | null ) {\n\treturn useQuery( {\n\t\tqueryKey: [ 'wp-attachment', id ],\n\t\tqueryFn: () => getMediaAttachment( { id } ),\n\t\tenabled: !! id,\n\t} );\n}\n","import { createError } from '@elementor/utils';\n\nexport const WpMediaNotAvailableError = createError( {\n\tcode: 'wp_media_not_available',\n\tmessage: '`wp.media` is not available, make sure the `media-models` handle is set in the dependencies array',\n} );\n\nexport const WpPluploadSettingsNotAvailableError = createError( {\n\tcode: 'wp_plupload_settings_not_available',\n\tmessage: '`_wpPluploadSettings` is not available, make sure a wp media uploader is open',\n} );\n","import { WpMediaNotAvailableError } from './errors';\nimport { type WpMediaWindow } from './types/wp-media';\n\nconst wpMediaWindow = window as unknown as WpMediaWindow;\n\nexport default () => {\n\tif ( ! wpMediaWindow.wp?.media ) {\n\t\tthrow new WpMediaNotAvailableError();\n\t}\n\n\treturn wpMediaWindow.wp.media;\n};\n","import { type Attachment } from './types/attachment';\nimport { type WpAttachmentJSON } from './types/wp-media';\n\nexport default function normalize( attachment: WpAttachmentJSON ): Attachment {\n\tconst { filesizeInBytes, filesizeHumanReadable, author, authorName, ...rest } = attachment;\n\n\treturn {\n\t\t...rest,\n\t\tfilesize: {\n\t\t\tinBytes: filesizeInBytes,\n\t\t\thumanReadable: filesizeHumanReadable,\n\t\t},\n\t\tauthor: {\n\t\t\tid: parseInt( author ),\n\t\t\tname: authorName,\n\t\t},\n\t};\n}\n","import media from './media';\nimport normalize from './normalize';\n\nexport async function getMediaAttachment( { id }: { id: number | null } ) {\n\tif ( ! id ) {\n\t\treturn null;\n\t}\n\n\tconst model = media().attachment( id );\n\tconst wpAttachment = model.toJSON();\n\n\tconst isFetched = 'url' in wpAttachment;\n\n\tif ( isFetched ) {\n\t\treturn normalize( wpAttachment );\n\t}\n\n\ttry {\n\t\treturn normalize( await model.fetch() );\n\t} catch {\n\t\treturn null;\n\t}\n}\n","import { useEffect, useRef } from 'react';\n\nimport media from '../media';\nimport normalize from '../normalize';\nimport { type Attachment } from '../types/attachment';\nimport { type MediaFrame } from '../types/wp-media';\nimport wpPluploadSettings from '../wp-plupload-settings';\n\nexport type OpenOptions = {\n\tmode?: 'upload' | 'browse' | 'url';\n\tcurrentUrl?: string;\n\tcurrentAlt?: string;\n};\n\nexport type MediaType = 'image' | 'svg' | 'video';\n\ntype Options = {\n\tmediaTypes: MediaType[];\n\ttitle?: string;\n\tallowUrlImport?: boolean;\n\tonSelectUrl?: ( url: string, alt?: string ) => void;\n} & (\n\t| {\n\t\t\tmultiple: true;\n\t\t\tselected: Array< number | null >;\n\t\t\tonSelect: ( val: Attachment[] ) => void;\n\t }\n\t| {\n\t\t\tmultiple: false;\n\t\t\tselected: number | null;\n\t\t\tonSelect: ( val: Attachment ) => void;\n\t }\n);\n\nexport default function useWpMediaFrame( options: Options ) {\n\tconst frame = useRef< MediaFrame >();\n\n\tconst open = ( openOptions: OpenOptions = {} ) => {\n\t\tcleanupFrame( frame.current );\n\n\t\tframe.current = createFrame( { ...options, ...openOptions } );\n\n\t\tframe.current?.open();\n\t};\n\n\tuseEffect( () => {\n\t\treturn () => {\n\t\t\tcleanupFrame( frame.current );\n\t\t};\n\t}, [] );\n\n\treturn {\n\t\topen,\n\t};\n}\n\nfunction createFrame( {\n\tonSelect,\n\tonSelectUrl,\n\tallowUrlImport,\n\tmultiple,\n\tmediaTypes,\n\tselected,\n\ttitle,\n\tmode = 'browse',\n\tcurrentUrl,\n\tcurrentAlt,\n}: Options & OpenOptions ) {\n\tconst frame: MediaFrame = media()( {\n\t\ttitle,\n\t\tmultiple,\n\t\tlibrary: {\n\t\t\ttype: getMimeTypes( mediaTypes ),\n\t\t},\n\t\t...( allowUrlImport ? { frame: 'post' } : {} ),\n\t} )\n\t\t.on( 'open', () => {\n\t\t\tsetTypeCaller( frame );\n\t\t\tapplyMode( frame, mode, currentUrl, currentAlt );\n\t\t\tif ( mode !== 'url' ) {\n\t\t\t\tapplySelection( frame, selected );\n\t\t\t}\n\t\t} )\n\t\t.on( 'insert select', () => select( frame, multiple, onSelect, onSelectUrl ) );\n\n\tif ( allowUrlImport ) {\n\t\tframe.on( 'ready open', () => restrictFrameMenu( frame ) );\n\t}\n\n\thandleExtensions( frame, mediaTypes );\n\n\treturn frame;\n}\n\nfunction cleanupFrame( frame?: MediaFrame ) {\n\tframe?.detach();\n\tframe?.remove();\n}\n\nfunction applyMode(\n\tframe: MediaFrame,\n\tmode: OpenOptions[ 'mode' ] = 'browse',\n\tcurrentUrl?: string,\n\tcurrentAlt?: string\n) {\n\tif ( mode === 'url' ) {\n\t\tframe.setState( 'embed' );\n\t\tif ( currentUrl || currentAlt ) {\n\t\t\t// Defer so the toolbar region is initialized before change:url triggers its refresh callback.\n\t\t\tsetTimeout( () => {\n\t\t\t\tif ( currentUrl ) {\n\t\t\t\t\tframe.state()?.props?.set( 'url', currentUrl );\n\t\t\t\t}\n\t\t\t\tif ( currentAlt ) {\n\t\t\t\t\tframe.state()?.props?.set( 'alt', currentAlt );\n\t\t\t\t}\n\t\t\t}, 0 );\n\t\t}\n\t} else {\n\t\tframe.content.mode( mode );\n\t}\n}\n\nfunction applySelection( frame: MediaFrame, selected: number | null | Array< number | null > ) {\n\tconst selectedAttachments = ( typeof selected === 'number' ? [ selected ] : selected )\n\t\t?.filter( ( id ) => !! id )\n\t\t.map( ( id ) => media().attachment( id as number ) );\n\n\tframe\n\t\t.state()\n\t\t.get( 'selection' )\n\t\t.set( selectedAttachments || [] );\n}\n\nfunction select(\n\tframe: MediaFrame,\n\tmultiple: boolean,\n\tonSelect: Options[ 'onSelect' ],\n\tonSelectUrl?: Options[ 'onSelectUrl' ]\n) {\n\tconst state = frame.state();\n\n\tif ( state.get( 'id' ) === 'embed' ) {\n\t\tif ( onSelectUrl ) {\n\t\t\tconst url = state.props?.get( 'url' );\n\t\t\tconst alt = state.props?.get( 'alt' );\n\t\t\tif ( url ) {\n\t\t\t\tonSelectUrl( url, alt );\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n\tconst attachments = state.get( 'selection' ).toJSON().map( normalize );\n\n\tconst onSelectFn = onSelect as ( val: Attachment | Attachment[] ) => void;\n\n\tonSelectFn( multiple ? attachments : attachments[ 0 ] );\n}\n\nconst FRAME_MENU_ITEMS_TO_REMOVE = [\n\t'#menu-item-gallery',\n\t'#menu-item-featured-image',\n\t'#menu-item-playlist',\n\t'#menu-item-video-playlist',\n].join( ',' );\n\nfunction restrictFrameMenu( frame: MediaFrame ) {\n\tframe.$el?.find( FRAME_MENU_ITEMS_TO_REMOVE )?.remove();\n}\n\nfunction setTypeCaller( frame: MediaFrame ) {\n\tframe.uploader.uploader.param( 'uploadTypeCaller', 'elementor-wp-media-upload' );\n}\n\nfunction handleExtensions( frame: MediaFrame, mediaTypes: MediaType[] ) {\n\tconst defaultExtensions = wpPluploadSettings().defaults.filters.mime_types?.[ 0 ]?.extensions;\n\n\t// Set extensions by media types\n\tframe.on( 'ready', () => {\n\t\twpPluploadSettings().defaults.filters.mime_types = [ { extensions: getExtensions( mediaTypes ) } ];\n\t} );\n\n\t// Restore default upload extensions\n\tframe.on( 'close', () => {\n\t\twpPluploadSettings().defaults.filters.mime_types = defaultExtensions\n\t\t\t? [ { extensions: defaultExtensions } ]\n\t\t\t: [];\n\t} );\n}\n\nconst imageExtensions = [ 'avif', 'bmp', 'gif', 'ico', 'jpe', 'jpeg', 'jpg', 'png', 'webp' ];\nconst videoExtensions = [ 'mp4', 'webm', 'ogg', 'mov', 'm4v', 'avi', 'wmv', 'mpg', 'mpeg', '3gp', '3g2' ];\n\nfunction getMimeTypes( mediaTypes: MediaType[] ) {\n\tconst mimeTypesPerType: Record< MediaType, string[] > = {\n\t\timage: imageExtensions.map( ( extension ) => `image/${ extension }` ),\n\t\tsvg: [ 'image/svg+xml' ],\n\t\tvideo: [\n\t\t\t'video/mp4',\n\t\t\t'video/webm',\n\t\t\t'video/ogg',\n\t\t\t'video/quicktime',\n\t\t\t'video/x-m4v',\n\t\t\t'video/avi',\n\t\t\t'video/x-ms-wmv',\n\t\t\t'video/mpeg',\n\t\t\t'video/3gpp',\n\t\t\t'video/3gpp2',\n\t\t],\n\t};\n\n\treturn mediaTypes.reduce( ( prev, currentType ) => {\n\t\treturn prev.concat( mimeTypesPerType[ currentType ] );\n\t}, [] as string[] );\n}\n\nfunction getExtensions( mediaTypes: MediaType[] ) {\n\tconst extensionsPerType: Record< MediaType, string[] > = {\n\t\timage: imageExtensions,\n\t\tsvg: [ 'svg' ],\n\t\tvideo: videoExtensions,\n\t};\n\n\tconst extensions = mediaTypes.reduce( ( prev, currentType ) => {\n\t\treturn prev.concat( extensionsPerType[ currentType ] );\n\t}, [] as string[] );\n\n\treturn extensions.join( ',' );\n}\n","import { WpPluploadSettingsNotAvailableError } from './errors';\nimport { type WpPluploadSettingsWindow } from './types/plupload';\n\nconst wpPluploadSettingsWindow = window as unknown as WpPluploadSettingsWindow;\n\nexport default () => {\n\tif ( ! wpPluploadSettingsWindow._wpPluploadSettings ) {\n\t\tthrow new WpPluploadSettingsNotAvailableError();\n\t}\n\n\treturn wpPluploadSettingsWindow._wpPluploadSettings;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAyB;;;ACAzB,mBAA4B;AAErB,IAAM,+BAA2B,0BAAa;AAAA,EACpD,MAAM;AAAA,EACN,SAAS;AACV,CAAE;AAEK,IAAM,0CAAsC,0BAAa;AAAA,EAC/D,MAAM;AAAA,EACN,SAAS;AACV,CAAE;;;ACPF,IAAM,gBAAgB;AAEtB,IAAO,gBAAQ,MAAM;AACpB,MAAK,CAAE,cAAc,IAAI,OAAQ;AAChC,UAAM,IAAI,yBAAyB;AAAA,EACpC;AAEA,SAAO,cAAc,GAAG;AACzB;;;ACRe,SAAR,UAA4B,YAA2C;AAC7E,QAAM,EAAE,iBAAiB,uBAAuB,QAAQ,YAAY,GAAG,KAAK,IAAI;AAEhF,SAAO;AAAA,IACN,GAAG;AAAA,IACH,UAAU;AAAA,MACT,SAAS;AAAA,MACT,eAAe;AAAA,IAChB;AAAA,IACA,QAAQ;AAAA,MACP,IAAI,SAAU,MAAO;AAAA,MACrB,MAAM;AAAA,IACP;AAAA,EACD;AACD;;;ACdA,eAAsB,mBAAoB,EAAE,GAAG,GAA2B;AACzE,MAAK,CAAE,IAAK;AACX,WAAO;AAAA,EACR;AAEA,QAAM,QAAQ,cAAM,EAAE,WAAY,EAAG;AACrC,QAAM,eAAe,MAAM,OAAO;AAElC,QAAM,YAAY,SAAS;AAE3B,MAAK,WAAY;AAChB,WAAO,UAAW,YAAa;AAAA,EAChC;AAEA,MAAI;AACH,WAAO,UAAW,MAAM,MAAM,MAAM,CAAE;AAAA,EACvC,QAAQ;AACP,WAAO;AAAA,EACR;AACD;;;AJlBe,SAAR,qBAAuC,IAAoB;AACjE,aAAO,uBAAU;AAAA,IAChB,UAAU,CAAE,iBAAiB,EAAG;AAAA,IAChC,SAAS,MAAM,mBAAoB,EAAE,GAAG,CAAE;AAAA,IAC1C,SAAS,CAAC,CAAE;AAAA,EACb,CAAE;AACH;;;AKVA,mBAAkC;;;ACGlC,IAAM,2BAA2B;AAEjC,IAAO,+BAAQ,MAAM;AACpB,MAAK,CAAE,yBAAyB,qBAAsB;AACrD,UAAM,IAAI,oCAAoC;AAAA,EAC/C;AAEA,SAAO,yBAAyB;AACjC;;;ADuBe,SAAR,gBAAkC,SAAmB;AAC3D,QAAM,YAAQ,qBAAqB;AAEnC,QAAM,OAAO,CAAE,cAA2B,CAAC,MAAO;AACjD,iBAAc,MAAM,OAAQ;AAE5B,UAAM,UAAU,YAAa,EAAE,GAAG,SAAS,GAAG,YAAY,CAAE;AAE5D,UAAM,SAAS,KAAK;AAAA,EACrB;AAEA,8BAAW,MAAM;AAChB,WAAO,MAAM;AACZ,mBAAc,MAAM,OAAQ;AAAA,IAC7B;AAAA,EACD,GAAG,CAAC,CAAE;AAEN,SAAO;AAAA,IACN;AAAA,EACD;AACD;AAEA,SAAS,YAAa;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AACD,GAA2B;AAC1B,QAAM,QAAoB,cAAM,EAAG;AAAA,IAClC;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACR,MAAM,aAAc,UAAW;AAAA,IAChC;AAAA,IACA,GAAK,iBAAiB,EAAE,OAAO,OAAO,IAAI,CAAC;AAAA,EAC5C,CAAE,EACA,GAAI,QAAQ,MAAM;AAClB,kBAAe,KAAM;AACrB,cAAW,OAAO,MAAM,YAAY,UAAW;AAC/C,QAAK,SAAS,OAAQ;AACrB,qBAAgB,OAAO,QAAS;AAAA,IACjC;AAAA,EACD,CAAE,EACD,GAAI,iBAAiB,MAAM,OAAQ,OAAO,UAAU,UAAU,WAAY,CAAE;AAE9E,MAAK,gBAAiB;AACrB,UAAM,GAAI,cAAc,MAAM,kBAAmB,KAAM,CAAE;AAAA,EAC1D;AAEA,mBAAkB,OAAO,UAAW;AAEpC,SAAO;AACR;AAEA,SAAS,aAAc,OAAqB;AAC3C,SAAO,OAAO;AACd,SAAO,OAAO;AACf;AAEA,SAAS,UACR,OACA,OAA8B,UAC9B,YACA,YACC;AACD,MAAK,SAAS,OAAQ;AACrB,UAAM,SAAU,OAAQ;AACxB,QAAK,cAAc,YAAa;AAE/B,iBAAY,MAAM;AACjB,YAAK,YAAa;AACjB,gBAAM,MAAM,GAAG,OAAO,IAAK,OAAO,UAAW;AAAA,QAC9C;AACA,YAAK,YAAa;AACjB,gBAAM,MAAM,GAAG,OAAO,IAAK,OAAO,UAAW;AAAA,QAC9C;AAAA,MACD,GAAG,CAAE;AAAA,IACN;AAAA,EACD,OAAO;AACN,UAAM,QAAQ,KAAM,IAAK;AAAA,EAC1B;AACD;AAEA,SAAS,eAAgB,OAAmB,UAAmD;AAC9F,QAAM,uBAAwB,OAAO,aAAa,WAAW,CAAE,QAAS,IAAI,WACzE,OAAQ,CAAE,OAAQ,CAAC,CAAE,EAAG,EACzB,IAAK,CAAE,OAAQ,cAAM,EAAE,WAAY,EAAa,CAAE;AAEpD,QACE,MAAM,EACN,IAAK,WAAY,EACjB,IAAK,uBAAuB,CAAC,CAAE;AAClC;AAEA,SAAS,OACR,OACA,UACA,UACA,aACC;AACD,QAAM,QAAQ,MAAM,MAAM;AAE1B,MAAK,MAAM,IAAK,IAAK,MAAM,SAAU;AACpC,QAAK,aAAc;AAClB,YAAM,MAAM,MAAM,OAAO,IAAK,KAAM;AACpC,YAAM,MAAM,MAAM,OAAO,IAAK,KAAM;AACpC,UAAK,KAAM;AACV,oBAAa,KAAK,GAAI;AAAA,MACvB;AAAA,IACD;AACA;AAAA,EACD;AAEA,QAAM,cAAc,MAAM,IAAK,WAAY,EAAE,OAAO,EAAE,IAAK,SAAU;AAErE,QAAM,aAAa;AAEnB,aAAY,WAAW,cAAc,YAAa,CAAE,CAAE;AACvD;AAEA,IAAM,6BAA6B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,EAAE,KAAM,GAAI;AAEZ,SAAS,kBAAmB,OAAoB;AAC/C,QAAM,KAAK,KAAM,0BAA2B,GAAG,OAAO;AACvD;AAEA,SAAS,cAAe,OAAoB;AAC3C,QAAM,SAAS,SAAS,MAAO,oBAAoB,2BAA4B;AAChF;AAEA,SAAS,iBAAkB,OAAmB,YAA0B;AACvE,QAAM,oBAAoB,6BAAmB,EAAE,SAAS,QAAQ,aAAc,CAAE,GAAG;AAGnF,QAAM,GAAI,SAAS,MAAM;AACxB,iCAAmB,EAAE,SAAS,QAAQ,aAAa,CAAE,EAAE,YAAY,cAAe,UAAW,EAAE,CAAE;AAAA,EAClG,CAAE;AAGF,QAAM,GAAI,SAAS,MAAM;AACxB,iCAAmB,EAAE,SAAS,QAAQ,aAAa,oBAChD,CAAE,EAAE,YAAY,kBAAkB,CAAE,IACpC,CAAC;AAAA,EACL,CAAE;AACH;AAEA,IAAM,kBAAkB,CAAE,QAAQ,OAAO,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,MAAO;AAC3F,IAAM,kBAAkB,CAAE,OAAO,QAAQ,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,QAAQ,OAAO,KAAM;AAExG,SAAS,aAAc,YAA0B;AAChD,QAAM,mBAAkD;AAAA,IACvD,OAAO,gBAAgB,IAAK,CAAE,cAAe,SAAU,SAAU,EAAG;AAAA,IACpE,KAAK,CAAE,eAAgB;AAAA,IACvB,OAAO;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAEA,SAAO,WAAW,OAAQ,CAAE,MAAM,gBAAiB;AAClD,WAAO,KAAK,OAAQ,iBAAkB,WAAY,CAAE;AAAA,EACrD,GAAG,CAAC,CAAc;AACnB;AAEA,SAAS,cAAe,YAA0B;AACjD,QAAM,oBAAmD;AAAA,IACxD,OAAO;AAAA,IACP,KAAK,CAAE,KAAM;AAAA,IACb,OAAO;AAAA,EACR;AAEA,QAAM,aAAa,WAAW,OAAQ,CAAE,MAAM,gBAAiB;AAC9D,WAAO,KAAK,OAAQ,kBAAmB,WAAY,CAAE;AAAA,EACtD,GAAG,CAAC,CAAc;AAElB,SAAO,WAAW,KAAM,GAAI;AAC7B;","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -101,7 +101,9 @@ function createFrame({
|
|
|
101
101
|
mediaTypes,
|
|
102
102
|
selected,
|
|
103
103
|
title,
|
|
104
|
-
mode = "browse"
|
|
104
|
+
mode = "browse",
|
|
105
|
+
currentUrl,
|
|
106
|
+
currentAlt
|
|
105
107
|
}) {
|
|
106
108
|
const frame = media_default()({
|
|
107
109
|
title,
|
|
@@ -112,11 +114,11 @@ function createFrame({
|
|
|
112
114
|
...allowUrlImport ? { frame: "post" } : {}
|
|
113
115
|
}).on("open", () => {
|
|
114
116
|
setTypeCaller(frame);
|
|
115
|
-
applyMode(frame, mode);
|
|
117
|
+
applyMode(frame, mode, currentUrl, currentAlt);
|
|
116
118
|
if (mode !== "url") {
|
|
117
119
|
applySelection(frame, selected);
|
|
118
120
|
}
|
|
119
|
-
}).on("
|
|
121
|
+
}).on("insert select", () => select(frame, multiple, onSelect, onSelectUrl));
|
|
120
122
|
if (allowUrlImport) {
|
|
121
123
|
frame.on("ready open", () => restrictFrameMenu(frame));
|
|
122
124
|
}
|
|
@@ -127,9 +129,19 @@ function cleanupFrame(frame) {
|
|
|
127
129
|
frame?.detach();
|
|
128
130
|
frame?.remove();
|
|
129
131
|
}
|
|
130
|
-
function applyMode(frame, mode = "browse") {
|
|
132
|
+
function applyMode(frame, mode = "browse", currentUrl, currentAlt) {
|
|
131
133
|
if (mode === "url") {
|
|
132
134
|
frame.setState("embed");
|
|
135
|
+
if (currentUrl || currentAlt) {
|
|
136
|
+
setTimeout(() => {
|
|
137
|
+
if (currentUrl) {
|
|
138
|
+
frame.state()?.props?.set("url", currentUrl);
|
|
139
|
+
}
|
|
140
|
+
if (currentAlt) {
|
|
141
|
+
frame.state()?.props?.set("alt", currentAlt);
|
|
142
|
+
}
|
|
143
|
+
}, 0);
|
|
144
|
+
}
|
|
133
145
|
} else {
|
|
134
146
|
frame.content.mode(mode);
|
|
135
147
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-wp-media-attachment.ts","../src/errors.ts","../src/media.ts","../src/normalize.ts","../src/get-media-attachment.ts","../src/hooks/use-wp-media-frame.ts","../src/wp-plupload-settings.ts"],"sourcesContent":["import { useQuery } from '@elementor/query';\n\nimport { getMediaAttachment } from '../get-media-attachment';\n\nexport default function useWpMediaAttachment( id: number | null ) {\n\treturn useQuery( {\n\t\tqueryKey: [ 'wp-attachment', id ],\n\t\tqueryFn: () => getMediaAttachment( { id } ),\n\t\tenabled: !! id,\n\t} );\n}\n","import { createError } from '@elementor/utils';\n\nexport const WpMediaNotAvailableError = createError( {\n\tcode: 'wp_media_not_available',\n\tmessage: '`wp.media` is not available, make sure the `media-models` handle is set in the dependencies array',\n} );\n\nexport const WpPluploadSettingsNotAvailableError = createError( {\n\tcode: 'wp_plupload_settings_not_available',\n\tmessage: '`_wpPluploadSettings` is not available, make sure a wp media uploader is open',\n} );\n","import { WpMediaNotAvailableError } from './errors';\nimport { type WpMediaWindow } from './types/wp-media';\n\nconst wpMediaWindow = window as unknown as WpMediaWindow;\n\nexport default () => {\n\tif ( ! wpMediaWindow.wp?.media ) {\n\t\tthrow new WpMediaNotAvailableError();\n\t}\n\n\treturn wpMediaWindow.wp.media;\n};\n","import { type Attachment } from './types/attachment';\nimport { type WpAttachmentJSON } from './types/wp-media';\n\nexport default function normalize( attachment: WpAttachmentJSON ): Attachment {\n\tconst { filesizeInBytes, filesizeHumanReadable, author, authorName, ...rest } = attachment;\n\n\treturn {\n\t\t...rest,\n\t\tfilesize: {\n\t\t\tinBytes: filesizeInBytes,\n\t\t\thumanReadable: filesizeHumanReadable,\n\t\t},\n\t\tauthor: {\n\t\t\tid: parseInt( author ),\n\t\t\tname: authorName,\n\t\t},\n\t};\n}\n","import media from './media';\nimport normalize from './normalize';\n\nexport async function getMediaAttachment( { id }: { id: number | null } ) {\n\tif ( ! id ) {\n\t\treturn null;\n\t}\n\n\tconst model = media().attachment( id );\n\tconst wpAttachment = model.toJSON();\n\n\tconst isFetched = 'url' in wpAttachment;\n\n\tif ( isFetched ) {\n\t\treturn normalize( wpAttachment );\n\t}\n\n\ttry {\n\t\treturn normalize( await model.fetch() );\n\t} catch {\n\t\treturn null;\n\t}\n}\n","import { useEffect, useRef } from 'react';\n\nimport media from '../media';\nimport normalize from '../normalize';\nimport { type Attachment } from '../types/attachment';\nimport { type MediaFrame } from '../types/wp-media';\nimport wpPluploadSettings from '../wp-plupload-settings';\n\nexport type OpenOptions = {\n\tmode?: 'upload' | 'browse' | 'url';\n};\n\nexport type MediaType = 'image' | 'svg' | 'video';\n\ntype Options = {\n\tmediaTypes: MediaType[];\n\ttitle?: string;\n\tallowUrlImport?: boolean;\n\tonSelectUrl?: ( url: string, alt?: string ) => void;\n} & (\n\t| {\n\t\t\tmultiple: true;\n\t\t\tselected: Array< number | null >;\n\t\t\tonSelect: ( val: Attachment[] ) => void;\n\t }\n\t| {\n\t\t\tmultiple: false;\n\t\t\tselected: number | null;\n\t\t\tonSelect: ( val: Attachment ) => void;\n\t }\n);\n\nexport default function useWpMediaFrame( options: Options ) {\n\tconst frame = useRef< MediaFrame >();\n\n\tconst open = ( openOptions: OpenOptions = {} ) => {\n\t\tcleanupFrame( frame.current );\n\n\t\tframe.current = createFrame( { ...options, ...openOptions } );\n\n\t\tframe.current?.open();\n\t};\n\n\tuseEffect( () => {\n\t\treturn () => {\n\t\t\tcleanupFrame( frame.current );\n\t\t};\n\t}, [] );\n\n\treturn {\n\t\topen,\n\t};\n}\n\nfunction createFrame( {\n\tonSelect,\n\tonSelectUrl,\n\tallowUrlImport,\n\tmultiple,\n\tmediaTypes,\n\tselected,\n\ttitle,\n\tmode = 'browse',\n}: Options & OpenOptions ) {\n\tconst frame: MediaFrame = media()( {\n\t\ttitle,\n\t\tmultiple,\n\t\tlibrary: {\n\t\t\ttype: getMimeTypes( mediaTypes ),\n\t\t},\n\t\t...( allowUrlImport ? { frame: 'post' } : {} ),\n\t} )\n\t\t.on( 'open', () => {\n\t\t\tsetTypeCaller( frame );\n\t\t\tapplyMode( frame, mode );\n\t\t\tif ( mode !== 'url' ) {\n\t\t\t\tapplySelection( frame, selected );\n\t\t\t}\n\t\t} )\n\t\t.on( 'close', () => cleanupFrame( frame ) )\n\t\t.on( 'insert select', () => select( frame, multiple, onSelect, onSelectUrl ) );\n\n\tif ( allowUrlImport ) {\n\t\tframe.on( 'ready open', () => restrictFrameMenu( frame ) );\n\t}\n\n\thandleExtensions( frame, mediaTypes );\n\n\treturn frame;\n}\n\nfunction cleanupFrame( frame?: MediaFrame ) {\n\tframe?.detach();\n\tframe?.remove();\n}\n\nfunction applyMode( frame: MediaFrame, mode: OpenOptions[ 'mode' ] = 'browse' ) {\n\tif ( mode === 'url' ) {\n\t\tframe.setState( 'embed' );\n\t} else {\n\t\tframe.content.mode( mode );\n\t}\n}\n\nfunction applySelection( frame: MediaFrame, selected: number | null | Array< number | null > ) {\n\tconst selectedAttachments = ( typeof selected === 'number' ? [ selected ] : selected )\n\t\t?.filter( ( id ) => !! id )\n\t\t.map( ( id ) => media().attachment( id as number ) );\n\n\tframe\n\t\t.state()\n\t\t.get( 'selection' )\n\t\t.set( selectedAttachments || [] );\n}\n\nfunction select(\n\tframe: MediaFrame,\n\tmultiple: boolean,\n\tonSelect: Options[ 'onSelect' ],\n\tonSelectUrl?: Options[ 'onSelectUrl' ]\n) {\n\tconst state = frame.state();\n\n\tif ( state.get( 'id' ) === 'embed' ) {\n\t\tif ( onSelectUrl ) {\n\t\t\tconst url = state.props?.get( 'url' );\n\t\t\tconst alt = state.props?.get( 'alt' );\n\t\t\tif ( url ) {\n\t\t\t\tonSelectUrl( url, alt );\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n\tconst attachments = state.get( 'selection' ).toJSON().map( normalize );\n\n\tconst onSelectFn = onSelect as ( val: Attachment | Attachment[] ) => void;\n\n\tonSelectFn( multiple ? attachments : attachments[ 0 ] );\n}\n\nconst FRAME_MENU_ITEMS_TO_REMOVE = [\n\t'#menu-item-gallery',\n\t'#menu-item-featured-image',\n\t'#menu-item-playlist',\n\t'#menu-item-video-playlist',\n].join( ',' );\n\nfunction restrictFrameMenu( frame: MediaFrame ) {\n\tframe.$el?.find( FRAME_MENU_ITEMS_TO_REMOVE )?.remove();\n}\n\nfunction setTypeCaller( frame: MediaFrame ) {\n\tframe.uploader.uploader.param( 'uploadTypeCaller', 'elementor-wp-media-upload' );\n}\n\nfunction handleExtensions( frame: MediaFrame, mediaTypes: MediaType[] ) {\n\tconst defaultExtensions = wpPluploadSettings().defaults.filters.mime_types?.[ 0 ]?.extensions;\n\n\t// Set extensions by media types\n\tframe.on( 'ready', () => {\n\t\twpPluploadSettings().defaults.filters.mime_types = [ { extensions: getExtensions( mediaTypes ) } ];\n\t} );\n\n\t// Restore default upload extensions\n\tframe.on( 'close', () => {\n\t\twpPluploadSettings().defaults.filters.mime_types = defaultExtensions\n\t\t\t? [ { extensions: defaultExtensions } ]\n\t\t\t: [];\n\t} );\n}\n\nconst imageExtensions = [ 'avif', 'bmp', 'gif', 'ico', 'jpe', 'jpeg', 'jpg', 'png', 'webp' ];\nconst videoExtensions = [ 'mp4', 'webm', 'ogg', 'mov', 'm4v', 'avi', 'wmv', 'mpg', 'mpeg', '3gp', '3g2' ];\n\nfunction getMimeTypes( mediaTypes: MediaType[] ) {\n\tconst mimeTypesPerType: Record< MediaType, string[] > = {\n\t\timage: imageExtensions.map( ( extension ) => `image/${ extension }` ),\n\t\tsvg: [ 'image/svg+xml' ],\n\t\tvideo: [\n\t\t\t'video/mp4',\n\t\t\t'video/webm',\n\t\t\t'video/ogg',\n\t\t\t'video/quicktime',\n\t\t\t'video/x-m4v',\n\t\t\t'video/avi',\n\t\t\t'video/x-ms-wmv',\n\t\t\t'video/mpeg',\n\t\t\t'video/3gpp',\n\t\t\t'video/3gpp2',\n\t\t],\n\t};\n\n\treturn mediaTypes.reduce( ( prev, currentType ) => {\n\t\treturn prev.concat( mimeTypesPerType[ currentType ] );\n\t}, [] as string[] );\n}\n\nfunction getExtensions( mediaTypes: MediaType[] ) {\n\tconst extensionsPerType: Record< MediaType, string[] > = {\n\t\timage: imageExtensions,\n\t\tsvg: [ 'svg' ],\n\t\tvideo: videoExtensions,\n\t};\n\n\tconst extensions = mediaTypes.reduce( ( prev, currentType ) => {\n\t\treturn prev.concat( extensionsPerType[ currentType ] );\n\t}, [] as string[] );\n\n\treturn extensions.join( ',' );\n}\n","import { WpPluploadSettingsNotAvailableError } from './errors';\nimport { type WpPluploadSettingsWindow } from './types/plupload';\n\nconst wpPluploadSettingsWindow = window as unknown as WpPluploadSettingsWindow;\n\nexport default () => {\n\tif ( ! wpPluploadSettingsWindow._wpPluploadSettings ) {\n\t\tthrow new WpPluploadSettingsNotAvailableError();\n\t}\n\n\treturn wpPluploadSettingsWindow._wpPluploadSettings;\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-wp-media-attachment.ts","../src/errors.ts","../src/media.ts","../src/normalize.ts","../src/get-media-attachment.ts","../src/hooks/use-wp-media-frame.ts","../src/wp-plupload-settings.ts"],"sourcesContent":["import { useQuery } from '@elementor/query';\n\nimport { getMediaAttachment } from '../get-media-attachment';\n\nexport default function useWpMediaAttachment( id: number | null ) {\n\treturn useQuery( {\n\t\tqueryKey: [ 'wp-attachment', id ],\n\t\tqueryFn: () => getMediaAttachment( { id } ),\n\t\tenabled: !! id,\n\t} );\n}\n","import { createError } from '@elementor/utils';\n\nexport const WpMediaNotAvailableError = createError( {\n\tcode: 'wp_media_not_available',\n\tmessage: '`wp.media` is not available, make sure the `media-models` handle is set in the dependencies array',\n} );\n\nexport const WpPluploadSettingsNotAvailableError = createError( {\n\tcode: 'wp_plupload_settings_not_available',\n\tmessage: '`_wpPluploadSettings` is not available, make sure a wp media uploader is open',\n} );\n","import { WpMediaNotAvailableError } from './errors';\nimport { type WpMediaWindow } from './types/wp-media';\n\nconst wpMediaWindow = window as unknown as WpMediaWindow;\n\nexport default () => {\n\tif ( ! wpMediaWindow.wp?.media ) {\n\t\tthrow new WpMediaNotAvailableError();\n\t}\n\n\treturn wpMediaWindow.wp.media;\n};\n","import { type Attachment } from './types/attachment';\nimport { type WpAttachmentJSON } from './types/wp-media';\n\nexport default function normalize( attachment: WpAttachmentJSON ): Attachment {\n\tconst { filesizeInBytes, filesizeHumanReadable, author, authorName, ...rest } = attachment;\n\n\treturn {\n\t\t...rest,\n\t\tfilesize: {\n\t\t\tinBytes: filesizeInBytes,\n\t\t\thumanReadable: filesizeHumanReadable,\n\t\t},\n\t\tauthor: {\n\t\t\tid: parseInt( author ),\n\t\t\tname: authorName,\n\t\t},\n\t};\n}\n","import media from './media';\nimport normalize from './normalize';\n\nexport async function getMediaAttachment( { id }: { id: number | null } ) {\n\tif ( ! id ) {\n\t\treturn null;\n\t}\n\n\tconst model = media().attachment( id );\n\tconst wpAttachment = model.toJSON();\n\n\tconst isFetched = 'url' in wpAttachment;\n\n\tif ( isFetched ) {\n\t\treturn normalize( wpAttachment );\n\t}\n\n\ttry {\n\t\treturn normalize( await model.fetch() );\n\t} catch {\n\t\treturn null;\n\t}\n}\n","import { useEffect, useRef } from 'react';\n\nimport media from '../media';\nimport normalize from '../normalize';\nimport { type Attachment } from '../types/attachment';\nimport { type MediaFrame } from '../types/wp-media';\nimport wpPluploadSettings from '../wp-plupload-settings';\n\nexport type OpenOptions = {\n\tmode?: 'upload' | 'browse' | 'url';\n\tcurrentUrl?: string;\n\tcurrentAlt?: string;\n};\n\nexport type MediaType = 'image' | 'svg' | 'video';\n\ntype Options = {\n\tmediaTypes: MediaType[];\n\ttitle?: string;\n\tallowUrlImport?: boolean;\n\tonSelectUrl?: ( url: string, alt?: string ) => void;\n} & (\n\t| {\n\t\t\tmultiple: true;\n\t\t\tselected: Array< number | null >;\n\t\t\tonSelect: ( val: Attachment[] ) => void;\n\t }\n\t| {\n\t\t\tmultiple: false;\n\t\t\tselected: number | null;\n\t\t\tonSelect: ( val: Attachment ) => void;\n\t }\n);\n\nexport default function useWpMediaFrame( options: Options ) {\n\tconst frame = useRef< MediaFrame >();\n\n\tconst open = ( openOptions: OpenOptions = {} ) => {\n\t\tcleanupFrame( frame.current );\n\n\t\tframe.current = createFrame( { ...options, ...openOptions } );\n\n\t\tframe.current?.open();\n\t};\n\n\tuseEffect( () => {\n\t\treturn () => {\n\t\t\tcleanupFrame( frame.current );\n\t\t};\n\t}, [] );\n\n\treturn {\n\t\topen,\n\t};\n}\n\nfunction createFrame( {\n\tonSelect,\n\tonSelectUrl,\n\tallowUrlImport,\n\tmultiple,\n\tmediaTypes,\n\tselected,\n\ttitle,\n\tmode = 'browse',\n\tcurrentUrl,\n\tcurrentAlt,\n}: Options & OpenOptions ) {\n\tconst frame: MediaFrame = media()( {\n\t\ttitle,\n\t\tmultiple,\n\t\tlibrary: {\n\t\t\ttype: getMimeTypes( mediaTypes ),\n\t\t},\n\t\t...( allowUrlImport ? { frame: 'post' } : {} ),\n\t} )\n\t\t.on( 'open', () => {\n\t\t\tsetTypeCaller( frame );\n\t\t\tapplyMode( frame, mode, currentUrl, currentAlt );\n\t\t\tif ( mode !== 'url' ) {\n\t\t\t\tapplySelection( frame, selected );\n\t\t\t}\n\t\t} )\n\t\t.on( 'insert select', () => select( frame, multiple, onSelect, onSelectUrl ) );\n\n\tif ( allowUrlImport ) {\n\t\tframe.on( 'ready open', () => restrictFrameMenu( frame ) );\n\t}\n\n\thandleExtensions( frame, mediaTypes );\n\n\treturn frame;\n}\n\nfunction cleanupFrame( frame?: MediaFrame ) {\n\tframe?.detach();\n\tframe?.remove();\n}\n\nfunction applyMode(\n\tframe: MediaFrame,\n\tmode: OpenOptions[ 'mode' ] = 'browse',\n\tcurrentUrl?: string,\n\tcurrentAlt?: string\n) {\n\tif ( mode === 'url' ) {\n\t\tframe.setState( 'embed' );\n\t\tif ( currentUrl || currentAlt ) {\n\t\t\t// Defer so the toolbar region is initialized before change:url triggers its refresh callback.\n\t\t\tsetTimeout( () => {\n\t\t\t\tif ( currentUrl ) {\n\t\t\t\t\tframe.state()?.props?.set( 'url', currentUrl );\n\t\t\t\t}\n\t\t\t\tif ( currentAlt ) {\n\t\t\t\t\tframe.state()?.props?.set( 'alt', currentAlt );\n\t\t\t\t}\n\t\t\t}, 0 );\n\t\t}\n\t} else {\n\t\tframe.content.mode( mode );\n\t}\n}\n\nfunction applySelection( frame: MediaFrame, selected: number | null | Array< number | null > ) {\n\tconst selectedAttachments = ( typeof selected === 'number' ? [ selected ] : selected )\n\t\t?.filter( ( id ) => !! id )\n\t\t.map( ( id ) => media().attachment( id as number ) );\n\n\tframe\n\t\t.state()\n\t\t.get( 'selection' )\n\t\t.set( selectedAttachments || [] );\n}\n\nfunction select(\n\tframe: MediaFrame,\n\tmultiple: boolean,\n\tonSelect: Options[ 'onSelect' ],\n\tonSelectUrl?: Options[ 'onSelectUrl' ]\n) {\n\tconst state = frame.state();\n\n\tif ( state.get( 'id' ) === 'embed' ) {\n\t\tif ( onSelectUrl ) {\n\t\t\tconst url = state.props?.get( 'url' );\n\t\t\tconst alt = state.props?.get( 'alt' );\n\t\t\tif ( url ) {\n\t\t\t\tonSelectUrl( url, alt );\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n\tconst attachments = state.get( 'selection' ).toJSON().map( normalize );\n\n\tconst onSelectFn = onSelect as ( val: Attachment | Attachment[] ) => void;\n\n\tonSelectFn( multiple ? attachments : attachments[ 0 ] );\n}\n\nconst FRAME_MENU_ITEMS_TO_REMOVE = [\n\t'#menu-item-gallery',\n\t'#menu-item-featured-image',\n\t'#menu-item-playlist',\n\t'#menu-item-video-playlist',\n].join( ',' );\n\nfunction restrictFrameMenu( frame: MediaFrame ) {\n\tframe.$el?.find( FRAME_MENU_ITEMS_TO_REMOVE )?.remove();\n}\n\nfunction setTypeCaller( frame: MediaFrame ) {\n\tframe.uploader.uploader.param( 'uploadTypeCaller', 'elementor-wp-media-upload' );\n}\n\nfunction handleExtensions( frame: MediaFrame, mediaTypes: MediaType[] ) {\n\tconst defaultExtensions = wpPluploadSettings().defaults.filters.mime_types?.[ 0 ]?.extensions;\n\n\t// Set extensions by media types\n\tframe.on( 'ready', () => {\n\t\twpPluploadSettings().defaults.filters.mime_types = [ { extensions: getExtensions( mediaTypes ) } ];\n\t} );\n\n\t// Restore default upload extensions\n\tframe.on( 'close', () => {\n\t\twpPluploadSettings().defaults.filters.mime_types = defaultExtensions\n\t\t\t? [ { extensions: defaultExtensions } ]\n\t\t\t: [];\n\t} );\n}\n\nconst imageExtensions = [ 'avif', 'bmp', 'gif', 'ico', 'jpe', 'jpeg', 'jpg', 'png', 'webp' ];\nconst videoExtensions = [ 'mp4', 'webm', 'ogg', 'mov', 'm4v', 'avi', 'wmv', 'mpg', 'mpeg', '3gp', '3g2' ];\n\nfunction getMimeTypes( mediaTypes: MediaType[] ) {\n\tconst mimeTypesPerType: Record< MediaType, string[] > = {\n\t\timage: imageExtensions.map( ( extension ) => `image/${ extension }` ),\n\t\tsvg: [ 'image/svg+xml' ],\n\t\tvideo: [\n\t\t\t'video/mp4',\n\t\t\t'video/webm',\n\t\t\t'video/ogg',\n\t\t\t'video/quicktime',\n\t\t\t'video/x-m4v',\n\t\t\t'video/avi',\n\t\t\t'video/x-ms-wmv',\n\t\t\t'video/mpeg',\n\t\t\t'video/3gpp',\n\t\t\t'video/3gpp2',\n\t\t],\n\t};\n\n\treturn mediaTypes.reduce( ( prev, currentType ) => {\n\t\treturn prev.concat( mimeTypesPerType[ currentType ] );\n\t}, [] as string[] );\n}\n\nfunction getExtensions( mediaTypes: MediaType[] ) {\n\tconst extensionsPerType: Record< MediaType, string[] > = {\n\t\timage: imageExtensions,\n\t\tsvg: [ 'svg' ],\n\t\tvideo: videoExtensions,\n\t};\n\n\tconst extensions = mediaTypes.reduce( ( prev, currentType ) => {\n\t\treturn prev.concat( extensionsPerType[ currentType ] );\n\t}, [] as string[] );\n\n\treturn extensions.join( ',' );\n}\n","import { WpPluploadSettingsNotAvailableError } from './errors';\nimport { type WpPluploadSettingsWindow } from './types/plupload';\n\nconst wpPluploadSettingsWindow = window as unknown as WpPluploadSettingsWindow;\n\nexport default () => {\n\tif ( ! wpPluploadSettingsWindow._wpPluploadSettings ) {\n\t\tthrow new WpPluploadSettingsNotAvailableError();\n\t}\n\n\treturn wpPluploadSettingsWindow._wpPluploadSettings;\n};\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/wp-media",
|
|
3
3
|
"description": "An adapter for WordPress' media utils",
|
|
4
|
-
"version": "4.1.0-
|
|
4
|
+
"version": "4.1.0-821",
|
|
5
5
|
"private": false,
|
|
6
6
|
"author": "Elementor Team",
|
|
7
7
|
"homepage": "https://elementor.com/",
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
"dev": "tsup --config=../../tsup.dev.ts"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@elementor/query": "4.1.0-
|
|
44
|
-
"@elementor/utils": "4.1.0-
|
|
43
|
+
"@elementor/query": "4.1.0-821",
|
|
44
|
+
"@elementor/utils": "4.1.0-821"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
47
|
"react": "^18.3.1"
|
|
@@ -8,6 +8,8 @@ import wpPluploadSettings from '../wp-plupload-settings';
|
|
|
8
8
|
|
|
9
9
|
export type OpenOptions = {
|
|
10
10
|
mode?: 'upload' | 'browse' | 'url';
|
|
11
|
+
currentUrl?: string;
|
|
12
|
+
currentAlt?: string;
|
|
11
13
|
};
|
|
12
14
|
|
|
13
15
|
export type MediaType = 'image' | 'svg' | 'video';
|
|
@@ -61,6 +63,8 @@ function createFrame( {
|
|
|
61
63
|
selected,
|
|
62
64
|
title,
|
|
63
65
|
mode = 'browse',
|
|
66
|
+
currentUrl,
|
|
67
|
+
currentAlt,
|
|
64
68
|
}: Options & OpenOptions ) {
|
|
65
69
|
const frame: MediaFrame = media()( {
|
|
66
70
|
title,
|
|
@@ -72,12 +76,11 @@ function createFrame( {
|
|
|
72
76
|
} )
|
|
73
77
|
.on( 'open', () => {
|
|
74
78
|
setTypeCaller( frame );
|
|
75
|
-
applyMode( frame, mode );
|
|
79
|
+
applyMode( frame, mode, currentUrl, currentAlt );
|
|
76
80
|
if ( mode !== 'url' ) {
|
|
77
81
|
applySelection( frame, selected );
|
|
78
82
|
}
|
|
79
83
|
} )
|
|
80
|
-
.on( 'close', () => cleanupFrame( frame ) )
|
|
81
84
|
.on( 'insert select', () => select( frame, multiple, onSelect, onSelectUrl ) );
|
|
82
85
|
|
|
83
86
|
if ( allowUrlImport ) {
|
|
@@ -94,9 +97,25 @@ function cleanupFrame( frame?: MediaFrame ) {
|
|
|
94
97
|
frame?.remove();
|
|
95
98
|
}
|
|
96
99
|
|
|
97
|
-
function applyMode(
|
|
100
|
+
function applyMode(
|
|
101
|
+
frame: MediaFrame,
|
|
102
|
+
mode: OpenOptions[ 'mode' ] = 'browse',
|
|
103
|
+
currentUrl?: string,
|
|
104
|
+
currentAlt?: string
|
|
105
|
+
) {
|
|
98
106
|
if ( mode === 'url' ) {
|
|
99
107
|
frame.setState( 'embed' );
|
|
108
|
+
if ( currentUrl || currentAlt ) {
|
|
109
|
+
// Defer so the toolbar region is initialized before change:url triggers its refresh callback.
|
|
110
|
+
setTimeout( () => {
|
|
111
|
+
if ( currentUrl ) {
|
|
112
|
+
frame.state()?.props?.set( 'url', currentUrl );
|
|
113
|
+
}
|
|
114
|
+
if ( currentAlt ) {
|
|
115
|
+
frame.state()?.props?.set( 'alt', currentAlt );
|
|
116
|
+
}
|
|
117
|
+
}, 0 );
|
|
118
|
+
}
|
|
100
119
|
} else {
|
|
101
120
|
frame.content.mode( mode );
|
|
102
121
|
}
|
package/src/types/wp-media.ts
CHANGED
|
@@ -36,7 +36,7 @@ export type MediaFrame = {
|
|
|
36
36
|
toJSON: () => WpAttachmentJSON[];
|
|
37
37
|
} ) &
|
|
38
38
|
( ( key: 'id' ) => string );
|
|
39
|
-
props?: { get: ( key: string ) => string | undefined };
|
|
39
|
+
props?: { get: ( key: string ) => string | undefined; set: ( key: string, value: string ) => void };
|
|
40
40
|
};
|
|
41
41
|
setState: ( id: string ) => MediaFrame;
|
|
42
42
|
on: ( event: string, callback: () => void ) => MediaFrame;
|