2025-06-26 17:21:23 -04:00
|
|
|
// Data loader utility for fetching JSON data with cache-busting
|
|
|
|
|
|
2026-04-08 21:31:56 -04:00
|
|
|
import { withBasePath } from './base-path.mjs';
|
|
|
|
|
|
2025-06-26 17:21:23 -04:00
|
|
|
let dataCache = {};
|
|
|
|
|
|
|
|
|
|
// Load data with version-based cache busting
|
|
|
|
|
const loadData = async (dataType, version = '') => {
|
|
|
|
|
if (dataCache[dataType]) {
|
|
|
|
|
return dataCache[dataType];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
2026-04-08 21:31:56 -04:00
|
|
|
const url = withBasePath(`data/${dataType}.json${version ? `?_=${version}` : ''}`);
|
2025-06-26 17:21:23 -04:00
|
|
|
const response = await fetch(url);
|
|
|
|
|
|
|
|
|
|
if (!response.ok) {
|
|
|
|
|
throw new Error(`Failed to load ${dataType}: ${response.status}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const data = await response.json();
|
|
|
|
|
dataCache[dataType] = data;
|
|
|
|
|
return data;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error(`Error loading ${dataType}:`, error);
|
|
|
|
|
throw error;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Load all data types
|
|
|
|
|
const loadAllData = async (version = '') => {
|
|
|
|
|
const [travelCities, regionalCities, stationInfo] = await Promise.all([
|
|
|
|
|
loadData('travelcities', version),
|
|
|
|
|
loadData('regionalcities', version),
|
|
|
|
|
loadData('stations', version),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// Set global variables for backward compatibility
|
|
|
|
|
window.TravelCities = travelCities;
|
|
|
|
|
window.RegionalCities = regionalCities;
|
|
|
|
|
window.StationInfo = stationInfo;
|
|
|
|
|
|
|
|
|
|
return { travelCities, regionalCities, stationInfo };
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Clear cache (useful for development)
|
|
|
|
|
const clearDataCache = () => {
|
|
|
|
|
dataCache = {};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export {
|
|
|
|
|
loadData,
|
|
|
|
|
loadAllData,
|
|
|
|
|
clearDataCache,
|
|
|
|
|
};
|