import React from 'react'; import type { HTMLAttributes, MouseEvent, ReactNode } from 'react'; import { EditorState, useEditorState } from '../editor/EditorContext'; import OrderedListIcon from './icons/OrderedListIcon'; import UnorderedListIcon from './icons/UnorderedListIcon'; export const BtnBold = createButton('Bold', '𝐁', 'bold'); export const BtnBulletList = createButton( 'Bullet list', , 'insertUnorderedList', ); export const BtnClearFormatting = createButton( 'Clear formatting', 'TĖēₓ', 'removeFormat', ); export const BtnItalic = createButton('Italic', '𝑰', 'italic'); export const BtnStrikeThrough = createButton( 'Strike through', ab, 'strikeThrough', ); export const BtnLink = createButton('Link', '🔗', ({ $selection }) => { if ($selection?.nodeName === 'A') { document.execCommand('unlink'); } else { // eslint-disable-next-line no-alert document.execCommand('createLink', false, prompt('URL', '') || undefined); } }); export const BtnNumberedList = createButton( 'Numbered list', , 'insertOrderedList', ); export const BtnRedo = createButton('Redo', '↷', 'redo'); export const BtnUnderline = createButton( 'Underline', 𝐔, 'underline', ); export const BtnUndo = createButton('Undo', 'â†ķ', 'undo'); export function createButton( title: string, content: ReactNode, command: ((state: EditorState) => void) | string, ) { ButtonFactory.displayName = title.replace(/\s/g, ''); return ButtonFactory; function ButtonFactory(props: HTMLAttributes) { const editorState = useEditorState(); const { $el } = editorState; const isElFocused = () => Boolean($el?.contains(document.activeElement)); let active = false; if (typeof command === 'string') { active = isElFocused() && document.queryCommandState(command); } function onAction(e: MouseEvent) { e.preventDefault(); if (!isElFocused()) { $el?.focus(); } if (typeof command === 'function') { command(editorState); } else { document.execCommand(command); } } if (editorState.htmlMode) { return null; } return ( ); } }