'use client'; import React from 'react'; import type { DropdownMenuProps } from '@radix-ui/react-dropdown-menu'; import { BlockquotePlugin } from '@udecode/plate-block-quote/react'; import { CodeBlockPlugin } from '@udecode/plate-code-block/react'; import { HEADING_KEYS } from '@udecode/plate-heading'; import { INDENT_LIST_KEYS, ListStyleType } from '@udecode/plate-indent-list'; import { TogglePlugin } from '@udecode/plate-toggle/react'; import { ParagraphPlugin, useEditorRef, useSelectionFragmentProp, } from '@udecode/plate/react'; import { ChevronRightIcon, Columns3Icon, FileCodeIcon, Heading1Icon, Heading2Icon, Heading3Icon, ListIcon, ListOrderedIcon, PilcrowIcon, QuoteIcon, SquareIcon, } from 'lucide-react'; import { getBlockType, setBlockType, STRUCTURAL_TYPES, } from '@plone/plate/components/editor/transforms'; import { DropdownMenu, DropdownMenuContent, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger, useOpenState, } from './dropdown-menu'; import { ToolbarButton } from './toolbar'; const turnIntoItems = [ { icon: , keywords: ['paragraph'], label: 'Text', value: ParagraphPlugin.key, }, { icon: , keywords: ['title', 'h1'], label: 'Heading 1', value: HEADING_KEYS.h1, }, { icon: , keywords: ['subtitle', 'h2'], label: 'Heading 2', value: HEADING_KEYS.h2, }, { icon: , keywords: ['subtitle', 'h3'], label: 'Heading 3', value: HEADING_KEYS.h3, }, { icon: , keywords: ['unordered', 'ul', '-'], label: 'Bulleted list', value: ListStyleType.Disc, }, { icon: , keywords: ['ordered', 'ol', '1'], label: 'Numbered list', value: ListStyleType.Decimal, }, { icon: , keywords: ['checklist', 'task', 'checkbox', '[]'], label: 'To-do list', value: INDENT_LIST_KEYS.todo, }, { icon: , keywords: ['collapsible', 'expandable'], label: 'Toggle list', value: TogglePlugin.key, }, { icon: , keywords: ['```'], label: 'Code', value: CodeBlockPlugin.key, }, { icon: , keywords: ['citation', 'blockquote', '>'], label: 'Quote', value: BlockquotePlugin.key, }, { icon: , label: '3 columns', value: 'action_three_columns', }, ]; export function TurnIntoDropdownMenu(props: DropdownMenuProps) { const editor = useEditorRef(); const openState = useOpenState(); const value = useSelectionFragmentProp({ defaultValue: ParagraphPlugin.key, structuralTypes: STRUCTURAL_TYPES, getProp: (node) => getBlockType(node as any), }); const selectedItem = React.useMemo( () => turnIntoItems.find( (item) => item.value === (value ?? ParagraphPlugin.key), ) ?? turnIntoItems[0], [value], ); return ( {selectedItem.label} { e.preventDefault(); editor.tf.focus(); }} align="start" > { setBlockType(editor, type); }} label="Turn into" > {turnIntoItems.map(({ icon, label, value: itemValue }) => ( {icon} {label} ))} ); }