UNPKG

@lexical/react

Version:

This package provides Lexical components and hooks for React applications.

10 lines (8 loc) 3.34 kB
/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * */ "use strict";var e=require("@lexical/list"),t=require("@lexical/react/LexicalComposerContext"),n=require("@lexical/utils"),i=require("lexical"),r=require("react");function o(e,t){const i=e.target;if(!n.isHTMLElement(i))return;const r=i.firstChild;if(n.isHTMLElement(r)&&("UL"===r.tagName||"OL"===r.tagName))return;const o=i.parentNode;if(!o||"check"!==o.__lexicalListType)return;const s=i.getBoundingClientRect(),l=e.pageX/n.calculateZoomLevel(i);("rtl"===i.dir?l<s.right&&l>s.right-20:l>s.left&&l<s.left+20)&&t()}function s(t){o(t,(()=>{if(n.isHTMLElement(t.target)){const n=t.target,r=i.getNearestEditorFromDOMNode(n);null!=r&&r.isEditable()&&r.update((()=>{const t=i.$getNearestNodeFromDOMNode(n);e.$isListItemNode(t)&&(n.focus(),t.toggleChecked())}))}}))}function l(e){o(e,(()=>{e.preventDefault()}))}function c(){const e=document.activeElement;return n.isHTMLElement(e)&&"LI"===e.tagName&&null!=e.parentNode&&"check"===e.parentNode.__lexicalListType?e:null}function u(t,n,r){const o=c();return null!=o&&n.update((()=>{const s=i.$getNearestNodeFromDOMNode(o);if(!e.$isListItemNode(s))return;const l=function(t,n){let i=n?t.getPreviousSibling():t.getNextSibling(),r=t;for(;null==i&&e.$isListItemNode(r);)r=r.getParentOrThrow().getParent(),null!=r&&(i=n?r.getPreviousSibling():r.getNextSibling());for(;e.$isListItemNode(i);){const t=n?i.getLastChild():i.getFirstChild();if(!e.$isListNode(t))return i;i=n?t.getLastChild():t.getFirstChild()}return null}(s,r);if(null!=l){l.selectStart();const e=n.getElementByKey(l.__key);null!=e&&(t.preventDefault(),setTimeout((()=>{e.focus()}),0))}})),!1}exports.CheckListPlugin=function(){const[o]=t.useLexicalComposerContext();return r.useEffect((()=>n.mergeRegister(o.registerCommand(e.INSERT_CHECK_LIST_COMMAND,(()=>(e.insertList(o,"check"),!0)),i.COMMAND_PRIORITY_LOW),o.registerCommand(i.KEY_ARROW_DOWN_COMMAND,(e=>u(e,o,!1)),i.COMMAND_PRIORITY_LOW),o.registerCommand(i.KEY_ARROW_UP_COMMAND,(e=>u(e,o,!0)),i.COMMAND_PRIORITY_LOW),o.registerCommand(i.KEY_ESCAPE_COMMAND,(e=>{if(null!=c()){const e=o.getRootElement();return null!=e&&e.focus(),!0}return!1}),i.COMMAND_PRIORITY_LOW),o.registerCommand(i.KEY_SPACE_COMMAND,(t=>{const n=c();return!(null==n||!o.isEditable())&&(o.update((()=>{const r=i.$getNearestNodeFromDOMNode(n);e.$isListItemNode(r)&&(t.preventDefault(),r.toggleChecked())})),!0)}),i.COMMAND_PRIORITY_LOW),o.registerCommand(i.KEY_ARROW_LEFT_COMMAND,(t=>o.getEditorState().read((()=>{const r=i.$getSelection();if(i.$isRangeSelection(r)&&r.isCollapsed()){const{anchor:s}=r,l="element"===s.type;if(l||0===s.offset){const r=s.getNode(),c=n.$findMatchingParent(r,(e=>i.$isElementNode(e)&&!e.isInline()));if(e.$isListItemNode(c)){const n=c.getParent();if(e.$isListNode(n)&&"check"===n.getListType()&&(l||c.getFirstDescendant()===r)){const e=o.getElementByKey(c.__key);if(null!=e&&document.activeElement!==e)return e.focus(),t.preventDefault(),!0}}}}return!1}))),i.COMMAND_PRIORITY_LOW),o.registerRootListener(((e,t)=>{null!==e&&(e.addEventListener("click",s),e.addEventListener("pointerdown",l)),null!==t&&(t.removeEventListener("click",s),t.removeEventListener("pointerdown",l))}))))),null};