diff --git a/src/components/subscription/PurchaseCTAButton.tsx b/src/components/subscription/PurchaseCTAButton.tsx index 7b8be09..b9e0f2f 100644 --- a/src/components/subscription/PurchaseCTAButton.tsx +++ b/src/components/subscription/PurchaseCTAButton.tsx @@ -32,10 +32,10 @@ export default function PurchaseCTAButton({ subscription }: PurchaseCTAButtonPro
; +}) { + const { t } = useTranslation(); + const [countdown, setCountdown] = useState({ days: 0, hours: 0, minutes: 0, seconds: 0 }); + + useEffect(() => { + const endTime = new Date(endDate).getTime(); + const tick = () => { + const diff = Math.max(0, endTime - Date.now()); + setCountdown({ + days: Math.floor(diff / 86_400_000), + hours: Math.floor((diff % 86_400_000) / 3_600_000), + minutes: Math.floor((diff % 3_600_000) / 60_000), + seconds: Math.floor((diff % 60_000) / 1_000), + }); + }; + tick(); + const id = setInterval(tick, 1000); + return () => clearInterval(id); + }, [endDate]); + + const isExpired = !isActive; + const isUrgent = countdown.days <= 3; + + const formattedDate = new Date(endDate).toLocaleDateString(undefined, { + day: 'numeric', + month: 'short', + year: 'numeric', + }); + + return ( +
+
+
+ +
+ {t('dashboard.remaining')} +
+ {isExpired ? ( +
+ {t('subscription.expired')} +
+ ) : ( +
+ {countdown.days > 0 && ( + <> + + {countdown.days} + + + {t('subscription.daysShort')} + + + )} + + {String(countdown.hours).padStart(2, '0')} + + + : + + + {String(countdown.minutes).padStart(2, '0')} + + + : + + + {String(countdown.seconds).padStart(2, '0')} + +
+ )} +
+ {t('subscription.expiresAt')}: {formattedDate} +
+
+ ); +}); + export default function Subscription() { const { t } = useTranslation(); const queryClient = useQueryClient(); @@ -61,25 +201,6 @@ export default function Subscription() { // Extract subscription from response (null if no subscription) const subscription = subscriptionResponse?.subscription ?? null; - // Live countdown timer - const [countdown, setCountdown] = useState({ days: 0, hours: 0, minutes: 0, seconds: 0 }); - useEffect(() => { - if (!subscription?.end_date) return; - const endTime = new Date(subscription.end_date).getTime(); - const tick = () => { - const diff = Math.max(0, endTime - Date.now()); - setCountdown({ - days: Math.floor(diff / 86_400_000), - hours: Math.floor((diff % 86_400_000) / 3_600_000), - minutes: Math.floor((diff % 3_600_000) / 60_000), - seconds: Math.floor((diff % 60_000) / 1_000), - }); - }; - tick(); - const id = setInterval(tick, 1000); - return () => clearInterval(id); - }, [subscription?.end_date]); - // Purchase options (needed for balance_kopeks in device/traffic/server management) const { data: purchaseOptions } = useQuery({ queryKey: ['purchase-options'], @@ -316,7 +437,6 @@ export default function Subscription() { (trafficData?.is_unlimited ?? false) || subscription.traffic_limit_gb === 0; const zone = getTrafficZone(usedPercent); const connectedDevices = devicesData?.total ?? 0; - const formattedDate = new Date(subscription.end_date).toLocaleDateString(); return (
(