@nexusui/components
Version:
These are custom components specially-developed for NexusUI applications. They will make your life easier by giving you out-of-the-box implementations for various high-level UI elements that you can drop directly into your application.
2 lines (1 loc) • 2.23 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react"),n=require("@lexical/react/LexicalComposerContext"),i=require("lexical"),o=require("../utils/getSelectedNode.js"),s=require("../command/index.js"),r=require("../components/InsertLinkModal.js"),c=require("../../../util/functions/index.js"),a=require("@lexical/utils"),l=require("@lexical/link");const f=t.forwardRef((({t:f},g)=>{const[u]=n.useLexicalComposerContext(),[d,x]=t.useState(!1),[$,S]=t.useState(""),[C,L]=t.useState("");t.useEffect((()=>{const e=()=>{const e=i.$getSelection();if(i.$isRangeSelection(e)){const t=o.getSelectedNode(e),n=a.$findMatchingParent(t,l.$isLinkNode);if(a.$findMatchingParent(t,i.$isTextNode)){const s=Math.min(e.anchor.offset,e.focus.offset),r=Math.max(e.anchor.offset,e.focus.offset);s<r&&S(t.getTextContent().slice(s,r)),n&&(L(n.getURL()),S(t.getTextContent()),u.update((()=>{const t=i.$getSelection();if(i.$isRangeSelection(t)){const n=o.getSelectedNode(e),s=a.$findMatchingParent(n,i.$isTextNode);s&&(t.focus.set(s.getKey(),0,"text"),t.anchor.set(s.getKey(),s.getTextContentSize(),"text"))}})))}}};return a.mergeRegister(u.registerCommand(s.TOGGLE_INSERT_LINK_MODAL_COMMAND,(()=>(e(),x(!0),!1)),i.COMMAND_PRIORITY_LOW),u.registerCommand(i.CLICK_COMMAND,(t=>{const n=i.$getSelection();if(i.$isRangeSelection(n)){const i=o.getSelectedNode(n),s=a.$findMatchingParent(i,l.$isLinkNode);if(l.$isLinkNode(s)){const i=s.getTextContent(),o=n.anchor.offset;return 0===o||o===i.length||(o===n.focus.offset?(e(),x(!0),!0):((t.metaKey||t.ctrlKey)&&c.openLink(s.getURL(),"_blank"),!0))}}return x(!1),M(),!1}),i.COMMAND_PRIORITY_LOW))}),[u]);const M=()=>{S(""),L("")};return d&&g?.current?e.jsx(r.InsertLinkModal,{anchorEl:g?.current,onCancel:()=>{x(!1),M()},onSave:(e,t)=>{((e,t,n)=>{u.update((()=>{const o=i.$getSelection();if(i.$isRangeSelection(o)){const{anchor:s,focus:r}=o,c=i.$createTextNode(e);o.insertNodes([c]),s.offset-=e.length,r.offset=s.offset+e.length,l.toggleLink(t,{target:"_blank",title:t}),n&&s.set(c.getKey(),c.getTextContentSize(),"text")}}))})(e,t,!$),x(!1),M()},initialText:$,initialUrl:C,t:f},`${$}-${C}`):e.jsx(e.Fragment,{})}));exports.InsertLinkPlugin=f;