Create New Item
×
Item Type
File
Folder
Item Name
×
Search file in folder and subfolders...
File Manager
/
wp-content
/
plugins
/
generateblocks
/
src
/
components
/
url-controls
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
import { __ } from '@wordpress/i18n'; import { BaseControl, ToggleControl, useBaseControlProps } from '@wordpress/components'; import { URLInput } from '@wordpress/block-editor'; import { useEffect } from '@wordpress/element'; import { Stack } from '@edge22/components'; import { DynamicTagModal } from '../../dynamic-tags'; import './editor.scss'; export function URLControls( { htmlAttributes, setAttributes, attributesName = 'htmlAttributes', label = __( 'Link', 'generateblocks' ), context, tagName, } ) { const url = htmlAttributes?.href ?? ''; const target = htmlAttributes?.target ?? ''; const rel = htmlAttributes?.rel ?? ''; useEffect( () => { if ( '_blank' === target ) { if ( ! rel.includes( 'noopener' ) ) { const relItems = rel ? rel.split( ' ' ) : []; relItems.push( 'noopener' ); setAttributes( { [ attributesName ]: { ...htmlAttributes, rel: relItems.join( ' ' ), }, } ); } } else if ( rel.includes( 'noopener' ) ) { const relItems = rel ? rel.split( ' ' ) : []; relItems.splice( relItems.indexOf( 'noopener' ), 1 ); setAttributes( { [ attributesName ]: { ...htmlAttributes, rel: relItems.join( ' ' ), }, } ); } }, [ target, rel ] ); const { baseControlProps, controlProps } = useBaseControlProps( { label, } ); return ( <div className="gb-url-controls components-base-control"> <BaseControl { ...baseControlProps }> <Stack layout="flex" direction="horizontal" wrap={ false } gap="5px"> <URLInput { ...controlProps } className={ 'gb-url-controls__link-input' } value={ url } onChange={ ( value ) => { setAttributes( { [ attributesName ]: { ...htmlAttributes, href: value, }, } ); } } disableSuggestions={ url.includes( '{{' ) } /> <DynamicTagModal onInsert={ ( value ) => { setAttributes( { [ attributesName ]: { ...htmlAttributes, href: value, }, } ); } } selectedText={ url.startsWith( '{{' ) ? url : '' } context={ context } tagName={ tagName } /> </Stack> </BaseControl> { ( !! url || !! target || !! rel ) && ( <> <ToggleControl label={ __( 'Open link in a new tab', 'generateblocks' ) } checked={ target || '' } onChange={ ( value ) => { const newHtmlAttributes = { ...htmlAttributes }; if ( value ) { newHtmlAttributes.target = '_blank'; } else { delete newHtmlAttributes.target; } setAttributes( { [ attributesName ]: newHtmlAttributes, } ); } } /> <ToggleControl label={ __( 'Add rel="nofollow"', 'generateblocks' ) } checked={ rel?.includes( 'nofollow' ) || '' } onChange={ ( value ) => { const newHtmlAttributes = { ...htmlAttributes }; const relItems = rel ? rel.split( ' ' ) : []; if ( value && ! relItems.includes( 'nofollow' ) ) { relItems.push( 'nofollow' ); } if ( ! value && relItems.includes( 'nofollow' ) ) { relItems.splice( relItems.indexOf( 'nofollow' ), 1 ); } if ( relItems.length > 0 ) { newHtmlAttributes.rel = relItems.join( ' ' ); } else { delete newHtmlAttributes.rel; } setAttributes( { [ attributesName ]: newHtmlAttributes, } ); } } /> <ToggleControl label={ __( 'Add rel="sponsored"', 'generateblocks' ) } checked={ rel?.includes( 'sponsored' ) || '' } onChange={ ( value ) => { const newHtmlAttributes = { ...htmlAttributes }; const relItems = rel ? rel.split( ' ' ) : []; if ( value && ! relItems.includes( 'sponsored' ) ) { relItems.push( 'sponsored' ); } if ( ! value && relItems.includes( 'sponsored' ) ) { relItems.splice( relItems.indexOf( 'sponsored' ), 1 ); } if ( relItems.length > 0 ) { newHtmlAttributes.rel = relItems.join( ' ' ); } else { delete newHtmlAttributes.rel; } setAttributes( { [ attributesName ]: newHtmlAttributes, } ); } } /> </> ) } </div> ); }