import { useRef } from 'react'; import { Editor as EditorProps } from '@tiptap/react'; import { TbBold, TbCode, TbH1, TbH2, TbH3, TbItalic, TbLink, TbList, TbListDetails, TbListNumbers, TbPhoto, TbQuote, TbStrikethrough, TbUnlink, } from 'react-icons/tb'; import { Flex } from '../../Flex'; import { IconButton } from '../../IconButton'; import { Separator } from '../../Separator'; import { Tooltip } from '../../Tooltip'; interface MenuBarProps { editor: EditorProps | null; options: string[]; } export function MenuBar({ editor, options }: MenuBarProps): JSX.Element { const inputFileRef = useRef(null); function setLink(): void { if (editor) { const previousUrl = editor.getAttributes('link').href; const url = window.prompt('URL', previousUrl); if (url === null) { return; } if (url === '') { editor.chain().focus().extendMarkRange('link').unsetLink().run(); return; } editor .chain() .focus() .extendMarkRange('link') .setLink({ href: url }) .run(); } } if (!editor) { return <>; } return ( <> { if (event.target.files?.length) { const file = event.target.files[0]; const reader = new FileReader(); reader.onloadend = () => { if (editor) { editor .chain() .focus() .setImage({ src: reader.result as string, }) .run(); } }; reader.readAsDataURL(file); } }} style={{ display: 'none' }} /> {options.includes('heading-1') && ( editor.chain().focus().toggleHeading({ level: 1 }).run() } icon={} variant={ editor.isActive('heading', { level: 1 }) ? 'secondary' : 'ghost' } /> )} {options.includes('heading-2') && ( editor.chain().focus().toggleHeading({ level: 2 }).run() } icon={} variant={ editor.isActive('heading', { level: 2 }) ? 'secondary' : 'ghost' } /> )} {options.includes('heading-3') && ( editor.chain().focus().toggleHeading({ level: 3 }).run() } icon={} variant={ editor.isActive('heading', { level: 3 }) ? 'secondary' : 'ghost' } /> )} {options.includes('bold') && ( } onClick={() => editor.chain().focus().toggleBold().run()} variant={editor.isActive('bold') ? 'secondary' : 'ghost'} /> )} {options.includes('italic') && ( } onClick={() => editor.chain().focus().toggleItalic().run()} variant={editor.isActive('italic') ? 'secondary' : 'ghost'} /> )} {options.includes('strike') && ( editor.chain().focus().toggleStrike().run()} icon={} variant={editor.isActive('strike') ? 'secondary' : 'ghost'} /> )} {options.includes('code') && ( editor.chain().focus().toggleCodeBlock().run()} icon={} variant={editor.isActive('codeBlock') ? 'secondary' : 'ghost'} /> )} {options.includes('quote') && ( editor.chain().focus().toggleBlockquote().run()} icon={} variant={editor.isActive('blockquote') ? 'secondary' : 'ghost'} /> )} {options.includes('link') && ( <> {editor.isActive('link') ? ( editor.chain().focus().unsetLink().run()} variant="secondary" icon={} /> ) : ( } /> )} )} {options.includes('bullet-list') && ( editor.chain().focus().toggleBulletList().run()} icon={} variant={editor.isActive('bulletList') ? 'secondary' : 'ghost'} /> )} {options.includes('ordered-list') && ( editor.chain().focus().toggleOrderedList().run()} icon={} variant={editor.isActive('orderedList') ? 'secondary' : 'ghost'} /> )} {options.includes('todo-list') && ( editor.chain().focus().toggleTaskList().run()} icon={} variant={editor.isActive('taskList') ? 'secondary' : 'ghost'} /> )} {options.includes('image') && ( } onClick={() => inputFileRef.current?.click()} /> )} ); }