import { useState, useEffect } from 'react' import { useNavigate } from 'react-router-dom' import { api } from '../api' import { useAuth } from '../AuthContext' const INK = '#1A1A2E' const MUTED = '#888' const BORDER = '#E8E4DC' const CORAL = '#FF6B4A' const DURATIONS = [ { value: 1, label: '1 mese', price: '€14.95' }, { value: 3, label: '3 mesi', price: '€39.95' }, { value: 6, label: '6 mesi', price: '€64.95' }, { value: 12, label: '12 mesi (1 anno)', price: '€119.95' }, ] export default function AdminSettings() { const { isAdmin, user } = useAuth() const navigate = useNavigate() const [users, setUsers] = useState([]) const [codes, setCodes] = useState([]) const [loadingUsers, setLoadingUsers] = useState(true) const [loadingCodes, setLoadingCodes] = useState(true) const [duration, setDuration] = useState(1) const [generating, setGenerating] = useState(false) const [generatedCode, setGeneratedCode] = useState(null) const [copied, setCopied] = useState(false) const [error, setError] = useState('') useEffect(() => { if (!isAdmin) { navigate('/') return } loadUsers() loadCodes() }, [isAdmin]) const loadUsers = async () => { try { const data = await api.get('/admin/users') setUsers(data) } catch { // silently fail } finally { setLoadingUsers(false) } } const loadCodes = async () => { try { const data = await api.get('/admin/codes') setCodes(data) } catch { // silently fail } finally { setLoadingCodes(false) } } const handleGenerateCode = async () => { setGenerating(true) setError('') setGeneratedCode(null) try { const result = await api.post('/admin/codes/generate', { duration_months: duration }) setGeneratedCode(result) loadCodes() } catch (err) { setError(err.message || 'Errore nella generazione del codice.') } finally { setGenerating(false) } } const copyCode = async (code) => { try { await navigator.clipboard.writeText(code) setCopied(true) setTimeout(() => setCopied(false), 2000) } catch { // fallback } } if (!isAdmin) return null return (
Gestione utenti e codici abbonamento
{error}
)} {generatedCode && (Codice generato ({DURATIONS.find(d => d.value === generatedCode.duration_months)?.label})
{generatedCode.code}
Caricamento...
) : codes.length === 0 ? (Nessun codice generato ancora.
) : (| {h} | ))}||||
|---|---|---|---|---|
| {code.code} | {DURATIONS.find(d => d.value === code.duration_months)?.label || `${code.duration_months}m`} | {code.status === 'used' ? 'Usato' : 'Attivo'} | {code.used_by || '—'} | {code.used_at ? new Date(code.used_at).toLocaleDateString('it-IT') : '—'} |
Caricamento...
) : users.length === 0 ? (Nessun utente.
) : (| {h} | ))}||||
|---|---|---|---|---|
|
{u.email || u.username}
{u.display_name && u.display_name !== u.email && (
{u.display_name}
)}
{u.is_admin && (
admin
)}
|
{u.subscription_plan || 'freemium'} | {u.subscription_expires_at ? new Date(u.subscription_expires_at).toLocaleDateString('it-IT') : u.subscription_plan === 'pro' ? '∞' : '—'} | {u.auth_provider || 'local'} | {u.created_at ? new Date(u.created_at).toLocaleDateString('it-IT') : '—'} |