/** * WordPress dependencies */ import { RichTextToolbarButton } from '@safe-wordpress/block-editor'; import { useSelect } from '@safe-wordpress/data'; import { _x } from '@safe-wordpress/i18n'; import { registerFormatType, toggleFormat } from '@safe-wordpress/rich-text'; import type { RichTextFormat, RichTextValue } from '@safe-wordpress/rich-text'; /** * External dependencies */ import { capitalize, find, uniq, filter, slice, trim } from 'lodash'; import { store as NC_DATA } from '@nelio-content/data'; import { useDisabledProfiles } from '@nelio-content/edit-post'; import { isEmpty, isUrl } from '@nelio-content/utils'; import type { Url } from '@nelio-content/types'; /** * Internal dependencies */ import { createSocialMessageUsingSelection } from '../common'; import PluginIcon from '~/nelio-content-images/logo.svg'; const HIGHLIGHT = 'nelio-content/highlight'; const SHARE = 'nelio-content/share'; export function addSocialShareButtons(): void { registerFormatType( HIGHLIGHT, { name: HIGHLIGHT, title: _x( 'Social Media Highlight', 'text', 'nelio-content' ), // eslint-disable-next-line tagName: 'ncshare' as any, className: null, edit: HighlightButton, interactive: false, object: false, } ); registerFormatType( SHARE, { name: SHARE, title: _x( 'Share', 'command', 'nelio-content' ), tagName: 'span', className: 'nc-share', edit: ShareButton, interactive: false, object: false, } ); } const HighlightButton = ( { isActive, value, onChange, }: { readonly isActive: boolean; readonly value: RichTextValue; readonly onChange: ( v: RichTextValue ) => void; } ) => ( } title={ _x( 'Social Media Highlight', 'text', 'nelio-content' ) } onClick={ () => onChange( toggleFormat( value, { type: HIGHLIGHT } ) ) } isActive={ isActive } /> ); const ShareButton = ( { value }: { readonly value: RichTextValue } ) => { const profiles = useSelect( ( select ) => select( NC_DATA ).getSocialProfileIds(), [] ); const disabled = useDisabledProfiles(); const areThereAvailableProfiles = disabled.length < profiles.length; return ( createSocialMessageUsingSelection( getText( value ), extractLinks( value ) ) } /> ); }; function isThereSelectedText( value: RichTextValue ) { return ! isEmpty( getText( value ) ); } function getText( value: RichTextValue ) { const text = trim( value.text.substring( value.start ?? 0, value.end ) ); return capitalize( text[ 0 ] ) + text.substring( 1 ); } function extractLinks( value: RichTextValue ): ReadonlyArray< Url > { const charFormats = slice( value.formats, value.start, value.end ) ?? []; return uniq( filter( charFormats.map( extractReference ) ) ).filter( isUrl ); } function extractReference( formats?: ReadonlyArray< RichTextFormat > ): string { const link = find( formats, { type: 'core/link' } ); return link?.attributes?.url ?? ''; }