import React, { useCallback, useEffect, useState, } from 'react'; import { useTranslation } from 'next-i18next'; import { useGenerateTransferKey } from '~/client/services/g2g-transfer'; import { apiv3Get, apiv3Post } from '~/client/util/apiv3-client'; import { toastError, toastSuccess } from '~/client/util/toastr'; import { G2G_PROGRESS_STATUS, type G2GProgress } from '~/interfaces/g2g-transfer'; import { useAdminSocket } from '~/stores/socket-io'; import CustomCopyToClipBoard from '../Common/CustomCopyToClipBoard'; // import { FileUploadSettingMolecule } from './App/FileUploadSetting'; import G2GDataTransferExportForm from './G2GDataTransferExportForm'; import G2GDataTransferStatusIcon from './G2GDataTransferStatusIcon'; const IGNORED_COLLECTION_NAMES = [ 'sessions', 'rlflx', 'activities', 'attachmentFiles.files', 'attachmentFiles.chunks', ]; const G2GDataTransfer = (): JSX.Element => { const { data: socket } = useAdminSocket(); const { t } = useTranslation(['admin', 'commons']); const [startTransferKey, setStartTransferKey] = useState(''); const [collections, setCollections] = useState([]); const [selectedCollections, setSelectedCollections] = useState>(new Set()); const [optionsMap, setOptionsMap] = useState({}); const [isShowExportForm, setShowExportForm] = useState(false); const [isTransferring, setTransferring] = useState(false); const [g2gProgress, setG2GProgress] = useState({ mongo: G2G_PROGRESS_STATUS.PENDING, attachments: G2G_PROGRESS_STATUS.PENDING, }); // File upload settings // const [fileUploadType, setFileUploadType] = useState('aws'); // const [s3ReferenceFileWithRelayMode, setS3ReferenceFileWithRelayMode] = useState(false); // const [s3Region, setS3Region] = useState(''); // const [s3CustomEndpoint, setS3CustomEndpoint] = useState(''); // const [s3Bucket, setS3Bucket] = useState(''); // const [s3AccessKeyId, setS3AccessKeyId] = useState(''); // const [s3SecretAccessKey, setS3SecretAccessKey] = useState(''); // const [gcsReferenceFileWithRelayMode, setGcsReferenceFileWithRelayMode] = useState(false); // const [gcsApiKeyJsonPath, setGcsApiKeyJsonPath] = useState(''); // const [gcsBucket, setGcsBucket] = useState(''); // const [gcsUploadNamespace, setGcsUploadNamespace] = useState(''); const updateSelectedCollections = (newSelectedCollections: Set) => { setSelectedCollections(newSelectedCollections); }; const updateOptionsMap = (newOptionsMap: any) => { setOptionsMap(newOptionsMap); }; const onChangeTransferKeyHandler = useCallback((e) => { setStartTransferKey(e.target.value); }, []); const setCollectionsAndSelectedCollections = useCallback(async() => { const { data: collectionsData } = await apiv3Get<{collections: any[]}>('/mongo/collections', {}); // filter only not ignored collection names const filteredCollections = collectionsData.collections.filter((collectionName) => { return !IGNORED_COLLECTION_NAMES.includes(collectionName); }); setCollections(filteredCollections); setSelectedCollections(new Set(filteredCollections)); }, []); const setupWebsocketEventHandler = useCallback(() => { if (socket != null) { socket.on('admin:g2gProgress', (g2gProgress: G2GProgress) => { setG2GProgress(g2gProgress); if (g2gProgress.mongo === G2G_PROGRESS_STATUS.COMPLETED && g2gProgress.attachments === G2G_PROGRESS_STATUS.COMPLETED) { toastSuccess(t('admin:g2g:transfer_success')); } }); socket.on('admin:g2gError', ({ key }) => { setTransferring(false); toastError(t(key)); }); } }, [socket, t, setTransferring, setG2GProgress]); const cleanUpWebsocketEventHandler = useCallback(() => { if (socket != null) { socket.off('admin:g2gProgress'); socket.off('admin:g2gError'); } }, [socket]); const { transferKey, generateTransferKey } = useGenerateTransferKey(); const onClickHandler = useCallback(async() => { try { await generateTransferKey(); } catch (errs) { toastError(errs); } }, [generateTransferKey]); const startTransfer = useCallback(async(e) => { e.preventDefault(); setTransferring(true); try { await apiv3Post('/g2g-transfer/transfer', { transferKey: startTransferKey, collections: Array.from(selectedCollections), optionsMap, }); } catch (errs) { toastError(errs); } }, [setTransferring, startTransferKey, selectedCollections, optionsMap]); // File upload // const onChangeFileUploadTypeHandler = useCallback((e: ChangeEvent, type: string) => { // setFileUploadType(type); // }, []); // S3 // const onChangeS3ReferenceFileWithRelayModeHandler = useCallback((val: boolean) => { // setS3ReferenceFileWithRelayMode(val); // }, []); // const onChangeS3RegionHandler = useCallback((val: string) => { // setS3Region(val); // }, []); // const onChangeS3CustomEndpointHandler = useCallback((val: string) => { // setS3CustomEndpoint(val); // }, []); // const onChangeS3BucketHandler = useCallback((val: string) => { // setS3Bucket(val); // }, []); // const onChangeS3AccessKeyIdHandler = useCallback((val: string) => { // setS3AccessKeyId(val); // }, []); // const onChangeS3SecretAccessKeyHandler = useCallback((val: string) => { // setS3SecretAccessKey(val); // }, []); // // GCS // const onChangeGcsReferenceFileWithRelayModeHandler = useCallback((val: boolean) => { // setGcsReferenceFileWithRelayMode(val); // }, []); // const onChangeGcsApiKeyJsonPathHandler = useCallback((val: string) => { // setGcsApiKeyJsonPath(val); // }, []); // const onChangeGcsBucketHandler = useCallback((val: string) => { // setGcsBucket(val); // }, []); // const onChangeGcsUploadNamespaceHandler = useCallback((val: string) => { // setGcsUploadNamespace(val); // }, []); useEffect(() => { setCollectionsAndSelectedCollections(); setupWebsocketEventHandler(); return () => { cleanUpWebsocketEventHandler(); }; }, [setCollectionsAndSelectedCollections, setupWebsocketEventHandler, cleanUpWebsocketEventHandler]); return (

{t('admin:g2g_data_transfer.transfer_data_to_another_growi')}

{collections.length !== 0 && (
{/*

{t('admin:app_setting.file_upload')}

*/}

{t('export_management.export_archive_data')}

)}
{isTransferring && (
MongoDB
Attachments
)}

{t('commons:g2g_data_transfer.transfer_data_to_this_growi')}

{t('commons:g2g_data_transfer.transfer_key_limit')}

{t('commons:g2g_data_transfer.once_transfer_key_used')}

{t('commons:g2g_data_transfer.transfer_to_growi_cloud')}

); }; export default G2GDataTransfer;