ente/src/components/ExportModal.tsx

101 lines
3.5 KiB
TypeScript
Raw Normal View History

2021-07-07 05:31:48 +00:00
import React, { useEffect, useState } from 'react';
import exportService from 'services/exportService';
import { getData, LS_KEYS, setData } from 'utils/storage/localStorage';
2021-07-06 11:23:13 +00:00
import ExportFinished from './ExportFinished';
2021-07-06 09:20:05 +00:00
import ExportInit from './ExportInit';
import ExportInProgress from './ExportInProgress';
2021-07-07 05:31:48 +00:00
export enum ExportState {
2021-07-06 09:20:05 +00:00
INIT,
INPROGRESS,
2021-07-07 07:45:55 +00:00
PAUSED,
2021-07-06 09:20:05 +00:00
FINISHED
}
2021-07-07 05:31:48 +00:00
interface Props {
show: boolean
onHide: () => void
2021-07-07 07:45:55 +00:00
usage: string
}
export interface ExportStats {
current: number;
total: number;
failed: number;
2021-07-07 05:31:48 +00:00
}
export default function ExportModal(props: Props) {
2021-07-06 09:20:05 +00:00
// eslint-disable-next-line @typescript-eslint/no-unused-vars
2021-07-07 05:31:48 +00:00
const [exportState, setExportState] = useState(ExportState.INIT);
const [exportFolder, setExportFolder] = useState(null);
const [exportSize, setExportSize] = useState(null);
2021-07-07 07:45:55 +00:00
const [exportStats, setExportStats] = useState<ExportStats>({ current: 0, total: 0, failed: 0 });
const [lastExportTime, setLastExportTime] = useState(0);
2021-07-07 05:31:48 +00:00
useEffect(() => {
const exportInfo = getData(LS_KEYS.EXPORT);
exportInfo?.state && setExportState(exportInfo.state);
exportInfo?.folder && setExportFolder(exportInfo.folder);
2021-07-07 07:45:55 +00:00
exportInfo?.time && setLastExportTime(exportInfo.time);
2021-07-07 05:31:48 +00:00
setExportSize(props.usage);
}, []);
2021-07-07 07:45:55 +00:00
useEffect(() => {
if (exportStats.current === exportStats.total) {
updateExportState(ExportState.FINISHED);
updateExportTime(Date.now());
}
}, [exportStats]);
2021-07-07 05:31:48 +00:00
const updateExportFolder = (newFolder) => {
setExportFolder(newFolder);
setData(LS_KEYS.EXPORT, { ...getData(LS_KEYS.EXPORT), folder: newFolder });
};
const updateExportState = (newState) => {
setExportState(newState);
2021-07-07 07:45:55 +00:00
setData(LS_KEYS.EXPORT, { ...getData(LS_KEYS.EXPORT), state: newState });
};
const updateExportTime = (newTime) => {
setLastExportTime(newTime);
setData(LS_KEYS.EXPORT, { ...getData(LS_KEYS.EXPORT), time: newTime });
};
const startExport = () => {
updateExportState(ExportState.INPROGRESS);
setExportStats({ current: 0, total: 0, failed: 0 });
exportService.exportFiles(setExportStats);
2021-07-07 05:31:48 +00:00
};
2021-07-06 09:20:05 +00:00
switch (exportState) {
case ExportState.INIT:
return (
2021-07-07 07:45:55 +00:00
<ExportInit {...props}
exportFolder={exportFolder}
exportSize={exportSize}
updateExportFolder={updateExportFolder}
exportFiles={startExport}
updateExportState={updateExportState}
/>
2021-07-06 09:20:05 +00:00
);
case ExportState.INPROGRESS:
return (
2021-07-07 07:45:55 +00:00
<ExportInProgress {...props}
exportFolder={exportFolder}
exportSize={exportSize}
exportState={exportState}
updateExportState={updateExportState}
exportStats={exportStats}
exportFiles={startExport}
cancelExport={exportService.cancelExport}
/>
2021-07-06 09:20:05 +00:00
);
2021-07-06 11:23:13 +00:00
case ExportState.FINISHED:
return (
2021-07-07 07:45:55 +00:00
<ExportFinished
{...props}
exportFolder={exportFolder}
exportSize={exportSize}
updateExportFolder={updateExportFolder}
lastExportTime={lastExportTime}
exportStats={exportStats}
exportFiles={startExport}
/>
2021-07-06 11:23:13 +00:00
);
2021-07-06 09:20:05 +00:00
}
}