mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-28 09:33:46 +00:00
FIX PR Problems
This commit is contained in:
@@ -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)}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -550,7 +550,8 @@
|
||||
"noCards": "کارت به طور خودکار در شارژ بعدی ذخیره میشود",
|
||||
"pageTitle": "کارتهای ذخیره شده",
|
||||
"backToBalance": "بازگشت",
|
||||
"empty": "کارتی ذخیره نشده است. کارت به طور خودکار در شارژ بعدی ذخیره میشود."
|
||||
"empty": "کارتی ذخیره نشده است. کارت به طور خودکار در شارژ بعدی ذخیره میشود.",
|
||||
"loadError": "خطا در بارگذاری کارتها. لطفاً بعداً دوباره امتحان کنید."
|
||||
},
|
||||
"paymentSuccess": {
|
||||
"title": "پرداخت موفق",
|
||||
@@ -2393,7 +2394,8 @@
|
||||
"trafficAdded": "بسته ترافیک اضافه شد",
|
||||
"expired": "منقضی شده",
|
||||
"daysLeft": "روز باقیمانده",
|
||||
"deviceLimitUpdated": "محدودیت دستگاه بهروز شد"
|
||||
"deviceLimitUpdated": "محدودیت دستگاه بهروز شد",
|
||||
"invalidDays": "لطفاً تعداد روز معتبر وارد کنید (بیشتر از ۰)"
|
||||
},
|
||||
"balance": {
|
||||
"current": "موجودی فعلی",
|
||||
|
||||
@@ -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": "Текущий баланс",
|
||||
|
||||
@@ -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": "当前余额",
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user