// Статусы сервисов: внутренний 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(' · ')
}