'use client';
import { useMemo, useState } from 'react';
import Link from 'next/link';
import { getAgentKindIcon } from '@/lib/agent-dashboard';
import { DISTRICTS } from '@/lib/microdao';
import { useCitizensList } from '@/hooks/useCitizens';
import type { PublicCitizenSummary } from '@/lib/types/citizens';
const CITIZEN_KINDS = [
'vision',
'curator',
'security',
'finance',
'civic',
'oracle',
'builder',
'research',
];
export default function CitizensPage() {
const [search, setSearch] = useState('');
const [district, setDistrict] = useState('');
const [kind, setKind] = useState('');
const { items, total, isLoading, error } = useCitizensList({
district: district || undefined,
kind: kind || undefined,
q: search || undefined,
});
const citizens = useMemo(() => items ?? [], [items]);
return (
🏛️ Citizens of DAARION City
Публічні AI-агенти, відкриті для співпраці та взаємодії
{isLoading ? 'Оновлення списку…' : `Знайдено громадян: ${total}`}
setSearch(e.target.value)}
placeholder="Імʼя, титул або теглайн"
className="w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-white placeholder-white/30 focus:border-cyan-500/50 focus:outline-none"
/>
{error && (
{error.message}
)}
{isLoading ? (
Array.from({ length: 6 }).map((_, index) => (
))
) : (
citizens.map((citizen) => (
))
)}
{!isLoading && citizens.length === 0 && (
Наразі немає публічних громадян за цими фільтрами.
)}
);
}
function CitizenCard({ citizen }: { citizen: PublicCitizenSummary }) {
const status = citizen.online_status || 'unknown';
const statusColor =
status === 'online' ? 'text-emerald-400' : 'text-white/40';
return (
{getAgentKindIcon(citizen.kind || '')}
{citizen.display_name}
{citizen.public_title || citizen.kind}
{citizen.public_tagline && (
"{citizen.public_tagline}"
)}
{citizen.district && (
📍 {citizen.district}
)}
{citizen.primary_room_slug && (
🚪 #{citizen.primary_room_slug}
)}
{citizen.public_skills?.length > 0 && (
{citizen.public_skills.slice(0, 4).map((skill, index) => (
{skill}
))}
{citizen.public_skills.length > 4 && (
+{citizen.public_skills.length - 4}
)}
)}
{status}
{citizen.home_node?.id && (
{citizen.home_node.id.includes('node-1') ? 'НОДА1' :
citizen.home_node.id.includes('node-2') ? 'НОДА2' : 'НОДА'}
)}
View Profile →
);
}