@elementor/wp-media 4.1.0 → 4.2.0-839

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 CHANGED
@@ -28,12 +28,16 @@ type Attachment = {
28
28
  };
29
29
 
30
30
  type OpenOptions = {
31
- mode?: 'upload' | 'browse';
31
+ mode?: 'upload' | 'browse' | 'url';
32
+ currentUrl?: string;
33
+ currentAlt?: string;
32
34
  };
33
35
  type MediaType = 'image' | 'svg' | 'video';
34
36
  type Options = {
35
37
  mediaTypes: MediaType[];
36
38
  title?: string;
39
+ allowUrlImport?: boolean;
40
+ onSelectUrl?: (url: string, alt?: string) => void;
37
41
  } & ({
38
42
  multiple: true;
39
43
  selected: Array<number | null>;
package/dist/index.d.ts CHANGED
@@ -28,12 +28,16 @@ type Attachment = {
28
28
  };
29
29
 
30
30
  type OpenOptions = {
31
- mode?: 'upload' | 'browse';
31
+ mode?: 'upload' | 'browse' | 'url';
32
+ currentUrl?: string;
33
+ currentAlt?: string;
32
34
  };
33
35
  type MediaType = 'image' | 'svg' | 'video';
34
36
  type Options = {
35
37
  mediaTypes: MediaType[];
36
38
  title?: string;
39
+ allowUrlImport?: boolean;
40
+ onSelectUrl?: (url: string, alt?: string) => void;
37
41
  } & ({
38
42
  multiple: true;
39
43
  selected: Array<number | null>;
package/dist/index.js CHANGED
@@ -121,18 +121,35 @@ function useWpMediaFrame(options) {
121
121
  open
122
122
  };
123
123
  }
124
- function createFrame({ onSelect, multiple, mediaTypes, selected, title, mode = "browse" }) {
124
+ function createFrame({
125
+ onSelect,
126
+ onSelectUrl,
127
+ allowUrlImport,
128
+ multiple,
129
+ mediaTypes,
130
+ selected,
131
+ title,
132
+ mode = "browse",
133
+ currentUrl,
134
+ currentAlt
135
+ }) {
125
136
  const frame = media_default()({
126
137
  title,
127
138
  multiple,
128
139
  library: {
129
140
  type: getMimeTypes(mediaTypes)
130
- }
141
+ },
142
+ ...allowUrlImport ? { frame: "post" } : {}
131
143
  }).on("open", () => {
132
144
  setTypeCaller(frame);
133
- applyMode(frame, mode);
134
- applySelection(frame, selected);
135
- }).on("close", () => cleanupFrame(frame)).on("insert select", () => select(frame, multiple, onSelect));
145
+ applyMode(frame, mode, currentUrl, currentAlt);
146
+ if (mode !== "url") {
147
+ applySelection(frame, selected);
148
+ }
149
+ }).on("insert select", () => select(frame, multiple, onSelect, onSelectUrl));
150
+ if (allowUrlImport) {
151
+ frame.on("ready open", () => restrictFrameMenu(frame));
152
+ }
136
153
  handleExtensions(frame, mediaTypes);
137
154
  return frame;
138
155
  }
@@ -140,18 +157,52 @@ function cleanupFrame(frame) {
140
157
  frame?.detach();
141
158
  frame?.remove();
142
159
  }
143
- function applyMode(frame, mode = "browse") {
144
- frame.content.mode(mode);
160
+ function applyMode(frame, mode = "browse", currentUrl, currentAlt) {
161
+ if (mode === "url") {
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
+ }
173
+ } else {
174
+ frame.content.mode(mode);
175
+ }
145
176
  }
146
177
  function applySelection(frame, selected) {
147
178
  const selectedAttachments = (typeof selected === "number" ? [selected] : selected)?.filter((id) => !!id).map((id) => media_default().attachment(id));
148
179
  frame.state().get("selection").set(selectedAttachments || []);
149
180
  }
150
- function select(frame, multiple, onSelect) {
151
- const attachments = frame.state().get("selection").toJSON().map(normalize);
181
+ function select(frame, multiple, onSelect, onSelectUrl) {
182
+ const state = frame.state();
183
+ if (state.get("id") === "embed") {
184
+ if (onSelectUrl) {
185
+ const url = state.props?.get("url");
186
+ const alt = state.props?.get("alt");
187
+ if (url) {
188
+ onSelectUrl(url, alt);
189
+ }
190
+ }
191
+ return;
192
+ }
193
+ const attachments = state.get("selection").toJSON().map(normalize);
152
194
  const onSelectFn = onSelect;
153
195
  onSelectFn(multiple ? attachments : attachments[0]);
154
196
  }
197
+ var FRAME_MENU_ITEMS_TO_REMOVE = [
198
+ "#menu-item-gallery",
199
+ "#menu-item-featured-image",
200
+ "#menu-item-playlist",
201
+ "#menu-item-video-playlist"
202
+ ].join(",");
203
+ function restrictFrameMenu(frame) {
204
+ frame.$el?.find(FRAME_MENU_ITEMS_TO_REMOVE)?.remove();
205
+ }
155
206
  function setTypeCaller(frame) {
156
207
  frame.uploader.uploader.param("uploadTypeCaller", "elementor-wp-media-upload");
157
208
  }
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';\n};\n\nexport type MediaType = 'image' | 'svg' | 'video';\n\ntype Options = {\n\tmediaTypes: MediaType[];\n\ttitle?: string;\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( { onSelect, multiple, mediaTypes, selected, title, mode = 'browse' }: 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} )\n\t\t.on( 'open', () => {\n\t\t\tsetTypeCaller( frame );\n\t\t\tapplyMode( frame, mode );\n\t\t\tapplySelection( frame, selected );\n\t\t} )\n\t\t.on( 'close', () => cleanupFrame( frame ) )\n\t\t.on( 'insert select', () => select( frame, multiple, onSelect ) );\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\tframe.content.mode( mode );\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( frame: MediaFrame, multiple: boolean, onSelect: Options[ 'onSelect' ] ) {\n\tconst attachments = frame.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\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":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -93,18 +93,35 @@ function useWpMediaFrame(options) {
93
93
  open
94
94
  };
95
95
  }
