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 (
{/* Close Button */} {/* Modal Header */}

{user ? 'Profil & Qualifikationen' : 'Gast-Name anpassen'}

{user ? 'Anzeigename & persönliche Qualifikationen verwalten' : 'Passe deinen Namen für Schichteintragungen an'}

{error && (
{error}
)} {success && (
{success}
)}
{/* Display Name Edit Field */}
setDisplayName(e.target.value)} placeholder="z. B. Alex Muster" className="w-full px-3.5 py-2.5 rounded-sm bg-subtle border border-grid text-main text-sm focus:outline-none focus:border-muted font-sans" />

Wird in allen Schichtplänen bei deinen Eintragungen angezeigt.

{/* User Skills Selection (Only for logged-in users) */} {user && (
{safeSkills.length === 0 ? (

[ Noch keine Qualifikationen im System angelegt ]

) : (
{safeSkills.map((s) => { const isSelected = selectedSkillIds.includes(s.id); return (
toggleSkill(s.id)} className={`p-2.5 rounded-sm border cursor-pointer transition flex items-center justify-between font-mono ${ isSelected ? 'bg-surface-hover border-grid text-main font-bold shadow-sm' : 'bg-subtle border-grid/60 text-muted hover:text-main hover:border-grid' }`} >
{s.name}
{isSelected && }
); })}
)}
)}
{/* Add New Skill Section (For Admins / Staff) */} {user && (user.is_admin_user || user.is_staff || user.is_superuser) && (

Neue Qualifikation im System anlegen

setNewSkillName(e.target.value)} className="sm:col-span-7 px-3 py-2 rounded-sm bg-subtle border border-grid text-main text-xs font-sans" /> setNewSkillColor(e.target.value)} className="sm:col-span-2 h-8 w-full rounded-sm border border-grid cursor-pointer bg-subtle p-0.5" />
)}
); }