diff --git a/src/api/subscription.ts b/src/api/subscription.ts index 99fe63d..857d86f 100644 --- a/src/api/subscription.ts +++ b/src/api/subscription.ts @@ -345,6 +345,7 @@ export const subscriptionApi = { // Preview tariff switch cost previewTariffSwitch: async ( tariffId: number, + resetTraffic?: boolean, ): Promise<{ can_switch: boolean; current_tariff_id: number | null; @@ -364,10 +365,14 @@ export const subscriptionApi = { base_upgrade_cost_kopeks?: number; discount_percent?: number; discount_kopeks?: number; + // Traffic reset on switch + reset_traffic_available?: boolean; + reset_traffic_default?: boolean; }> => { const response = await apiClient.post('/cabinet/subscription/tariff/switch/preview', { tariff_id: tariffId, - period_days: 30, // Default period for switch + period_days: 30, + ...(resetTraffic !== undefined && { reset_traffic: resetTraffic }), }); return response.data; }, @@ -375,6 +380,7 @@ export const subscriptionApi = { // Switch to a different tariff switchTariff: async ( tariffId: number, + resetTraffic?: boolean, ): Promise<{ success: boolean; message: string; @@ -389,6 +395,7 @@ export const subscriptionApi = { const response = await apiClient.post('/cabinet/subscription/tariff/switch', { tariff_id: tariffId, period_days: 30, + ...(resetTraffic !== undefined && { reset_traffic: resetTraffic }), }); return response.data; }, diff --git a/src/locales/en.json b/src/locales/en.json index e7d818b..1c614a2 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -483,7 +483,9 @@ "switched": "Tariff switched", "notEnoughBalance": "Insufficient balance", "dailyPayment": "Daily payment", - "dailyChargeDescription": "Charged daily from your balance" + "dailyChargeDescription": "Charged daily from your balance", + "resetTraffic": "Reset traffic", + "resetTrafficHint": "Reset used traffic when switching tariff" }, "switchTraffic": { "title": "Change Traffic", diff --git a/src/locales/fa.json b/src/locales/fa.json index 08b1833..933a10b 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -378,7 +378,9 @@ "remainingDays": "روزهای باقی‌مانده", "switch": "تغییر", "title": "تغییر تعرفه", - "upgradeCost": "هزینه ارتقا" + "upgradeCost": "هزینه ارتقا", + "resetTraffic": "بازنشانی ترافیک", + "resetTrafficHint": "بازنشانی ترافیک مصرفی هنگام تغییر تعرفه" }, "promoGroup": { "yourGroup": "گروه شما: {{name}}", diff --git a/src/locales/ru.json b/src/locales/ru.json index b4cae25..6631864 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -506,7 +506,9 @@ "switched": "Тариф изменён", "notEnoughBalance": "Недостаточно средств", "dailyPayment": "Оплата за день", - "dailyChargeDescription": "Списывается ежедневно с баланса" + "dailyChargeDescription": "Списывается ежедневно с баланса", + "resetTraffic": "Сбросить трафик", + "resetTrafficHint": "Обнулить использованный трафик при смене тарифа" }, "switchTraffic": { "title": "Изменить трафик", diff --git a/src/locales/zh.json b/src/locales/zh.json index 122b6ae..0faad4f 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -378,7 +378,9 @@ "remainingDays": "剩余天数", "switch": "切换", "title": "切换套餐", - "upgradeCost": "升级费用" + "upgradeCost": "升级费用", + "resetTraffic": "重置流量", + "resetTrafficHint": "切换套餐时重置已使用流量" }, "promoGroup": { "yourGroup": "您的组:{{name}}", diff --git a/src/pages/SubscriptionPurchase.tsx b/src/pages/SubscriptionPurchase.tsx index 3aa99ce..991c501 100644 --- a/src/pages/SubscriptionPurchase.tsx +++ b/src/pages/SubscriptionPurchase.tsx @@ -128,12 +128,14 @@ export default function SubscriptionPurchase() { // Tariff switch const [switchTariffId, setSwitchTariffId] = useState(null); + const [resetTrafficOnSwitch, setResetTrafficOnSwitch] = useState(false); // Auto-close all modals on success notification const handleCloseAllModals = () => { setShowPurchaseForm(false); setShowTariffPurchase(false); setSwitchTariffId(null); + setResetTrafficOnSwitch(false); setSelectedTariff(null); setSelectedTariffPeriod(null); }; @@ -230,13 +232,21 @@ export default function SubscriptionPurchase() { enabled: !!switchTariffId, }); + // Initialize reset traffic toggle from server default + useEffect(() => { + if (switchPreview?.reset_traffic_default !== undefined) { + setResetTrafficOnSwitch(switchPreview.reset_traffic_default); + } + }, [switchPreview?.reset_traffic_default]); + // Tariff switch mutation const switchTariffMutation = useMutation({ - mutationFn: (tariffId: number) => subscriptionApi.switchTariff(tariffId), + mutationFn: (tariffId: number) => subscriptionApi.switchTariff(tariffId, resetTrafficOnSwitch), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['subscription'] }); queryClient.invalidateQueries({ queryKey: ['purchase-options'] }); setSwitchTariffId(null); + setResetTrafficOnSwitch(false); navigate('/subscription', { replace: true }); }, onError: (error: unknown) => { @@ -250,6 +260,7 @@ export default function SubscriptionPurchase() { const targetTariff = tariffs.find((tariff) => tariff.id === switchTariffId); if (targetTariff) { setSwitchTariffId(null); + setResetTrafficOnSwitch(false); setSelectedTariff(targetTariff); setSelectedTariffPeriod(targetTariff.periods[0] || null); setShowTariffPurchase(true); @@ -598,6 +609,35 @@ export default function SubscriptionPurchase() { + {/* Reset traffic toggle */} + {switchPreview.reset_traffic_available && ( + + )} + {!switchPreview.has_enough_balance && switchPreview.upgrade_cost_kopeks > 0 && (