import * as React from "react"; import { useMenuState } from "reakit"; import { MenuButton } from "reakit/Menu"; import styled from "styled-components"; import breakpoint from "styled-components-breakpoint"; import { MenuItem } from "@shared/editor/types"; import { s } from "@shared/styles"; import ContextMenu from "~/components/ContextMenu"; import Template from "~/components/ContextMenu/Template"; import { MenuItem as TMenuItem } from "~/types"; import { useEditor } from "./EditorContext"; import ToolbarButton from "./ToolbarButton"; import ToolbarSeparator from "./ToolbarSeparator"; import Tooltip from "./Tooltip"; type Props = { items: MenuItem[]; }; /* * Renders a dropdown menu in the floating toolbar. */ function ToolbarDropdown(props: { active: boolean; item: MenuItem }) { const menu = useMenuState(); const { commands, view } = useEditor(); const { item } = props; const { state } = view; const items: TMenuItem[] = React.useMemo(() => { const handleClick = (menuItem: MenuItem) => () => { if (!menuItem.name) { return; } commands[menuItem.name]( typeof menuItem.attrs === "function" ? menuItem.attrs(state) : menuItem.attrs ); }; return item.children ? item.children.map((child) => ({ type: "button", title: child.label, icon: child.icon, dangerous: child.dangerous, visible: child.visible, selected: child.active !== undefined ? child.active(state) : undefined, onClick: handleClick(child), })) : []; }, [item.children, commands, state]); return ( <> {(buttonProps) => ( {item.label && } {item.icon} )}