import { ToolbarButton } from '@/components/toolbarButton'; import { useGenerateAltText } from './useGenerateAltText'; import { BlockEditProps } from '@/types'; import _ from 'underscore'; import { useSelect } from '@wordpress/data'; import { useSettings } from '@/settings'; import { createInterpolateElement, createRoot, useCallback, useEffect, useMemo } from '@wordpress/element'; import { __, sprintf } from '@wordpress/i18n'; import { ExternalLink } from '@wordpress/components'; type Props = { attributes: BlockEditProps['attributes']; setAttributes: BlockEditProps['setAttributes']; isSelected: BlockEditProps['isSelected']; }; export const ImageToolbar = ({ attributes, setAttributes, isSelected }: Props) => { const generateAltText = useGenerateAltText({ attributes, setAttributes }); const { settings } = useSettings(); const dynamicAddAltTextEnabled = useMemo(() => { return (isSelected && settings?.dynamic_add_alt_text_enabled && (attributes?.mediaId || attributes?.id)) || false; }, [attributes, isSelected, settings]); const altText = useSelect( (select) => { if (!dynamicAddAltTextEnabled) { return null; } // @ts-expect-error Type 'never' has no call signatures. return select('core').getMedia(attributes.mediaId || attributes.id)?.alt_text; }, [dynamicAddAltTextEnabled] ); const Message = useCallback( () => ( <> {__('Describe the purpose of the image.')}
{createInterpolateElement( sprintf( __( 'Missing alt text will be automatically replaced with the current global alt text from the Media Library%s', 'filter-ai' ), altText ? `: "${altText}"` : '.' ), { i: } )} ), [altText] ); const addAltTextContainer = useCallback(() => { const link = document.querySelector('[href*="https://www.w3.org/WAI/tutorials/images/decision-tree/"]'); if (!link?.parentElement || document.querySelector('.filter-ai-alt-text-container')) { return; } link.parentElement.classList.add('filter-ai-alt-text-container'); const container = createRoot(link.parentElement); container.render(); }, [Message]); useEffect(() => { if (!dynamicAddAltTextEnabled) { return; } const tabpanel = document.querySelector('[id^="tabs-"][id$="-edit-post/block-view"]'); const observer = new MutationObserver(addAltTextContainer); if (tabpanel) { observer.observe(tabpanel, { childList: true, subtree: true }); } return () => { observer.disconnect(); }; }, [dynamicAddAltTextEnabled, addAltTextContainer]); return ; };