// public/js/map/activities/activitySource.js // =================================== // ACTIVITY SOURCE // =================================== (() => { "use strict"; const SOURCE_ID = "activities"; const CLUSTER_RADIUS = 80; // =============================== // CREATE SOURCE // =============================== function createActivitySource( map, features = [], ) { if (!map) { return null; } if (!map.isStyleLoaded()) { console.log( "[ActivitySource] create rimandato: style non pronto", ); return null; } const existingSource = map.getSource(SOURCE_ID); if (existingSource) { existingSource.setData({ type: "FeatureCollection", features, }); return existingSource; } const data = { type: "FeatureCollection", features, }; console.log( "[ActivitySource] creo source activities", { features: features.length, }, ); map.addSource(SOURCE_ID, { type: "geojson", data, cluster: true, clusterRadius: CLUSTER_RADIUS, }); console.log( "[ActivitySource] source activities creata", { source: !!map.getSource(SOURCE_ID), }, ); return map.getSource(SOURCE_ID); } // =============================== // UPDATE SOURCE // =============================== function updateActivitySource( map, features = [], ) { if (!map) { return null; } console.log( "[ActivitySource.update]", { features: features.length, styleLoaded: map.isStyleLoaded(), sourceExists: !!map.getSource("activities"), } ) if (!map.isStyleLoaded()) { console.log( "[ActivitySource] update rimandato: style non pronto", ); return null; } const data = { type: "FeatureCollection", features, }; const source = map.getSource(SOURCE_ID); // -------------------------------- // SOURCE ESISTENTE // -------------------------------- if (source) { source.setData(data); console.log( "[ActivitySource] source aggiornata", { features: features.length, }, ); return source; } // -------------------------------- // SOURCE NON ESISTENTE // -------------------------------- return createActivitySource( map, features, ); } // =============================== // GET SOURCE // =============================== function getActivitySource(map) { if (!map) { return null; } return ( map.getSource(SOURCE_ID) || null ); } // =============================== // GET FEATURES // =============================== function getActivitySourceFeatures(map) { const source = getActivitySource(map); if (!source) { return []; } return source._data?.features || []; } // =============================== // GET CLUSTERS // =============================== function getActivitySourceClusters(map) { if (!map) { return []; } if (!map.getSource(SOURCE_ID)) { return []; } return map.querySourceFeatures( SOURCE_ID, { filter: [ "has", "point_count", ], }, ); } // =============================== // GET POINTS // =============================== function getActivitySourcePoints(map) { if (!map) { return []; } if (!map.getSource(SOURCE_ID)) { return []; } return map.querySourceFeatures( SOURCE_ID, { filter: [ "!", ["has", "point_count"], ], }, ); } // =============================== // PUBLIC API // =============================== window.ActivitySource = { create: createActivitySource, update: updateActivitySource, get: getActivitySource, getFeatures: getActivitySourceFeatures, getClusters: getActivitySourceClusters, getPoints: getActivitySourcePoints, }; })();