import React, { useCallback } from 'react'; import { H3, Description, spacing, palette, css, cx, useDarkMode, ItemActionControls, useHoverState, useToast, } from '@mongodb-js/compass-components'; import type { ItemAction } from '@mongodb-js/compass-components'; import type { ConnectionInfo } from '@mongodb-js/connection-storage/renderer'; import { getConnectionTitle } from '@mongodb-js/connection-storage/renderer'; import ConnectionIcon from './connection-icon'; import { useConnectionColor } from '@mongodb-js/connection-form'; import { maybeProtectConnectionString } from '@mongodb-js/compass-maybe-protect-connection-string'; const TOAST_TIMEOUT_MS = 5000; // 5 seconds. type Action = | 'copy-connection-string' | 'duplicate-connection' | 'remove-connection'; const itemActionControls = css({ position: 'absolute', right: spacing[1], top: spacing[2] + spacing[1], margin: 'auto 0', bottom: 0, }); const connectionButtonContainerStyles = css({ position: 'relative', width: '100%', '&:hover': { '&::after': { opacity: 1, width: spacing[1], }, }, '&:focus': { '&::after': { opacity: 1, width: spacing[1], }, }, '&:focus-within': { '&::after': { opacity: 1, width: spacing[1], }, }, }); const connectionButtonStyles = css({ margin: 0, paddingTop: spacing[1], paddingRight: spacing[3], paddingBottom: spacing[1], paddingLeft: spacing[2], width: '100%', display: 'grid', gridTemplateAreas: `'color icon title' 'color . description'`, gridTemplateColumns: 'auto auto 1fr', gridTemplateRows: '1fr 1fr', alignItems: 'center', justifyItems: 'start', border: 'none', borderRadius: 0, background: 'none', '&:hover': { cursor: 'pointer', border: 'none', }, '&:focus': { border: 'none', }, }); const connectionButtonStylesLight = css({ '&:hover': { background: palette.gray.light2, }, }); const connectionButtonStylesDark = css({ '&:hover': { background: palette.gray.dark2, }, }); const connectionTitleStyles = css({ fontSize: '14px', fontWeight: 'normal', lineHeight: '20px', margin: 0, flexGrow: 1, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', gridArea: 'title', width: 'calc(100% - 20px)', textAlign: 'left', }); const connectionDescriptionStyles = css({ fontSize: '12px', lineHeight: '20px', margin: 0, padding: 0, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', gridArea: 'description', }); // Creates a date string formatted as `Oct 27, 3000, 2:06 PM`. const dateConfig: Intl.DateTimeFormatOptions = { month: 'short', day: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric', }; const colorIndicatorStyles = css({ height: 'calc(100% - 4px)', width: spacing[2], borderRadius: spacing[2], margin: '2px 0', marginRight: spacing[2], gridArea: 'color', }); function FavoriteColorIndicator({ favorite, className, }: { favorite?: ConnectionInfo['favorite']; className?: string; }): React.ReactElement { const { connectionColorToHex } = useConnectionColor(); const favoriteColorHex = connectionColorToHex(favorite?.color); return (
); } const actions: ItemAction