import React, { useState, useEffect } from 'react'; import { Project } from '../types'; import { Icons } from '../components/IconSet'; import { dbService } from '../services/DatabaseService'; import { authService } from '../services/AuthService'; import { DiscordUser } from '../types'; import CreateProjectModal from '../components/CreateProjectModal'; interface ProjectsProps { onSelectProject?: (id: string) => void; } const StatusBadge = ({ status, hiring }: { status: Project['status'], hiring: boolean }) => { const styles = { 'active': 'bg-accentInfo/10 text-accentInfo border-accentInfo/20', 'recruiting': 'bg-accentSuccess/10 text-accentSuccess border-accentSuccess/20', 'private': 'bg-textMuted/10 text-textMuted border-textMuted/20', 'completed': 'bg-textMuted/10 text-textMuted border-textMuted/20', }; const labels = { 'active': 'Aktives Geschäft', 'recruiting': 'Offener Story-Arc', 'private': 'Privat / Versteckt', 'completed': 'Archiviert' }; return (
{labels[status]} {hiring && ( Stellen )}
); }; const VentureCard = ({ project, onClick }: { project: Project, onClick?: () => void }) => (
{/* Background accent for certain types */} {project.category === 'Black Market' && (
)}
{project.category}
{project.logoUrl ? ( {`${project.title} ) : (
{project.title.charAt(0)}
)}

{project.title}

Inhaber
{project.owner}

{project.description}

{/* Reputation / Progress Bar */}
{project.category === 'Story Arc' ? 'Story Fortschritt' : 'Ruf'} {project.progress}%
{project.employees.length} Mitglieder
{project.shopCatalog && project.shopCatalog.length > 0 && (
Shop
)} {project.foundedDate && Gegr. {project.foundedDate}}
); const Projects: React.FC = ({ onSelectProject }) => { const [filter, setFilter] = useState<'all' | Project['status']>('all'); const [projects, setProjects] = useState([]); const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const [showCreateForm, setShowCreateForm] = useState(false); // Subscribe to auth and data updates useEffect(() => { const unsubAuth = authService.subscribe(setUser); const unsubDb = dbService.subscribe(() => { setProjects(dbService.getProjects()); }); // Initial data load setProjects(dbService.getProjects()); setLoading(false); return () => { unsubAuth(); unsubDb(); }; }, []); const filteredProjects = projects.filter(p => filter === 'all' ? true : p.status === filter ); // Berechne den Namen des verknüpften Charakters für die Modal-Anzeige const getLinkedPlayerName = () => { if (!user) return null; if (user.linkedPlayerUuid) { const linkedPlayer = dbService.getPlayer(user.linkedPlayerUuid); return linkedPlayer ? linkedPlayer.username : null; } return null; }; const linkedPlayerName = getLinkedPlayerName(); const createProject = async (projectData: { title: string; description: string; category: Project['category'] }) => { if (!user) { throw new Error('Nicht eingeloggt'); } console.log('Creating project with data:', projectData); console.log('User will be resolved to Minecraft name in backend'); const success = await dbService.createProject(projectData); if (!success) { throw new Error('Fehler beim Erstellen des Projekts'); } }; const handleCreateClick = () => { if (!user) { // Redirect to login or show message alert('Sie müssen sich zuerst anmelden, um ein Unternehmen zu erstellen.'); authService.login(); return; } setShowCreateForm(true); }; const tabs = [ { id: 'all', label: 'Alle Unternehmen' }, { id: 'active', label: 'Aktive Firmen' }, { id: 'recruiting', label: 'Story Arcs' }, { id: 'private', label: 'Privat' }, ]; return (

Unternehmen & Projekte

Spielergeführte Firmen, aktive Rollenspiel-Stränge und Dienstleister.

{/* Filter Tabs */}
{tabs.map(tab => ( ))}
{/* Grid */}
{filteredProjects.map(project => (
onSelectProject && onSelectProject(project.id)} />
))}
{filteredProjects.length === 0 && (

Keine Unternehmen in dieser Kategorie gefunden.

)} {/* Create Project Modal */} setShowCreateForm(false)} onCreate={createProject} linkedPlayerName={linkedPlayerName} />
); }; export default Projects;