나모웹에디터 React

£€€.T.$·2024년 3월 22일

React
index.js

import { useEffect, useRef, useState } from "react";
import StyledNamoEditor from "./styled";

export const NamoEditor = ({ src, sender, prntMessage }) => {
  const [iframeValue, setIframeValue] = useState();
  const [pageMode, setPageMode] = useState("V");
  const iframeRef = useRef(null);

  //iframe으로 메시지를 보낼 함수
  const sendMessageToIframe = (_message) => {
    const iframeWindow = iframeRef.current.contentWindow;
    const message = { type: "GREETING", data: _message };
    iframeWindow.postMessage(message, "*");
  };

  //iframe으로 보낼 메시지(state)를 채우는 함수
  const onChangeValue = (e) => {
    setIframeValue(e.target.value);
  };

  // iframe 로딩 완료 시 메시지 보내는 함수
  const onIframeLoad = () => {
    sendMessageToIframe(prntMessage);
  };

  //iframe에서 메시지를 받을 useEffect
  useEffect(() => {
    const receiveMessage = (event) => {
      if (sender === event.data.sender) {
        setIframeValue(event.data["targetNode"]);
      }
    };
    window.addEventListener("message", receiveMessage);
    return () => {
      window.removeEventListener("message", receiveMessage);
    };
  }, []);

  //PageMode(readonly : boolean)을 변경할 함수
  const onChangePageMode = (_mode) => {
    setPageMode(_mode);
  };

  //pageMode가 바뀌면 bool 값을 iFrame으로 내려주어
  //iframe setReadOnly : boolean 값을 변경해준다
  useEffect(() => {
    if (pageMode === "V") {
      const iframeWindow = iframeRef.current.contentWindow;
      iframeWindow.postMessage({ type: "pageMode", bool: false }, "*");
    } else if (pageMode === "E") {
      const iframeWindow = iframeRef.current.contentWindow;
      iframeWindow.postMessage({ type: "pageMode", bool: true }, "*");
    }
  }, [pageMode]);

  //에디터 내용을 초기화 하는 함수
  const onResetEditor = () => {
    const iframeWindow = iframeRef.current.contentWindow;
    const message = { type: "reset" };
    iframeWindow.postMessage(message, "*");
  };

  return (
    <StyledNamoEditor>
      <div className="header">
        {pageMode === "E" && (
          <button onClick={() => onChangePageMode("V")}>사용자 모드 </button>
        )}
        {pageMode === "V" && (
          <button onClick={() => onChangePageMode("E")}>관리자 모드 </button>
        )}
        <textarea onChange={onChangeValue} value={iframeValue}></textarea>
        <button onClick={() => sendMessageToIframe(iframeValue)}>
          내용 보내기
        </button>
        <button onClick={onResetEditor}>초기화</button>
      </div>

      <iframe src={src} id="namo" ref={iframeRef} onLoad={onIframeLoad} />
    </StyledNamoEditor>
  );
};


Namo

apache-tomcat-8.5.99/webapps/namo

index.html

...(중략)
    function sendMessageToParent(message) {
        window.parent.postMessage(message, "http://localhost:3100");
      }
    </script>
</head>

<body>
  		<textarea
            id="pe_buZ"
            name="pe_buZ"
            alt="initText"
            title="initText"
            style="width: 730px; height: 450px; font-size: 10pt"
          >
              
           </textarea>
          <script type="text/javascript" language="javascript">
            var CrossEditor = new NamoSE("pe_buZ");
            CrossEditor.params.Width = "100%";
            CrossEditor.params.Height = "700px";
            CrossEditor.params.UserLang = "auto";
            CrossEditor.params.NewToolbar = true;

            CrossEditor.params.FullScreen = false;

            CrossEditor.EditorStart();

            function CE_OnKeyActive(e) {
              var message = {
                targetNode: e.targetNode.textContent,
              };
              sendMessageToParent(message);
            }

            window.addEventListener("message", (event) => {
              console.debug("addEventListener event", event.data);
              if (event.origin !== "http://localhost:3100") {
                return;
              }
              if (event.data.type === "GREETING") {
                CrossEditor.SetBodyValue(event.data.data);
              } else if (event.data.type === "pageMode") {
                console.debug("CrossEditor", CrossEditor);
                CrossEditor.SetReadonly(event.data.bool);
              }
            });

            function OnInitCompleted(e) {
              console.debug("OnInitComplete e", e);
              e.editorTarget.SetBodyValue(
                document.getElementById("pe_buZ").value
              );
            }
          </script>
profile
Be {Nice} Be {Kind}

0개의 댓글