diff --git a/packages/app-store/office365calendar/lib/CalendarService.ts b/packages/app-store/office365calendar/lib/CalendarService.ts index ba908b1a89..29bd859c76 100644 --- a/packages/app-store/office365calendar/lib/CalendarService.ts +++ b/packages/app-store/office365calendar/lib/CalendarService.ts @@ -1,5 +1,6 @@ import type { Calendar as OfficeCalendar, User, Event } from "@microsoft/microsoft-graph-types-beta"; import type { DefaultBodyType } from "msw"; +import { findIana } from "windows-iana"; import { MSTeamsLocationType } from "@calcom/app-store/constants"; import dayjs from "@calcom/dayjs"; @@ -688,20 +689,58 @@ export default class Office365CalendarService implements Calendar { return response.json(); } + /** + * Gets the main timezone from Office365 mailbox settings. + * Handles both legacy string format and new Graph API object format due to API evolution. + * Legacy format: returns string timezone as-is (preserves existing behavior) + * New format: converts Windows timezone from {"value": "Windows Timezone"} to IANA format + */ async getMainTimeZone(): Promise { try { const response = await this.fetcher(`${await this.getUserEndpoint()}/mailboxSettings/timeZone`); - const timezone = await handleErrorsJson(response); + const timezoneResponse = await handleErrorsJson(response); - if (!timezone || typeof timezone !== "string") { + if (typeof timezoneResponse === "object" && timezoneResponse !== null && "value" in timezoneResponse) { + const windowsTimezoneName = timezoneResponse.value; + this.log.info("timezone found in outlook mailbox settings (new format)", { + windowsTimezoneName, + }); + + try { + const ianaTimezone = findIana(windowsTimezoneName); + if (ianaTimezone && ianaTimezone.length > 0) { + const convertedTimezone = ianaTimezone[0]; + this.log.info("Successfully converted Windows timezone to IANA", { + windowsTimezoneName, + convertedTimezone, + }); + return convertedTimezone; + } else { + this.log.warn("Could not convert Windows timezone to IANA, using original value", { + windowsTimezoneName, + }); + return windowsTimezoneName; + } + } catch (conversionError) { + this.log.warn("Error converting Windows timezone to IANA, using original value", { + windowsTimezoneName, + conversionError, + }); + return windowsTimezoneName; + } + } + + if (!timezoneResponse || typeof timezoneResponse !== "string") { this.log.warn("No timezone found in outlook mailbox settings, defaulting to Europe/London", { - timezone, + timezoneResponse, }); return "Europe/London"; } - this.log.info("timezone found in outlook mailbox settings", { timezone }); - return timezone; + this.log.info("timezone found in outlook mailbox settings (legacy format)", { + timezone: timezoneResponse, + }); + return timezoneResponse; } catch (error) { this.log.error("Error getting main timezone from Office365 Calendar", { error }); throw error; diff --git a/packages/app-store/office365calendar/package.json b/packages/app-store/office365calendar/package.json index 419c194fb1..098b32572e 100644 --- a/packages/app-store/office365calendar/package.json +++ b/packages/app-store/office365calendar/package.json @@ -8,7 +8,8 @@ "dependencies": { "@calcom/lib": "workspace:*", "@calcom/prisma": "workspace:*", - "msw": "^2.7.0" + "msw": "^2.7.0", + "windows-iana": "^5.1.0" }, "devDependencies": { "@calcom/types": "workspace:*" diff --git a/packages/platform/examples/base/src/pages/_app.tsx b/packages/platform/examples/base/src/pages/_app.tsx index d35433c584..2c78641a85 100644 --- a/packages/platform/examples/base/src/pages/_app.tsx +++ b/packages/platform/examples/base/src/pages/_app.tsx @@ -73,7 +73,7 @@ export default function App({ Component, pageProps }: AppProps) { } }, []); useEffect(() => { - if (!!selectedUser) { + if (selectedUser) { setAccessToken(selectedUser.accessToken); setUserEmail(selectedUser.email); setUsername(selectedUser.username); @@ -83,13 +83,15 @@ export default function App({ Component, pageProps }: AppProps) { return (
{options.length > 0 && ( - opt?.email.includes("lauris"))} + onChange={(opt: TUser | null) => setSelectedUser(opt)} + options={options} + /> )} {email ? ( <> diff --git a/yarn.lock b/yarn.lock index ef0d1aaaad..18cc484d12 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3750,6 +3750,7 @@ __metadata: "@calcom/prisma": "workspace:*" "@calcom/types": "workspace:*" msw: ^2.7.0 + windows-iana: ^5.1.0 languageName: unknown linkType: soft @@ -49166,6 +49167,13 @@ __metadata: languageName: node linkType: hard +"windows-iana@npm:^5.1.0": + version: 5.1.0 + resolution: "windows-iana@npm:5.1.0" + checksum: 0dc9ababde5f839e83a4bcd448347d8da563efd9e23ce61ac777e9992774ff85de2a9f343f87b80b37b181742fe4d783cff3ba39191cfedb6357ae7d5f58aadc + languageName: node + linkType: hard + "winston-transport@npm:^4.5.0, winston-transport@npm:^4.9.0": version: 4.9.0 resolution: "winston-transport@npm:4.9.0"