fix: address review feedback on admin pages and backgrounds

- guard config.default_quick_amounts with ?? [] so the edit page survives a
  cabinet deployed ahead of the bot
- roll back the first faq reorder request when the second fails so both
  questions don't end up with the same display_order
- stop overriding the aurora palette in render for the legacy seed colors
- add the missing legalPages / displayMode / quickAmounts keys to fa and zh
This commit is contained in:
Boris Kovalskii
2026-06-11 20:00:52 +10:00
parent acd0d7c69e
commit 9e6372afba
5 changed files with 122 additions and 15 deletions

View File

@@ -15,13 +15,9 @@ const SPEED_DURATIONS: Record<string, string> = {
}; };
export default function AuroraBackground({ settings }: Props) { export default function AuroraBackground({ settings }: Props) {
const isLegacySeed = const firstColor = sanitizeColor(settings.firstColor, '#3b82f6');
settings.firstColor === '#00d2ff' && const secondColor = sanitizeColor(settings.secondColor, '#a5b4fc');
settings.secondColor === '#7928ca' && const thirdColor = sanitizeColor(settings.thirdColor, '#93c5fd');
settings.thirdColor === '#ff0080';
const firstColor = isLegacySeed ? '#3b82f6' : sanitizeColor(settings.firstColor, '#3b82f6');
const secondColor = isLegacySeed ? '#a5b4fc' : sanitizeColor(settings.secondColor, '#a5b4fc');
const thirdColor = isLegacySeed ? '#93c5fd' : sanitizeColor(settings.thirdColor, '#93c5fd');
const speed = safeSelect(settings.speed, ['slow', 'normal', 'fast'] as const, 'normal'); const speed = safeSelect(settings.speed, ['slow', 'normal', 'fast'] as const, 'normal');
const showRadialGradient = safeBoolean(settings.showRadialGradient, true); const showRadialGradient = safeBoolean(settings.showRadialGradient, true);
const paused = useAnimationPause(); const paused = useAnimationPause();

View File

@@ -1130,7 +1130,8 @@
"landings": "صفحات فرود", "landings": "صفحات فرود",
"referralNetwork": "شبکه ارجاع", "referralNetwork": "شبکه ارجاع",
"news": "اخبار", "news": "اخبار",
"infoPages": "صفحات اطلاعات" "infoPages": "صفحات اطلاعات",
"legalPages": "صفحات سیستمی"
}, },
"panel": { "panel": {
"title": "پنل مدیریت", "title": "پنل مدیریت",
@@ -2304,7 +2305,14 @@
"noPromoGroups": "هیچ گروه تبلیغاتی نیست", "noPromoGroups": "هیچ گروه تبلیغاتی نیست",
"cancelButton": "لغو", "cancelButton": "لغو",
"saveButton": "ذخیره", "saveButton": "ذخیره",
"notFound": "روش پرداخت یافت نشد" "notFound": "روش پرداخت یافت نشد",
"quickAmounts": "مبالغ سریع (₽)",
"quickAmountsHint": "دکمه‌های مبلغ شارژ سریع. خالی — مقادیر پیش‌فرض استفاده می‌شوند: {{defaults}} ₽",
"quickAmountsPlaceholder": "مبلغ به روبل",
"quickAmountsAdd": "افزودن",
"quickAmountsInvalid": "یک مبلغ مثبت به روبل وارد کنید",
"quickAmountsLimit": "حداکثر ۱۰ مبلغ مجاز است",
"quickAmountsRemove": "حذف مبلغ {{value}} ₽"
}, },
"campaigns": { "campaigns": {
"title": "کمپین‌های تبلیغاتی", "title": "کمپین‌های تبلیغاتی",
@@ -3813,7 +3821,8 @@
"sortOrder": "ترتیب", "sortOrder": "ترتیب",
"icon": "آیکون (ایموجی)", "icon": "آیکون (ایموجی)",
"pageType": "نوع صفحه", "pageType": "نوع صفحه",
"replacesTab": "جایگزینی تب" "replacesTab": "جایگزینی تب",
"displayMode": "نمایش"
}, },
"replacesTabNone": "بدون جایگزینی", "replacesTabNone": "بدون جایگزینی",
"replacesTabOptions": { "replacesTabOptions": {
@@ -3855,6 +3864,11 @@
"en": "انگلیسی", "en": "انگلیسی",
"zh": "چینی", "zh": "چینی",
"fa": "فارسی" "fa": "فارسی"
},
"displayModes": {
"bot": "فقط ربات",
"web": "فقط وب",
"both": "ربات و وب"
} }
}, },
"bulkActions": { "bulkActions": {
@@ -3965,6 +3979,43 @@
"trafficGbUnit": "GB", "trafficGbUnit": "GB",
"selectAllSubs": "انتخاب همه اشتراک‌ها", "selectAllSubs": "انتخاب همه اشتراک‌ها",
"deselectAllSubs": "لغو انتخاب همه اشتراک‌ها" "deselectAllSubs": "لغو انتخاب همه اشتراک‌ها"
},
"legalPages": {
"title": "صفحات سیستمی",
"subtitle": "قوانین، سیاست حریم خصوصی، پیشنهاد عمومی و FAQ",
"open": "صفحات سیستمی",
"tabs": {
"privacy": "حریم خصوصی",
"offer": "پیشنهاد",
"rules": "قوانین",
"faq": "FAQ"
},
"displayMode": "نمایش",
"displayModes": {
"bot": "فقط ربات",
"web": "فقط وب",
"both": "ربات و وب"
},
"displayModeLocked": "از طریق متغیر محیطی تنظیم شده",
"enabled": "نمایش به کاربران",
"language": "زبان محتوا",
"content": "متن",
"contentPlaceholder": "متن HTML صفحه...",
"save": "ذخیره",
"saving": "در حال ذخیره...",
"saveError": "ذخیره ناموفق بود. لطفاً دوباره تلاش کنید.",
"unsavedWarning": "تغییرات ذخیره‌نشده از بین می‌رود. ادامه می‌دهید؟",
"faqPages": "سوالات و پاسخ‌ها",
"addQuestion": "افزودن سوال",
"newQuestion": "سوال جدید",
"questionTitle": "سوال",
"questionContent": "پاسخ (HTML پشتیبانی می‌شود)",
"confirmDeleteQuestion": "این سوال حذف شود؟",
"noQuestions": "هنوز سوالی وجود ندارد",
"active": "فعال",
"moveUp": "انتقال به بالا",
"moveDown": "انتقال به پایین",
"delete": "حذف"
} }
}, },
"adminUpdates": { "adminUpdates": {

View File

@@ -1130,7 +1130,8 @@
"landings": "落地页", "landings": "落地页",
"referralNetwork": "推荐网络", "referralNetwork": "推荐网络",
"news": "新闻", "news": "新闻",
"infoPages": "信息页面" "infoPages": "信息页面",
"legalPages": "系统页面"
}, },
"panel": { "panel": {
"title": "管理面板", "title": "管理面板",
@@ -1456,7 +1457,14 @@
"noPromoGroups": "没有促销组", "noPromoGroups": "没有促销组",
"cancelButton": "取消", "cancelButton": "取消",
"saveButton": "保存", "saveButton": "保存",
"notFound": "未找到支付方式" "notFound": "未找到支付方式",
"quickAmounts": "快捷金额(₽)",
"quickAmountsHint": "快捷充值金额按钮。留空 — 使用默认值:{{defaults}} ₽",
"quickAmountsPlaceholder": "金额(卢布)",
"quickAmountsAdd": "添加",
"quickAmountsInvalid": "请输入正的卢布金额",
"quickAmountsLimit": "最多 10 个金额",
"quickAmountsRemove": "删除金额 {{value}} ₽"
}, },
"emailTemplates": { "emailTemplates": {
"title": "邮件模板", "title": "邮件模板",
@@ -3812,7 +3820,8 @@
"sortOrder": "排序", "sortOrder": "排序",
"icon": "图标(表情)", "icon": "图标(表情)",
"pageType": "页面类型", "pageType": "页面类型",
"replacesTab": "替换标签" "replacesTab": "替换标签",
"displayMode": "显示"
}, },
"replacesTabNone": "不替换", "replacesTabNone": "不替换",
"replacesTabOptions": { "replacesTabOptions": {
@@ -3854,6 +3863,11 @@
"en": "英语", "en": "英语",
"zh": "中文", "zh": "中文",
"fa": "波斯语" "fa": "波斯语"
},
"displayModes": {
"bot": "仅机器人",
"web": "仅网页",
"both": "机器人和网页"
} }
}, },
"bulkActions": { "bulkActions": {
@@ -3964,6 +3978,43 @@
"trafficGbUnit": "GB", "trafficGbUnit": "GB",
"selectAllSubs": "选择所有订阅", "selectAllSubs": "选择所有订阅",
"deselectAllSubs": "取消选择所有订阅" "deselectAllSubs": "取消选择所有订阅"
},
"legalPages": {
"title": "系统页面",
"subtitle": "规则、隐私政策、公开要约和 FAQ",
"open": "系统页面",
"tabs": {
"privacy": "隐私",
"offer": "条款",
"rules": "规则",
"faq": "FAQ"
},
"displayMode": "显示",
"displayModes": {
"bot": "仅机器人",
"web": "仅网页",
"both": "机器人和网页"
},
"displayModeLocked": "通过环境变量设置",
"enabled": "对用户可见",
"language": "内容语言",
"content": "内容",
"contentPlaceholder": "HTML 页面内容...",
"save": "保存",
"saving": "保存中...",
"saveError": "保存失败,请重试。",
"unsavedWarning": "未保存的更改将丢失。是否继续?",
"faqPages": "问答",
"addQuestion": "添加问题",
"newQuestion": "新问题",
"questionTitle": "问题",
"questionContent": "答案(支持 HTML",
"confirmDeleteQuestion": "确定删除此问题?",
"noQuestions": "暂无问题",
"active": "已激活",
"moveUp": "上移",
"moveDown": "下移",
"delete": "删除"
} }
}, },
"adminUpdates": { "adminUpdates": {

View File

@@ -521,7 +521,14 @@ function FaqEditor({ onDirtyChange }: { onDirtyChange: (dirty: boolean) => void
const reorderMutation = useMutation({ const reorderMutation = useMutation({
mutationFn: async ({ a, b }: { a: FaqPageItem; b: FaqPageItem }) => { mutationFn: async ({ a, b }: { a: FaqPageItem; b: FaqPageItem }) => {
await adminLegalPagesApi.updateFaqPage(a.id, { display_order: b.display_order }); await adminLegalPagesApi.updateFaqPage(a.id, { display_order: b.display_order });
try {
await adminLegalPagesApi.updateFaqPage(b.id, { display_order: a.display_order }); await adminLegalPagesApi.updateFaqPage(b.id, { display_order: a.display_order });
} catch (err) {
await adminLegalPagesApi
.updateFaqPage(a.id, { display_order: a.display_order })
.catch(() => {});
throw err;
}
}, },
onSuccess: () => { onSuccess: () => {
haptic.success(); haptic.success();

View File

@@ -383,7 +383,9 @@ export default function AdminPaymentMethodEdit() {
{quickAmountsError && <p className="mt-1 text-xs text-error-400">{quickAmountsError}</p>} {quickAmountsError && <p className="mt-1 text-xs text-error-400">{quickAmountsError}</p>}
<p className="mt-1 text-xs text-dark-500"> <p className="mt-1 text-xs text-dark-500">
{t('admin.paymentMethods.quickAmountsHint', { {t('admin.paymentMethods.quickAmountsHint', {
defaults: config.default_quick_amounts.map((kopeks) => kopeks / 100).join(', '), defaults: (config.default_quick_amounts ?? [])
.map((kopeks) => kopeks / 100)
.join(', '),
})} })}
</p> </p>
</div> </div>