feat(promo-offers): охват сегментов и прогресс доставки на странице отправки

Сегмент выбирался вслепую — в списке не было числа пользователей, а после
отправки экран показывал только количество созданных офферов: сколько
человек реально получило предложение и сколько заблокировало бота, узнать
было негде.

В селекте сегментов теперь стоит охват каждого (GET /promo-offers/segments),
под ним — сколько уйдёт по выбранному. После отправки экран результата
показывает прогресс доставки с карточками Всего/Отправлено/Заблокировали/
Ошибки и опрашивает запись рассылки раз в 3 секунды, пока она не завершится.

Прогресс-блок и бейдж статуса вынесены из AdminBroadcastDetail в
BroadcastDeliveryStats и переиспользуются обеими страницами, а условие
«доставка ещё идёт» — в утилиту broadcastStatus с тестами.
This commit is contained in:
kewldan
2026-07-28 22:24:58 +03:00
parent 51d0f0431a
commit c6d8c0afe0
10 changed files with 298 additions and 128 deletions

View File

@@ -3807,7 +3807,9 @@
"sendError": "Failed to send offer",
"notificationsSent": "Notifications sent",
"offersCreated": "Offers created",
"notificationsFailed": "(failed: {{count}})"
"notificationsFailed": "(failed: {{count}})",
"deliveryTitle": "Telegram delivery",
"openAsBroadcast": "Open as broadcast"
},
"notFound": "Template not found",
"noActiveTemplates": "No active templates",

View File

@@ -3305,7 +3305,9 @@
"notificationsFailed": "(ناموفق: {{count}})",
"sendError": "ارسال پیشنهاد ناموفق بود",
"notificationsSent": "اعلان‌های ارسال شده",
"offersCreated": "پیشنهادهای ایجاد شده"
"offersCreated": "پیشنهادهای ایجاد شده",
"deliveryTitle": "تحویل در تلگرام",
"openAsBroadcast": "نمایش به‌عنوان ارسال گروهی"
},
"notFound": "قالب یافت نشد",
"noActiveTemplates": "قالب فعالی وجود ندارد",

View File

@@ -4208,7 +4208,9 @@
"sendError": "Не удалось отправить предложение",
"notificationsSent": "Отправлено уведомлений",
"offersCreated": "Создано офферов",
"notificationsFailed": "(не отправлено: {{count}})"
"notificationsFailed": "(не отправлено: {{count}})",
"deliveryTitle": "Доставка в Telegram",
"openAsBroadcast": "Открыть как рассылку"
},
"notFound": "Шаблон не найден",
"noActiveTemplates": "Нет активных шаблонов",

View File

@@ -3304,7 +3304,9 @@
"notificationsFailed": "(失败: {{count}}",
"sendError": "发送优惠失败",
"notificationsSent": "已发送通知",
"offersCreated": "已创建优惠"
"offersCreated": "已创建优惠",
"deliveryTitle": "Telegram 送达情况",
"openAsBroadcast": "作为群发查看"
},
"notFound": "未找到模板",
"noActiveTemplates": "没有活跃的模板",