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()}
/>
)
}