react-jangditor
Version:
This is my first test editor
132 lines (131 loc) • 5.93 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
import { useEffect, useState, useRef } from "react";
import React from "react";
import Editor_header from "./editor_header";
import Editor_body from "./editor_body";
import Editor_nav from "./editor_nav";
import "../scss/editor.scss";
var uid = function () {
return Date.now().toString(36) + Math.random().toString(36);
};
var bodyBlockState = {
id: uid(),
html: "",
tagName: "div",
};
export default function Edtior() {
var _a = useState([bodyBlockState]), blocks = _a[0], setBlocks = _a[1];
var _b = useState(null), selectedBlockIndex = _b[0], setSelectedBlockIndex = _b[1];
var dragItem = useRef();
var dragOverItem = useRef();
useEffect(function () {
console.log("state 변했어!");
}, [blocks]);
//태그적용시키기
var applyHeading = function (headingLevel) {
var currentContent = blocks.findIndex(function (block) { var _a, _b; return block.html === ((_b = (_a = window.getSelection()) === null || _a === void 0 ? void 0 : _a.anchorNode) === null || _b === void 0 ? void 0 : _b.textContent); });
if (currentContent !== null && currentContent >= 0) {
console.log(currentContent);
var updatedBlocks = __spreadArray([], blocks, true);
var headingTag = "h".concat(headingLevel);
if (headingTag !== updatedBlocks[currentContent].tagName) {
updatedBlocks[currentContent].tagName = headingTag;
}
else {
updatedBlocks[currentContent].tagName = "div";
}
setBlocks(updatedBlocks);
}
};
// 드래그 시작될 때 실행
var dragStart = function (e, position) {
dragItem.current = position;
console.log("드래그시작", e.target.innerText);
};
// 드래그중인 대상이 위로 포개졌을 때
var dragEnter = function (e, position) {
dragOverItem.current = position;
console.log("드래그도중 다른 요소와 포개짐", e.target.innerText);
};
//드랍 했을때
var drop = function (e) {
console.log(blocks);
var newList = __spreadArray([], blocks, true);
var dragItemValue = newList[dragItem.current];
newList.splice(dragItem.current, 1);
newList.splice(dragOverItem.current, 0, dragItemValue);
dragItem.current = undefined;
dragOverItem.current = undefined;
setBlocks(newList);
};
//blocks의 html값 변경 함수
function updateblock(updatedBlock) {
var t_blocks = blocks;
var index = blocks.map(function (b) { return b.id; }).indexOf(updatedBlock.id);
var updatedBlocks = __spreadArray([], t_blocks, true);
updatedBlocks[index] = __assign(__assign({}, updatedBlocks[index]), { tagName: updatedBlock.tagName, html: updatedBlock.html });
setBlocks(updatedBlocks);
}
//엔터키 눌렀을때, 백스페이스키 눌렀을때
var handleKeydown = function (e) {
if (e.key === "Enter" && !e.shiftKey) {
e.preventDefault();
var newBlock = { id: uid(), html: "", tagName: "div" };
setBlocks(__spreadArray(__spreadArray([], blocks, true), [newBlock], false));
setSelectedBlockIndex(blocks.length);
}
else if (e.key === "Backspace") {
if (e.target.innerText === "") {
if (blocks.length > 1) {
var prev = e.target.parentNode.parentNode.previousSibling.children[0]
.children[1];
var num_1 = e.target.id;
setBlocks(blocks.filter(function (block, index) {
return index !== Number(num_1);
}));
if (prev) {
setCaretToEnd(prev);
prev.focus();
}
}
}
}
};
//객체 삭제시 이전 객체의 내용 끝으로 커서를 설정하는 함수
var setCaretToEnd = function (element) {
//특정 범위를 지정하는 함수 document.createRange()
var range = document.createRange();
//현재 선택된 객체 가져오기
var selection = window.getSelection();
range.selectNodeContents(element);
range.collapse(false);
console.log(range);
selection.removeAllRanges();
selection.addRange(range);
};
return (React.createElement("div", { className: "all", onKeyDown: handleKeydown },
React.createElement(Editor_header, null),
React.createElement(Editor_nav, { applyHeading: applyHeading }),
React.createElement("div", { className: "container" }, blocks.map(function (block, index) {
return (React.createElement(Editor_body, { key: index, index: index, id: block.id, html: block.html, tagName: block.tagName, updateblock: updateblock, onDragStart: dragStart, onDragEnter: dragEnter, onDropEnd: drop, isSelected: selectedBlockIndex === index }));
}))));
}