/** * WordPress dependencies */ import { InspectorControls } from '@wordpress/block-editor'; import { PanelBody } from '@wordpress/components'; import { compose, createHigherOrderComponent } from '@wordpress/compose'; import domReady from '@wordpress/dom-ready'; import { addFilter } from '@wordpress/hooks'; /** * Internal dependencies */ import { __ } from '@wordpress/i18n'; import { Telemetry } from '../../../js/telemetry/telemetry'; import { LeafIcon } from '../../common/icons/leaf-icon'; import { SettingsProvider, SidebarSettings, useSettings } from '../../common/settings'; import { isEditorReady } from '../../common/utils/functions'; import { getContentHelperPermissions } from '../../common/utils/permissions'; import { VerifyCredentials } from '../../common/verify-credentials'; import { getSettingsFromJson } from '../editor-sidebar'; import { SmartLinkingPanel, SmartLinkingPanelContext } from './component'; import { initBlockOverlay } from './component-block-overlay'; import './smart-linking.scss'; import { selectSmartLink } from './utils'; /** * Default maximum number of links to show in the smart linking panel. * * @since 3.14.0 */ export const DEFAULT_MAX_LINKS = 10; /** * The allowed blocks for Smart Linking. * * @since 3.16.2 */ export const ALLOWED_BLOCKS = window.wpParselySmartLinkingAllowedBlocks ?? [ 'core/paragraph' ]; const permissions = getContentHelperPermissions(); /** * Higher order component to add the settings provider to the block edit component. * This is required to provide the settings to the smart linking panel. * * @since 3.14.0 */ const withSettingsProvider = createHigherOrderComponent( ( BlockEdit ) => { return ( props ) => { if ( ! ALLOWED_BLOCKS.includes( props.name ) ) { return ; } return ( ); }; }, 'withSettingsProvider' ); /** * Smart linking inspector control panel component. * * @since 3.14.0 */ const SmartLinkingInspectorControlPanel = createHigherOrderComponent( ( BlockEdit ) => { return ( props ) => { if ( ! props.isSelected || ! ALLOWED_BLOCKS.includes( props.name ) ) { return ; } const { settings, setSettings } = useSettings(); return ( <> { /* @ts-ignore */ } } onToggle={ ( next ) => { setSettings( { SmartLinking: { ...settings.SmartLinking, Open: next, }, } ); Telemetry.trackEvent( 'smart_linking_block_inspector_panel_toggled', { open: next } ); } } > ); }; }, 'withSmartLinkingPanel' ); /** * The smart linking panel with settings provider. * This is the final component that is added to the block inspector. * * @since 3.14.0 */ const SmartLinkingPanelWithSettingsProvider = compose( withSettingsProvider, SmartLinkingInspectorControlPanel ); /** * Initializes the smart linking, by adding the smart linking panel to the paragraph block. * Also registers the block overlay container. * * @since 3.14.0 */ export const initSmartLinking = (): void => { if ( true !== permissions.SmartLinking ) { return; } /** * Add smart linking inspector control panel to paragraph block. */ addFilter( 'editor.BlockEdit', 'wpparsely/smart-linking-inspector-control-panel', SmartLinkingPanelWithSettingsProvider ); /** * Initialize the block overlay component. */ initBlockOverlay(); /** * If the smart-link query parameter is present, it will select that smart link, and scroll to it. * This is used when the "Open in Editor" button is clicked from the inbound smart link details page. * * @since 3.16.0 */ domReady( () => { // Check if the smart-link query parameter is present. const urlParams = new URLSearchParams( window.location.search ); const smartLinkValue = urlParams.get( 'smart-link' ); if ( smartLinkValue ) { isEditorReady().then( () => { const editorContent = document.querySelector( '.wp-block-post-content' ); selectSmartLink( editorContent as HTMLElement, smartLinkValue ); } ); } } ); };