UNPKG

@yuntijs/ui

Version:

☁️ Yunti UI - an open-source UI component library for building Cloud Native web apps

300 lines 12.5 kB
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray"; function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } import { $isCodeNode } from '@lexical/code'; import { $isListNode, ListNode } from '@lexical/list'; import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'; import { $isHeadingNode } from '@lexical/rich-text'; import { $getNearestNodeOfType, mergeRegister } from '@lexical/utils'; import { ActionIcon } from '@lobehub/ui'; import { Divider, Flex } from 'antd'; import { $getNodeByKey, $getSelection, $isNodeSelection, $isRangeSelection, CAN_REDO_COMMAND, CAN_UNDO_COMMAND, COMMAND_PRIORITY_LOW, FORMAT_ELEMENT_COMMAND, FORMAT_TEXT_COMMAND, REDO_COMMAND, SELECTION_CHANGE_COMMAND, UNDO_COMMAND } from 'lexical'; import { Bold, Code, Italic, List, ListOrdered, MessageSquareQuote, Redo, SquareCheck, Strikethrough, TextAlignCenter, TextAlignEnd, TextAlignJustify, TextAlignStart, Underline, Undo } from 'lucide-react'; import { useCallback, useEffect, useRef, useState } from 'react'; import { BlockFormatDropDown } from "./BlockFormatDropDown"; import DropdownLanguages from "./DropdownLanguages"; import { useStyles } from "./styles"; import { $findTopLevelElement, BLOCK_TYPE, formatBulletList, formatCheckList, formatNumberedList, formatQuote } from "./utils"; import { jsx as _jsx } from "react/jsx-runtime"; import { jsxs as _jsxs } from "react/jsx-runtime"; export var Toolbar = function Toolbar(_ref) { var _ref$size = _ref.size, size = _ref$size === void 0 ? { blockSize: 26, size: 18 } : _ref$size, _ref$gap = _ref.gap, gap = _ref$gap === void 0 ? 2 : _ref$gap, classname = _ref.classname; var _useStyles = useStyles(), styles = _useStyles.styles, cx = _useStyles.cx; var _useLexicalComposerCo = useLexicalComposerContext(), _useLexicalComposerCo2 = _slicedToArray(_useLexicalComposerCo, 1), editor = _useLexicalComposerCo2[0]; var toolbarRef = useRef(null); var _useState = useState(false), _useState2 = _slicedToArray(_useState, 2), canUndo = _useState2[0], setCanUndo = _useState2[1]; var _useState3 = useState(false), _useState4 = _slicedToArray(_useState3, 2), canRedo = _useState4[0], setCanRedo = _useState4[1]; var _useState5 = useState(false), _useState6 = _slicedToArray(_useState5, 2), isBold = _useState6[0], setIsBold = _useState6[1]; var _useState7 = useState(false), _useState8 = _slicedToArray(_useState7, 2), isItalic = _useState8[0], setIsItalic = _useState8[1]; var _useState9 = useState(false), _useState10 = _slicedToArray(_useState9, 2), isUnderline = _useState10[0], setIsUnderline = _useState10[1]; var _useState11 = useState(false), _useState12 = _slicedToArray(_useState11, 2), isStrikethrough = _useState12[0], setIsStrikethrough = _useState12[1]; var _useState13 = useState(false), _useState14 = _slicedToArray(_useState13, 2), isCode = _useState14[0], setIsCode = _useState14[1]; var _useState15 = useState(BLOCK_TYPE.PARAGRAPH), _useState16 = _slicedToArray(_useState15, 2), blockType = _useState16[0], setBlockType = _useState16[1]; var _useState17 = useState(''), _useState18 = _slicedToArray(_useState17, 2), language = _useState18[0], setLanguage = _useState18[1]; var _useState19 = useState(null), _useState20 = _slicedToArray(_useState19, 2), selectedElementKey = _useState20[0], setSelectedElementKey = _useState20[1]; var $updateToolbar = useCallback(function () { var selection = $getSelection(); if ($isRangeSelection(selection)) { setIsBold(selection.hasFormat('bold')); setIsItalic(selection.hasFormat('italic')); setIsUnderline(selection.hasFormat('underline')); setIsStrikethrough(selection.hasFormat('strikethrough')); setIsCode(selection.hasFormat('code')); var anchorNode = selection.anchor.getNode(); var element = $findTopLevelElement(anchorNode); var elementKey = element.getKey(); var elementDOM = editor.getElementByKey(elementKey); if (elementDOM !== null) { setSelectedElementKey(elementKey); if ($isListNode(element)) { var parentList = $getNearestNodeOfType(anchorNode, ListNode); var type = parentList ? parentList.getListType() : element.getListType(); setBlockType(type); } else if (element) { if ($isCodeNode(element)) { var _language = element.getLanguage(); setLanguage(_language || ''); } var _type = $isHeadingNode(element) ? element.getTag() : element.getType(); setBlockType(_type); } } } if ($isNodeSelection(selection)) { var nodes = selection.getNodes(); var _iterator = _createForOfIteratorHelper(nodes), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var selectedNode = _step.value; var _parentList = $getNearestNodeOfType(selectedNode, ListNode); if (_parentList) { var _type2 = _parentList.getListType(); setBlockType(_type2); } else { var selectedElement = $findTopLevelElement(selectedNode); if ($isCodeNode(selectedElement)) { var _language2 = selectedElement.getLanguage(); setLanguage(_language2 || ''); setBlockType(BLOCK_TYPE.CODE); } } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } }, [editor]); var onCodeLanguageSelect = useCallback(function (value) { editor.update(function () { if (selectedElementKey !== null) { var node = $getNodeByKey(selectedElementKey); if ($isCodeNode(node)) { node.setLanguage(value); } } }); }, [editor, selectedElementKey]); useEffect(function () { return mergeRegister(editor.registerUpdateListener(function (_ref2) { var editorState = _ref2.editorState; editorState.read(function () { $updateToolbar(); }, { editor: editor }); }), editor.registerCommand(SELECTION_CHANGE_COMMAND, function (_payload, _newEditor) { $updateToolbar(); return false; }, COMMAND_PRIORITY_LOW), editor.registerCommand(CAN_UNDO_COMMAND, function (payload) { setCanUndo(payload); return false; }, COMMAND_PRIORITY_LOW), editor.registerCommand(CAN_REDO_COMMAND, function (payload) { setCanRedo(payload); return false; }, COMMAND_PRIORITY_LOW)); }, [editor, $updateToolbar]); return /*#__PURE__*/_jsxs(Flex, { align: "center", className: cx(styles.barWrapper, classname), gap: gap, ref: toolbarRef, wrap: true, children: [/*#__PURE__*/_jsx(ActionIcon, { disabled: !canUndo, icon: Undo, onClick: function onClick() { return editor.dispatchCommand(UNDO_COMMAND, void 0); }, size: size }), /*#__PURE__*/_jsx(ActionIcon, { disabled: !canRedo, icon: Redo, onClick: function onClick() { return editor.dispatchCommand(REDO_COMMAND, void 0); }, size: size }), /*#__PURE__*/_jsx(Divider, { className: styles.divider, type: "vertical" }), /*#__PURE__*/_jsx(BlockFormatDropDown, { blockType: blockType, editor: editor }), /*#__PURE__*/_jsx(Divider, { className: styles.divider, type: "vertical" }), /*#__PURE__*/_jsx(ActionIcon, { active: isBold, icon: Bold, onClick: function onClick() { return editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold'); }, size: size, title: "Bold" }), /*#__PURE__*/_jsx(ActionIcon, { active: isItalic, icon: Italic, onClick: function onClick() { return editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic'); }, size: size, title: "Ttalic" }), /*#__PURE__*/_jsx(ActionIcon, { active: isUnderline, icon: Underline, onClick: function onClick() { return editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline'); }, size: size, title: "Underline" }), /*#__PURE__*/_jsx(ActionIcon, { active: isStrikethrough, icon: Strikethrough, onClick: function onClick() { return editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough'); }, size: size, title: "Strikethrough" }), /*#__PURE__*/_jsx(ActionIcon, { active: isCode, icon: Code, onClick: function onClick() { return editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code'); }, size: size, title: "Inline code" }), /*#__PURE__*/_jsx(Divider, { className: styles.divider, type: "vertical" }), /*#__PURE__*/_jsx(ActionIcon, { active: blockType === BLOCK_TYPE.BULLET, icon: List, onClick: function onClick() { return formatBulletList(editor, blockType); }, size: size, title: "Bullet List" }), /*#__PURE__*/_jsx(ActionIcon, { active: blockType === BLOCK_TYPE.NUMBER, icon: ListOrdered, onClick: function onClick() { return formatNumberedList(editor, blockType); }, size: size, title: "Numbered List" }), /*#__PURE__*/_jsx(ActionIcon, { active: blockType === BLOCK_TYPE.CHECK, icon: SquareCheck, onClick: function onClick() { return formatCheckList(editor, blockType); }, size: size, title: "Check List" }), /*#__PURE__*/_jsx(ActionIcon, { active: blockType === BLOCK_TYPE.QUOTE, icon: MessageSquareQuote, onClick: function onClick() { return formatQuote(editor, blockType); }, size: size, title: "Quote" }), /*#__PURE__*/_jsx(DropdownLanguages, { blockType: blockType, editor: editor, onChange: onCodeLanguageSelect, size: size, value: language }), /*#__PURE__*/_jsx(Divider, { className: styles.divider, type: "vertical" }), /*#__PURE__*/_jsx(ActionIcon, { icon: TextAlignStart, onClick: function onClick() { editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'left'); }, size: size }), /*#__PURE__*/_jsx(ActionIcon, { icon: TextAlignCenter, onClick: function onClick() { editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'center'); }, size: size }), /*#__PURE__*/_jsx(ActionIcon, { icon: TextAlignEnd, onClick: function onClick() { editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'right'); }, size: size }), /*#__PURE__*/_jsx(ActionIcon, { icon: TextAlignJustify, onClick: function onClick() { editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'justify'); }, size: size })] }); };