import React, { useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import * as toastr from 'toastr'; import { apiDelete } from '~/client/util/apiv1-client'; import { apiv3Get } from '~/client/util/apiv3-client'; import { useAdminSocket } from '~/stores/socket-io'; import LabeledProgressBar from './Common/LabeledProgressBar'; import ArchiveFilesTable from './ExportArchiveData/ArchiveFilesTable'; import SelectCollectionsModal from './ExportArchiveData/SelectCollectionsModal'; const IGNORED_COLLECTION_NAMES = [ 'sessions', 'rlflx', 'activities', ]; const ExportArchiveDataPage = (): JSX.Element => { const { data: socket } = useAdminSocket(); const { t } = useTranslation('admin'); const [collections, setCollections] = useState([]); const [zipFileStats, setZipFileStats] = useState([]); const [progressList, setProgressList] = useState([]); const [isExportModalOpen, setExportModalOpen] = useState(false); const [isExporting, setExporting] = useState(false); const [isZipping, setZipping] = useState(false); const [isExported, setExported] = useState(false); const fetchData = useCallback(async() => { const [{ data: collectionsData }, { data: statusData }] = await Promise.all([ apiv3Get<{collections: any[]}>('/mongo/collections', {}), apiv3Get<{status: { zipFileStats: any[], isExporting: boolean, progressList: any[] }}>('/export/status', {}), ]); // TODO: toastSuccess, toastError // filter only not ignored collection names const filteredCollections = collectionsData.collections.filter((collectionName) => { return !IGNORED_COLLECTION_NAMES.includes(collectionName); }); const { zipFileStats, isExporting, progressList } = statusData.status; setCollections(filteredCollections); setZipFileStats(zipFileStats); setExporting(isExporting); setProgressList(progressList); }, []); const setupWebsocketEventHandler = useCallback(() => { if (socket != null) { // websocket event socket.on('admin:onProgressForExport', ({ currentCount, totalCount, progressList }) => { setExporting(true); setProgressList(progressList); }); // websocket event socket.on('admin:onStartZippingForExport', () => { setZipping(true); }); // websocket event socket.on('admin:onTerminateForExport', ({ addedZipFileStat }) => { setExporting(false); setZipping(false); setExported(true); setZipFileStats(prev => prev.concat([addedZipFileStat])); // TODO: toastSuccess, toastError toastr.success(undefined, `New Archive Data '${addedZipFileStat.fileName}' is added`, { closeButton: true, progressBar: true, newestOnTop: false, showDuration: '100', hideDuration: '100', timeOut: '1200', extendedTimeOut: '150', }); }); } }, [socket]); const onZipFileStatRemove = useCallback(async(fileName) => { try { await apiDelete(`/v3/export/${fileName}`, {}); setZipFileStats(prev => prev.filter(stat => stat.fileName !== fileName)); // TODO: toastSuccess, toastError toastr.success(undefined, `Deleted ${fileName}`, { closeButton: true, progressBar: true, newestOnTop: false, showDuration: '100', hideDuration: '100', timeOut: '1200', extendedTimeOut: '150', }); } catch (err) { // TODO: toastSuccess, toastError toastr.error(err, 'Error', { closeButton: true, progressBar: true, newestOnTop: false, showDuration: '100', hideDuration: '100', timeOut: '3000', }); } }, []); const exportingRequestedHandler = useCallback(() => {}, []); const renderProgressBarsForCollections = useCallback(() => { const cols = progressList.map((progressData) => { const { collectionName, currentCount, totalCount } = progressData; return (
); }); return
{cols}
; }, [progressList]); const renderProgressBarForZipping = useCallback(() => { const showZippingBar = isZipping || isExported; if (!showZippingBar) { return <>; } return (
); }, [isExported, isZipping]); useEffect(() => { fetchData(); setupWebsocketEventHandler(); }, [fetchData, setupWebsocketEventHandler]); const showExportingData = (isExported || isExporting) && (progressList != null); return (

{t('export_management.export_archive_data')}

{ showExportingData && (

{t('export_management.exporting_collection_list')}

{ renderProgressBarsForCollections() } { renderProgressBarForZipping() }
) }

{t('export_management.exported_data_list')}

setExportModalOpen(false)} collections={collections} />
); }; export default ExportArchiveDataPage;