import { Editor } from '@tiptap/react'; import { BiCodeBlock, BiText } from 'react-icons/bi'; import { RiEmphasis } from 'react-icons/ri'; import { MdChecklist, MdCode, MdExtension, MdFormatBold, MdFormatItalic, MdFormatListBulleted, MdFormatListNumbered, MdFormatQuote, MdFormatUnderlined, MdImage, MdLink, MdStrikethroughS, MdWarning, MdOutlineWarning, MdSmartButton, MdOutlineAssignment } from 'react-icons/md'; import { BsFiletypeHtml } from 'react-icons/bs'; import { AiOutlineInsertRowLeft, AiOutlineInsertRowRight, AiOutlineInsertRowAbove, AiOutlineInsertRowBelow, AiOutlineTable, AiOutlineDeleteRow, AiOutlineDeleteColumn, AiOutlineMergeCells } from 'react-icons/ai'; export interface IUseButtonProps { editor: Editor; identifier: string; toggleMediaLibrary: () => void; } export interface IUseButtonReturn { dropdown?: IUseButtonReturn[]; icon: JSX.Element; active: boolean; disabled?: boolean; onClick: () => void; } const useButton = ({ identifier, editor, toggleMediaLibrary }: IUseButtonProps): IUseButtonReturn => { const active = editor.isActive(decapitalizeFirstLetter(identifier)); switch (identifier) { case 'Link': return { active, icon: , disabled: !editor.can().chain().focus().toggleLink({ href: '' }).run() || editor.isActive('htmlsource') || editor.isActive('button'), onClick: () => editor.chain().focus().toggleLink({ href: '' }).run() }; case 'Bold': return { active, icon: , disabled: !editor.can().chain().focus().toggleBold().run() || editor.isActive('htmlsource'), onClick: () => editor.chain().focus().toggleBold().run() }; case 'Strong': return { active, icon: , disabled: !editor.can().chain().focus().toggleStrong().run() || editor.isActive('htmlsource'), onClick: () => editor.chain().focus().toggleStrong().run() }; case 'Italic': return { active, icon: , disabled: !editor.can().chain().focus().toggleItalic().run() || editor.isActive('htmlsource'), onClick: () => editor.chain().focus().toggleItalic().run() }; case 'Emphasis': return { active, icon: , disabled: !editor.can().chain().focus().toggleEmphasis().run() || editor.isActive('htmlsource'), onClick: () => editor.chain().focus().toggleEmphasis().run() }; case 'Underline': return { active, icon: , disabled: !editor.can().chain().focus().toggleUnderline().run() || editor.isActive('htmlsource'), onClick: () => editor.chain().focus().toggleUnderline().run() }; case 'Strike': return { active, icon: , disabled: !editor.can().chain().focus().toggleStrike().run() || editor.isActive('htmlsource'), onClick: () => editor.chain().focus().toggleStrike().run() }; case 'Code': return { active, icon: , disabled: !editor.can().chain().focus().toggleCode().run() || editor.isActive('htmlsource'), onClick: () => editor.chain().focus().toggleCode().run() }; case 'CodeBlock': return { active, icon: , disabled: !editor.can().chain().focus().toggleCodeBlock().run() || editor.isActive('htmlsource'), onClick: () => editor.chain().focus().toggleCodeBlock().run() }; case 'BlockQuote': return { active, icon: , disabled: !editor.can().chain().focus().toggleBlockquote().run() || editor.isActive('htmlsource'), onClick: () => editor.chain().focus().toggleBlockquote().run() }; case 'Table': return { active, icon: , disabled: editor.isActive('htmlsource'), onClick: () => editor .chain() .focus() .insertTable({ rows: 3, cols: 3, withHeaderRow: true }) .run() }; case 'Column before': return { active, icon: , disabled: editor.isActive('htmlsource'), onClick: () => editor.chain().focus().addColumnBefore().run() }; case 'Column after': return { active, icon: , disabled: editor.isActive('htmlsource'), onClick: () => editor.chain().focus().addColumnAfter().run() }; case 'Row before': return { active, icon: , disabled: editor.isActive('htmlsource'), onClick: () => editor.chain().focus().addRowBefore().run() }; case 'Row after': return { active, icon: , disabled: editor.isActive('htmlsource'), onClick: () => editor.chain().focus().addRowAfter().run() }; case 'Delete row': return { active, icon: , disabled: editor.isActive('htmlsource'), onClick: () => editor.chain().focus().deleteRow().run() }; case 'Delete column': return { active, icon: , disabled: editor.isActive('htmlsource'), onClick: () => editor.chain().focus().deleteColumn().run() }; case 'Merge cells': return { active, icon: , disabled: editor.isActive('htmlsource'), onClick: () => editor.chain().focus().mergeOrSplit().run() }; case 'BulletList': return { active, icon: , disabled: !editor.can().chain().focus().toggleBulletList().run() || editor.isActive('htmlsource'), onClick: () => editor.chain().focus().toggleBulletList().run() }; case 'OrderedList': return { active, icon: , disabled: !editor.can().chain().focus().toggleOrderedList().run() || editor.isActive('htmlsource'), onClick: () => editor.chain().focus().toggleOrderedList().run() }; case 'TaskList': return { active, icon: , disabled: !editor.can().chain().focus().toggleTaskList().run() || editor.isActive('htmlsource'), onClick: () => editor.chain().focus().toggleTaskList().run() }; case 'Image': return { active, icon: , disabled: editor.isActive('htmlsource'), onClick: toggleMediaLibrary }; case 'Alert': return { dropdown: [ { active, icon: , disabled: editor.isActive('htmlsource'), onClick: () => editor.isActive(decapitalizeFirstLetter(identifier)) ? editor.chain().focus().updateAttributes('alert', { color: '#F44F56' }).run() : editor.chain().focus().toggleAlert('#F44F56').run() }, { active, icon: , disabled: editor.isActive('htmlsource'), onClick: () => editor.isActive(decapitalizeFirstLetter(identifier)) ? editor.chain().focus().updateAttributes('alert', { color: '#00C670' }).run() : editor.chain().focus().toggleAlert('#00C670').run() }, { active, icon: , disabled: editor.isActive('htmlsource'), onClick: () => editor.isActive(decapitalizeFirstLetter(identifier)) ? editor.chain().focus().updateAttributes('alert', { color: '#FEB300' }).run() : editor.chain().focus().toggleAlert('#FEB300').run() }, { active, icon: , disabled: editor.isActive('htmlsource'), onClick: () => editor.isActive(decapitalizeFirstLetter(identifier)) ? editor.chain().focus().updateAttributes('alert', { color: '#00B1FF' }).run() : editor.chain().focus().toggleAlert('#00B1FF').run() } ], active, icon: , disabled: editor.isActive('htmlsource'), onClick: () => editor.chain().focus().toggleAlert('green').run() }; case 'Button': return { active, icon: , disabled: editor.isActive('htmlsource'), onClick: () => editor.chain().focus().toggleButton().run() }; case 'StepByStep': return { active, icon: , disabled: editor.isActive('htmlsource'), onClick: () => editor.chain().focus().toggleStepByStep().run() }; case 'htmlsource': return { active, icon: , onClick: () => { if (editor.isActive('htmlsource')) { editor.commands.setContent( editor .getHTML() .replace(new RegExp(/(

)?<\/?htmlsource>(<\/p>)?/g), '') .replace(new RegExp(/</g), '<') .replace(new RegExp(/>/g), '>') ); } else { editor.commands.setContent( `${editor .getHTML() .replace(new RegExp(//g), '>') .replace(new RegExp(/></g), '>

<') .replace(new RegExp(/a><\/p/g), 'a></p')}` ); } } }; default: return { active, icon: , disabled: true, onClick: () => console.error('Button data not set') }; } }; const decapitalizeFirstLetter = (string: string): string => { return string.charAt(0).toLocaleLowerCase() + string.slice(1); }; export default useButton;