Web: Client: Data Import: refactoring

This commit is contained in:
Elyor Djalilov 2024-08-01 12:03:18 +05:00
parent 0f10ac21c3
commit ec14566491
3 changed files with 57 additions and 144 deletions

View File

@ -143,8 +143,7 @@ const SelectFileStep = (props: SelectFileStepProps) => {
setWorkspace,
cancelUploadDialogVisible,
setCancelUploadDialogVisible,
initMigrationName,
singleFileUploading,
initMigrations,
getMigrationStatus,
setUsers,
cancelMigration,
@ -152,9 +151,9 @@ const SelectFileStep = (props: SelectFileStepProps) => {
setLoadingStatus,
files,
setFiles,
multipleFileUploading,
migratingWorkspace,
setMigratingWorkspace,
uploadFiles,
} = props as InjectedSelectFileStepProps;
const [isSaveDisabled, setIsSaveDisabled] = useState(
@ -173,9 +172,18 @@ const SelectFileStep = (props: SelectFileStepProps) => {
const [chunkSize, setChunkSize] = useState(0);
const [failTries, setFailTries] = useState(FAIL_TRIES);
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 () => {
try {
const res = await getMigrationStatus();
@ -186,17 +194,12 @@ const SelectFileStep = (props: SelectFileStepProps) => {
}
if (!res) {
toastr.error(t("Common:SomethingWentWrong"));
setLoadingStatus("none");
clearInterval(uploadInterval.current);
handleError();
return;
}
if (res.parseResult.failedArchives.length > 0 || res.error) {
toastr.error(res.error);
setIsFileError(true);
setLoadingStatus("none");
clearInterval(uploadInterval.current);
handleError(res.error);
return;
}
@ -209,7 +212,6 @@ const SelectFileStep = (props: SelectFileStepProps) => {
res.parseResult.withoutEmailUsers.length;
if (totalUsers > 0) {
setUsers(res.parseResult);
setIsBackupEmpty(false);
setLoadingStatus("done");
setUsers(res.parseResult);
@ -228,10 +230,7 @@ const SelectFileStep = (props: SelectFileStepProps) => {
setIsInfiniteProgress(false);
}
} catch (error) {
toastr.error(error || t("Common:SomethingWentWrong"));
setIsFileError(true);
setLoadingStatus("none");
clearInterval(uploadInterval.current);
handleError(error as string);
setIsNetworkError(true);
}
}, [
@ -240,15 +239,16 @@ const SelectFileStep = (props: SelectFileStepProps) => {
isInfiniteProgress,
setLoadingStatus,
setUsers,
t,
handleError,
]);
const onUploadFile = async (file: File | File[]) => {
try {
if (file instanceof Array) {
setFiles(file.map((item) => item.name));
await multipleFileUploading(
file,
const filesData = Array.isArray(file) ? file : [file];
setFiles(filesData.map((item) => item.name));
await uploadFiles(
filesData,
setProgress,
isAbort,
setChunk,
@ -256,31 +256,16 @@ const SelectFileStep = (props: SelectFileStepProps) => {
setChunkSize,
chunkSize,
);
} else {
setFiles([file.name]);
await singleFileUploading(
file,
setProgress,
isAbort,
setChunk,
startChunk,
setChunkSize,
chunkSize,
);
}
if (isAbort.current) return;
await initMigrationName(migratorName);
await initMigrations(migratorName);
setLoadingStatus("proceed");
} catch (error) {
toastr.error(error || t("Common:SomethingWentWrong"));
setIsFileError(true);
setLoadingStatus("none");
handleError(error as string);
setIsNetworkError(true);
} finally {
isAbort.current = false;
setIsBackupEmpty(false);
}
};
@ -292,6 +277,7 @@ const SelectFileStep = (props: SelectFileStepProps) => {
setProgress(0);
setIsFileError(false);
setIsBackupEmpty(false);
setIsSaveDisabled(true);
setLoadingStatus("upload");
setFailTries(FAIL_TRIES);
@ -497,8 +483,7 @@ const SelectFileStep = (props: SelectFileStepProps) => {
export default inject<TStore>(({ dialogsStore, importAccountsStore }) => {
const {
initMigrationName,
singleFileUploading,
initMigrations,
getMigrationStatus,
setUsers,
fileLoadingStatus,
@ -508,16 +493,15 @@ export default inject<TStore>(({ dialogsStore, importAccountsStore }) => {
incrementStep,
files,
setFiles,
multipleFileUploading,
migratingWorkspace,
setMigratingWorkspace,
uploadFiles,
} = importAccountsStore;
const { cancelUploadDialogVisible, setCancelUploadDialogVisible } =
dialogsStore;
return {
initMigrationName,
singleFileUploading,
initMigrations,
getMigrationStatus,
setUsers,
fileLoadingStatus,
@ -529,8 +513,8 @@ export default inject<TStore>(({ dialogsStore, importAccountsStore }) => {
incrementStep,
files,
setFiles,
multipleFileUploading,
migratingWorkspace,
setMigratingWorkspace,
uploadFiles,
};
})(observer(SelectFileStep));

View File

@ -59,8 +59,7 @@ export interface InjectedSelectFileStepProps extends SelectFileStepProps {
setWorkspace: TStore["importAccountsStore"]["setWorkspace"];
cancelUploadDialogVisible: TStore["dialogsStore"]["cancelUploadDialogVisible"];
setCancelUploadDialogVisible: TStore["dialogsStore"]["setCancelUploadDialogVisible"];
initMigrationName: TStore["importAccountsStore"]["initMigrationName"];
singleFileUploading: TStore["importAccountsStore"]["singleFileUploading"];
initMigrations: TStore["importAccountsStore"]["initMigrations"];
getMigrationStatus: TStore["importAccountsStore"]["getMigrationStatus"];
setUsers: TStore["importAccountsStore"]["setUsers"];
fileLoadingStatus: TStore["importAccountsStore"]["fileLoadingStatus"];
@ -68,9 +67,9 @@ export interface InjectedSelectFileStepProps extends SelectFileStepProps {
cancelMigration: TStore["importAccountsStore"]["cancelMigration"];
files: TStore["importAccountsStore"]["files"];
setFiles: TStore["importAccountsStore"]["setFiles"];
multipleFileUploading: TStore["importAccountsStore"]["multipleFileUploading"];
migratingWorkspace: TStore["importAccountsStore"]["migratingWorkspace"];
setMigratingWorkspace: TStore["importAccountsStore"]["setMigratingWorkspace"];
uploadFiles: TStore["importAccountsStore"]["uploadFiles"];
}
export interface DataImportProps {}

View File

@ -329,8 +329,8 @@ class ImportAccountsStore {
};
};
multipleFileUploading = async (
files: File[],
uploadFiles = async (
filesData: File | File[],
setProgress: (progress: number) => void,
isAbort: React.MutableRefObject<boolean>,
setChunk: React.Dispatch<React.SetStateAction<number>>,
@ -339,21 +339,20 @@ class ImportAccountsStore {
chunkSize: number,
) => {
let chunk = 0;
try {
const location = combineUrl(
window.location.origin,
"migrationFileUpload.ashx",
);
const requestsDataArray: { formData: FormData; fileName: string }[] = [];
let chunkUploadSize = 0;
try {
let chunkUploadSize = chunkSize;
if (chunkSize) {
chunkUploadSize = chunkSize;
} else {
const res: {
data: { Success: boolean; ChunkSize: number; Message: string };
} = await axios.post(`${location}?Init=${startChunk === 0}`);
if (!chunkSize) {
const res = await axios.post<{
Success: boolean;
ChunkSize: number;
Message: string;
}>(`${location}?Init=${startChunk === 0}`);
if (!res.data.Success) {
toastr.error(res.data.Message);
@ -364,9 +363,10 @@ class ImportAccountsStore {
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
.map((file) => Math.ceil(file.size / chunkUploadSize))
@ -402,79 +402,9 @@ class ImportAccountsStore {
setProgress(Math.ceil(progress));
chunk += 1;
}
} catch (e) {
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) {
} catch (error) {
setChunk(chunk);
throw new Error(error as string);
}
};
@ -492,7 +422,7 @@ class ImportAccountsStore {
};
// eslint-disable-next-line class-methods-use-this
initMigrationName = (name: TWorkspaceService) => {
initMigrations = (name: TWorkspaceService) => {
return initMigration(name);
};