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 (
);
}
}