105 lines
3.7 KiB
JavaScript
105 lines
3.7 KiB
JavaScript
import React, { useState } from 'react';
|
|
import { Button, Dropdown, Icon, Input, Menu, Tooltip, Select, Upload, message, Spin, Modal } from 'antd';
|
|
import { httpUrl, TokenKey } from '../../fetch';
|
|
import cookie from 'react-cookies';
|
|
import { updateWiki, treeToMd, addWiki } from '../../api';
|
|
import { Base64 } from 'js-base64';
|
|
|
|
export default function UploadWiki(props) {
|
|
const { match, history, showNotification, project, fileList, setFileList, fileArrInit, setReload, butClass } = props;
|
|
const {location:{pathname}} = history;
|
|
let projectsId = match.params.projectsId;
|
|
let owner = match.params.owner;
|
|
|
|
const uploadProps = {
|
|
name: 'multipartFile',
|
|
withCredentials: true,
|
|
action: `${httpUrl}/api/wikiExport/uploadWiki/${owner}/${projectsId}/${project && project.id}`,
|
|
showUploadList: false,
|
|
headers: {
|
|
Authorization: cookie.load(TokenKey),
|
|
},
|
|
beforeUpload: beforeUpload,
|
|
onChange(info) {
|
|
// 截取文件名称
|
|
const fileName = info.file.name.substring(0,info.file.name.lastIndexOf("."))
|
|
if (info.file.status === 'done') {
|
|
if (info.file.response.message === '201') {
|
|
// 修改sidebar文件
|
|
if(!fileArrInit.length){
|
|
// 仓库没有wiki文件
|
|
addWiki({owner,repo: projectsId,projectId: project.id,pageName: "_Sidebar",title: "_Sidebar",message: '',content_base64: Base64.encode(`[[${fileName}]]`)}).then(res=>{
|
|
if(res && res.message === "201"){
|
|
message.success(`${fileName} 上传成功`);
|
|
history.push(`/${owner}/${projectsId}/wiki/${encodeURI(fileName)}/0`);
|
|
setReload(Math.random());
|
|
}
|
|
})
|
|
return;
|
|
}
|
|
const newSidebarList = fileList.concat({title: `[[${fileName}]]`, children: []})
|
|
updateWikiFun(newSidebarList, 0);
|
|
message.success(`${fileName} 上传成功`);
|
|
history.push(`/${owner}/${projectsId}/wiki/${encodeURI(fileName)}/0`);
|
|
setReload(Math.random());
|
|
}
|
|
} else if (info.file.status === 'error') {
|
|
const {message: responseMes} = info.file.response;
|
|
if(responseMes.indexOf('wiki page already exists') !== -1){
|
|
message.error("已存在相同文件名的文件")
|
|
}else{
|
|
message.error(responseMes || `${fileName} 上传失败`);
|
|
}
|
|
}
|
|
},
|
|
};
|
|
|
|
function beforeUpload(file) {
|
|
if (!['md', 'txt', 'markdown'].includes(file.name.split('.').pop())) {
|
|
message.error('只能上传md、txt文件');
|
|
return false;
|
|
}
|
|
|
|
let regEn = /[\\/:*?"<>|[\]-]/g;
|
|
if (regEn.test(file.name)) {
|
|
message.error('文件名不能有特殊字符: \\ / : * ? \" < > | [ \] -');
|
|
return false;
|
|
}
|
|
|
|
for (const item of fileArrInit) {
|
|
if (item.name === file.name) {
|
|
message.error('不能上传与已有文件相同文件名的文件');
|
|
return false;
|
|
}
|
|
}
|
|
const isLt100M = file.size / 1024 / 1024 < 100;
|
|
if (!isLt100M) {
|
|
showNotification(`文件大小必须小于${100}MB!`);
|
|
}
|
|
return isLt100M;
|
|
}
|
|
|
|
function updateWikiFun(sidebarList, type){
|
|
updateWiki({
|
|
owner,
|
|
repo: projectsId,
|
|
projectId: project.id,
|
|
pageName: '_Sidebar',
|
|
title: '_Sidebar',
|
|
commit_message: '',
|
|
content_base64: Base64.encode(treeToMd(sidebarList))
|
|
}).then(res => {
|
|
if (res && res.message === "200") {
|
|
setFileList(sidebarList);
|
|
}else {
|
|
message.error(res.data || "操作失败");
|
|
}
|
|
});
|
|
}
|
|
|
|
return <Upload {...uploadProps}>
|
|
<Tooltip placement="top" title={'支持导入txt、markdown格式文件'}>
|
|
<Button type="default" className={`ml10 ${butClass}`}><Icon type="plus" />导入模板</Button>
|
|
</Tooltip>
|
|
</Upload>
|
|
} |