mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-30 10:27:49 +00:00
- Add glassTheme utility with theme-aware color tokens - Replace hardcoded rgba(255,255,255,...) with dynamic values - Replace text-white with text-dark-50 for auto theme remapping - Restyle subscription page block to match dashboard glassmorphic design - Light mode: white semi-opaque cards with subtle shadows - Dark mode: unchanged visual appearance
170 lines
5.6 KiB
TypeScript
170 lines
5.6 KiB
TypeScript
import { useTranslation } from 'react-i18next';
|
|
import { Link } from 'react-router';
|
|
import type { Subscription } from '../../types';
|
|
import { useTheme } from '../../hooks/useTheme';
|
|
import { getGlassColors } from '../../utils/glassTheme';
|
|
|
|
interface SubscriptionCardExpiredProps {
|
|
subscription: Subscription;
|
|
}
|
|
|
|
export default function SubscriptionCardExpired({ subscription }: SubscriptionCardExpiredProps) {
|
|
const { t } = useTranslation();
|
|
const { isDark } = useTheme();
|
|
const g = getGlassColors(isDark);
|
|
|
|
const formattedDate = new Date(subscription.end_date).toLocaleDateString();
|
|
|
|
return (
|
|
<div
|
|
className="relative overflow-hidden rounded-3xl"
|
|
style={{
|
|
background: g.cardBg,
|
|
border: '1px solid rgba(255,70,70,0.12)',
|
|
boxShadow: g.shadow,
|
|
padding: '28px 28px 24px',
|
|
}}
|
|
>
|
|
{/* Red glow */}
|
|
<div
|
|
className="pointer-events-none absolute"
|
|
style={{
|
|
top: -60,
|
|
right: -60,
|
|
width: 200,
|
|
height: 200,
|
|
borderRadius: '50%',
|
|
background: 'radial-gradient(circle, rgba(255,59,92,0.08) 0%, transparent 70%)',
|
|
}}
|
|
aria-hidden="true"
|
|
/>
|
|
{/* Grid pattern */}
|
|
<div
|
|
className="pointer-events-none absolute inset-0 opacity-[0.02]"
|
|
style={{
|
|
backgroundImage: `linear-gradient(rgba(255,255,255,0.1) 1px, transparent 1px),
|
|
linear-gradient(90deg, rgba(255,255,255,0.1) 1px, transparent 1px)`,
|
|
backgroundSize: '40px 40px',
|
|
}}
|
|
aria-hidden="true"
|
|
/>
|
|
|
|
{/* Header */}
|
|
<div className="mb-5 flex items-start justify-between">
|
|
<div className="flex items-center gap-3">
|
|
{/* Clock icon */}
|
|
<div
|
|
className="flex h-11 w-11 flex-shrink-0 items-center justify-center rounded-[14px]"
|
|
style={{
|
|
background: 'rgba(255,59,92,0.1)',
|
|
border: '1px solid rgba(255,59,92,0.15)',
|
|
}}
|
|
>
|
|
<svg
|
|
width="22"
|
|
height="22"
|
|
viewBox="0 0 24 24"
|
|
fill="none"
|
|
stroke="#FF3B5C"
|
|
strokeWidth="2"
|
|
strokeLinecap="round"
|
|
strokeLinejoin="round"
|
|
aria-hidden="true"
|
|
>
|
|
<circle cx="12" cy="12" r="10" />
|
|
<path d="M12 6v6l4 2" />
|
|
</svg>
|
|
</div>
|
|
<div>
|
|
<h2 className="text-lg font-bold tracking-tight text-dark-50">
|
|
{t('dashboard.expired.title')}
|
|
</h2>
|
|
<span className="text-xs text-dark-50/35">
|
|
{subscription.is_trial
|
|
? t('dashboard.expired.trialSubtitle')
|
|
: t('dashboard.expired.paidSubtitle')}
|
|
</span>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Badge */}
|
|
<div
|
|
className="flex items-center gap-1 rounded-full px-3 py-1 text-[11px] font-semibold"
|
|
style={{
|
|
background: 'rgba(255,59,92,0.1)',
|
|
border: '1px solid rgba(255,59,92,0.2)',
|
|
color: '#FF3B5C',
|
|
}}
|
|
>
|
|
{subscription.is_trial && (
|
|
<svg
|
|
width="12"
|
|
height="12"
|
|
viewBox="0 0 24 24"
|
|
fill="none"
|
|
stroke="currentColor"
|
|
strokeWidth="2"
|
|
aria-hidden="true"
|
|
>
|
|
<path
|
|
d="M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09z"
|
|
strokeLinecap="round"
|
|
strokeLinejoin="round"
|
|
/>
|
|
</svg>
|
|
)}
|
|
{subscription.is_trial ? t('subscription.trialStatus') : t('subscription.expired')}
|
|
</div>
|
|
</div>
|
|
|
|
{/* Expired info grid */}
|
|
<div
|
|
className="mb-5 flex justify-around rounded-[14px] text-center"
|
|
style={{
|
|
background: 'rgba(255,59,92,0.04)',
|
|
border: '1px solid rgba(255,59,92,0.08)',
|
|
padding: '16px 18px',
|
|
}}
|
|
>
|
|
{[
|
|
{ label: t('dashboard.expired.traffic'), value: '0 GB' },
|
|
{ label: t('dashboard.expired.devices'), value: '0' },
|
|
{ label: t('dashboard.expired.expiredDate'), value: formattedDate },
|
|
].map((item, i) => (
|
|
<div key={i}>
|
|
<div className="mb-1 font-mono text-[10px] font-medium uppercase tracking-wider text-dark-50/30">
|
|
{item.label}
|
|
</div>
|
|
<div className="text-base font-bold tracking-tight text-dark-50/50">{item.value}</div>
|
|
</div>
|
|
))}
|
|
</div>
|
|
|
|
{/* Action buttons */}
|
|
<div className="flex gap-2.5">
|
|
<Link
|
|
to="/subscription"
|
|
state={{ scrollToExtend: true }}
|
|
className="flex flex-1 items-center justify-center rounded-[14px] py-3.5 text-[15px] font-semibold tracking-tight text-white transition-all duration-300"
|
|
style={{
|
|
background: 'linear-gradient(135deg, #FF3B5C, #FF6B35)',
|
|
boxShadow: '0 4px 20px rgba(255,59,92,0.2)',
|
|
}}
|
|
>
|
|
{t('dashboard.expired.renew')}
|
|
</Link>
|
|
<Link
|
|
to="/subscription"
|
|
className="flex items-center justify-center rounded-[14px] px-5 py-3.5 text-[15px] font-semibold tracking-tight text-dark-50/50 transition-colors duration-200"
|
|
style={{
|
|
background: g.innerBg,
|
|
border: `1px solid ${g.innerBorder}`,
|
|
}}
|
|
>
|
|
{t('dashboard.expired.tariffs')}
|
|
</Link>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|