Files
Investidor-V2/resources/js/components/territory-geometry-preview.tsx
T

122 lines
4.8 KiB
TypeScript

import InteractiveInvestmentMap from './interactive-investment-map';
import {
useTerritoryGeometry,
type TerritoryGeometryContext,
} from './use-territory-geometry';
const noPoints: [] = [];
export default function TerritoryGeometryPreview({
territoryId,
management = false,
endpoint: suppliedEndpoint,
label = 'Cobertura cartográfica da seleção',
}: {
territoryId?: string;
management?: boolean;
endpoint?: string;
label?: string;
}) {
const { context, error } = useTerritoryGeometry(
territoryId,
suppliedEndpoint ??
(management
? '/management/territory-geometries'
: '/api/v1/investment/territory-geometries'),
);
if (!territoryId) return null;
return (
<TerritoryGeometryDetails
context={context}
error={error}
label={label}
renderMap
/>
);
}
export function TerritoryGeometryDetails({
context,
error,
label = 'Cobertura cartográfica da selecção',
renderMap = false,
showSources = true,
}: {
context: TerritoryGeometryContext | null;
error: string;
label?: string;
renderMap?: boolean;
showSources?: boolean;
}) {
return (
<section className="space-y-2 md:col-span-full" aria-label={label}>
<p>Território selecionado no cadastro.</p>
{error && <p role="alert">{error}</p>}
{!context && !error && <p role="status">A consultar geometria…</p>}
{context && (
<>
<p role="status">
{context.selected_geometry_available
? 'Limite administrativo disponível para este território.'
: 'Sem limite administrativo acessível para este território neste perfil.'}
</p>
{!context.selected_geometry_available &&
context.areas.length > 0 && (
<p role="note">
O mapa mostra outros limites da hierarquia como
contexto. Estes limites não representam o
território seleccionado.
</p>
)}
<p>
{context.context_geometry_count} limites disponíveis na
hierarquia consultada. São contexto administrativo, não
perímetro nem disponibilidade de investimento. A edição
e a atualidade jurídica são informações distintas.
</p>
{context.child_coverage?.location_type && (
<p role="status">
Subdivisões do nível imediatamente inferior com
limite nesta resposta:{' '}
{context.child_coverage.represented_count} de{' '}
{context.child_coverage.registered_count}{' '}
referências acessíveis. As restantes não têm limite
apresentado nesta consulta; isso não significa
inexistência do território.
</p>
)}
{context.truncated && (
<p role="alert">
Consulta limitada a 100 geometrias e 500
subdivisões; cobertura incompleta.
</p>
)}
{renderMap && context.areas.length > 0 && (
<InteractiveInvestmentMap
points={noPoints}
areas={context.areas}
contextOnly
/>
)}
{showSources && (
<ul>
{context.areas.map((area, index) => (
<li key={index}>
{area.title} ·{' '}
{area.selected_territory
? 'Território seleccionado'
: area.child_territory
? 'Subdivisão do território seleccionado'
: 'Contexto de nível superior'}{' '}
· Fonte:{' '}
{area.source_reference ?? 'Não indicada'} ·
Edição: {area.source_date ?? 'Não indicada'}
</li>
))}
</ul>
)}
</>
)}
</section>
);
}