@wordpress/block-library
Version:
Block library for the WordPress editor.
8 lines (7 loc) • 13.8 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../src/embed/edit.js"],
"sourcesContent": ["/**\n * Internal dependencies\n */\nimport {\n\tcreateUpgradedEmbedBlock,\n\tgetClassNames,\n\tremoveAspectRatioClasses,\n\tfallback,\n\tgetEmbedInfoByProvider,\n\tgetMergedAttributesWithPreview,\n} from './util';\nimport EmbedControls from './embed-controls';\nimport { embedContentIcon } from './icons';\nimport EmbedLoading from './embed-loading';\nimport EmbedPlaceholder from './embed-placeholder';\nimport EmbedPreview from './embed-preview';\n\n/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { __, _x, sprintf } from '@wordpress/i18n';\nimport { useState, useEffect } from '@wordpress/element';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { useBlockProps } from '@wordpress/block-editor';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { View } from '@wordpress/primitives';\nimport { getAuthority } from '@wordpress/url';\nimport { Caption } from '../utils/caption';\n\nconst EmbedEdit = ( props ) => {\n\tconst {\n\t\tattributes: {\n\t\t\tproviderNameSlug,\n\t\t\tpreviewable,\n\t\t\tresponsive,\n\t\t\turl: attributesUrl,\n\t\t},\n\t\tattributes,\n\t\tisSelected,\n\t\tonReplace,\n\t\tsetAttributes,\n\t\tinsertBlocksAfter,\n\t\tonFocus,\n\t} = props;\n\n\tconst defaultEmbedInfo = {\n\t\ttitle: _x( 'Embed', 'block title' ),\n\t\ticon: embedContentIcon,\n\t};\n\tconst { icon, title } =\n\t\tgetEmbedInfoByProvider( providerNameSlug ) || defaultEmbedInfo;\n\n\tconst [ url, setURL ] = useState( attributesUrl );\n\tconst [ isEditingURL, setIsEditingURL ] = useState( false );\n\tconst { invalidateResolution } = useDispatch( coreStore );\n\n\tconst {\n\t\tpreview,\n\t\tfetching,\n\t\tthemeSupportsResponsive,\n\t\tcannotEmbed,\n\t\thasResolved,\n\t} = useSelect(\n\t\t( select ) => {\n\t\t\tconst {\n\t\t\t\tgetEmbedPreview,\n\t\t\t\tisPreviewEmbedFallback,\n\t\t\t\tisRequestingEmbedPreview,\n\t\t\t\tgetThemeSupports,\n\t\t\t\thasFinishedResolution,\n\t\t\t} = select( coreStore );\n\t\t\tif ( ! attributesUrl ) {\n\t\t\t\treturn { fetching: false, cannotEmbed: false };\n\t\t\t}\n\n\t\t\tconst embedPreview = getEmbedPreview( attributesUrl );\n\t\t\tconst previewIsFallback = isPreviewEmbedFallback( attributesUrl );\n\n\t\t\t// The external oEmbed provider does not exist. We got no type info and no html.\n\t\t\tconst badEmbedProvider =\n\t\t\t\tembedPreview?.html === false &&\n\t\t\t\tembedPreview?.type === undefined;\n\t\t\t// Some WordPress URLs that can't be embedded will cause the API to return\n\t\t\t// a valid JSON response with no HTML and `data.status` set to 404, rather\n\t\t\t// than generating a fallback response as other embeds do.\n\t\t\tconst wordpressCantEmbed = embedPreview?.data?.status === 404;\n\t\t\tconst validPreview =\n\t\t\t\t!! embedPreview && ! badEmbedProvider && ! wordpressCantEmbed;\n\t\t\treturn {\n\t\t\t\tpreview: validPreview ? embedPreview : undefined,\n\t\t\t\tfetching: isRequestingEmbedPreview( attributesUrl ),\n\t\t\t\tthemeSupportsResponsive:\n\t\t\t\t\tgetThemeSupports()[ 'responsive-embeds' ],\n\t\t\t\tcannotEmbed: ! validPreview || previewIsFallback,\n\t\t\t\thasResolved: hasFinishedResolution( 'getEmbedPreview', [\n\t\t\t\t\tattributesUrl,\n\t\t\t\t] ),\n\t\t\t};\n\t\t},\n\t\t[ attributesUrl ]\n\t);\n\n\t/**\n\t * Returns the attributes derived from the preview, merged with the current attributes.\n\t *\n\t * @return {Object} Merged attributes.\n\t */\n\tconst getMergedAttributes = () =>\n\t\tgetMergedAttributesWithPreview(\n\t\t\tattributes,\n\t\t\tpreview,\n\t\t\ttitle,\n\t\t\tresponsive\n\t\t);\n\n\tfunction toggleResponsive( newAllowResponsive ) {\n\t\tconst { className } = attributes;\n\t\tconst { html } = preview;\n\t\tsetAttributes( {\n\t\t\tallowResponsive: newAllowResponsive,\n\t\t\tclassName: getClassNames(\n\t\t\t\thtml,\n\t\t\t\tclassName,\n\t\t\t\tresponsive && newAllowResponsive\n\t\t\t),\n\t\t} );\n\t}\n\n\tuseEffect( () => {\n\t\tif ( preview?.html || ! cannotEmbed || ! hasResolved ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// At this stage, we're not fetching the preview and know it can't be embedded,\n\t\t// so try removing any trailing slash, and resubmit.\n\t\tconst newURL = attributesUrl.replace( /\\/$/, '' );\n\t\tsetURL( newURL );\n\t\tsetIsEditingURL( false );\n\t\tsetAttributes( { url: newURL } );\n\t}, [\n\t\tpreview?.html,\n\t\tattributesUrl,\n\t\tcannotEmbed,\n\t\thasResolved,\n\t\tsetAttributes,\n\t] );\n\n\t// Try a different provider in case the embed url is not supported.\n\tuseEffect( () => {\n\t\tif ( ! cannotEmbed || fetching || ! url ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Until X provider is supported in WordPress, as a workaround we use Twitter provider.\n\t\tif ( getAuthority( url ) === 'x.com' ) {\n\t\t\tconst newURL = new URL( url );\n\t\t\tnewURL.host = 'twitter.com';\n\t\t\tsetAttributes( { url: newURL.toString() } );\n\t\t}\n\t}, [ url, cannotEmbed, fetching, setAttributes ] );\n\n\t// Handle incoming preview.\n\tuseEffect( () => {\n\t\tif ( preview && ! isEditingURL ) {\n\t\t\t// When obtaining an incoming preview,\n\t\t\t// we set the attributes derived from the preview data.\n\t\t\tconst mergedAttributes = getMergedAttributes();\n\t\t\tconst hasChanges = Object.keys( mergedAttributes ).some(\n\t\t\t\t( key ) => mergedAttributes[ key ] !== attributes[ key ]\n\t\t\t);\n\n\t\t\tif ( hasChanges ) {\n\t\t\t\tsetAttributes( mergedAttributes );\n\t\t\t}\n\n\t\t\tif ( onReplace ) {\n\t\t\t\tconst upgradedBlock = createUpgradedEmbedBlock(\n\t\t\t\t\tprops,\n\t\t\t\t\tmergedAttributes\n\t\t\t\t);\n\n\t\t\t\tif ( upgradedBlock ) {\n\t\t\t\t\tonReplace( upgradedBlock );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [ preview, isEditingURL ] );\n\n\tconst blockProps = useBlockProps();\n\n\tif ( fetching ) {\n\t\treturn (\n\t\t\t<View { ...blockProps }>\n\t\t\t\t<EmbedLoading />\n\t\t\t</View>\n\t\t);\n\t}\n\n\t// translators: %s: type of embed e.g: \"YouTube\", \"Twitter\", etc. \"Embed\" is used when no specific type exists\n\tconst label = sprintf( __( '%s URL' ), title );\n\n\t// No preview, or we can't embed the current URL, or we've clicked the edit button.\n\tconst showEmbedPlaceholder = ! preview || cannotEmbed || isEditingURL;\n\n\tif ( showEmbedPlaceholder ) {\n\t\treturn (\n\t\t\t<View { ...blockProps }>\n\t\t\t\t<EmbedPlaceholder\n\t\t\t\t\ticon={ icon }\n\t\t\t\t\tlabel={ label }\n\t\t\t\t\tonFocus={ onFocus }\n\t\t\t\t\tonSubmit={ ( event ) => {\n\t\t\t\t\t\tif ( event ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If the embed URL was changed, we need to reset the aspect ratio class.\n\t\t\t\t\t\t// To do this we have to remove the existing ratio class so it can be recalculated.\n\t\t\t\t\t\tconst blockClass = removeAspectRatioClasses(\n\t\t\t\t\t\t\tattributes.className\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tsetIsEditingURL( false );\n\t\t\t\t\t\tsetAttributes( { url, className: blockClass } );\n\t\t\t\t\t} }\n\t\t\t\t\tvalue={ url }\n\t\t\t\t\tcannotEmbed={ cannotEmbed }\n\t\t\t\t\tonChange={ ( value ) => setURL( value ) }\n\t\t\t\t\tfallback={ () => fallback( url, onReplace ) }\n\t\t\t\t\ttryAgain={ () => {\n\t\t\t\t\t\tinvalidateResolution( 'getEmbedPreview', [ url ] );\n\t\t\t\t\t} }\n\t\t\t\t/>\n\t\t\t</View>\n\t\t);\n\t}\n\n\t// Even though we set attributes that get derived from the preview,\n\t// we don't access them directly because for the initial render,\n\t// the `setAttributes` call will not have taken effect. If we're\n\t// rendering responsive content, setting the responsive classes\n\t// after the preview has been rendered can result in unwanted\n\t// clipping or scrollbars. The `getAttributesFromPreview` function\n\t// that `getMergedAttributes` uses is memoized so that we're not\n\t// calculating them on every render.\n\tconst {\n\t\tcaption,\n\t\ttype,\n\t\tallowResponsive,\n\t\tclassName: classFromPreview,\n\t} = getMergedAttributes();\n\tconst className = clsx( classFromPreview, props.className );\n\n\treturn (\n\t\t<>\n\t\t\t<EmbedControls\n\t\t\t\tshowEditButton={ preview && ! cannotEmbed }\n\t\t\t\tthemeSupportsResponsive={ themeSupportsResponsive }\n\t\t\t\tblockSupportsResponsive={ responsive }\n\t\t\t\tallowResponsive={ allowResponsive }\n\t\t\t\ttoggleResponsive={ toggleResponsive }\n\t\t\t\tswitchBackToURLInput={ () => setIsEditingURL( true ) }\n\t\t\t/>\n\t\t\t<figure\n\t\t\t\t{ ...blockProps }\n\t\t\t\tclassName={ clsx( blockProps.className, className, {\n\t\t\t\t\t[ `is-type-${ type }` ]: type,\n\t\t\t\t\t[ `is-provider-${ providerNameSlug }` ]: providerNameSlug,\n\t\t\t\t\t[ `wp-block-embed-${ providerNameSlug }` ]:\n\t\t\t\t\t\tproviderNameSlug,\n\t\t\t\t} ) }\n\t\t\t>\n\t\t\t\t<EmbedPreview\n\t\t\t\t\tpreview={ preview }\n\t\t\t\t\tpreviewable={ previewable }\n\t\t\t\t\tclassName={ className }\n\t\t\t\t\turl={ url }\n\t\t\t\t\ttype={ type }\n\t\t\t\t\tcaption={ caption }\n\t\t\t\t\tonCaptionChange={ ( value ) =>\n\t\t\t\t\t\tsetAttributes( { caption: value } )\n\t\t\t\t\t}\n\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\ticon={ icon }\n\t\t\t\t\tlabel={ label }\n\t\t\t\t\tinsertBlocksAfter={ insertBlocksAfter }\n\t\t\t\t\tattributes={ attributes }\n\t\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\t/>\n\t\t\t\t<Caption\n\t\t\t\t\tattributes={ attributes }\n\t\t\t\t\tsetAttributes={ setAttributes }\n\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\tinsertBlocksAfter={ insertBlocksAfter }\n\t\t\t\t\tlabel={ __( 'Embed caption text' ) }\n\t\t\t\t\tshowToolbarButton={ isSelected }\n\t\t\t\t/>\n\t\t\t</figure>\n\t\t</>\n\t);\n};\n\nexport default EmbedEdit;\n"],
"mappings": "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",
"names": ["className"]
}