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 };