import React, { useCallback, useMemo } from 'react'; import { Badge, Banner, css, FormFieldContainer, FormModal, spacing, useToast, } from '@mongodb-js/compass-components'; import { FileInput } from './file-input'; import { Passphrase } from './passphrase'; import { SelectTable } from './select-table'; import type { ImportExportResult } from '../hooks/common'; import { useOpenModalThroughIpc } from '../hooks/common'; import { useImportConnections } from '../hooks/use-import'; import type { ConnectionInfo, ConnectionStorage, } from '@mongodb-js/connection-storage/renderer'; const TOAST_TIMEOUT_MS = 5000; const tableStyles = css({ maxHeight: '24vh', overflow: 'auto', }); const existingFavoriteBadgeStyles = css({ marginLeft: spacing[2], }); const selectTableColumns = [['displayName', 'Connection Name']] as const; export function ImportConnectionsModal({ open, setOpen, favoriteConnections, afterImport, trackingProps, connectionStorage, }: { open: boolean; setOpen: (newOpen: boolean) => void; favoriteConnections: Pick[]; afterImport?: () => void; trackingProps?: Record; connectionStorage?: typeof ConnectionStorage; }): React.ReactElement { const { openToast } = useToast('compass-connection-import-export'); const finish = useCallback( (result: ImportExportResult) => { setOpen(false); if (result === 'succeeded') { openToast('import-succeeded', { title: 'Import successful', description: 'New connections have been added', variant: 'success', timeout: TOAST_TIMEOUT_MS, }); afterImport?.(); } }, [afterImport, openToast, setOpen] ); useOpenModalThroughIpc(open, setOpen, 'compass:open-import-connections'); const { onSubmit, onCancel, onChangeFilename, onChangePassphrase, onChangeConnectionList, state: { inProgress, error, passphraseRequired, connectionList, filename, passphrase, }, } = useImportConnections( { finish, open, favoriteConnections, trackingProps, }, connectionStorage?.importConnections.bind(connectionStorage), connectionStorage?.deserializeConnections.bind(connectionStorage) ); const [displayConnectionList, hasSelectedDuplicates] = useMemo(() => { return [ connectionList.map((conn) => ({ ...conn, displayName: ( <> {conn.name} {conn.isExistingFavorite && ( Existing Favorite )} ), })), connectionList.some((conn) => conn.isExistingFavorite && conn.selected), ]; }, [connectionList]); return ( 0} disabled={inProgress} onChange={onChangePassphrase} value={passphrase} /> {connectionList.length > 0 && ( )} {(error && !passphraseRequired && ( Error: {error} )) || (hasSelectedDuplicates && ( Some connections are already saved and will be overwritten by importing them ))} ); }