feat: add web campaign links — capture, auth integration, bonus UI

- Add campaign.ts utility (capture from URL, localStorage with TTL, validation)
- Pass campaign_slug in all auth API methods (telegram, widget, email, oauth)
- Consume slug in auth store login methods, set pendingCampaignBonus state
- Add CampaignBonusNotifier component (toast on bonus, mounted in AppShell)
- Show web_link alongside bot deep_link in AdminCampaignStats
- Add CampaignBonusInfo type with union bonus_type
- Fix VerifyEmail: ref guard against StrictMode double-fire, setTimeout cleanup
- Fix AdminCampaignStats: setTimeout refs with cleanup, i18n-aware locale
- Wrap all localStorage access in try/catch (Safari private browsing safety)
- Add campaignBonus translations (ru/en/fa/zh)
This commit is contained in:
Fringg
2026-02-17 06:44:10 +03:00
parent 850124f469
commit e0dd21fd0b
13 changed files with 332 additions and 49 deletions

View File

@@ -64,6 +64,12 @@
"newUserReply": "کاربر در تیکت پاسخ داد: {{title}}",
"newUserReplyTitle": "پاسخ کاربر"
},
"campaignBonus": {
"title": "!پاداش فعال شد",
"balance": "شما {{amount}} روبل از کمپین «{{name}}» دریافت کردید",
"subscription": "شما اشتراک {{days}} روزه از کمپین «{{name}}» دریافت کردید",
"tariff": "شما تعرفه «{{tariff}}» از کمپین «{{name}}» دریافت کردید"
},
"wsNotifications": {
"balance": {
"topupTitle": "موجودی شارژ شد",
@@ -1421,6 +1427,8 @@
"inactive": "غیرفعال",
"copy": "کپی",
"copied": "کپی شد!",
"botLink": "لینک ربات",
"webLink": "لینک وب",
"users": "کاربران",
"noUsers": "کاربر ثبت‌نام شده‌ای وجود ندارد",
"paid": "پرداخت کرده",