You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
4.0 KiB
149 lines
4.0 KiB
/*
|
|
* @Description: 创建 reactQuill实例
|
|
* @Author: tangjiang
|
|
* @Github:
|
|
* @Date: 2019-12-09 09:31:42
|
|
* @LastEditors: tangjiang
|
|
* @LastEditTime: 2019-12-17 20:42:05
|
|
*/
|
|
import Quill from 'quill'; // 导入quill
|
|
import { useState, useEffect, useMemo } from 'react';
|
|
import flatten from './flatten.js';
|
|
import useDeepEqualMemo from './useDeepEqualMemo';
|
|
import Katex from 'katex';
|
|
import ImageBlot from './ImageBlot';
|
|
import { fetchUploadImage } from '../../services/ojService.js';
|
|
import { getImageUrl } from 'educoder'
|
|
window.katex = Katex;
|
|
|
|
Quill.register(ImageBlot);
|
|
|
|
function useMountQuill ({
|
|
element,
|
|
options: passedOptions,
|
|
uploadImage,
|
|
showUploadImage,
|
|
imgAttrs = {} // 指定图片的宽高属性
|
|
}) {
|
|
|
|
// 是否引入 katex
|
|
const [katexLoaded, setKatexLoaded] = useState(Boolean(window.katex))
|
|
const [quill, setQuill] = useState(null);
|
|
|
|
const options = useDeepEqualMemo(passedOptions);
|
|
console.log('use mount quill: ', passedOptions);
|
|
|
|
// 判断options中是否包含公式
|
|
const requireKatex = useMemo(() => {
|
|
return flatten(options.modules.toolbar).includes('formula');
|
|
}, [options]);
|
|
|
|
// 加载katex
|
|
useEffect(() => {
|
|
if (!requireKatex) return;
|
|
if (katexLoaded) return;
|
|
|
|
const interval = setInterval(() => {
|
|
if (window.katex) {
|
|
setKatexLoaded(true);
|
|
clearInterval(interval);
|
|
}
|
|
});
|
|
|
|
return () => { // 定义回调清除定时器
|
|
clearInterval(interval);
|
|
}
|
|
|
|
}, [
|
|
setKatexLoaded,
|
|
katexLoaded,
|
|
requireKatex
|
|
]);
|
|
|
|
// 加载 quill
|
|
useEffect(() => {
|
|
if (!element) return;
|
|
if (requireKatex && !katexLoaded) {
|
|
element.innerHTML = `
|
|
<div style="color: #ddd">
|
|
Loading Katex...
|
|
</div>
|
|
`
|
|
}
|
|
// 清空内容
|
|
element.innerHTML = '';
|
|
console.log(element);
|
|
// 创建 quill 节点
|
|
const quillNode = document.createElement('div');
|
|
element.appendChild(quillNode); // 将quill节点追回到 element 元素中
|
|
|
|
const quill = new Quill(element, options);
|
|
setQuill(quill);
|
|
// 加载上传图片功能
|
|
if (typeof uploadImage === 'function') {
|
|
quill.getModule('toolbar').addHandler('image', (e) => {
|
|
// 创建type类型输入框加载本地图片
|
|
const input = document.createElement('input');
|
|
input.setAttribute('type', 'file');
|
|
input.setAttribute('accept', 'image/*');
|
|
input.click();
|
|
|
|
input.onchange = async (e) => {
|
|
const file = input.files[0]; // 获取文件信息
|
|
const formData = new FormData();
|
|
formData.append('file', file);
|
|
|
|
// const reader = new FileReader();
|
|
// reader.readAsDataURL(file);
|
|
// console.log('文件信息===>>', reader);
|
|
// reader.onload = function (e) {
|
|
// debugger;
|
|
// console.log('文件信息===>>', e.target.result);
|
|
// const image = new Image();
|
|
// image.src = e.target.result;
|
|
|
|
// image.onload = function () {
|
|
// // file.width =
|
|
// console.log(image.width, image.height);
|
|
// }
|
|
// }
|
|
|
|
const range = quill.getSelection(true);
|
|
let fileUrl = ''; // 保存上传成功后图片的url
|
|
// 上传文件
|
|
const result = await fetchUploadImage(formData);
|
|
// 获取上传图片的url
|
|
if (result.data && result.data.id) {
|
|
fileUrl = getImageUrl(`api/attachments/${result.data.id}`);
|
|
}
|
|
// 根据id获取文件路径
|
|
const { width, height } = imgAttrs;
|
|
// console.log('上传图片的url:', fileUrl);
|
|
if (fileUrl) {
|
|
quill.insertEmbed(range.index, 'image', {
|
|
url: fileUrl,
|
|
alt: '',
|
|
onClick: showUploadImage,
|
|
width,
|
|
height
|
|
});
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
return () => {
|
|
element.innerHTML = '';
|
|
}
|
|
}, [
|
|
element,
|
|
options,
|
|
requireKatex,
|
|
katexLoaded,
|
|
]);
|
|
|
|
return quill;
|
|
}
|
|
|
|
export default useMountQuill;
|