96
- function createFrame({ onSelect, multiple, mediaTypes, selected, title, mode = "browse" }) {
96
+ function createFrame({
97
+ onSelect,
98
+ onSelectUrl,
99
+ allowUrlImport,
100
+ multiple,
101
+ mediaTypes,
102
+ selected,
103
+ title,
104
+ mode = "browse",
105
+ currentUrl,
106
+ currentAlt
107
+ }) {
97
108
  const frame = media_default()({
98
109
  title,
99
110
  multiple,
100
111
  library: {
101
112
  type: getMimeTypes(mediaTypes)
102
- }
113
+ },
114
+ ...allowUrlImport ? { frame: "post" } : {}
103
115
  }).on("open", () => {
104
116
  setTypeCaller(frame);
105
- applyMode(frame, mode);
106
- applySelection(frame, selected);
107
- }).on("close", () => cleanupFrame(frame)).on("insert select", () => select(frame, multiple, onSelect));
117
+ applyMode(frame, mode, currentUrl, currentAlt);
118
+ if (mode !== "url") {
119
+ applySelection(frame, selected);
120
+ }
121
+ }).on("insert select", () => select(frame, multiple, onSelect, onSelectUrl));
122
+ if (allowUrlImport) {
123
+ frame.on("ready open", () => restrictFrameMenu(frame));
124
+ }
108
125
  handleExtensions(frame, mediaTypes);
109
126
  return frame;
110
127
  }
@@ -112,18 +129,52 @@ function cleanupFrame(frame) {
112
129
  frame?.detach();
113
130
  frame?.remove();
114
131
  }
115
- function applyMode(frame, mode = "browse") {
116
- frame.content.mode(mode);
132
+ function applyMode(frame, mode = "browse", currentUrl, currentAlt) {
133
+ if (mode === "url") {
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
+ }
145
+ } else {
146
+ frame.content.mode(mode);
147
+ }
117
148
  }
118
149
  function applySelection(frame, selected) {
119
150
  const selectedAttachments = (typeof selected === "number" ? [selected] : selected)?.filter((id) => !!id).map((id) => media_default().attachment(id));
120
151
  frame.state().get("selection").set(selectedAttachments || []);
121
152
  }
