'use client'; import { useState, useEffect } from 'react'; import { getAllOrganizations } from '@/lib/api/admin'; import { createOrganization, updateOrganization } from '@/lib/api/organizations'; interface Organization { id: string; name: string; type: string; scac?: string; siren?: string; eori?: string; contact_phone?: string; contact_email?: string; address: { street: string; city: string; state?: string; postalCode: string; country: string; }; logoUrl?: string; isActive: boolean; createdAt: string; } export default function AdminOrganizationsPage() { const [organizations, setOrganizations] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [selectedOrg, setSelectedOrg] = useState(null); const [showCreateModal, setShowCreateModal] = useState(false); const [showEditModal, setShowEditModal] = useState(false); // Form state const [formData, setFormData] = useState<{ name: string; type: string; scac: string; siren: string; eori: string; contact_phone: string; contact_email: string; address: { street: string; city: string; state?: string; postalCode: string; country: string; }; logoUrl: string; }>({ name: '', type: 'FREIGHT_FORWARDER', scac: '', siren: '', eori: '', contact_phone: '', contact_email: '', address: { street: '', city: '', state: '', postalCode: '', country: 'FR', }, logoUrl: '', }); useEffect(() => { fetchOrganizations(); }, []); const fetchOrganizations = async () => { try { setLoading(true); const response = await getAllOrganizations(); setOrganizations(response.organizations || []); setError(null); } catch (err: any) { setError(err.message || 'Failed to load organizations'); } finally { setLoading(false); } }; const handleCreate = async (e: React.FormEvent) => { e.preventDefault(); try { // Transform formData to match API expected format const apiData = { name: formData.name, type: formData.type as any, // OrganizationType address_street: formData.address.street, address_city: formData.address.city, address_postal_code: formData.address.postalCode, address_country: formData.address.country, contact_email: formData.contact_email || undefined, contact_phone: formData.contact_phone || undefined, logo_url: formData.logoUrl || undefined, }; await createOrganization(apiData); await fetchOrganizations(); setShowCreateModal(false); resetForm(); } catch (err: any) { alert(err.message || 'Failed to create organization'); } }; const handleUpdate = async (e: React.FormEvent) => { e.preventDefault(); if (!selectedOrg) return; try { await updateOrganization(selectedOrg.id, formData); await fetchOrganizations(); setShowEditModal(false); setSelectedOrg(null); resetForm(); } catch (err: any) { alert(err.message || 'Failed to update organization'); } }; const resetForm = () => { setFormData({ name: '', type: 'FREIGHT_FORWARDER', scac: '', siren: '', eori: '', contact_phone: '', contact_email: '', address: { street: '', city: '', state: '', postalCode: '', country: 'FR', }, logoUrl: '', }); }; const openEditModal = (org: Organization) => { setSelectedOrg(org); setFormData({ name: org.name, type: org.type, scac: org.scac || '', siren: org.siren || '', eori: org.eori || '', contact_phone: org.contact_phone || '', contact_email: org.contact_email || '', address: org.address, logoUrl: org.logoUrl || '', }); setShowEditModal(true); }; if (loading) { return (

Loading organizations...

); } return (
{/* Header */}

Organization Management

Manage all organizations in the system

{/* Error Message */} {error && (
{error}
)} {/* Organizations Grid */}
{organizations.map(org => (

{org.name}

{org.type.replace('_', ' ')}
{org.isActive ? 'Active' : 'Inactive'}
{org.scac && (
SCAC: {org.scac}
)} {org.siren && (
SIREN: {org.siren}
)} {org.contact_email && (
Email: {org.contact_email}
)}
Location: {org.address.city}, {org.address.country}
))}
{/* Create/Edit Modal */} {(showCreateModal || showEditModal) && (

{showCreateModal ? 'Create New Organization' : 'Edit Organization'}

setFormData({ ...formData, name: e.target.value })} className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:border-blue-500 focus:ring-blue-500 focus:outline-none" />
{formData.type === 'CARRIER' && (
setFormData({ ...formData, scac: e.target.value.toUpperCase() })} className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:border-blue-500 focus:ring-blue-500 focus:outline-none" />
)}
setFormData({ ...formData, siren: e.target.value })} className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:border-blue-500 focus:ring-blue-500 focus:outline-none" />
setFormData({ ...formData, eori: e.target.value })} className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:border-blue-500 focus:ring-blue-500 focus:outline-none" />
setFormData({ ...formData, contact_phone: e.target.value })} className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:border-blue-500 focus:ring-blue-500 focus:outline-none" />
setFormData({ ...formData, contact_email: e.target.value })} className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:border-blue-500 focus:ring-blue-500 focus:outline-none" />
setFormData({ ...formData, address: { ...formData.address, street: e.target.value } })} className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:border-blue-500 focus:ring-blue-500 focus:outline-none" />
setFormData({ ...formData, address: { ...formData.address, city: e.target.value } })} className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:border-blue-500 focus:ring-blue-500 focus:outline-none" />
setFormData({ ...formData, address: { ...formData.address, postalCode: e.target.value } })} className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:border-blue-500 focus:ring-blue-500 focus:outline-none" />
setFormData({ ...formData, address: { ...formData.address, state: e.target.value } })} className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:border-blue-500 focus:ring-blue-500 focus:outline-none" />
setFormData({ ...formData, address: { ...formData.address, country: e.target.value.toUpperCase() } })} className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:border-blue-500 focus:ring-blue-500 focus:outline-none" />
setFormData({ ...formData, logoUrl: e.target.value })} className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:border-blue-500 focus:ring-blue-500 focus:outline-none" />
)}
); }