Files
calendar/packages/lib/timezone.ts
T
4d8198d113 Filter Timezones by cities (#7118)
* Filter Timezones by cities

* Update yarn.lock

* Removes large endpoint from batching

* Adds caching for large response

* Updates test snapshots

---------

Co-authored-by: gitstart-calcom <gitstart@users.noreply.github.com>
Co-authored-by: zomars <zomars@me.com>
2023-03-02 13:42:41 -07:00

39 lines
1.4 KiB
TypeScript

import type { ITimezoneOption } from "react-timezone-select";
import { allTimezones } from "react-timezone-select";
import type { ICity } from "@calcom/ui/components/form/timezone-select";
function findPartialMatch(itemsToSearch: string, searchString: string) {
const searchItems = searchString.split(" ");
return searchItems.every((i) => itemsToSearch.toLowerCase().indexOf(i.toLowerCase()) >= 0);
}
function findFromCity(searchString: string, data: ICity[]): ICity[] {
if (searchString) {
const cityLookup = data.filter((o) => findPartialMatch(o.city, searchString));
return cityLookup?.length ? cityLookup : [];
}
return [];
}
export const filterByCities = (tz: string, data: ICity[]): ICity[] => {
const cityLookup = findFromCity(tz, data);
return cityLookup.map(({ city, timezone }) => ({ city, timezone }));
};
export const addCitiesToDropdown = (cities: ICity[]) => {
const cityTimezones = cities?.reduce((acc: { [key: string]: string }, city: ICity) => {
if (Object.keys(allTimezones).includes(city.timezone)) {
acc[city.timezone] = city.city;
}
return acc;
}, {});
return cityTimezones || {};
};
export const handleOptionLabel = (option: ITimezoneOption, cities: ICity[]) => {
const timezoneValue = option.label.split(")")[0].replace("(", " ").replace("T", "T ");
const cityName = option.label.split(") ")[1];
return cities.length > 0 ? `${cityName}${timezoneValue}` : `${option.value}${timezoneValue}`;
};