supermemory/apps/web/app/components/plate-ui/align-dropdown-menu.tsx
2025-01-20 17:50:45 -07:00

75 lines
1.7 KiB
TypeScript

'use client';
import React from 'react';
import type { DropdownMenuProps } from '@radix-ui/react-dropdown-menu';
import {
useAlignDropdownMenu,
useAlignDropdownMenuState,
} from '@udecode/plate-alignment/react';
import {
AlignCenterIcon,
AlignJustifyIcon,
AlignLeftIcon,
AlignRightIcon,
} from 'lucide-react';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuRadioGroup,
DropdownMenuRadioItem,
DropdownMenuTrigger,
useOpenState,
} from './dropdown-menu';
import { ToolbarButton } from './toolbar';
const items = [
{
icon: AlignLeftIcon,
value: 'left',
},
{
icon: AlignCenterIcon,
value: 'center',
},
{
icon: AlignRightIcon,
value: 'right',
},
{
icon: AlignJustifyIcon,
value: 'justify',
},
];
export function AlignDropdownMenu({ children, ...props }: DropdownMenuProps) {
const state = useAlignDropdownMenuState();
const { radioGroupProps } = useAlignDropdownMenu(state);
const openState = useOpenState();
const IconValue =
items.find((item) => item.value === radioGroupProps.value)?.icon ??
AlignLeftIcon;
return (
<DropdownMenu modal={false} {...openState} {...props}>
<DropdownMenuTrigger asChild>
<ToolbarButton pressed={openState.open} tooltip="Align" isDropdown>
<IconValue />
</ToolbarButton>
</DropdownMenuTrigger>
<DropdownMenuContent className="min-w-0" align="start">
<DropdownMenuRadioGroup {...radioGroupProps}>
{items.map(({ icon: Icon, value: itemValue }) => (
<DropdownMenuRadioItem key={itemValue} value={itemValue} hideIcon>
<Icon />
</DropdownMenuRadioItem>
))}
</DropdownMenuRadioGroup>
</DropdownMenuContent>
</DropdownMenu>
);
}