import { useState, useEffect } from 'react' import { Gift, AlertCircle, TrendingUp, Award } from 'lucide-react' import { api } from '../utils/api' export default function SubscriptionPage() { const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [subscription, setSubscription] = useState(null) const [usage, setUsage] = useState([]) const [limits, setLimits] = useState([]) const [couponCode, setCouponCode] = useState('') const [redeeming, setRedeeming] = useState(false) const [couponSuccess, setCouponSuccess] = useState('') useEffect(() => { loadData() }, []) async function loadData() { try { setLoading(true) const [subData, usageData, limitsData] = await Promise.all([ api.getMySubscription(), api.getMyUsage(), api.getMyLimits() ]) setSubscription(subData) setUsage(usageData) setLimits(limitsData) setError('') } catch (e) { setError(e.message) } finally { setLoading(false) } } async function handleRedeemCoupon() { if (!couponCode.trim()) return try { setRedeeming(true) setError('') setCouponSuccess('') await api.redeemCoupon(couponCode.trim().toUpperCase()) setCouponSuccess('Coupon erfolgreich eingelöst!') setCouponCode('') await loadData() } catch (e) { setError(e.message) } finally { setRedeeming(false) } } if (loading) return (
) const tierColors = { free: { bg: 'var(--surface2)', color: 'var(--text2)', icon: '🆓' }, basic: { bg: '#E3F2FD', color: '#1565C0', icon: '⭐' }, premium: { bg: '#F3E5F5', color: '#6A1B9A', icon: '👑' }, selfhosted: { bg: 'var(--accent-light)', color: 'var(--accent-dark)', icon: '🏠' } } const currentTier = subscription?.current_tier || 'free' const tierStyle = tierColors[currentTier] || tierColors.free return (
{/* Header */}
Mein Abo
Tier, Limits und Nutzung
{/* Messages */} {error && (
{error}
)} {couponSuccess && (
{couponSuccess}
)} {/* Current Tier Card */}
{tierStyle.icon}
Aktueller Tier
{currentTier.charAt(0).toUpperCase() + currentTier.slice(1)}
{subscription?.trial_ends_at && new Date(subscription.trial_ends_at) > new Date() && (
Trial aktiv: Endet am {new Date(subscription.trial_ends_at).toLocaleDateString('de-DE')}
)} {subscription?.access_until && (
Zugriff bis: {new Date(subscription.access_until).toLocaleDateString('de-DE')}
)}
{/* Feature Limits */}
Feature-Limits & Nutzung
{limits.length === 0 ? (
Keine Limits konfiguriert
) : (
{limits.map(limit => { const usageEntry = usage.find(u => u.feature_id === limit.feature_id) const used = usageEntry?.usage_count || 0 const limitValue = limit.limit_value const percentage = limitValue ? Math.min((used / limitValue) * 100, 100) : 0 return (
{limit.feature_name}
{used} / {limitValue === null ? '∞' : limitValue}
{limitValue !== null && (
90 ? 'var(--danger)' : percentage > 70 ? '#FFA726' : 'var(--accent)', transition: 'width 0.3s' }} />
)} {limit.reset_period !== 'never' && (
Reset: {limit.reset_period === 'daily' ? 'Täglich' : 'Monatlich'}
)}
) })}
)}
{/* Coupon Redemption */}
Coupon einlösen
Hast du einen Coupon-Code? Löse ihn hier ein um Zugriff auf Premium-Features zu erhalten.
setCouponCode(e.target.value)} placeholder="Z.B. PROMO-2026" onKeyPress={(e) => e.key === 'Enter' && handleRedeemCoupon()} />
) }