Newer
Older
hard-panel / panel / frontend / src / serviceStatus.js
// Статусы сервисов: внутренний health-чек и внешняя проверка публичного пути.
// Вынесено из страниц, чтобы список и персональная страница не расходились.

import { t } from './i18n/index.js'

// --- Внутренний health-статус (url сервиса) ---------------------------------

export const internalVariant = (status) =>
  status === 'up' ? 'success'
    : status === 'degraded' ? 'warning'
    : status === 'down' ? 'danger'
    : 'warning'

export const internalText = (status) => ({
  up: t('services.stateUp'),
  degraded: t('services.stateDegraded'),
  down: t('services.stateDown'),
}[status] || t('services.statePending'))

// --- Внешний статус (публичный путь: DNS → IP → TLS → HTTP) -----------------

// probe_error — проблема на нашей стороне (резолвер), а не сервиса: жёлтый,
// не пугаем красным. http_fail — сервис достижим, но отвечает 5xx/421.
export const externalVariant = (state) =>
  state === 'up' ? 'success'
    : state === 'http_fail' || state === 'pending' || state === 'probe_error' ? 'warning'
    : state === 'down' || state === 'dns_mismatch' || state === 'dns_fail' || state === 'tls_fail'
      ? 'danger'
      : 'warning'

export const externalText = (state) => ({
  up: t('services.extUp'),
  dns_mismatch: t('services.extDnsMismatch'),
  dns_fail: t('services.extDnsFail'),
  tls_fail: t('services.extTlsFail'),
  http_fail: t('services.extHttpFail'),
  down: t('services.extDown'),
  probe_error: t('services.extProbeError'),
}[state] || t('services.extPending'))

/** Подсказка бейджа: причина, адреса из DNS и срок сертификата. */
export function externalHint(external) {
  if (!external) return ''
  const parts = []
  if (external.message) parts.push(external.message)
  if (external.dns_ips?.length) parts.push(`DNS: ${external.dns_ips.join(', ')}`)
  if (external.cert_days != null) parts.push(t('services.extCertDays', { n: external.cert_days }))
  return parts.join(' · ')
}