import { css } from '@emotion/css'; import { ReactNode, useCallback, useState } from 'react'; import { DataQueryError, GrafanaTheme2 } from '@grafana/data'; import { Alert, AlertVariant, Button, useTheme2 } from '@grafana/ui'; type Props = { error?: DataQueryError; message?: ReactNode; title: string; severity?: AlertVariant; suggestedAction?: string; onSuggestedAction?(): void; onRemove?(): void; dismissable?: boolean; }; const SHORT_ERROR_MESSAGE_LIMIT = 100; export function SupplementaryResultError(props: Props) { const [isOpen, setIsOpen] = useState(false); const [dismissed, setDismissed] = useState(false); const { dismissable, error, title, suggestedAction, onSuggestedAction, onRemove, severity = 'warning' } = props; // generic get-error-message-logic, taken from // /public/app/features/explore/ErrorContainer.tsx const message = props.message ?? error?.message ?? error?.data?.message ?? ''; const showButton = typeof message === 'string' && message.length > SHORT_ERROR_MESSAGE_LIMIT; const theme = useTheme2(); const styles = getStyles(theme); const dismiss = useCallback(() => { setDismissed(true); }, []); const handleRemove = dismissable ? dismiss : onRemove; if (dismissed) { return null; } return (