analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
81 lines (80 loc) • 2.69 kB
JavaScript
// src/hooks/useMapData.ts
import { useState, useEffect, useCallback, useRef } from "react";
function transformGeoJSONFeatures(geoJSON) {
return geoJSON.features.map((feature) => ({
id: feature.properties?.GEOCODIGO || feature.properties?.NOME || "",
name: feature.properties?.NOME || "",
groupName: feature.properties?.NRE ? `NRE ${feature.properties.NRE}` : void 0,
value: feature.properties?.value ?? 0,
accessCount: feature.properties?.totalAccess ?? 0,
geoJson: feature,
isManagedRegion: feature.properties?.isManagedRegion !== false,
accessBreakdown: feature.properties?.accessBreakdown
}));
}
function transformRegionData(region) {
if (!region.geoJson) {
return null;
}
return {
id: region.schoolGroupId,
name: region.schoolGroupName,
code: region.schoolGroupCode,
value: region.value,
accessCount: region.totalAccess,
geoJson: region.geoJson,
isManagedRegion: region.isManagedRegion !== false
};
}
var createUseMapData = (fetchMapDataApi) => {
return (filters) => {
const filtersRef = useRef(filters);
filtersRef.current = filters;
const filtersKey = JSON.stringify(filters);
const fetchIdRef = useRef(0);
const [data, setData] = useState([]);
const [bounds, setBounds] = useState(null);
const [geoJSON, setGeoJSON] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
const fetchData = useCallback(async () => {
const fetchId = ++fetchIdRef.current;
setLoading(true);
setError(null);
try {
const mapData = await fetchMapDataApi(filtersRef.current);
if (fetchIdRef.current !== fetchId) return;
const transformedRegions = mapData.data.geoJSON ? transformGeoJSONFeatures(mapData.data.geoJSON) : mapData.data.regions.map(transformRegionData).filter((r) => r !== null);
setData(transformedRegions);
setBounds(mapData.data.bounds);
setGeoJSON(mapData.data.geoJSON ?? null);
} catch (err) {
if (fetchIdRef.current !== fetchId) return;
const errorMessage = err instanceof Error ? err.message : "Erro ao carregar dados do mapa";
setError(errorMessage);
setData([]);
setBounds(null);
setGeoJSON(null);
} finally {
if (fetchIdRef.current === fetchId) {
setLoading(false);
}
}
}, [filtersKey]);
useEffect(() => {
fetchData();
}, [fetchData]);
return {
data,
bounds,
geoJSON,
loading,
error,
refetch: fetchData
};
};
};
export {
createUseMapData
};
//# sourceMappingURL=chunk-FXOZSHRV.mjs.map