import React, { useState, useEffect } from 'react'; import { Player } from '../types'; import { dbService } from '../services/DatabaseService'; import { authService } from '../services/AuthService'; import InventoryGrid from '../components/InventoryGrid'; import EditModal from '../components/EditModal'; import { Icons } from '../components/IconSet'; interface PlayerProfileProps { player: Player; onBack: () => void; } const PlayerProfile: React.FC = ({ player: initialPlayer, onBack }) => { const [player, setPlayer] = useState(initialPlayer); const [currentUser, setCurrentUser] = useState(authService.getUser()); // Edit State const [isEditStoryOpen, setIsEditStoryOpen] = useState(false); const [isEditTagsOpen, setIsEditTagsOpen] = useState(false); const [isEditOrgOpen, setIsEditOrgOpen] = useState(false); const [ownedProjects, setOwnedProjects] = useState([]); // Is this the logged-in user's profile? const isOwner = currentUser?.linkedPlayerUuid === player.uuid; const playerOrg = dbService.getOrg(player.stats.organizationId || ''); // Check if player is already linked to anyone in our mock/real DB logic // Since the Player object doesn't expose 'discordId' publicly in types yet (it's hidden in DB), // we use a heuristic or add it. For now, we assume if currentUser has NO link, they can claim. const canClaim = !!currentUser && !currentUser.linkedPlayerUuid && !isOwner; useEffect(() => { // Refresh player data from "DB" to ensure we have latest local edits const freshData = dbService.getPlayer(player.uuid); if (freshData) setPlayer(freshData); // Load owned projects const allProjects = dbService.getProjects(); const playerProjects = allProjects.filter(p => p.owner === player.username); setOwnedProjects(playerProjects); // Subscribe to auth to show/hide edit buttons const unsub = authService.subscribe(u => setCurrentUser(u)); return unsub; }, [player.uuid, player.username]); const handleSaveStory = (newStory: string) => { // Update local DB dbService.updatePlayer(player.uuid, { storyMarkdown: newStory }); // Update local state setPlayer(prev => ({ ...prev, storyMarkdown: newStory })); }; const handleSaveTags = async (tagsString: string) => { const tags = tagsString.split(',').map(tag => tag.trim()).filter(tag => tag.length > 0); // Update via API const response = await fetch(`https://vollidioten.ceraticsoft.de/api/players/${player.uuid}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ tags }) }); if (response.ok) { // Update local state setPlayer(prev => ({ ...prev, tags })); } else { alert('Fehler beim Aktualisieren der Tags'); } }; const handleSaveOrganization = async (orgId: string) => { const response = await fetch(`https://vollidioten.ceraticsoft.de/api/players/${player.uuid}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ organizationId: orgId || null }) }); if (response.ok) { // Update local state setPlayer(prev => ({ ...prev, stats: { ...prev.stats, organizationId: orgId || undefined } })); } else { alert('Fehler beim Aktualisieren der Zugehörigkeit'); } }; const handleClaim = async () => { if (confirm(`Möchtest du den Charakter "${player.username}" mit deinem Discord-Account verknüpfen?`)) { const success = await dbService.linkPlayer(player.uuid); if (success) { // Force refresh auth to get updated linkedPlayerUuid await authService.checkSession(); alert("Erfolgreich verknüpft! Du kannst nun Bearbeitungen vornehmen."); } else { alert("Fehler beim Verknüpfen. Bitte Backend Logs prüfen."); } } }; // Simple markdown renderer replacement for demo purposes const renderMarkdown = (text: string) => { return text.split('\n').map((line, i) => { if (line.startsWith('# ')) return

{line.replace('# ', '')}

; if (line.startsWith('### ')) return

{line.replace('### ', '')}

; if (line.startsWith('> ')) return
{line.replace('> ', '')}
; if (line.startsWith('* ')) return
  • {line.replace('* ', '')}
  • ; return

    {line}

    ; }); }; return (
    {canClaim && ( )}
    {/* Header */}
    {isOwner && (
    Dein Profil
    )}
    {isOwner && (
    Ändern
    )}

    {player.username}

    {player.isOnline && ( Online )}
    {player.tags.map(tag => ( {tag} ))} {isOwner && ( )}
    {player.stats.playtimeHours}h
    Lvl {player.stats.level}
    {/* Left Col: Inventory & Org */}

    Zugehörigkeit

    {playerOrg ? playerOrg.name.charAt(0) : }
    {player.stats.role}
    {playerOrg ? ( {playerOrg.name} ) : ( 'Freiberufler / Keine Zugehörigkeit' )}
    {/* Right Col: Story & Projects */}
    {/* Story Section */}

    Charakter-Journal

    Markdown {isOwner && ( )}
    {renderMarkdown(player.storyMarkdown)}
    {/* Owned Projects Section */} {ownedProjects.length > 0 && (

    Unternehmen & Projekte ({ownedProjects.length})

    {ownedProjects.map((project) => (

    {project.title}

    {project.category}

    {project.description}

    Gegründet: {project.foundedDate}
    {project.shopCatalog && project.shopCatalog.length > 0 && ( Shop ({project.shopCatalog.length}) )} {project.employees.length + 1}
    ))}
    )}
    {/* Modals */} setIsEditStoryOpen(false)} onSave={handleSaveStory} /> setIsEditTagsOpen(false)} onSave={handleSaveTags} />
    ); }; export default PlayerProfile;