import React, { HTMLAttributes, useState } from 'react';
import styled from 'styled-components';
import Upload from './Upload';
import { Tip } from '../Tip/Tip';
import Progress from '../Progress/Progress';
export type Config = {
multiple: boolean;
action: string;
};
export interface UploadToServerProps extends HTMLAttributes {
children?: React.ReactNode;
config: Config;
}
const Wrap = styled.div`
display: flex;
flex-direction: column;
gap: 30px;
> .processBar {
display: flex;
flex-direction: column;
gap: 10px;
> .title {
display: flex;
justify-content: space-between;
}
}
`;
const UploadToServerStyled = styled.div`
height: 20vh;
`;
const UploadToServer: React.FC = (props) => {
const { children, config, ...rest } = props;
const { multiple, action } = config;
const [processBar, setProcessBar] = useState<{
[key: string]: { loaded: number; total: number };
}>({});
// 发请求
const ajax = (url: string, data: FormData, filename: string) => {
return new Promise((resolve, reject) => {
const request = new XMLHttpRequest();
request.open('POST', url);
request.onreadystatechange = () => {
if (document.readyState === 'complete' && request.status === 200) {
resolve(request.response);
} else {
reject(new Error('上传失败'));
}
};
request.upload.onprogress = (e: ProgressEvent) => {
setProcessBar((state) => {
const newBar = { [filename]: { loaded: e.loaded, total: e.loaded } };
return { ...state, ...newBar };
});
};
request.send(data);
});
};
// 获取源文件
const getFiles = (data: File[]) => {
data.forEach((item) => {
const form = new FormData();
form.append('ui_file', item);
ajax(action, form, item.name)
.then(() => {})
.catch(() => {
Tip('error', `${item.name}上传失败`);
});
});
// ;
};
const processBarRender = () => {
return Object.keys(processBar).map((item) => {
if (processBar.hasOwnProperty.call(processBar, item)) {
return (
<>
{item}
上传进度:
>
);
}
return '';
});
};
return (
{processBarRender()}
);
};
UploadToServer.defaultProps = {
children: ''
};
export default UploadToServer;