{"version":3,"file":"QueryValidator.mjs","sources":["../../../../src/components/query-editor-raw/QueryValidator.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { useState, useMemo, useEffect } from 'react';\nimport { useAsyncFn, useDebounce } from 'react-use';\n\nimport { formattedValueToString, getValueFormat, type TimeRange } from '@grafana/data';\nimport { Trans } from '@grafana/i18n';\nimport { Icon, Spinner, useTheme2 } from '@grafana/ui';\n\nimport { type DB, type SQLQuery, type ValidationResults } from '../../types';\n\nexport interface QueryValidatorProps {\n  db: DB;\n  query: SQLQuery;\n  range?: TimeRange;\n  onValidate: (isValid: boolean) => void;\n}\n\nexport function QueryValidator({ db, query, onValidate, range }: QueryValidatorProps) {\n  const [validationResult, setValidationResult] = useState<ValidationResults | null>();\n  const theme = useTheme2();\n  const valueFormatter = useMemo(() => getValueFormat('bytes'), []);\n\n  const styles = useMemo(() => {\n    return {\n      error: css({\n        color: theme.colors.error.text,\n        fontSize: theme.typography.bodySmall.fontSize,\n        fontFamily: theme.typography.fontFamilyMonospace,\n      }),\n      valid: css({\n        color: theme.colors.success.text,\n      }),\n      info: css({\n        color: theme.colors.text.secondary,\n      }),\n    };\n  }, [theme]);\n\n  const [state, validateQuery] = useAsyncFn(\n    async (q: SQLQuery) => {\n      if (q.rawSql?.trim() === '') {\n        return null;\n      }\n\n      return await db.validateQuery(q, range);\n    },\n    [db]\n  );\n\n  const [,] = useDebounce(\n    async () => {\n      const result = await validateQuery(query);\n      if (result) {\n        setValidationResult(result);\n      }\n\n      return null;\n    },\n    1000,\n    [query, validateQuery]\n  );\n\n  useEffect(() => {\n    if (validationResult?.isError) {\n      onValidate(false);\n    }\n    if (validationResult?.isValid) {\n      onValidate(true);\n    }\n  }, [validationResult, onValidate]);\n\n  if (!state.value && !state.loading) {\n    return null;\n  }\n\n  const error = state.value?.error ? processErrorMessage(state.value.error) : '';\n\n  return (\n    <>\n      {state.loading && (\n        <div className={styles.info}>\n          <Spinner inline={true} size=\"xs\" />{' '}\n          <Trans i18nKey=\"grafana-sql.components.query-validator.validating-query\">Validating query...</Trans>\n        </div>\n      )}\n      {!state.loading && state.value && (\n        <>\n          <>\n            {state.value.isValid && state.value.statistics && (\n              <div className={styles.valid}>\n                <Trans\n                  i18nKey=\"grafana-sql.components.query-validator.query-will-process\"\n                  values={{ bytes: formattedValueToString(valueFormatter(state.value.statistics.TotalBytesProcessed)) }}\n                >\n                  <Icon name=\"check\" /> This query will process <strong>{'{{bytes}}'}</strong> when run.\n                </Trans>\n              </div>\n            )}\n          </>\n\n          <>{state.value.isError && <div className={styles.error}>{error}</div>}</>\n        </>\n      )}\n    </>\n  );\n}\n\nfunction processErrorMessage(error: string) {\n  const splat = error.split(':');\n  if (splat.length > 2) {\n    return splat.slice(2).join(':');\n  }\n  return error;\n}\n"],"names":["_a"],"mappings":"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"}