/home/edulekha/heavenbuildpro.com/wp-content/plugins/extendify/src/Draft/components/InsertMenu.js
import { createBlock, pasteHandler } from '@wordpress/blocks'
import {
MenuGroup,
MenuItem,
__experimentalDivider as Divider,
} from '@wordpress/components'
import { useDispatch, useSelect } from '@wordpress/data'
import { useEffect } from '@wordpress/element'
import { __ } from '@wordpress/i18n'
import { Icon } from '@wordpress/icons'
import { useContentHighlight } from '@draft/hooks/useContentHighlight'
import { replace, replay, below, trash, shorter, longer } from '@draft/svg'
export const InsertMenu = ({
prompt,
completion,
loading,
setPrompt,
setInputText,
}) => {
const { toggleHighlight, toggleInsertionPoint } = useContentHighlight()
const { insertBlocks, replaceBlocks } = useDispatch('core/block-editor')
const selectedBlock = useSelect(
(select) => select('core/block-editor').getSelectedBlock(),
[],
)
const selectedBlockClientIds = useSelect(
(select) => select('core/block-editor').getSelectedBlockClientIds(),
[],
)
const { getBlockRootClientId, getBlockIndex, getBlock } = useSelect(
(select) => select('core/block-editor'),
[],
)
const canReplaceContent = () => {
const targetBlock = selectedBlock
? selectedBlock
: getBlock(selectedBlockClientIds[0])
if (!targetBlock) {
return true
}
return typeof targetBlock?.attributes?.content === 'undefined'
}
const transformBlocks = (blocks, targetBlockId) => {
const targetBlock = getBlock(targetBlockId)
return blocks.map((block) => {
return {
...block,
name: targetBlock.name,
attributes: {
...targetBlock.attributes,
content: block.attributes.content,
},
}
})
}
const plainTextToBlocks = (plainText) => {
let blocks = pasteHandler({ plainText: plainText })
if (!Array.isArray(blocks)) {
blocks = [
createBlock('core/paragraph', {
content: blocks,
}),
]
}
return blocks
}
const insertCompletion = ({ replaceContent = false }) => {
setPrompt({ text: '', promptType: '', systemMessageKey: '' })
const targetBlockId = selectedBlock
? selectedBlock?.clientId
: selectedBlockClientIds[0]
let blocks = plainTextToBlocks(completion)
if (selectedBlock && selectedBlock?.attributes?.content === '') {
replaceContent = true
}
if (replaceContent) {
blocks = transformBlocks(blocks, targetBlockId)
replaceBlocks(selectedBlockClientIds, blocks)
} else if (!targetBlockId) {
insertBlocks(blocks)
} else {
const parentBlockId = getBlockRootClientId(targetBlockId)
const blockIndex = getBlockIndex(
selectedBlockClientIds.at(-1),
parentBlockId,
)
if (parentBlockId) {
blocks = transformBlocks(blocks, targetBlockId)
}
insertBlocks(blocks, blockIndex + 1, parentBlockId)
}
}
const handleEdit = (promptType) => {
setInputText('')
setPrompt({
text: completion,
promptType,
systemMessageKey: 'edit',
})
}
const discard = () => {
setInputText('')
setPrompt({ text: '', promptType: '', systemMessageKey: '' })
}
const retry = () => {
setInputText('')
setPrompt({ text: '', promptType: '', systemMessageKey: '' })
setTimeout(() => setPrompt(prompt))
}
useEffect(() => {
return () => {
toggleHighlight(selectedBlockClientIds, { isHighlighted: false })
}
}, [selectedBlockClientIds, toggleHighlight])
return (
<MenuGroup>
<MenuItem
onClick={() => insertCompletion({ replaceContent: true })}
onMouseEnter={() =>
toggleHighlight(selectedBlockClientIds, {
isHighlighted: true,
})
}
onMouseLeave={() =>
toggleHighlight(selectedBlockClientIds, {
isHighlighted: false,
})
}
disabled={loading || canReplaceContent()}>
<Icon
icon={replace}
className="flex-shrink-0 fill-current w-5 h-5 mr-2"
/>
<span className="whitespace-normal text-left">
{__('Replace selected block text', 'extendify')}
</span>
</MenuItem>
<MenuItem
onClick={() => insertCompletion({ replaceContent: false })}
onMouseEnter={() => toggleInsertionPoint(true)}
onMouseLeave={() => toggleInsertionPoint(false)}
disabled={loading}>
<Icon
icon={below}
className="flex-shrink-0 fill-current w-5 h-5 mr-2"
/>
<span className="whitespace-normal text-left">
{__('Insert below', 'extendify')}
</span>
</MenuItem>
<MenuItem
onClick={() => handleEdit('make-shorter')}
disabled={loading}
className="group">
<Icon
icon={shorter}
className="flex-shrink-0 fill-current w-5 h-5 mr-2"
/>
{__('Make shorter', 'extendify')}
</MenuItem>
<MenuItem
onClick={() => handleEdit('make-longer')}
disabled={loading}
className="group">
<Icon
icon={longer}
className="flex-shrink-0 fill-current w-5 h-5 mr-2"
/>
<span className="whitespace-normal text-left">
{__('Make longer', 'extendify')}
</span>
</MenuItem>
<Divider />
<MenuItem onClick={retry} disabled={loading}>
<Icon
icon={replay}
className="flex-shrink-0 fill-current w-5 h-5 mr-2"
/>
<span className="whitespace-normal text-left">
{__('Try again', 'extendify')}
</span>
</MenuItem>
<MenuItem onClick={discard} disabled={loading}>
<Icon
icon={trash}
className="flex-shrink-0 fill-current w-5 h-5 mr-2"
/>
<span className="whitespace-normal text-left">
{__('Discard', 'extendify')}
</span>
</MenuItem>
</MenuGroup>
)
}