Files
PnvPanel/frontend/src/shared/lib/countries.ts
T
mrleo1nidandClaude Opus 5.5 e979adca57
CI / Backend (build + test) (push) Failing after 1m26s
CI / Frontend (lint + typecheck + build) (push) Successful in 33s
Add load balancer marker for inbound country flag
Reserved CountryCode "XX" (Inbound.BalancerCountryCode) marks an inbound
behind a load balancer whose exit country is unknown: the site shows a
Shuffle icon with a tooltip instead of a flag, the bot shows 🔀. Admin can
pick it in the publish dialog. Fits the existing column, no migration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 01:57:30 +03:00

32 lines
1.9 KiB
TypeScript

import type { FlagComponent } from 'country-flag-icons/react/3x2'
import {
AE, AM, AR, AT, AU, AZ, BE, BG, BR, BY, CA, CH, CL, CY, CZ, DE, DK, EE, ES, FI, FR, GB, GE, GR, HK,
HR, HU, ID, IE, IL, IN, IS, IT, JP, KG, KR, KZ, LT, LU, LV, MD, MX, MY, NL, NO, PL, PT, RO, RS, RU,
SE, SG, SI, SK, TH, TR, TW, UA, US, UZ, VN, ZA,
} from 'country-flag-icons/react/3x2'
// Курируемый список стран, где обычно арендуют VPN-серверы: полный набор country-flag-icons весит
// ~1 МБ SVG, а named-импорты тришейкаются. Нужна новая страна — добавить её сюда (бэкенд принимает
// любой ISO 3166-1 alpha-2; неизвестный UI код показывается текстом вместо флага).
// Emoji-флаги не используем: Windows их не рисует (вместо 🇩🇪 показывает «DE»).
export const FLAGS: Record<string, FlagComponent> = {
AE, AM, AR, AT, AU, AZ, BE, BG, BR, BY, CA, CH, CL, CY, CZ, DE, DK, EE, ES, FI, FR, GB, GE, GR, HK,
HR, HU, ID, IE, IL, IN, IS, IT, JP, KG, KR, KZ, LT, LU, LV, MD, MX, MY, NL, NO, PL, PT, RO, RS, RU,
SE, SG, SI, SK, TH, TR, TW, UA, US, UZ, VN, ZA,
}
export const COUNTRY_CODES = Object.keys(FLAGS)
/** Зарезервированный код «инбаунд за балансировщиком, страна выхода неизвестна» (см.
* Inbound.BalancerCountryCode на бэкенде) — вместо флага рисуется значок балансира. */
export const BALANCER_COUNTRY_CODE = 'XX'
/** Локализованное имя страны по ISO-коду (Intl), без собственных переводов. */
export function countryName(code: string, language: string): string {
try {
return new Intl.DisplayNames([language], { type: 'region' }).of(code) ?? code
} catch {
return code
}
}