UNPKG

react-text-editor-kit

Version:

React Text Editor Kit is a customizable rich text editor component for React applications. It provides a flexible and easy-to-use interface for users to create and edit content with various formatting options. And also easy to integrate in react applicati

191 lines (175 loc) 5.4 kB
import React, { useEffect, useRef, useState } from "react"; import LinkIcon from "./SVGImages/LinkIcon"; import ImageIcon from "./SVGImages/ImageIcon"; import RemoveLinkIcon from "./SVGImages/RemoveLinkIcon"; import OpenLinkIcon from "./SVGImages/OpenLinkIcon"; import { remove_resizer } from "./constant"; import Styles from "../css/style.module.css"; const RightClickLinkPopup = ({ editorRef, setIsOpenModel, setSelectedData, setSelectedEvent, selectedEvent, setImageUrl, handleRemoveLink, selectedRange, isDisable, }) => { const popupRef = useRef(null); const [popupPosition, setPopupPosition] = useState({ x: 0, y: 0 }); const [popupVisible, setPopupVisible] = useState(false); const getSelectedText = () => { if (selectedRange) { const selectedText = selectedRange.toString(); return selectedText; } return ""; }; const handleRightClick = (event) => { if (isDisable) { return; } event.preventDefault(); remove_resizer(); const target = event.target; const parentRect = target.parentElement.getBoundingClientRect(); setPopupPosition({ x: event.clientX - parentRect.left, y: event.clientY - parentRect.top, }); let tagNames = ["IMG", "A", "BUTTON"]; if (tagNames.includes(target.tagName)) { setSelectedEvent(target); } setPopupVisible(true); }; const handleClickOutside = (event) => { if (popupRef.current && !popupRef.current.contains(event.target)) { setPopupVisible(false); } }; const handleOpenLinkPopup = () => { let open_new_tab = false; let link_url = ""; let link_text = getSelectedText() || ""; let link_type = "text"; if (selectedEvent?.tagName === "A") { link_url = selectedEvent?.href; link_text = getSelectedText() || selectedEvent?.textContent.trim(); open_new_tab = selectedEvent?.target === "_blank"; } else if (selectedEvent?.tagName === "IMG") { link_text = "Image"; link_type = "image"; setImageUrl(selectedEvent?.src); } else if (selectedEvent?.tagName === "BUTTON") { link_text = selectedEvent.textContent; link_type = "button"; } const parentElement = selectedEvent?.parentElement; if (parentElement?.tagName === "A") { setSelectedEvent(parentElement); link_url = parentElement?.href; open_new_tab = parentElement?.target === "_blank"; } let selected_object = { link: link_url, text: link_text, open_new_tab: open_new_tab, link_type: link_type, }; setSelectedData(selected_object); setPopupVisible(false); setIsOpenModel("link"); }; const handleOpenLink = () => { let link = selectedEvent?.href; if ( selectedEvent?.tagName !== "A" && selectedEvent?.parentElement?.tagName === "A" ) { link = selectedEvent?.parentElement?.href; } window.open(link); setPopupVisible(false); }; const handleRemove = () => { handleRemoveLink(); setPopupVisible(false); }; const handleImageLink = () => { setPopupVisible(false); let height = selectedEvent.style?.height; let width = selectedEvent.style?.width; if (!height) { height = selectedEvent?.offsetHeight; } if (!width) { width = selectedEvent?.offsetWidth; } setSelectedData({ link: selectedEvent?.src, height: height, width: width, }); setIsOpenModel("image"); }; useEffect(() => { const editor = editorRef.current; if (editor) { editor.addEventListener("contextmenu", handleRightClick); } document.addEventListener("mousedown", handleClickOutside); return () => { if (editor) { editor.removeEventListener("contextmenu", handleRightClick); } document.removeEventListener("mousedown", handleClickOutside); }; }, [editorRef]); return ( <> {popupVisible && ( <div className={Styles.rightClickPopupBackground} style={{ top: popupPosition.y, left: popupPosition.x, }} ref={popupRef} > <div className={Styles.rightClickPopup} onClick={handleOpenLinkPopup}> <LinkIcon /> Link... </div> {(selectedEvent?.tagName === "A" || selectedEvent?.parentElement?.tagName === "A") && ( <> <div className={Styles.rightClickPopup} onClick={handleRemove}> <RemoveLinkIcon /> Remove Link... </div>{" "} <div className={`${Styles.rightClickPopup} ${Styles.openLink}`} onClick={handleOpenLink} > <OpenLinkIcon /> Open Link... </div> </> )} {selectedEvent?.tagName === "IMG" && ( <> <hr /> <div className={Styles.rightClickPopup} ref={popupRef} onClick={handleImageLink} > <ImageIcon /> Image... </div> </> )} </div> )} </> ); }; export default RightClickLinkPopup;