import React, { useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import * as toastr from 'toastr'; import { apiv3Get } from '~/client/util/apiv3-client'; import { useAdminSocket } from '~/stores/socket-io'; import CustomCopyToClipBoard from '../Common/CustomCopyToClipBoard'; import SelectCollectionsModal from './ExportArchiveData/SelectCollectionsModal'; const IGNORED_COLLECTION_NAMES = [ 'sessions', 'rlflx', 'activities', ]; const G2GDataTransfer = (): JSX.Element => { const { data: socket } = useAdminSocket(); const { t } = useTranslation(); const [collections, setCollections] = useState([]); const [isExportModalOpen, setExportModalOpen] = useState(false); const [isExporting, setExporting] = useState(false); // TODO: データのエクスポートが完了したことが分かるようにする const [isExported, setExported] = useState(false); const [transferKey, setTransferKey] = useState(''); 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', {}), ]); // filter only not ignored collection names const filteredCollections = collectionsData.collections.filter((collectionName) => { return !IGNORED_COLLECTION_NAMES.includes(collectionName); }); setCollections(filteredCollections); setExporting(statusData.status.isExporting); }, []); const setupWebsocketEventHandler = useCallback(() => { if (socket != null) { // websocket event socket.on('admin:onProgressForExport', ({ currentCount, totalCount, progressList }) => { setExporting(true); }); // websocket event socket.on('admin:onTerminateForExport', ({ addedZipFileStat }) => { setExporting(false); setExported(true); // 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 publishTransferKey = () => { // 移行キー発行の処理 setTransferKey('transferKey'); }; const transferData = () => { // データ移行の処理 }; const exportingRequestedHandler = useCallback(() => {}, []); useEffect(() => { fetchData(); setupWebsocketEventHandler(); }, [fetchData, setupWebsocketEventHandler]); return (

{t('g2g_data_transfer.transfer_data_to_another_growi')}

{t('g2g_data_transfer.transfer_data_to_this_growi')}

{t('g2g_data_transfer.transfer_key_limit')}

{t('g2g_data_transfer.once_transfer_key_used')}

{t('g2g_data_transfer.transfer_to_growi_cloud')}

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