2023-05-09 19:27:05 +00:00
|
|
|
export const cityTimezonesHandler = async () => {
|
2023-04-25 22:39:47 +00:00
|
|
|
/**
|
|
|
|
* 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;
|
|
|
|
};
|