import React, { useState, useEffect } from 'react';
import { Organization } from '../types';
import { Icons } from '../components/IconSet';
import { dbService } from '../services/DatabaseService';
interface CitiesProps {
onSelectCity: (id: string) => void;
}
const CityCard = ({ city, onClick }: { city: Organization; onClick: () => void }) => (
{/* Background Image */}
{/* Content */}
{city.establishedYear || 'Unbekannte Ära'}
{city.name}
{city.description}
{city.memberCount} Bürger
{city.status}
);
const Cities: React.FC = ({ onSelectCity }) => {
const [cities, setCities] = useState([]);
const [citiesWithStats, setCitiesWithStats] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
const loadCities = () => {
// Get all organizations from database
const allOrgs = dbService.getOrgs();
const cityOrgs = allOrgs.filter(org => org.type === 'City');
// Calculate dynamic stats for each city
const citiesStats = cityOrgs.map(city => {
// Count citizens (players with this organizationId)
const allPlayers = dbService.getPlayers();
const citizenCount = allPlayers.filter(player =>
player.stats.organizationId === city.id
).length;
// Count businesses/projects in this city
const allProjects = dbService.getProjects();
const businessCount = allProjects.filter(project =>
project.associatedOrgId === city.id
).length;
return {
...city,
memberCount: citizenCount,
businessCount: businessCount,
// Override static memberCount with dynamic count
stats: {
citizens: citizenCount,
businesses: businessCount,
...city.cityStats
}
};
});
setCities(cityOrgs);
setCitiesWithStats(citiesStats);
setLoading(false);
};
// Initial load
loadCities();
// Subscribe to updates
const unsub = dbService.subscribe(loadCities);
return unsub;
}, []);
return (
Große Siedlungen
Entdecke die blühenden Zentren der Zivilisation im Obsidian-Tal.
{loading ? (
) : (
<>
{citiesWithStats.map(city => (
onSelectCity(city.id)} />
))}
{citiesWithStats.length === 0 && (
Noch keine Städte gegründet.
)}
>
)}
);
};
export default Cities;