import React, { useState, useEffect } from 'react'; import { X, User, Award, Check, AlertCircle, CheckCircle2 } from 'lucide-react'; import { apiFetch } from '../api/client'; import { getRandomSkillColor } from '../utils/colors'; export default function ProfileModal({ user, skills = [], onClose, onUserUpdated, onRefreshSkills }) { const safeSkills = Array.isArray(skills) ? skills : []; const safeUserSkills = user?.skills ? (Array.isArray(user.skills) ? user.skills : []) : []; const [displayName, setDisplayName] = useState( user?.display_name || user?.username || localStorage.getItem('guest_display_name') || '' ); const [selectedSkillIds, setSelectedSkillIds] = useState( safeUserSkills.map(s => (typeof s === 'object' ? s.id : s)) ); useEffect(() => { if (user) { setDisplayName(user.display_name || user.username || ''); const uSkills = user.skills ? (Array.isArray(user.skills) ? user.skills : []) : []; setSelectedSkillIds(uSkills.map(s => (typeof s === 'object' ? s.id : s))); } else { setDisplayName(localStorage.getItem('guest_display_name') || ''); setSelectedSkillIds([]); } }, [user]); // New skill fields const [newSkillName, setNewSkillName] = useState(''); const [newSkillDesc, setNewSkillDesc] = useState(''); const [newSkillColor, setNewSkillColor] = useState(getRandomSkillColor()); const [savingProfile, setSavingProfile] = useState(false); const [creatingSkill, setCreatingSkill] = useState(false); const [error, setError] = useState(''); const [success, setSuccess] = useState(''); const handleSaveProfile = async (e) => { e.preventDefault(); setError(''); setSuccess(''); setSavingProfile(true); try { if (user) { const updatedUser = await apiFetch('/users/me/', { method: 'PATCH', body: JSON.stringify({ display_name: displayName.trim(), skill_ids: selectedSkillIds }) }); setSuccess('Profil und Anzeigename erfolgreich aktualisiert!'); if (onUserUpdated) onUserUpdated(updatedUser); setTimeout(() => onClose(), 800); } else { localStorage.setItem('guest_display_name', displayName.trim()); window.dispatchEvent(new Event('guest_name_updated')); setSuccess('Gast-Name erfolgreich gespeichert!'); setTimeout(() => onClose(), 600); } } catch (err) { setError(err.message || 'Speichern des Profils fehlgeschlagen.'); } finally { setSavingProfile(false); } }; const toggleSkill = (skillId) => { if (selectedSkillIds.includes(skillId)) { setSelectedSkillIds(selectedSkillIds.filter(id => id !== skillId)); } else { setSelectedSkillIds([...selectedSkillIds, skillId]); } }; const handleCreateSkill = async (e) => { e.preventDefault(); if (!newSkillName.trim()) return; setCreatingSkill(true); setError(''); setSuccess(''); try { await apiFetch('/skills/', { method: 'POST', body: JSON.stringify({ name: newSkillName.trim(), description: newSkillDesc.trim(), color: newSkillColor }) }); setNewSkillName(''); setNewSkillDesc(''); setNewSkillColor(getRandomSkillColor()); setSuccess('Neue Fähigkeit erfolgreich angelegt!'); if (onRefreshSkills) onRefreshSkills(); } catch (err) { setError(err.message || 'Erstellen der Fähigkeit fehlgeschlagen.'); } finally { setCreatingSkill(false); } }; return (
{user ? 'Anzeigename & persönliche Qualifikationen verwalten' : 'Passe deinen Namen für Schichteintragungen an'}