122
- function select(frame, multiple, onSelect) {
123
- const attachments = frame.state().get("selection").toJSON().map(normalize);
153
+ function select(frame, multiple, onSelect, onSelectUrl) {
154
+ const state = frame.state();
155
+ if (state.get("id") === "embed") {
156
+ if (onSelectUrl) {
157
+ const url = state.props?.get("url");
158
+ const alt = state.props?.get("alt");
159
+ if (url) {
160
+ onSelectUrl(url, alt);
161
+ }
162
+ }
163
+ return;
164
+ }
165
+ const attachments = state.get("selection").toJSON().map(normalize);
124
166
  const onSelectFn = onSelect;
125
167
  onSelectFn(multiple ? attachments : attachments[0]);
126
168
  }
169
+ var FRAME_MENU_ITEMS_TO_REMOVE = [
170
+ "#menu-item-gallery",
171
+ "#menu-item-featured-image",
172
+ "#menu-item-playlist",
173
+ "#menu-item-video-playlist"
174
+ ].join(",");
175
+ function restrictFrameMenu(frame) {
176
+ frame.$el?.find(FRAME_MENU_ITEMS_TO_REMOVE)?.remove();
177
+ }
127
178
  function setTypeCaller(frame) {
128
179
  frame.uploader.uploader.param("uploadTypeCaller", "elementor-wp-media-upload");
129
180
  }
@@ -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';\n};\n\nexport type MediaType = 'image' | 'svg' | 'video';\n\ntype Options = {\n\tmediaTypes: MediaType[];\n\ttitle?: string;\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( { onSelect, multiple, mediaTypes, selected, title, mode = 'browse' }: 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} )\n\t\t.on( 'open', () => {\n\t\t\tsetTypeCaller( frame );\n\t\t\tapplyMode( frame, mode );\n\t\t\tapplySelection( frame, selected );\n\t\t} )\n\t\t.on( 'close', () => cleanupFrame( frame ) )\n\t\t.on( 'insert select', () => select( frame, multiple, onSelect ) );\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\tframe.content.mode( mode );\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( frame: MediaFrame, multiple: boolean, onSelect: Options[ 'onSelect' ] ) {\n\tconst attachments = frame.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\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.2.0-839",
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.2.0-839",
44
+ "@elementor/utils": "4.2.0-839"
45
45
  },
