diff --git a/apps/web/playwright/availability.e2e.ts b/apps/web/playwright/availability.e2e.ts index 961426022b..df923e5c66 100644 --- a/apps/web/playwright/availability.e2e.ts +++ b/apps/web/playwright/availability.e2e.ts @@ -179,7 +179,7 @@ test.describe("Availablity", () => { .locator("svg") .click(); - await page.locator("[id=timeZone-lg-viewport]").fill("bras"); + await page.locator("[id=timeZone-lg-viewport]").fill("Braz"); await page.getByTestId("select-option-America/Sao_Paulo").click(); await submitAndWaitForResponse(page, "/api/trpc/availability/schedule.update?batch=1"); await page.getByTestId("add-override").click(); diff --git a/apps/web/test/lib/getTimezone.test.ts b/apps/web/test/lib/getTimezone.test.ts index ff2be79b49..10c025aedd 100644 --- a/apps/web/test/lib/getTimezone.test.ts +++ b/apps/web/test/lib/getTimezone.test.ts @@ -23,6 +23,66 @@ const cityData = [ city: "San Francisco", timezone: "America/Los_Angeles", }, + { + city: "Eastern Time - US & Canada", + timezone: "America/New_York", + }, + { + city: "Pacific Time - US & Canada", + timezone: "America/Los_Angeles", + }, + { + city: "Central Time - US & Canada", + timezone: "America/Chicago", + }, + { + city: "Mountain Time - US & Canada", + timezone: "America/Denver", + }, + { + city: "Atlantic Time - Canada", + timezone: "America/Halifax", + }, + { + city: "Eastern European Time", + timezone: "Europe/Bucharest", + }, + { + city: "Central European Time", + timezone: "Europe/Berlin", + }, + { + city: "Western European Time", + timezone: "Europe/London", + }, + { + city: "Australian Eastern Time", + timezone: "Australia/Sydney", + }, + { + city: "Japan Standard Time", + timezone: "Asia/Tokyo", + }, + { + city: "India Standard Time", + timezone: "Asia/Kolkata", + }, + { + city: "Gulf Standard Time", + timezone: "Asia/Dubai", + }, + { + city: "South Africa Standard Time", + timezone: "Africa/Johannesburg", + }, + { + city: "Brazil Time", + timezone: "America/Sao_Paulo", + }, + { + city: "Hawaii-Aleutian Standard Time", + timezone: "Pacific/Honolulu", + }, ]; const option = { @@ -49,37 +109,50 @@ describe("getTimezone", () => { it("should filter cities for a valid city name", () => { expect(filterByCities("San Francisco", cityData)).toMatchInlineSnapshot(` - [ - { - "city": "San Francisco", - "timezone": "America/Argentina/Cordoba", - }, - { - "city": "San Francisco de Macoris", - "timezone": "America/Santo_Domingo", - }, - { - "city": "San Francisco Gotera", - "timezone": "America/El_Salvador", - }, - { - "city": "San Francisco", - "timezone": "America/Los_Angeles", - }, - ] - `); + [ + { + "city": "San Francisco", + "timezone": "America/Argentina/Cordoba", + }, + { + "city": "San Francisco de Macoris", + "timezone": "America/Santo_Domingo", + }, + { + "city": "San Francisco Gotera", + "timezone": "America/El_Salvador", + }, + { + "city": "San Francisco", + "timezone": "America/Los_Angeles", + }, + ] + `); }); it("should return appropriate timezone(s) for a given city name array", () => { expect(addCitiesToDropdown(cityData)).toMatchInlineSnapshot(` - { - "America/Argentina/Cordoba": "San Francisco", - "America/El_Salvador": "San Francisco Gotera", - "America/Los_Angeles": "San Francisco", - "America/Santo_Domingo": "San Francisco de Macoris", - "America/Sao_Paulo": "Sao Francisco do Sul", - } - `); + { + "Africa/Johannesburg": "South Africa Standard Time", + "America/Argentina/Cordoba": "San Francisco", + "America/Chicago": "Central Time - US & Canada", + "America/Denver": "Mountain Time - US & Canada", + "America/El_Salvador": "San Francisco Gotera", + "America/Halifax": "Atlantic Time - Canada", + "America/Los_Angeles": "Pacific Time - US & Canada", + "America/New_York": "Eastern Time - US & Canada", + "America/Santo_Domingo": "San Francisco de Macoris", + "America/Sao_Paulo": "Brazil Time", + "Asia/Dubai": "Gulf Standard Time", + "Asia/Kolkata": "India Standard Time", + "Asia/Tokyo": "Japan Standard Time", + "Australia/Sydney": "Australian Eastern Time", + "Europe/Berlin": "Central European Time", + "Europe/Bucharest": "Eastern European Time", + "Europe/London": "Western European Time", + "Pacific/Honolulu": "Hawaii-Aleutian Standard Time", + } + `); }); it("should render city name as option label if cityData is not empty", () => { diff --git a/packages/features/additionalTimezones/additionalTimezones.json b/packages/features/additionalTimezones/additionalTimezones.json new file mode 100644 index 0000000000..5549cfb9dd --- /dev/null +++ b/packages/features/additionalTimezones/additionalTimezones.json @@ -0,0 +1,64 @@ +{ + "timezones": [ + { + "name": "Eastern Time - US & Canada", + "identifier": "America/New_York" + }, + { + "name": "Pacific Time - US & Canada", + "identifier": "America/Los_Angeles" + }, + { + "name": "Central Time - US & Canada", + "identifier": "America/Chicago" + }, + { + "name": "Mountain Time - US & Canada", + "identifier": "America/Denver" + }, + { + "name": "Atlantic Time - Canada", + "identifier": "America/Halifax" + }, + { + "name": "Eastern European Time", + "identifier": "Europe/Bucharest" + }, + { + "name": "Central European Time", + "identifier": "Europe/Berlin" + }, + { + "name": "Western European Time", + "identifier": "Europe/London" + }, + { + "name": "Australian Eastern Time", + "identifier": "Australia/Sydney" + }, + { + "name": "Japan Standard Time", + "identifier": "Asia/Tokyo" + }, + { + "name": "India Standard Time", + "identifier": "Asia/Kolkata" + }, + { + "name": "Gulf Standard Time", + "identifier": "Asia/Dubai" + }, + { + "name": "South Africa Standard Time", + "identifier": "Africa/Johannesburg" + }, + { + "name": "Brazil Time", + "identifier": "America/Sao_Paulo" + }, + { + "name": "Hawaii-Aleutian Standard Time", + "identifier": "Pacific/Honolulu" + } + ] +} diff --git a/packages/features/additionalTimezones/additionalTimezones.ts b/packages/features/additionalTimezones/additionalTimezones.ts new file mode 100644 index 0000000000..84f15c9d84 --- /dev/null +++ b/packages/features/additionalTimezones/additionalTimezones.ts @@ -0,0 +1,10 @@ +import * as additionalTimezones from "./additionalTimezones.json"; + +export interface Timezone { + name: string; + identifier: string; +} + +export const timezones: Timezone[] = additionalTimezones.timezones; + +export default additionalTimezones; diff --git a/packages/lib/timezone.ts b/packages/lib/timezone.ts index d4820943b0..92ac08f175 100644 --- a/packages/lib/timezone.ts +++ b/packages/lib/timezone.ts @@ -3,6 +3,7 @@ import type { ITimezoneOption } from "react-timezone-select"; import dayjs from "@calcom/dayjs"; import type { ICity } from "@calcom/ui/components/form/timezone-select"; +import { timezones as additionalTimezones } from "../features/additionalTimezones/additionalTimezones"; import isProblematicTimezone from "./isProblematicTimezone"; function findPartialMatch(itemsToSearch: string, searchString: string) { @@ -30,6 +31,11 @@ export const addCitiesToDropdown = (cities: ICity[]) => { } return acc; }, {}); + + additionalTimezones.forEach((tz) => { + cityTimezones[tz.identifier] = tz.name; + }); + return cityTimezones || {}; };