import { useState, useEffect } from 'react' import { Plus, Pencil, Trash2, Save, X, Eye, EyeOff } from 'lucide-react' import { api } from '../utils/api' import EmojiIconPicker from '../components/EmojiIconPicker' const CATEGORIES = [ { value: 'body_composition', label: 'Körperzusammensetzung' }, { value: 'training', label: 'Training' }, { value: 'endurance', label: 'Ausdauer' }, { value: 'coordination', label: 'Koordination' }, { value: 'mental', label: 'Mental' }, { value: 'recovery', label: 'Erholung' }, { value: 'health', label: 'Gesundheit' }, { value: 'custom', label: 'Eigene' } ] function groupAreasByCategory(areas) { const grouped = {} for (const area of areas) { const cat = area.category || 'other' if (!grouped[cat]) grouped[cat] = [] grouped[cat].push(area) } return grouped } export default function AdminFocusAreasPage() { const [data, setData] = useState({ areas: [], grouped: {}, total: 0 }) const [usageTypesCatalog, setUsageTypesCatalog] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [showInactive, setShowInactive] = useState(false) const [editingId, setEditingId] = useState(null) const [creating, setCreating] = useState(false) const [formData, setFormData] = useState({ key: '', name_de: '', name_en: '', icon: '', description: '', category: 'custom' }) useEffect(() => { loadData() }, [showInactive]) useEffect(() => { let cancelled = false ;(async () => { try { const r = await api.listFocusAreaUsageTypes() if (!cancelled) setUsageTypesCatalog(r.usage_types || []) } catch (e) { console.error('usage-types catalog:', e) if (!cancelled) setUsageTypesCatalog([]) } })() return () => { cancelled = true } }, []) const loadData = async () => { try { setLoading(true) const result = await api.listFocusAreaDefinitions(showInactive) const areas = (result.areas || []).map(a => ({ ...a, allowed_usage_type_keys: Array.isArray(a.allowed_usage_type_keys) ? a.allowed_usage_type_keys : [] })) setData({ areas, grouped: groupAreasByCategory(areas), total: result.total ?? areas.length }) setError(null) } catch (err) { console.error('Failed to load focus areas:', err) setError(err.message) } finally { setLoading(false) } } const handleCreate = async () => { if (!formData.key || !formData.name_de) { setError('Key und Name (DE) sind erforderlich') return } try { await api.createFocusAreaDefinition(formData) setCreating(false) setFormData({ key: '', name_de: '', name_en: '', icon: '', description: '', category: 'custom' }) await loadData() } catch (err) { setError(err.message) } } const handleUpdate = async (id) => { try { const area = data.areas.find(a => a.id === id) const usageKeys = Array.isArray(area.allowed_usage_type_keys) ? area.allowed_usage_type_keys : [] await Promise.all([ api.updateFocusAreaDefinition(id, { name_de: area.name_de, name_en: area.name_en, icon: area.icon, description: area.description, category: area.category, is_active: area.is_active }), api.setFocusAreaUsageTypes(id, usageKeys) ]) setEditingId(null) await loadData() } catch (err) { setError(err.message) } } const handleDelete = async (id) => { if (!confirm('Focus Area wirklich löschen?')) return try { await api.deleteFocusAreaDefinition(id) await loadData() } catch (err) { setError(err.message) } } const handleToggleActive = async (id) => { const area = data.areas.find(a => a.id === id) try { await api.updateFocusAreaDefinition(id, { is_active: !area.is_active }) await loadData() } catch (err) { setError(err.message) } } const updateField = (id, field, value) => { setData(prev => { const areas = prev.areas.map(a => a.id === id ? { ...a, [field]: value } : a ) return { ...prev, areas, grouped: groupAreasByCategory(areas), total: areas.length } }) } const toggleUsageTypeKey = (areaId, key, checked) => { setData(prev => { const areas = prev.areas.map(a => { if (a.id !== areaId) return a const cur = new Set(Array.isArray(a.allowed_usage_type_keys) ? a.allowed_usage_type_keys : []) if (checked) cur.add(key) else cur.delete(key) return { ...a, allowed_usage_type_keys: [...cur] } }) return { ...prev, areas, grouped: groupAreasByCategory(areas), total: areas.length } }) } if (loading) { return (
{area.key}