cal.pub0.org/packages/trpc/server/routers/publicViewer/cityTimezones.handler.ts

31 lines
1.3 KiB
TypeScript
Raw Normal View History

export const cityTimezonesHandler = async () => {
/**
* Lazy loads third party dependency to avoid loading 1.5Mb for ALL tRPC procedures.
* Thanks @roae for the tip 🙏
**/
const allCities = await import("city-timezones").then((mod) => mod.cityMapping);
/**
* Filter out all cities that have the same "city" key and only use the one with the highest population.
* This way we return a new array of cities without running the risk of having more than one city
* with the same name on the dropdown and prevent users from mistaking the time zone of the desired city.
*/
const topPopulatedCities: { [key: string]: { city: string; timezone: string; pop: number } } = {};
allCities.forEach((city) => {
const cityPopulationCount = city.pop;
if (
topPopulatedCities[city.city]?.pop === undefined ||
cityPopulationCount > topPopulatedCities[city.city].pop
) {
topPopulatedCities[city.city] = { city: city.city, timezone: city.timezone, pop: city.pop };
}
});
const uniqueCities = Object.values(topPopulatedCities);
/** Add specific overries in here */
uniqueCities.forEach((city) => {
if (city.city === "London") city.timezone = "Europe/London";
if (city.city === "Londonderry") city.city = "London";
});
return uniqueCities;
};