import { useState, type FormEvent } from 'react';
import { useNavigate } from 'react-router-dom';
import { useCreateLocation, useLocations } from '@/api/referentiel';
import { usePermissions } from '@/auth/use-permissions';
import { CarteGeo } from '@/components/carte-geo';
import { Button } from '@/components/ui/button';
import { Modale } from '@/components/ui/modale';
import { construireArbre } from '@/lib/lieux';
/** Écran 1 des maquettes R1 : liste dense + carte OSM (positions PostGIS). */
export default function PageSites() {
const navigate = useNavigate();
const { data: locations } = useLocations();
const { can } = usePermissions();
const [modale, setModale] = useState(false);
const sites = construireArbre(locations ?? []);
const totalAppareils = sites.reduce((n, s) => n + s.assetCount, 0);
return (
<>
Sites
{sites.length} sites · {totalAppareils} ascenseurs
{can('LOCATIONS', 'create') ? (
) : null}
| Site |
Ascenseurs |
Gardien |
Zones |
{sites.map((site) => (
navigate(`/sites/${site.id}`)}
style={{ cursor: 'pointer' }}
>
|
{site.name}
{[site.address, site.city].filter(Boolean).join(', ') || '—'}
|
{site.assetCount} |
{site.guardianName ?? '—'} |
{site.zones.length} |
))}
s.latitude != null && s.longitude != null)
.map((s) => ({
id: s.id,
latitude: s.latitude!,
longitude: s.longitude!,
libelle: `${s.name} · ${s.assetCount}`,
onClick: () => navigate(`/sites/${s.id}`),
}))}
/>
>
);
}
function NouveauSite({
ouverte,
surFermeture,
}: {
ouverte: boolean;
surFermeture: (o: boolean) => void;
}) {
const creation = useCreateLocation();
const navigate = useNavigate();
const [position, setPosition] = useState<{ lat: number; lng: number } | null>(null);
const surEnvoi = (e: FormEvent) => {
e.preventDefault();
const donnees = new FormData(e.currentTarget);
creation.mutate(
{
name: String(donnees.get('name')),
address: String(donnees.get('address')) || undefined,
city: String(donnees.get('city')) || undefined,
guardianName: String(donnees.get('guardianName')) || undefined,
guardianPhone: String(donnees.get('guardianPhone')) || undefined,
latitude: position?.lat,
longitude: position?.lng,
},
{
onSuccess: (site) => {
surFermeture(false);
navigate(`/sites/${site.id}`);
},
},
);
};
return (
);
}