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, 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));

View File

@ -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 {}

View File

@ -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);
}; };