@wordpress/block-library
Version:
Block library for the WordPress editor.
101 lines (91 loc) • 2.44 kB
JavaScript
/**
* WordPress dependencies
*/
import { __, sprintf } from '@wordpress/i18n';
import {
LinkSettingsNavigation,
FooterMessageLink,
} from '@wordpress/components';
import { isURL } from '@wordpress/url';
import { useDispatch } from '@wordpress/data';
import { store as noticesStore } from '@wordpress/notices';
import { useCallback, useEffect, useRef, useState } from '@wordpress/element';
const EmbedLinkSettings = ( {
autoFocus,
value,
label,
isVisible,
onClose,
onSubmit,
withBottomSheet,
} ) => {
const url = useRef( value );
const [ inputURL, setInputURL ] = useState( value );
const { createErrorNotice } = useDispatch( noticesStore );
const linkSettingsOptions = {
url: {
label: sprintf(
// translators: %s: embed block variant's label e.g: "Twitter".
__( '%s link' ),
label
),
placeholder: __( 'Add link' ),
autoFocus,
autoFill: true,
},
footer: {
label: (
<FooterMessageLink
href={ __(
'https://wordpress.org/support/article/embeds/'
) }
value={ __( 'Learn more about embeds' ) }
/>
),
separatorType: 'topFullWidth',
},
};
const onDismiss = useCallback( () => {
if ( ! isURL( url.current ) && url.current !== '' ) {
createErrorNotice( __( 'Invalid URL. Please enter a valid URL.' ) );
// If the URL was already defined, we submit it to stop showing the embed placeholder.
onSubmit( value );
return;
}
onSubmit( url.current );
}, [ onSubmit, value ] );
useEffect( () => {
url.current = value;
setInputURL( value );
}, [ value ] );
/**
* If the Embed Bottom Sheet component does not utilize a bottom sheet then the onDismiss action is not
* called. Here we are wiring the onDismiss to the onClose callback that gets triggered when input is submitted.
*/
const performOnCloseOperations = useCallback( () => {
if ( onClose ) {
onClose();
}
if ( ! withBottomSheet ) {
onDismiss();
}
}, [ onClose ] );
const onSetAttributes = useCallback( ( attributes ) => {
url.current = attributes.url;
setInputURL( attributes.url );
}, [] );
return (
<LinkSettingsNavigation
isVisible={ isVisible }
url={ inputURL }
onClose={ performOnCloseOperations }
onDismiss={ onDismiss }
setAttributes={ onSetAttributes }
options={ linkSettingsOptions }
testID="embed-edit-url-modal"
withBottomSheet={ withBottomSheet }
showIcon
/>
);
};
export default EmbedLinkSettings;