diff --git a/src/locales/en.json b/src/locales/en.json
index de4dde5..c5af0e4 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -5504,7 +5504,15 @@
"shareModalActivateVia": "Activate via bot:",
"shareModalActivateViaCabinet": "Or via website:",
"copyMessage": "Copy message",
- "shareToastCopied": "Message copied"
+ "shareToastCopied": "Message copied",
+ "qrHint": "Scan to activate the gift",
+ "scanButton": "📷 Scan QR",
+ "scanInProgress": "Scanning…",
+ "scanCancel": "Stop scanning",
+ "scanDescription": "Point the camera at the gift QR code",
+ "scanNotRecognized": "No gift code in this QR",
+ "scanError": "Could not scan",
+ "scanNoCamera": "Camera unavailable — enter the code manually"
},
"news": {
"title": "News & Updates",
diff --git a/src/locales/fa.json b/src/locales/fa.json
index 247abae..6e805a5 100644
--- a/src/locales/fa.json
+++ b/src/locales/fa.json
@@ -5012,7 +5012,15 @@
"tabActivate": "فعالسازی",
"tabBuy": "خرید",
"tabMyGifts": "هدایای من",
- "unlimitedTraffic": "ترافیک نامحدود"
+ "unlimitedTraffic": "ترافیک نامحدود",
+ "qrHint": "برای فعالسازی هدیه اسکن کنید",
+ "scanButton": "📷 اسکن QR",
+ "scanInProgress": "در حال اسکن…",
+ "scanCancel": "توقف اسکن",
+ "scanDescription": "دوربین را روی کد QR هدیه بگیرید",
+ "scanNotRecognized": "در این QR کد هدیهای نیست",
+ "scanError": "اسکن ناموفق بود",
+ "scanNoCamera": "دوربین در دسترس نیست — کد را دستی وارد کنید"
},
"news": {
"title": "اخبار و بهروزرسانیها",
diff --git a/src/locales/ru.json b/src/locales/ru.json
index 72f742f..9dd3f21 100644
--- a/src/locales/ru.json
+++ b/src/locales/ru.json
@@ -6058,7 +6058,15 @@
"shareModalActivateVia": "Активировать через бота:",
"shareModalActivateViaCabinet": "Или через сайт:",
"copyMessage": "Скопировать сообщение",
- "shareToastCopied": "Сообщение скопировано"
+ "shareToastCopied": "Сообщение скопировано",
+ "qrHint": "Отсканируйте, чтобы активировать подарок",
+ "scanButton": "📷 Отсканировать QR",
+ "scanInProgress": "Сканирование…",
+ "scanCancel": "Остановить сканирование",
+ "scanDescription": "Наведите камеру на QR-код подарка",
+ "scanNotRecognized": "В QR-коде нет кода подарка",
+ "scanError": "Не удалось отсканировать",
+ "scanNoCamera": "Камера недоступна — введите код вручную"
},
"news": {
"title": "Новости и обновления",
diff --git a/src/locales/zh.json b/src/locales/zh.json
index 08ca1eb..1e85997 100644
--- a/src/locales/zh.json
+++ b/src/locales/zh.json
@@ -5011,7 +5011,15 @@
"tabActivate": "激活",
"tabBuy": "购买",
"tabMyGifts": "我的礼物",
- "unlimitedTraffic": "无限流量"
+ "unlimitedTraffic": "无限流量",
+ "qrHint": "扫描以激活礼物",
+ "scanButton": "📷 扫描二维码",
+ "scanInProgress": "扫描中…",
+ "scanCancel": "停止扫描",
+ "scanDescription": "将摄像头对准礼物二维码",
+ "scanNotRecognized": "该二维码中没有礼物码",
+ "scanError": "扫描失败",
+ "scanNoCamera": "摄像头不可用 — 请手动输入代码"
},
"news": {
"title": "新闻与更新",
diff --git a/src/pages/GiftResult.tsx b/src/pages/GiftResult.tsx
index a77c549..1fa5622 100644
--- a/src/pages/GiftResult.tsx
+++ b/src/pages/GiftResult.tsx
@@ -3,6 +3,7 @@ import { useSearchParams, useNavigate } from 'react-router';
import { useQuery } from '@tanstack/react-query';
import { useTranslation } from 'react-i18next';
import { motion } from 'framer-motion';
+import { QRCodeSVG } from 'qrcode.react';
import { giftApi } from '../api/gift';
import { brandingApi, type TelegramWidgetConfig } from '../api/branding';
import { Spinner } from '@/components/ui/Spinner';
@@ -121,6 +122,14 @@ function CodeOnlySuccessState({
{giftCode}
+ {/* QR — получателю проще отсканировать, чем копировать ссылку.
+ Кодируем bot-ссылку, если она есть: активация в боте — основной путь,
+ иначе ссылку кабинета. */}
+