/*
* External dependencies
*/
import { aiAssistantIcon } from '@automattic/jetpack-ai-client';
import { useAnalytics } from '@automattic/jetpack-shared-extension-utils';
import { ToolbarButton, Dropdown } from '@wordpress/components';
import React, { useCallback, useContext } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
/*
* Internal dependencies
*/
import AiAssistantToolbarDropdownContent from '../../../components/ai-assistant-toolbar-dropdown/dropdown-content';
import useTransformToAssistant from '../../../hooks/use-transform-to-assistant';
import { InlineExtensionsContext } from '../../get-block-handler';
/*
* Types
*/
import type {
AiAssistantDropdownOnChangeOptionsArgProps,
OnRequestSuggestion,
} from '../../../components/ai-assistant-toolbar-dropdown/dropdown-content';
import type { ExtendedInlineBlockProp } from '../../../extensions/ai-assistant';
import type { PromptTypeProp } from '../../../lib/prompt';
import type { BlockBehavior } from '../../types';
import type { ReactElement } from 'react';
type AiAssistantExtensionToolbarDropdownContentProps = {
blockType: ExtendedInlineBlockProp;
onClose: () => void;
onAskAiAssistant: () => void;
onRequestSuggestion: OnRequestSuggestion;
};
/**
* The dropdown component with logic for the AI Assistant block.
* @param {AiAssistantExtensionToolbarDropdownContentProps} props - The props.
* @returns {ReactElement} The React content of the dropdown.
*/
function AiAssistantExtensionToolbarDropdownContent( {
blockType,
onClose,
onAskAiAssistant,
onRequestSuggestion,
}: AiAssistantExtensionToolbarDropdownContentProps ) {
const { canTransformToAIAssistant, transformToAIAssistant, getSelectedBlockClientIds } =
useTransformToAssistant();
const handleToolbarButtonClick = useCallback(
( request?: {
promptType: PromptTypeProp;
options?: AiAssistantDropdownOnChangeOptionsArgProps;
humanText?: string;
} ) => {
const selectedBlockIds = getSelectedBlockClientIds();
const [ clientId ] = selectedBlockIds;
if (
selectedBlockIds.length < 2 ||
! canTransformToAIAssistant( { clientId, blockName: blockType } )
) {
// If there is only one selected block or the block cannot be transformed, proceed to open the extension input.
if ( request ) {
onRequestSuggestion?.( request.promptType, request.options, request.humanText );
} else {
onAskAiAssistant?.();
}
onClose?.();
} else {
// If there are multiple blocks selected, replace them with a single AI Assistant block.
transformToAIAssistant( { request } );
}
},
[
blockType,
canTransformToAIAssistant,
getSelectedBlockClientIds,
onAskAiAssistant,
onClose,
onRequestSuggestion,
transformToAIAssistant,
]
);
const handleRequestSuggestion: OnRequestSuggestion = ( promptType, options, humanText ) => {
handleToolbarButtonClick( { promptType, options, humanText } );
};
const handleAskAiAssistant = async () => {
handleToolbarButtonClick();
};
return (
);
}
type AiAssistantExtensionToolbarDropdownProps = {
behavior: BlockBehavior;
blockType: ExtendedInlineBlockProp;
label?: string;
onAskAiAssistant: () => void;
onRequestSuggestion: OnRequestSuggestion;
};
export default function AiAssistantExtensionToolbarDropdown( {
behavior,
blockType,
label = __( 'AI Assistant', 'jetpack' ),
onAskAiAssistant,
onRequestSuggestion,
}: AiAssistantExtensionToolbarDropdownProps ): ReactElement {
const { tracks } = useAnalytics();
const inlineExtensionsContext = useContext( InlineExtensionsContext );
const toggleHandler = useCallback(
( isOpen: boolean ) => {
if ( isOpen ) {
tracks.recordEvent( 'jetpack_ai_assistant_extension_toolbar_menu_show', {
block_type: blockType,
} );
}
},
[ blockType, tracks ]
);
const handleAskAiAssistant = useCallback( () => {
tracks.recordEvent( 'jetpack_editor_ai_assistant_extension_toolbar_prompt_show', {
block_type: blockType,
} );
onAskAiAssistant?.();
}, [ blockType, onAskAiAssistant, tracks ] );
const handleRequestSuggestion = useCallback< OnRequestSuggestion >(
( promptType, options, humanText ) => {
tracks.recordEvent( 'jetpack_editor_ai_assistant_extension_toolbar_button_click', {
suggestion: promptType,
block_type: blockType,
} );
onRequestSuggestion?.( promptType, options, humanText );
},
[ blockType, onRequestSuggestion, tracks ]
);
return (
{
const handleClick = () => {
if ( typeof behavior === 'function' ) {
behavior( { onToggle, onAskAiAssistant, context: inlineExtensionsContext } );
return;
}
switch ( behavior ) {
case 'action':
handleAskAiAssistant();
break;
case 'dropdown':
onToggle();
break;
}
};
return (
);
} }
onToggle={ toggleHandler }
renderContent={ ( { onClose: onClose } ) => (
) }
/>
);
}