46
46
  "peerDependencies": {
47
47
  "react": "^18.3.1"
@@ -7,7 +7,9 @@ import { type MediaFrame } from '../types/wp-media';
7
7
  import wpPluploadSettings from '../wp-plupload-settings';
8
8
 
9
9
  export type OpenOptions = {
10
- mode?: 'upload' | 'browse';
10
+ mode?: 'upload' | 'browse' | 'url';
11
+ currentUrl?: string;
12
+ currentAlt?: string;
11
13
  };
12
14
 
13
15
  export type MediaType = 'image' | 'svg' | 'video';
@@ -15,6 +17,8 @@ export type MediaType = 'image' | 'svg' | 'video';
15
17
  type Options = {
16
18
  mediaTypes: MediaType[];
17
19
  title?: string;
20
+ allowUrlImport?: boolean;
21
+ onSelectUrl?: ( url: string, alt?: string ) => void;
18
22
  } & (
19
23
  | {
20
24
  multiple: true;
@@ -50,21 +54,38 @@ export default function useWpMediaFrame( options: Options ) {
50
54
  };
51
55
  }
52
56
 
53
- function createFrame( { onSelect, multiple, mediaTypes, selected, title, mode = 'browse' }: Options & OpenOptions ) {
57
+ function createFrame( {
58
+ onSelect,
59
+ onSelectUrl,
60
+ allowUrlImport,
61
+ multiple,
62
+ mediaTypes,
63
+ selected,
64
+ title,
65
+ mode = 'browse',
66
+ currentUrl,
67
+ currentAlt,
68
+ }: Options & OpenOptions ) {
54
69
  const frame: MediaFrame = media()( {
55
70
  title,
56
71
  multiple,
57
72
  library: {
58
73
  type: getMimeTypes( mediaTypes ),
59
74
  },
75
+ ...( allowUrlImport ? { frame: 'post' } : {} ),
60
76
  } )
61
77
  .on( 'open', () => {
62
78
  setTypeCaller( frame );
63
- applyMode( frame, mode );
64
- applySelection( frame, selected );
79
+ applyMode( frame, mode, currentUrl, currentAlt );
80
+ if ( mode !== 'url' ) {
81
+ applySelection( frame, selected );
82
+ }
65
83
  } )
66
- .on( 'close', () => cleanupFrame( frame ) )
67
- .on( 'insert select', () => select( frame, multiple, onSelect ) );
84
+ .on( 'insert select', () => select( frame, multiple, onSelect, onSelectUrl ) );
85
+
86
+ if ( allowUrlImport ) {
87
+ frame.on( 'ready open', () => restrictFrameMenu( frame ) );
88
+ }
68
89
 
69
90
  handleExtensions( frame, mediaTypes );
70
91
 
@@ -76,8 +97,28 @@ function cleanupFrame( frame?: MediaFrame ) {
76
97
  frame?.remove();
77
98
  }
78
99
 
79
- function applyMode( frame: MediaFrame, mode: OpenOptions[ 'mode' ] = 'browse' ) {
80
- frame.content.mode( mode );
100
+ function applyMode(
101
+ frame: MediaFrame,
102
+ mode: OpenOptions[ 'mode' ] = 'browse',
103
+ currentUrl?: string,
104
+ currentAlt?: string
105
+ ) {
106
+ if ( mode === 'url' ) {
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
+ }
119
+ } else {
120
+ frame.content.mode( mode );
121
+ }
81
122
  }
82
123
 
83
124
  function applySelection( frame: MediaFrame, selected: number | null | Array< number | null > ) {
@@ -91,14 +132,43 @@ function applySelection( frame: MediaFrame, selected: number | null | Array< num
91
132
  .set( selectedAttachments || [] );
92
133
  }
93
134
 
94
- function select( frame: MediaFrame, multiple: boolean, onSelect: Options[ 'onSelect' ] ) {
95
- const attachments = frame.state().get( 'selection' ).toJSON().map( normalize );
135
+ function select(
136
+ frame: MediaFrame,
137
+ multiple: boolean,
138
+ onSelect: Options[ 'onSelect' ],
139
+ onSelectUrl?: Options[ 'onSelectUrl' ]
140
+ ) {
141
+ const state = frame.state();
142
+
143
+ if ( state.get( 'id' ) === 'embed' ) {
144
+ if ( onSelectUrl ) {
145
+ const url = state.props?.get( 'url' );
146
+ const alt = state.props?.get( 'alt' );
147
+ if ( url ) {
148
+ onSelectUrl( url, alt );
149
+ }
150
+ }
151
+ return;
152
+ }
153
+
154
+ const attachments = state.get( 'selection' ).toJSON().map( normalize );
96
155
 
97
156
  const onSelectFn = onSelect as ( val: Attachment | Attachment[] ) => void;
98
157
 
99
158
  onSelectFn( multiple ? attachments : attachments[ 0 ] );
100
159
  }
101
160
 
161
+ const FRAME_MENU_ITEMS_TO_REMOVE = [
162
+ '#menu-item-gallery',
163
+ '#menu-item-featured-image',
164
+ '#menu-item-playlist',
165
+ '#menu-item-video-playlist',
166
+ ].join( ',' );
167
+
168
+ function restrictFrameMenu( frame: MediaFrame ) {
169
+ frame.$el?.find( FRAME_MENU_ITEMS_TO_REMOVE )?.remove();
170
+ }
171
+
102
172
  function setTypeCaller( frame: MediaFrame ) {
103
173
  frame.uploader.uploader.param( 'uploadTypeCaller', 'elementor-wp-media-upload' );
104
174
  }
@@ -10,6 +10,7 @@ export type BackboneAttachmentModel = {
10
10
  export type CreateMediaFrameOptions = {
11
11
  title?: string;
12
12
  multiple?: boolean;
13
+ frame?: string;
13
14
  library?: {
14
15
  type?: string[] | string;
15
16
  };
@@ -26,12 +27,18 @@ export type MediaFrame = {
26
27
  param: ( key: string, value: string ) => void;
27
28
  };
28
29
  };
30
+ $el?: {
31
+ find: ( selector: string ) => { remove: () => void };
32
+ };
29
33
  state: () => {
30
- get: ( key: 'selection' ) => {
34
+ get: ( ( key: 'selection' ) => {
31
35
  set: ( attachments: BackboneAttachmentModel[] ) => void;
32
36
  toJSON: () => WpAttachmentJSON[];
33
- };
37
+ } ) &
38
+ ( ( key: 'id' ) => string );
39
+ props?: { get: ( key: string ) => string | undefined; set: ( key: string, value: string ) => void };
34
40
  };
41
+ setState: ( id: string ) => MediaFrame;
35
42
  on: ( event: string, callback: () => void ) => MediaFrame;
36
43
  open: () => void;
37
44
  detach: () => void;