/* * @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 = `
Loading Katex...
` } // 清空内容 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;