'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}
))}
);
}