diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json index 6e306dcbfa..6eb5d6e481 100644 --- a/apps/web/public/static/locales/en/common.json +++ b/apps/web/public/static/locales/en/common.json @@ -2607,6 +2607,7 @@ "disable_email": "Disable email", "grant_admin_api": "Grant Admin API Access", "revoke_admin_api": "Revoke Admin API Access", + "add_calendar_label": "Add {{calendar}} Calendar", "apple_connect_atom_label": "Connect Apple Calendar", "apple_connect_atom_already_connected_label": "Connected Apple Calendar", "apple_connect_atom_loading_label": "Checking Apple Calendar", diff --git a/packages/platform/atoms/calendar-settings/wrappers/CalendarSettingsPlatformWrapper.tsx b/packages/platform/atoms/calendar-settings/wrappers/CalendarSettingsPlatformWrapper.tsx index 47d9712cf8..ad4ed1ee5e 100644 --- a/packages/platform/atoms/calendar-settings/wrappers/CalendarSettingsPlatformWrapper.tsx +++ b/packages/platform/atoms/calendar-settings/wrappers/CalendarSettingsPlatformWrapper.tsx @@ -1,5 +1,6 @@ import { DestinationCalendarSettingsPlatformWrapper } from "../../destination-calendar/index"; import { SelectedCalendarsSettingsPlatformWrapper } from "../../selected-calendars/index"; +import type { CalendarRedirectUrls } from "../../selected-calendars/wrappers/SelectedCalendarsSettingsPlatformWrapper"; type CalendarSettingsPlatformWrapperProps = { classNames?: { @@ -7,9 +8,13 @@ type CalendarSettingsPlatformWrapperProps = { destinationCalendarSettingsCustomClassnames?: string; selectedCalendarSettingsCustomClassnames?: string; }; + calendarRedirectUrls?: CalendarRedirectUrls; }; -export const CalendarSettingsPlatformWrapper = ({ classNames }: CalendarSettingsPlatformWrapperProps) => { +export const CalendarSettingsPlatformWrapper = ({ + classNames, + calendarRedirectUrls, +}: CalendarSettingsPlatformWrapperProps) => { return (
); diff --git a/packages/platform/atoms/connect/OAuthConnect.tsx b/packages/platform/atoms/connect/OAuthConnect.tsx index 046e21d0cd..99ec1e7e26 100644 --- a/packages/platform/atoms/connect/OAuthConnect.tsx +++ b/packages/platform/atoms/connect/OAuthConnect.tsx @@ -25,6 +25,7 @@ export type OAuthConnectProps = { tooltip?: ReactNode; tooltipSide?: "top" | "bottom" | "left" | "right"; isClickable?: boolean; + onSuccess?: () => void; }; export const OAuthConnect: FC< @@ -44,6 +45,7 @@ export const OAuthConnect: FC< tooltip, tooltipSide = "bottom", isClickable, + onSuccess, }) => { const { connect } = useConnect(calendar, redir); const { allowConnect, checked } = useCheck({ @@ -74,7 +76,10 @@ export const OAuthConnect: FC< tooltipSide={tooltipSide} tooltipOffset={10} className={cn("", !isDisabled && "cursor-pointer", className)} - onClick={() => connect()}> + onClick={() => { + connect(); + onSuccess?.(); + }}> {displayedLabel} diff --git a/packages/platform/atoms/connect/apple/AppleConnect.tsx b/packages/platform/atoms/connect/apple/AppleConnect.tsx index 78771c5f72..2d1d25bd4d 100644 --- a/packages/platform/atoms/connect/apple/AppleConnect.tsx +++ b/packages/platform/atoms/connect/apple/AppleConnect.tsx @@ -34,6 +34,7 @@ export const AppleConnect: FC>> = ({ tooltip, tooltipSide = "bottom", isClickable, + onSuccess, }) => { const { t } = useLocale(); const form = useForm({ @@ -60,6 +61,7 @@ export const AppleConnect: FC>> = ({ toast({ description: "Calendar credentials added successfully", }); + onSuccess?.(); } }, onError: (err) => { diff --git a/packages/platform/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsPlatformWrapper.tsx b/packages/platform/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsPlatformWrapper.tsx index 61764b26f6..43fb746e6c 100644 --- a/packages/platform/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsPlatformWrapper.tsx +++ b/packages/platform/atoms/selected-calendars/wrappers/SelectedCalendarsSettingsPlatformWrapper.tsx @@ -11,22 +11,37 @@ import { List, DisconnectIntegrationComponent, Alert, + Button, + Dropdown, + DropdownMenuContent, + DropdownMenuTrigger, } from "@calcom/ui"; +import { AppleConnect } from "../../connect/apple/AppleConnect"; import { useAddSelectedCalendar } from "../../hooks/calendars/useAddSelectedCalendar"; import { useDeleteCalendarCredentials } from "../../hooks/calendars/useDeleteCalendarCredentials"; import { useRemoveSelectedCalendar } from "../../hooks/calendars/useRemoveSelectedCalendar"; import { useConnectedCalendars } from "../../hooks/useConnectedCalendars"; +import { Connect } from "../../index"; import { AtomsWrapper } from "../../src/components/atoms-wrapper"; import { Switch } from "../../src/components/ui/switch"; import { useToast } from "../../src/components/ui/use-toast"; import { SelectedCalendarsSettings } from "../SelectedCalendarsSettings"; +export type CalendarRedirectUrls = { + google?: string; + outlook?: string; +}; + +type SelectedCalendarsSettingsPlatformWrapperProps = { + classNames?: string; + calendarRedirectUrls?: CalendarRedirectUrls; +}; + export const SelectedCalendarsSettingsPlatformWrapper = ({ classNames = "mx-5 mb-6", -}: { - classNames?: string; -}) => { + calendarRedirectUrls, +}: SelectedCalendarsSettingsPlatformWrapperProps) => { const { t } = useLocale(); const query = useConnectedCalendars({}); @@ -44,7 +59,7 @@ export const SelectedCalendarsSettingsPlatformWrapper = ({ return ( - + {data.connectedCalendars.map((connectedCalendar) => { if (!!connectedCalendar.calendars && connectedCalendar.calendars.length > 0) { @@ -121,7 +136,11 @@ export const SelectedCalendarsSettingsPlatformWrapper = ({ ); }; -const SelectedCalendarsSettingsHeading = () => { +const SelectedCalendarsSettingsHeading = ({ + calendarRedirectUrls, +}: { + calendarRedirectUrls?: CalendarRedirectUrls; +}) => { const { t } = useLocale(); return ( @@ -131,6 +150,11 @@ const SelectedCalendarsSettingsHeading = () => {

{t("check_for_conflicts")}

{t("select_calendars")}

+
+
+ +
+
); @@ -244,3 +268,62 @@ const PlatformCalendarSwitch = (props: ICalendarSwitchProps) => { ); }; + +const PlatformAdditionalCalendarSelector = ({ + calendarRedirectUrls, +}: { + calendarRedirectUrls?: CalendarRedirectUrls; +}) => { + const { t } = useLocale(); + const { refetch } = useConnectedCalendars({}); + + return ( + + + + + +
+
+ } + redir={calendarRedirectUrls?.google ?? window.location.href} + label={t("add_calendar_label", { calendar: "Google" })} + loadingLabel={t("add_calendar_label", { calendar: "Google" })} + alreadyConnectedLabel={t("add_calendar_label", { calendar: "Google" })} + className="hover:bg-subtle hover:text-default cursor-pointer border-none bg-inherit text-inherit" + /> +
+
+ } + redir={calendarRedirectUrls?.outlook ?? window.location.href} + label={t("add_calendar_label", { calendar: "Outlook" })} + loadingLabel={t("add_calendar_label", { calendar: "Outlook" })} + alreadyConnectedLabel={t("add_calendar_label", { calendar: "Outlook" })} + className="hover:bg-subtle hover:text-default cursor-pointer border-none bg-inherit text-inherit" + /> +
+
+ } + label={t("add_calendar_label", { calendar: "Apple" })} + loadingLabel={t("add_calendar_label", { calendar: "Apple" })} + alreadyConnectedLabel={t("add_calendar_label", { calendar: "Apple" })} + className="hover:bg-subtle hover:text-default cursor-pointer border-none bg-inherit text-inherit" + /> +
+
+
+
+ ); +};