feat(ui): show per-inbound live speed (#5261)

* feat(utils): add speedFormat utility and tests

* feat(inbounds): add InboundSpeedEntry type

* feat(inbounds): add speed column to inbound list

* feat(inbounds): show speed in inbound stats modal

* feat(inbounds): compute inbound speed from traffic deltas

* feat(inbounds): wire inbound speed through page

* feat(i18n): add speed translation for all locales

* refactor(inbounds): dedupe live-speed UI and harden formatting

Extract a shared InboundSpeedTag component and isActiveSpeed guard used by the speed column and stats modal, unify InboundSpeedEntry into a single type, and route speedFormat through sizeFormat.

Also guard sizeFormat against non-finite input (no more "NaN PB/s") and clear stale per-inbound speeds when a traffic poll returns no deltas.

---------

Co-authored-by: Sanaei <ho3ein.sanaei@gmail.com>
This commit is contained in:
Nikan Zeyaei
2026-06-15 00:09:40 +03:30
committed by GitHub
parent 1c75034957
commit f4bbaf40f0
22 changed files with 198 additions and 5 deletions
+1
View File
@@ -289,6 +289,7 @@
"port": "المنفذ",
"portMap": "تعيين المنفذ",
"traffic": "حركة المرور",
"speed": "السرعة",
"details": "تفاصيل",
"transportConfig": "النقل",
"expireDate": "المدة",
+1
View File
@@ -289,6 +289,7 @@
"port": "Port",
"portMap": "Port Mapping",
"traffic": "Traffic",
"speed": "Speed",
"details": "Details",
"transportConfig": "Transport",
"expireDate": "Duration",
+1
View File
@@ -289,6 +289,7 @@
"port": "Puerto",
"portMap": "Asignación de puertos",
"traffic": "Tráfico",
"speed": "Velocidad",
"details": "Detalles",
"transportConfig": "Transporte",
"expireDate": "Fecha de Expiración",
+1
View File
@@ -289,6 +289,7 @@
"port": "پورت",
"portMap": "نگاشت پورت",
"traffic": "ترافیک",
"speed": "سرعت",
"details": "توضیحات",
"transportConfig": "انتقال",
"expireDate": "مدت زمان",
+1
View File
@@ -289,6 +289,7 @@
"port": "Port",
"portMap": "Pemetaan port",
"traffic": "Trafik",
"speed": "Kecepatan",
"details": "Rincian",
"transportConfig": "Transport",
"expireDate": "Durasi",
+1
View File
@@ -289,6 +289,7 @@
"port": "ポート",
"portMap": "ポートマッピング",
"traffic": "トラフィック",
"speed": "速度",
"details": "詳細情報",
"transportConfig": "トランスポート",
"expireDate": "有効期限",
+1
View File
@@ -289,6 +289,7 @@
"port": "Porta",
"portMap": "Mapeamento de portas",
"traffic": "Tráfego",
"speed": "Velocidade",
"details": "Detalhes",
"transportConfig": "Transporte",
"expireDate": "Duração",
+1
View File
@@ -289,6 +289,7 @@
"port": "Порт",
"portMap": "Сопоставление портов",
"traffic": "Трафик",
"speed": "Скорость",
"details": "Подробнее",
"transportConfig": "Транспорт",
"expireDate": "Дата окончания",
+1
View File
@@ -289,6 +289,7 @@
"port": "Port",
"portMap": "Port Eşlemesi",
"traffic": "Trafik",
"speed": "Hız",
"details": "Detaylar",
"transportConfig": "Aktarım",
"expireDate": "Süre",
+1
View File
@@ -289,6 +289,7 @@
"port": "Порт",
"portMap": "Відображення портів",
"traffic": "Трафік",
"speed": "Швидкість",
"details": "Деталі",
"transportConfig": "Транспорт",
"expireDate": "Тривалість",
+1
View File
@@ -289,6 +289,7 @@
"port": "Cổng",
"portMap": "Ánh xạ cổng",
"traffic": "Lưu lượng",
"speed": "Tốc độ",
"details": "Chi tiết",
"transportConfig": "Truyền dẫn",
"expireDate": "Ngày hết hạn",
+1
View File
@@ -289,6 +289,7 @@
"port": "端口",
"portMap": "端口映射",
"traffic": "流量",
"speed": "速度",
"details": "详细信息",
"transportConfig": "传输",
"expireDate": "到期时间",
+1
View File
@@ -289,6 +289,7 @@
"port": "連接埠",
"portMap": "連接埠對應",
"traffic": "流量",
"speed": "速度",
"details": "詳細資訊",
"transportConfig": "傳輸",
"expireDate": "到期時間",