'use client' import { useEffect, useState } from 'react' import Link from 'next/link' import { useAdminI18n } from '@/components/I18nProvider' import { ADMIN_API_BASE } from '@/lib/api' interface Company { id: string name: string slug: string status: string email: string contractSettings: { legalName: string | null } | null subscription: { plan: string; status: string } | null _count: { employees: number; vehicles: number } } const STATUS_COLORS: Record = { ACTIVE: 'text-emerald-400 bg-emerald-900/30', TRIALING: 'text-sky-400 bg-sky-900/30', SUSPENDED: 'text-red-400 bg-red-900/30', PENDING: 'text-orange-400 bg-orange-900/30', CANCELLED: 'text-zinc-400 bg-zinc-800', } export default function AdminCompaniesPage() { const { language, dict } = useAdminI18n() const copy = { en: { title: 'Companies', search: 'Search by name or slug…', loading: 'Loading…', empty: 'No companies found', company: 'Company', legalName: 'Legal name', slug: 'Slug', status: 'Status', plan: 'Plan', fleet: 'Fleet', vehicles: 'vehicles', view: 'View', suspend: 'Suspend', reactivate: 'Reactivate', }, fr: { title: 'Entreprises', search: 'Rechercher par nom ou slug…', loading: 'Chargement…', empty: 'Aucune entreprise trouvée', company: 'Entreprise', legalName: 'Raison sociale', slug: 'Slug', status: 'Statut', plan: 'Plan', fleet: 'Flotte', vehicles: 'véhicules', view: 'Voir', suspend: 'Suspendre', reactivate: 'Réactiver', }, ar: { title: 'الشركات', search: 'ابحث بالاسم أو بالمُعرّف المختصر…', loading: 'جارٍ التحميل…', empty: 'لم يتم العثور على شركات', company: 'الشركة', legalName: 'الاسم القانوني', slug: 'Slug', status: 'الحالة', plan: 'الخطة', fleet: 'الأسطول', vehicles: 'مركبة', view: 'عرض', suspend: 'تعليق', reactivate: 'إعادة التفعيل', }, }[language] const [companies, setCompanies] = useState([]) const [filtered, setFiltered] = useState([]) const [search, setSearch] = useState('') const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [actioning, setActioning] = useState(null) async function fetchCompanies() { try { const res = await fetch(`${ADMIN_API_BASE}/admin/companies`, { credentials: 'include', cache: 'no-store', }) const json = await res.json() if (!res.ok) throw new Error(json?.message ?? 'Failed to fetch') const list = Array.isArray(json.data) ? json.data : (json.data?.data ?? []) setCompanies(list) setFiltered(list) } catch (err: any) { setError(err.message) } finally { setLoading(false) } } useEffect(() => { fetchCompanies() }, []) useEffect(() => { const q = search.toLowerCase() setFiltered(companies.filter((c) => c.name.toLowerCase().includes(q) || c.slug.includes(q) || c.email.toLowerCase().includes(q))) }, [search, companies]) async function changeStatus(id: string, status: string) { setActioning(id) try { const res = await fetch(`${ADMIN_API_BASE}/admin/companies/${id}/status`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ status }), }) if (!res.ok) throw new Error('Action failed') await fetchCompanies() } catch (err: any) { setError(err.message) } finally { setActioning(null) } } return (

{dict.platform}

{copy.title}

setSearch(e.target.value)} />
{error &&
{error}
}
{loading ? ( ) : filtered.length === 0 ? ( ) : filtered.map((c) => ( ))}
{copy.company} {copy.slug} {copy.status} {copy.plan} {copy.fleet}
{copy.loading}
{copy.empty}

{c.name}

{c.contractSettings?.legalName && c.contractSettings.legalName !== c.name ? (

{copy.legalName}: {c.contractSettings.legalName}

) : null}

{c.email}

{c.slug} {c.status} {c.subscription?.plan ?? '—'} {c._count?.vehicles ?? 0} {copy.vehicles}
{copy.view} {c.status === 'ACTIVE' || c.status === 'TRIALING' ? ( ) : c.status === 'SUSPENDED' ? ( ) : null}
) }