import React from 'react';
import {
css,
cx,
focusRing,
palette,
spacing,
useDarkMode,
WorkspaceContainer,
} from '@mongodb-js/compass-components';
import {
AIEntrySVG,
getAIEntrySVGString,
aiEntrySVGDarkModeStyles,
aiEntrySVGLightModeStyles,
aiEntrySVGStyles,
} from './ai-entry-svg';
const hiddenOnNarrowStyles = css({
[`@container ${WorkspaceContainer.toolbarContainerQueryName} (width < 900px)`]:
{
display: 'none',
},
});
const aiEntryStyles = css(
{
// Reset button styles.
border: 'none',
outline: 'none',
boxShadow: 'none',
// A bit of a hack to make the focus ring look nice without
// moving the component around.
padding: `${spacing[1]}px ${spacing[2]}px`,
margin: `${-spacing[1]}px ${-spacing[2]}px`,
background: 'none',
whiteSpace: 'normal',
position: 'relative',
// Text styles.
textDecoration: 'underline',
fontWeight: 'bold',
// Aligning elements.
display: 'inline-flex',
gap: `${spacing[1]}px`,
transition: 'color 0.16s ease-in',
path: {
transition: 'fill 0.16s ease-in',
},
'&:hover': {
cursor: 'pointer',
},
},
focusRing,
aiEntrySVGStyles
);
const aiEntryDarkModeStyles = css(
{
color: palette.green.dark1,
'&:hover': {
path: {
fill: palette.green.base,
},
color: palette.green.base,
},
},
aiEntrySVGDarkModeStyles
);
const aiEntryLightModeStyles = css(
{
color: palette.green.dark2,
'&:hover': {
path: {
fill: palette.green.dark1,
},
color: palette.green.dark1,
},
},
aiEntrySVGLightModeStyles
);
function AIExperienceEntry({
'data-testid': dataTestId,
type,
onClick,
}: {
['data-testid']?: string;
type: 'aggregation' | 'query';
onClick: () => void;
}) {
const darkMode = useDarkMode();
return (
);
}
// We build the AI Placeholder with html elements as our
// codemirror placeholder extension accepts `HTMLElement`s.
function createAIPlaceholderHTMLPlaceholder({
onClickAI,
darkMode,
placeholderText,
}: {
onClickAI: () => void;
darkMode?: boolean;
placeholderText: string;
}): HTMLElement {
const containerEl = document.createElement('div');
const placeholderTextEl = document.createTextNode(`${placeholderText} or `);
containerEl.appendChild(placeholderTextEl);
const aiButtonEl = document.createElement('button');
aiButtonEl.setAttribute('data-testid', 'open-ai-query-entry-button');
aiButtonEl.setAttribute('type', 'button');
// By default placeholder container will have pointer events disabled
aiButtonEl.style.pointerEvents = 'auto';
// We stop mousedown from propagating and preventing default behavior to avoid
// input getting focused on placeholder click (that's the event that
// codemirror uses internally to set focus to the input)
aiButtonEl.addEventListener('mousedown', (e) => {
e.preventDefault();
e.stopPropagation();
});
aiButtonEl.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
onClickAI();
});
aiButtonEl.className = cx(
aiEntryStyles,
darkMode ? aiEntryDarkModeStyles : aiEntryLightModeStyles
);
const aiButtonContent = `Generate query
${getAIEntrySVGString()}`;
aiButtonEl.innerHTML = aiButtonContent;
containerEl.appendChild(aiButtonEl);
return containerEl;
}
export { AIExperienceEntry, createAIPlaceholderHTMLPlaceholder };