Add a new popover component for editing Personalization Tags
[MAILPOET-6379]
This commit is contained in:
@@ -71,3 +71,17 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.mailpoet-personalization-tag-popover {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
|
||||
.mailpoet-personalization-tag-popover__content {
|
||||
padding: 8px;
|
||||
width: 400px;
|
||||
}
|
||||
.mailpoet-personalization-tag-popover__content-button {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,97 @@
|
||||
import { useEffect, useState } from '@wordpress/element';
|
||||
import { Popover, Button, TextControl } from '@wordpress/components';
|
||||
import { __ } from '@wordpress/i18n';
|
||||
|
||||
type PersonalizationTagsPopoverProps = {
|
||||
contentRef: React.RefObject< HTMLElement >;
|
||||
onUpdate: ( originalValue: string, updatedValue: string ) => void;
|
||||
};
|
||||
|
||||
/**
|
||||
* Component to display a popover with a text control to update personalization tags.
|
||||
* The popover is displayed when a user clicks on a personalization tag in the editor.
|
||||
* @param root0
|
||||
* @param root0.contentRef Reference to the container where the popover should be displayed
|
||||
* @param root0.onUpdate Callback to update the personalization tag
|
||||
*/
|
||||
const PersonalizationTagsPopover = ( {
|
||||
contentRef,
|
||||
onUpdate,
|
||||
}: PersonalizationTagsPopoverProps ) => {
|
||||
const [ isPopoverVisible, setIsPopoverVisible ] = useState( false );
|
||||
const [ popoverAnchor, setPopoverAnchor ] = useState< HTMLElement | null >(
|
||||
null
|
||||
);
|
||||
const [ updatedValue, setUpdatedValue ] = useState( '' );
|
||||
const [ originalValue, setOriginalValue ] = useState( '' );
|
||||
|
||||
useEffect( () => {
|
||||
if ( ! contentRef || ! contentRef.current ) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const container = contentRef.current;
|
||||
|
||||
// Handle clicks within the referenced container
|
||||
const handleContainerClick = ( event: Event ) => {
|
||||
const target = event.target as HTMLElement;
|
||||
const commentSpan = target.closest(
|
||||
'span[data-rich-text-comment]'
|
||||
) as HTMLElement;
|
||||
|
||||
if ( commentSpan ) {
|
||||
// Remove brackets from the text content for better user experience
|
||||
const textContent = commentSpan.innerText.replace(
|
||||
/^\[|\]$/g,
|
||||
''
|
||||
);
|
||||
setOriginalValue( textContent );
|
||||
setUpdatedValue( textContent );
|
||||
setPopoverAnchor( commentSpan );
|
||||
setIsPopoverVisible( true );
|
||||
}
|
||||
};
|
||||
|
||||
// Add the event listener to the container
|
||||
container.addEventListener( 'click', handleContainerClick );
|
||||
|
||||
// Cleanup function to remove the event listener on unmount
|
||||
return () => {
|
||||
container.removeEventListener( 'click', handleContainerClick );
|
||||
};
|
||||
}, [ contentRef ] );
|
||||
|
||||
return (
|
||||
<>
|
||||
{ isPopoverVisible && (
|
||||
<Popover
|
||||
position="bottom right"
|
||||
onClose={ () => setIsPopoverVisible( false ) }
|
||||
anchorRef={ popoverAnchor }
|
||||
className="mailpoet-personalization-tag-popover"
|
||||
>
|
||||
<div className="mailpoet-personalization-tag-popover__content">
|
||||
<TextControl
|
||||
label={ __( 'Personalization Tag', 'mailpoet' ) }
|
||||
value={ updatedValue }
|
||||
onChange={ ( value ) => setUpdatedValue( value ) }
|
||||
/>
|
||||
<div className="mailpoet-personalization-tag-popover__content-button">
|
||||
<Button
|
||||
isPrimary
|
||||
onClick={ () => {
|
||||
onUpdate( originalValue, updatedValue );
|
||||
setIsPopoverVisible( false );
|
||||
} }
|
||||
>
|
||||
{ __( 'Update', 'mailpoet' ) }
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</Popover>
|
||||
) }
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export { PersonalizationTagsPopover };
|
Reference in New Issue
Block a user