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.title}
{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;