@elementor/wp-media 4.1.0-820 → 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 CHANGED
@@ -29,6 +29,8 @@ type Attachment = {
29
29
 
30
30
  type OpenOptions = {
31
31
  mode?: 'upload' | 'browse' | 'url';
32
+ currentUrl?: string;
33
+ currentAlt?: string;
32
34
  };
33
35
  type MediaType = 'image' | 'svg' | 'video';
34
36
  type Options = {
package/dist/index.d.ts CHANGED
@@ -29,6 +29,8 @@ type Attachment = {
29
29
 
30
30
  type OpenOptions = {
31
31
  mode?: 'upload' | 'browse' | 'url';
32
+ currentUrl?: string;
33
+ currentAlt?: string;
32
34
  };
33
35
  type MediaType = 'image' | 'svg' | 'video';
34
36
  type Options = {
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("close", () => cleanupFrame(frame)).on("insert select", () => select(frame, multiple, onSelect, onSelectUrl));
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":"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","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("close", () => cleanupFrame(frame)).on("insert select", () => select(frame, multiple, onSelect, onSelectUrl));
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
  }
@@ -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":";AAAA,SAAS,gBAAgB;;;ACAzB,SAAS,mBAAmB;AAErB,IAAM,2BAA2B,YAAa;AAAA,EACpD,MAAM;AAAA,EACN,SAAS;AACV,CAAE;AAEK,IAAM,sCAAsC,YAAa;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,SAAO,SAAU;AAAA,IAChB,UAAU,CAAE,iBAAiB,EAAG;AAAA,IAChC,SAAS,MAAM,mBAAoB,EAAE,GAAG,CAAE;AAAA,IAC1C,SAAS,CAAC,CAAE;AAAA,EACb,CAAE;AACH;;;AKVA,SAAS,WAAW,cAAc;;;ACGlC,IAAM,2BAA2B;AAEjC,IAAO,+BAAQ,MAAM;AACpB,MAAK,CAAE,yBAAyB,qBAAsB;AACrD,UAAM,IAAI,oCAAoC;AAAA,EAC/C;AAEA,SAAO,yBAAyB;AACjC;;;ADqBe,SAAR,gBAAkC,SAAmB;AAC3D,QAAM,QAAQ,OAAqB;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,YAAW,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;AACR,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,IAAK;AACvB,QAAK,SAAS,OAAQ;AACrB,qBAAgB,OAAO,QAAS;AAAA,IACjC;AAAA,EACD,CAAE,EACD,GAAI,SAAS,MAAM,aAAc,KAAM,CAAE,EACzC,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,UAAW,OAAmB,OAA8B,UAAW;AAC/E,MAAK,SAAS,OAAQ;AACrB,UAAM,SAAU,OAAQ;AAAA,EACzB,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":[]}
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-820",
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-820",
44
- "@elementor/utils": "4.1.0-820"
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( frame: MediaFrame, mode: OpenOptions[ 'mode' ] = 'browse' ) {
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
  }
@@ -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;