Web: Client: Data Import: refactoring
This commit is contained in:
parent
0f10ac21c3
commit
ec14566491
@ -143,8 +143,7 @@ const SelectFileStep = (props: SelectFileStepProps) => {
|
|||||||
setWorkspace,
|
setWorkspace,
|
||||||
cancelUploadDialogVisible,
|
cancelUploadDialogVisible,
|
||||||
setCancelUploadDialogVisible,
|
setCancelUploadDialogVisible,
|
||||||
initMigrationName,
|
initMigrations,
|
||||||
singleFileUploading,
|
|
||||||
getMigrationStatus,
|
getMigrationStatus,
|
||||||
setUsers,
|
setUsers,
|
||||||
cancelMigration,
|
cancelMigration,
|
||||||
@ -152,9 +151,9 @@ const SelectFileStep = (props: SelectFileStepProps) => {
|
|||||||
setLoadingStatus,
|
setLoadingStatus,
|
||||||
files,
|
files,
|
||||||
setFiles,
|
setFiles,
|
||||||
multipleFileUploading,
|
|
||||||
migratingWorkspace,
|
migratingWorkspace,
|
||||||
setMigratingWorkspace,
|
setMigratingWorkspace,
|
||||||
|
uploadFiles,
|
||||||
} = props as InjectedSelectFileStepProps;
|
} = props as InjectedSelectFileStepProps;
|
||||||
|
|
||||||
const [isSaveDisabled, setIsSaveDisabled] = useState(
|
const [isSaveDisabled, setIsSaveDisabled] = useState(
|
||||||
@ -173,9 +172,18 @@ const SelectFileStep = (props: SelectFileStepProps) => {
|
|||||||
const [chunkSize, setChunkSize] = useState(0);
|
const [chunkSize, setChunkSize] = useState(0);
|
||||||
|
|
||||||
const [failTries, setFailTries] = useState(FAIL_TRIES);
|
const [failTries, setFailTries] = useState(FAIL_TRIES);
|
||||||
|
|
||||||
const uploadInterval = useRef<number>();
|
const uploadInterval = useRef<number>();
|
||||||
|
|
||||||
|
const handleError = useCallback(
|
||||||
|
(message?: string) => {
|
||||||
|
toastr.error(message || t("Common:SomethingWentWrong"));
|
||||||
|
setIsFileError(true);
|
||||||
|
setLoadingStatus("none");
|
||||||
|
clearInterval(uploadInterval.current);
|
||||||
|
},
|
||||||
|
[t, setLoadingStatus],
|
||||||
|
);
|
||||||
|
|
||||||
const poolStatus = useCallback(async () => {
|
const poolStatus = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
const res = await getMigrationStatus();
|
const res = await getMigrationStatus();
|
||||||
@ -186,17 +194,12 @@ const SelectFileStep = (props: SelectFileStepProps) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!res) {
|
if (!res) {
|
||||||
toastr.error(t("Common:SomethingWentWrong"));
|
handleError();
|
||||||
setLoadingStatus("none");
|
|
||||||
clearInterval(uploadInterval.current);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res.parseResult.failedArchives.length > 0 || res.error) {
|
if (res.parseResult.failedArchives.length > 0 || res.error) {
|
||||||
toastr.error(res.error);
|
handleError(res.error);
|
||||||
setIsFileError(true);
|
|
||||||
setLoadingStatus("none");
|
|
||||||
clearInterval(uploadInterval.current);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,7 +212,6 @@ const SelectFileStep = (props: SelectFileStepProps) => {
|
|||||||
res.parseResult.withoutEmailUsers.length;
|
res.parseResult.withoutEmailUsers.length;
|
||||||
|
|
||||||
if (totalUsers > 0) {
|
if (totalUsers > 0) {
|
||||||
setUsers(res.parseResult);
|
|
||||||
setIsBackupEmpty(false);
|
setIsBackupEmpty(false);
|
||||||
setLoadingStatus("done");
|
setLoadingStatus("done");
|
||||||
setUsers(res.parseResult);
|
setUsers(res.parseResult);
|
||||||
@ -228,10 +230,7 @@ const SelectFileStep = (props: SelectFileStepProps) => {
|
|||||||
setIsInfiniteProgress(false);
|
setIsInfiniteProgress(false);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
toastr.error(error || t("Common:SomethingWentWrong"));
|
handleError(error as string);
|
||||||
setIsFileError(true);
|
|
||||||
setLoadingStatus("none");
|
|
||||||
clearInterval(uploadInterval.current);
|
|
||||||
setIsNetworkError(true);
|
setIsNetworkError(true);
|
||||||
}
|
}
|
||||||
}, [
|
}, [
|
||||||
@ -240,15 +239,16 @@ const SelectFileStep = (props: SelectFileStepProps) => {
|
|||||||
isInfiniteProgress,
|
isInfiniteProgress,
|
||||||
setLoadingStatus,
|
setLoadingStatus,
|
||||||
setUsers,
|
setUsers,
|
||||||
t,
|
handleError,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const onUploadFile = async (file: File | File[]) => {
|
const onUploadFile = async (file: File | File[]) => {
|
||||||
try {
|
try {
|
||||||
if (file instanceof Array) {
|
const filesData = Array.isArray(file) ? file : [file];
|
||||||
setFiles(file.map((item) => item.name));
|
setFiles(filesData.map((item) => item.name));
|
||||||
await multipleFileUploading(
|
|
||||||
file,
|
await uploadFiles(
|
||||||
|
filesData,
|
||||||
setProgress,
|
setProgress,
|
||||||
isAbort,
|
isAbort,
|
||||||
setChunk,
|
setChunk,
|
||||||
@ -256,31 +256,16 @@ const SelectFileStep = (props: SelectFileStepProps) => {
|
|||||||
setChunkSize,
|
setChunkSize,
|
||||||
chunkSize,
|
chunkSize,
|
||||||
);
|
);
|
||||||
} else {
|
|
||||||
setFiles([file.name]);
|
|
||||||
await singleFileUploading(
|
|
||||||
file,
|
|
||||||
setProgress,
|
|
||||||
isAbort,
|
|
||||||
setChunk,
|
|
||||||
startChunk,
|
|
||||||
setChunkSize,
|
|
||||||
chunkSize,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isAbort.current) return;
|
if (isAbort.current) return;
|
||||||
|
|
||||||
await initMigrationName(migratorName);
|
await initMigrations(migratorName);
|
||||||
setLoadingStatus("proceed");
|
setLoadingStatus("proceed");
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
toastr.error(error || t("Common:SomethingWentWrong"));
|
handleError(error as string);
|
||||||
setIsFileError(true);
|
|
||||||
setLoadingStatus("none");
|
|
||||||
setIsNetworkError(true);
|
setIsNetworkError(true);
|
||||||
} finally {
|
} finally {
|
||||||
isAbort.current = false;
|
isAbort.current = false;
|
||||||
setIsBackupEmpty(false);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -292,6 +277,7 @@ const SelectFileStep = (props: SelectFileStepProps) => {
|
|||||||
|
|
||||||
setProgress(0);
|
setProgress(0);
|
||||||
setIsFileError(false);
|
setIsFileError(false);
|
||||||
|
setIsBackupEmpty(false);
|
||||||
setIsSaveDisabled(true);
|
setIsSaveDisabled(true);
|
||||||
setLoadingStatus("upload");
|
setLoadingStatus("upload");
|
||||||
setFailTries(FAIL_TRIES);
|
setFailTries(FAIL_TRIES);
|
||||||
@ -497,8 +483,7 @@ const SelectFileStep = (props: SelectFileStepProps) => {
|
|||||||
|
|
||||||
export default inject<TStore>(({ dialogsStore, importAccountsStore }) => {
|
export default inject<TStore>(({ dialogsStore, importAccountsStore }) => {
|
||||||
const {
|
const {
|
||||||
initMigrationName,
|
initMigrations,
|
||||||
singleFileUploading,
|
|
||||||
getMigrationStatus,
|
getMigrationStatus,
|
||||||
setUsers,
|
setUsers,
|
||||||
fileLoadingStatus,
|
fileLoadingStatus,
|
||||||
@ -508,16 +493,15 @@ export default inject<TStore>(({ dialogsStore, importAccountsStore }) => {
|
|||||||
incrementStep,
|
incrementStep,
|
||||||
files,
|
files,
|
||||||
setFiles,
|
setFiles,
|
||||||
multipleFileUploading,
|
|
||||||
migratingWorkspace,
|
migratingWorkspace,
|
||||||
setMigratingWorkspace,
|
setMigratingWorkspace,
|
||||||
|
uploadFiles,
|
||||||
} = importAccountsStore;
|
} = importAccountsStore;
|
||||||
const { cancelUploadDialogVisible, setCancelUploadDialogVisible } =
|
const { cancelUploadDialogVisible, setCancelUploadDialogVisible } =
|
||||||
dialogsStore;
|
dialogsStore;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
initMigrationName,
|
initMigrations,
|
||||||
singleFileUploading,
|
|
||||||
getMigrationStatus,
|
getMigrationStatus,
|
||||||
setUsers,
|
setUsers,
|
||||||
fileLoadingStatus,
|
fileLoadingStatus,
|
||||||
@ -529,8 +513,8 @@ export default inject<TStore>(({ dialogsStore, importAccountsStore }) => {
|
|||||||
incrementStep,
|
incrementStep,
|
||||||
files,
|
files,
|
||||||
setFiles,
|
setFiles,
|
||||||
multipleFileUploading,
|
|
||||||
migratingWorkspace,
|
migratingWorkspace,
|
||||||
setMigratingWorkspace,
|
setMigratingWorkspace,
|
||||||
|
uploadFiles,
|
||||||
};
|
};
|
||||||
})(observer(SelectFileStep));
|
})(observer(SelectFileStep));
|
||||||
|
@ -59,8 +59,7 @@ export interface InjectedSelectFileStepProps extends SelectFileStepProps {
|
|||||||
setWorkspace: TStore["importAccountsStore"]["setWorkspace"];
|
setWorkspace: TStore["importAccountsStore"]["setWorkspace"];
|
||||||
cancelUploadDialogVisible: TStore["dialogsStore"]["cancelUploadDialogVisible"];
|
cancelUploadDialogVisible: TStore["dialogsStore"]["cancelUploadDialogVisible"];
|
||||||
setCancelUploadDialogVisible: TStore["dialogsStore"]["setCancelUploadDialogVisible"];
|
setCancelUploadDialogVisible: TStore["dialogsStore"]["setCancelUploadDialogVisible"];
|
||||||
initMigrationName: TStore["importAccountsStore"]["initMigrationName"];
|
initMigrations: TStore["importAccountsStore"]["initMigrations"];
|
||||||
singleFileUploading: TStore["importAccountsStore"]["singleFileUploading"];
|
|
||||||
getMigrationStatus: TStore["importAccountsStore"]["getMigrationStatus"];
|
getMigrationStatus: TStore["importAccountsStore"]["getMigrationStatus"];
|
||||||
setUsers: TStore["importAccountsStore"]["setUsers"];
|
setUsers: TStore["importAccountsStore"]["setUsers"];
|
||||||
fileLoadingStatus: TStore["importAccountsStore"]["fileLoadingStatus"];
|
fileLoadingStatus: TStore["importAccountsStore"]["fileLoadingStatus"];
|
||||||
@ -68,9 +67,9 @@ export interface InjectedSelectFileStepProps extends SelectFileStepProps {
|
|||||||
cancelMigration: TStore["importAccountsStore"]["cancelMigration"];
|
cancelMigration: TStore["importAccountsStore"]["cancelMigration"];
|
||||||
files: TStore["importAccountsStore"]["files"];
|
files: TStore["importAccountsStore"]["files"];
|
||||||
setFiles: TStore["importAccountsStore"]["setFiles"];
|
setFiles: TStore["importAccountsStore"]["setFiles"];
|
||||||
multipleFileUploading: TStore["importAccountsStore"]["multipleFileUploading"];
|
|
||||||
migratingWorkspace: TStore["importAccountsStore"]["migratingWorkspace"];
|
migratingWorkspace: TStore["importAccountsStore"]["migratingWorkspace"];
|
||||||
setMigratingWorkspace: TStore["importAccountsStore"]["setMigratingWorkspace"];
|
setMigratingWorkspace: TStore["importAccountsStore"]["setMigratingWorkspace"];
|
||||||
|
uploadFiles: TStore["importAccountsStore"]["uploadFiles"];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface DataImportProps {}
|
export interface DataImportProps {}
|
||||||
|
@ -329,8 +329,8 @@ class ImportAccountsStore {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
multipleFileUploading = async (
|
uploadFiles = async (
|
||||||
files: File[],
|
filesData: File | File[],
|
||||||
setProgress: (progress: number) => void,
|
setProgress: (progress: number) => void,
|
||||||
isAbort: React.MutableRefObject<boolean>,
|
isAbort: React.MutableRefObject<boolean>,
|
||||||
setChunk: React.Dispatch<React.SetStateAction<number>>,
|
setChunk: React.Dispatch<React.SetStateAction<number>>,
|
||||||
@ -339,21 +339,20 @@ class ImportAccountsStore {
|
|||||||
chunkSize: number,
|
chunkSize: number,
|
||||||
) => {
|
) => {
|
||||||
let chunk = 0;
|
let chunk = 0;
|
||||||
try {
|
|
||||||
const location = combineUrl(
|
const location = combineUrl(
|
||||||
window.location.origin,
|
window.location.origin,
|
||||||
"migrationFileUpload.ashx",
|
"migrationFileUpload.ashx",
|
||||||
);
|
);
|
||||||
const requestsDataArray: { formData: FormData; fileName: string }[] = [];
|
|
||||||
|
|
||||||
let chunkUploadSize = 0;
|
try {
|
||||||
|
let chunkUploadSize = chunkSize;
|
||||||
|
|
||||||
if (chunkSize) {
|
if (!chunkSize) {
|
||||||
chunkUploadSize = chunkSize;
|
const res = await axios.post<{
|
||||||
} else {
|
Success: boolean;
|
||||||
const res: {
|
ChunkSize: number;
|
||||||
data: { Success: boolean; ChunkSize: number; Message: string };
|
Message: string;
|
||||||
} = await axios.post(`${location}?Init=${startChunk === 0}`);
|
}>(`${location}?Init=${startChunk === 0}`);
|
||||||
|
|
||||||
if (!res.data.Success) {
|
if (!res.data.Success) {
|
||||||
toastr.error(res.data.Message);
|
toastr.error(res.data.Message);
|
||||||
@ -364,9 +363,10 @@ class ImportAccountsStore {
|
|||||||
setChunkSize(chunkUploadSize);
|
setChunkSize(chunkUploadSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!chunkUploadSize) return;
|
if (!chunkUploadSize || isAbort.current) return;
|
||||||
|
|
||||||
if (isAbort.current) return;
|
const requestsDataArray: { formData: FormData; fileName: string }[] = [];
|
||||||
|
const files = Array.isArray(filesData) ? filesData : [filesData];
|
||||||
|
|
||||||
const chunksNumber = files
|
const chunksNumber = files
|
||||||
.map((file) => Math.ceil(file.size / chunkUploadSize))
|
.map((file) => Math.ceil(file.size / chunkUploadSize))
|
||||||
@ -402,79 +402,9 @@ class ImportAccountsStore {
|
|||||||
setProgress(Math.ceil(progress));
|
setProgress(Math.ceil(progress));
|
||||||
chunk += 1;
|
chunk += 1;
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (error) {
|
||||||
setChunk(chunk);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
singleFileUploading = async (
|
|
||||||
file: File,
|
|
||||||
setProgress: (progress: number) => void,
|
|
||||||
isAbort: React.MutableRefObject<boolean>,
|
|
||||||
setChunk: React.Dispatch<React.SetStateAction<number>>,
|
|
||||||
startChunk: number,
|
|
||||||
setChunkSize: React.Dispatch<React.SetStateAction<number>>,
|
|
||||||
chunkSize: number,
|
|
||||||
) => {
|
|
||||||
let chunk = 0;
|
|
||||||
try {
|
|
||||||
const location = combineUrl(
|
|
||||||
window.location.origin,
|
|
||||||
"migrationFileUpload.ashx",
|
|
||||||
);
|
|
||||||
|
|
||||||
let chunkUploadSize = 0;
|
|
||||||
|
|
||||||
if (chunkSize) {
|
|
||||||
chunkUploadSize = chunkSize;
|
|
||||||
} else {
|
|
||||||
const res: {
|
|
||||||
data: { Success: boolean; ChunkSize: number; Message: string };
|
|
||||||
} = await axios.post(`${location}?Init=${startChunk === 0}`);
|
|
||||||
|
|
||||||
if (!res.data.Success) {
|
|
||||||
toastr.error(res.data.Message);
|
|
||||||
throw new Error(res.data.Message);
|
|
||||||
}
|
|
||||||
|
|
||||||
chunkUploadSize = res.data.ChunkSize;
|
|
||||||
setChunkSize(chunkUploadSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!chunkUploadSize) return;
|
|
||||||
|
|
||||||
const requestsDataArray = [];
|
|
||||||
|
|
||||||
const chunks = Math.ceil(file.size / chunkUploadSize);
|
|
||||||
|
|
||||||
if (isAbort.current) return;
|
|
||||||
|
|
||||||
while (chunk < chunks) {
|
|
||||||
const offset = chunk * chunkUploadSize;
|
|
||||||
const formData = new FormData();
|
|
||||||
formData.append("file", file.slice(offset, offset + chunkUploadSize));
|
|
||||||
requestsDataArray.push(formData);
|
|
||||||
chunk += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
chunk = startChunk || 0;
|
|
||||||
while (
|
|
||||||
chunk < chunks &&
|
|
||||||
(this.fileLoadingStatus === "upload" ||
|
|
||||||
this.fileLoadingStatus === "proceed")
|
|
||||||
) {
|
|
||||||
if (isAbort.current) return;
|
|
||||||
// eslint-disable-next-line no-await-in-loop
|
|
||||||
await uploadFile(
|
|
||||||
`${location}?Name=${file.name}`,
|
|
||||||
requestsDataArray[chunk],
|
|
||||||
);
|
|
||||||
const progress = (chunk / chunks) * 100;
|
|
||||||
setProgress(Math.ceil(progress));
|
|
||||||
chunk += 1;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
setChunk(chunk);
|
setChunk(chunk);
|
||||||
|
throw new Error(error as string);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -492,7 +422,7 @@ class ImportAccountsStore {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// eslint-disable-next-line class-methods-use-this
|
// eslint-disable-next-line class-methods-use-this
|
||||||
initMigrationName = (name: TWorkspaceService) => {
|
initMigrations = (name: TWorkspaceService) => {
|
||||||
return initMigration(name);
|
return initMigration(name);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user