FIX PR Problems

This commit is contained in:
firewookie
2026-03-10 15:58:02 +05:00
parent 9467a08861
commit 8c9eadc273
7 changed files with 42 additions and 27 deletions

View File

@@ -33,18 +33,6 @@ export const BackIcon = ({ className }: IconProps) => (
</svg>
);
export const ArrowLeftIcon = ({ className }: IconProps) => (
<svg
className={cn('h-5 w-5', className)}
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
strokeWidth={2}
>
<path strokeLinecap="round" strokeLinejoin="round" d="M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18" />
</svg>
);
export const ChevronRightIcon = ({ className }: IconProps) => (
<svg
className={cn('h-5 w-5', className)}

View File

@@ -686,7 +686,8 @@
"noCards": "Card will be saved automatically on next top-up",
"pageTitle": "Saved Cards",
"backToBalance": "Back",
"empty": "No saved cards. A card will be saved automatically on your next top-up."
"empty": "No saved cards. A card will be saved automatically on your next top-up.",
"loadError": "Failed to load saved cards. Please try again later."
},
"paymentReady": "Payment link is ready",
"clickToOpenPayment": "Click the button below to open the payment page in a new tab",
@@ -2759,7 +2760,8 @@
"trafficAdded": "Traffic package added",
"expired": "expired",
"daysLeft": "d left",
"deviceLimitUpdated": "Device limit updated"
"deviceLimitUpdated": "Device limit updated",
"invalidDays": "Please enter a valid number of days (greater than 0)"
},
"balance": {
"current": "Current balance",

View File

@@ -550,7 +550,8 @@
"noCards": "کارت به طور خودکار در شارژ بعدی ذخیره می‌شود",
"pageTitle": "کارت‌های ذخیره شده",
"backToBalance": "بازگشت",
"empty": "کارتی ذخیره نشده است. کارت به طور خودکار در شارژ بعدی ذخیره می‌شود."
"empty": "کارتی ذخیره نشده است. کارت به طور خودکار در شارژ بعدی ذخیره می‌شود.",
"loadError": "خطا در بارگذاری کارت‌ها. لطفاً بعداً دوباره امتحان کنید."
},
"paymentSuccess": {
"title": "پرداخت موفق",
@@ -2393,7 +2394,8 @@
"trafficAdded": "بسته ترافیک اضافه شد",
"expired": "منقضی شده",
"daysLeft": "روز باقیمانده",
"deviceLimitUpdated": "محدودیت دستگاه به‌روز شد"
"deviceLimitUpdated": "محدودیت دستگاه به‌روز شد",
"invalidDays": "لطفاً تعداد روز معتبر وارد کنید (بیشتر از ۰)"
},
"balance": {
"current": "موجودی فعلی",

View File

@@ -714,7 +714,8 @@
"noCards": "Карта будет сохранена автоматически при следующем пополнении",
"pageTitle": "Сохранённые карты",
"backToBalance": "Назад",
"empty": "Нет привязанных карт. Карта будет сохранена автоматически при следующем пополнении."
"empty": "Нет привязанных карт. Карта будет сохранена автоматически при следующем пополнении.",
"loadError": "Не удалось загрузить сохранённые карты. Попробуйте позже."
},
"paymentReady": "Ссылка на оплату готова",
"clickToOpenPayment": "Нажмите кнопку ниже, чтобы открыть страницу оплаты в новой вкладке",
@@ -3280,7 +3281,8 @@
"trafficAdded": "Пакет трафика добавлен",
"expired": "истёк",
"daysLeft": "дн. осталось",
"deviceLimitUpdated": "Лимит устройств обновлён"
"deviceLimitUpdated": "Лимит устройств обновлён",
"invalidDays": "Введите корректное количество дней (больше 0)"
},
"balance": {
"current": "Текущий баланс",

View File

@@ -550,7 +550,8 @@
"noCards": "银行卡将在下次充值时自动保存",
"pageTitle": "已保存的银行卡",
"backToBalance": "返回",
"empty": "暂无已保存的银行卡。银行卡将在下次充值时自动保存。"
"empty": "暂无已保存的银行卡。银行卡将在下次充值时自动保存。",
"loadError": "加载银行卡失败,请稍后重试。"
},
"paymentSuccess": {
"title": "支付成功",
@@ -2392,7 +2393,8 @@
"trafficAdded": "流量包已添加",
"expired": "已过期",
"daysLeft": "天剩余",
"deviceLimitUpdated": "设备限制已更新"
"deviceLimitUpdated": "设备限制已更新",
"invalidDays": "请输入有效天数大于0"
},
"balance": {
"current": "当前余额",

View File

@@ -431,7 +431,10 @@ export default function AdminUserDetail() {
const handleUpdateSubscription = async (overrideAction?: string) => {
if (!userId) return;
const action = overrideAction || subAction;
if ((action === 'extend' || action === 'shorten') && toNumber(subDays, 0) <= 0) return;
if ((action === 'extend' || action === 'shorten') && toNumber(subDays, 0) <= 0) {
notify.error(t('admin.users.detail.subscription.invalidDays'));
return;
}
setActionLoading(true);
try {
const data: UpdateSubscriptionRequest = {

View File

@@ -10,7 +10,7 @@ import { useDestructiveConfirm } from '../platform/hooks/useNativeDialog';
import { Card } from '@/components/data-display/Card';
import { Button } from '@/components/primitives/Button';
import { ArrowLeftIcon } from '@/components/icons';
import { BackIcon } from '@/components/icons';
import { staggerContainer, staggerItem } from '@/components/motion/transitions';
function formatCardDate(dateStr: string): string {
@@ -30,7 +30,11 @@ export default function SavedCards() {
const { showToast } = useToast();
const confirmDelete = useDestructiveConfirm();
const { data: savedCardsData, isLoading } = useQuery({
const {
data: savedCardsData,
isLoading,
isError,
} = useQuery({
queryKey: ['saved-cards'],
queryFn: balanceApi.getSavedCards,
});
@@ -55,7 +59,8 @@ export default function SavedCards() {
message: '',
duration: 3000,
});
} catch {
} catch (error) {
console.error('Failed to unlink card:', error);
showToast({
type: 'error',
title: t('balance.savedCards.unlinkError'),
@@ -80,7 +85,7 @@ export default function SavedCards() {
onClick={() => navigate('/balance')}
className="flex h-10 w-10 items-center justify-center rounded-linear border border-dark-700/30 bg-dark-800/50 text-dark-300 transition-colors hover:bg-dark-700/50 hover:text-dark-100"
>
<ArrowLeftIcon className="h-5 w-5" />
<BackIcon className="h-5 w-5" />
</button>
<h1 className="text-2xl font-bold text-dark-50 sm:text-3xl">
{t('balance.savedCards.pageTitle')}
@@ -112,8 +117,19 @@ export default function SavedCards() {
</motion.div>
)}
{/* Error state */}
{isError && (
<motion.div variants={staggerItem}>
<Card>
<div className="py-12 text-center">
<div className="text-error-400">{t('balance.savedCards.loadError')}</div>
</div>
</Card>
</motion.div>
)}
{/* Cards List */}
{!isLoading && savedCards && savedCards.length > 0 ? (
{!isLoading && !isError && savedCards && savedCards.length > 0 ? (
<motion.div variants={staggerItem}>
<Card>
<div className="space-y-3">
@@ -150,7 +166,7 @@ export default function SavedCards() {
</div>
</Card>
</motion.div>
) : !isLoading && savedCards ? (
) : !isLoading && !isError && savedCards ? (
/* Empty state - only show when data loaded and empty */
<motion.div variants={staggerItem}>
<Card>