import React from 'react'; import { connect } from 'react-redux'; import { Banner, BannerVariant, EmptyContent, Link, css, spacing, } from '@mongodb-js/compass-components'; import { DatabasesList } from '@mongodb-js/databases-collections-list'; import { usePreference } from 'compass-preferences-model'; import { ZeroGraphic } from './zero-graphic'; import type { Database, DatabasesState } from '../modules/databases'; import { createDatabase, dropDatabase, refreshDatabases, selectDatabase, } from '../modules/databases'; import { useTrackOnChange } from '@mongodb-js/compass-logging/provider'; const errorContainerStyles = css({ padding: spacing[3], }); const nonGenuineErrorContainerStyles = css({ width: '100%', }); const NON_GENUINE_SUBTEXT = 'This server or service appears to be emulating' + ' MongoDB. Some documented MongoDB features may work differently, may be' + ' entirely missing or incomplete, or may have unexpectedly different' + ' performance characteristics than would be found when connecting to a' + ' real MongoDB server or service.'; const DOCUMENTATION_LINK = 'https://www.mongodb.com/atlas/database'; const ERROR_WARNING = 'An error occurred while loading databases'; function NonGenuineZeroState() { return (
Try MongoDB Atlas } />
); } type DatabasesProps = { databases: Database[]; databasesLoadingStatus: string; databasesLoadingError: string | null; isWritable: boolean; isGenuineMongoDB: boolean; isDataLake: boolean; onDatabaseClick(ns: string): void; onDeleteDatabaseClick(ns: string): void; onCreateDatabaseClick(): void; onRefreshClick(): void; }; const Databases: React.FunctionComponent = ({ databases, databasesLoadingStatus, databasesLoadingError, isWritable, isDataLake, isGenuineMongoDB, onDatabaseClick, onDeleteDatabaseClick, onCreateDatabaseClick, onRefreshClick, }) => { const isPreferencesReadOnly = usePreference('readOnly', React); useTrackOnChange( 'COMPASS-DATABASES-UI', (track) => { track('Screen', { name: 'databases' }); }, [] ); if (databasesLoadingStatus === 'error') { return (
{databasesLoadingError ? `${ERROR_WARNING}: ${databasesLoadingError}` : ERROR_WARNING}
); } if (databases.length === 0 && !isGenuineMongoDB) { return ; } const editable = isWritable && !isPreferencesReadOnly; const actions = Object.assign( { onDatabaseClick, onRefreshClick }, editable && !isDataLake ? { onDeleteDatabaseClick, onCreateDatabaseClick } : {} ); return ; }; const mapStateToProps = (state: DatabasesState) => { return { databases: state.databases, databasesLoadingStatus: state.databasesLoadingStatus.status, databasesLoadingError: state.databasesLoadingStatus.error, isWritable: state.instance.isWritable, isDataLake: state.instance.isDataLake, isGenuineMongoDB: state.instance.isGenuineMongoDB, }; }; const mapDispatchToProps = { onRefreshClick: refreshDatabases, onDatabaseClick: selectDatabase, onDeleteDatabaseClick: dropDatabase, onCreateDatabaseClick: createDatabase, }; /** * Connect the redux store to the component. * (dispatch) */ const ConnectedDatabases = connect( mapStateToProps, mapDispatchToProps )(Databases) as React.FunctionComponent>; export default ConnectedDatabases; export { Databases };