import { useMutation } from "@tanstack/react-query"; import Link from "next/link"; import { Fragment } from "react"; import { InstallAppButton } from "@calcom/app-store/components"; import DisconnectIntegration from "@calcom/features/apps/components/DisconnectIntegration"; import DestinationCalendarSelector from "@calcom/features/calendars/DestinationCalendarSelector"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; import { Alert, Button, EmptyScreen, List, showToast, AppSkeletonLoader as SkeletonLoader, Switch, ShellSubHeading, } from "@calcom/ui"; import { FiArrowLeft, FiCalendar, FiPlus } from "@calcom/ui/components/icon"; import { QueryCell } from "@lib/QueryCell"; import AdditionalCalendarSelector from "@components/apps/AdditionalCalendarSelector"; import IntegrationListItem from "@components/apps/IntegrationListItem"; import SubHeadingTitleWithConnections from "@components/integrations/SubHeadingTitleWithConnections"; type Props = { onChanged: () => unknown | Promise; fromOnboarding?: boolean; destinationCalendarId?: string; }; function CalendarSwitch(props: { type: string; externalId: string; title: string; defaultSelected: boolean; destination?: boolean; }) { const { t } = useLocale(); const utils = trpc.useContext(); const mutation = useMutation< unknown, unknown, { isOn: boolean; } >( async ({ isOn }) => { const body = { integration: props.type, externalId: props.externalId, }; if (isOn) { const res = await fetch("/api/availability/calendar", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(body), }); if (!res.ok) { throw new Error("Something went wrong"); } } else { const res = await fetch("/api/availability/calendar", { method: "DELETE", headers: { "Content-Type": "application/json", }, body: JSON.stringify(body), }); if (!res.ok) { throw new Error("Something went wrong"); } } }, { async onSettled() { await utils.viewer.integrations.invalidate(); }, onError() { showToast(`Something went wrong when toggling "${props.title}""`, "error"); }, } ); return (
{ mutation.mutate({ isOn }); }} /> {!!props.destination && ( {t("adding_events_to")} )}
); } function CalendarList(props: Props) { const { t } = useLocale(); const query = trpc.viewer.integrations.useQuery({ variant: "calendar", onlyInstalled: false }); return ( ( {data.items.map((item) => ( ( )} onChanged={() => props.onChanged()} /> } /> ))} )} /> ); } // todo: @hariom extract this into packages/apps-store as "GeneralAppSettings" function ConnectedCalendarsList(props: Props) { const { t } = useLocale(); const query = trpc.viewer.connectedCalendars.useQuery(undefined, { suspense: true, }); const { fromOnboarding } = props; return ( null} success={({ data }) => { if (!data.connectedCalendars.length) { return null; } return ( {data.connectedCalendars.map((item) => ( {item.calendars ? ( }>
{!fromOnboarding && ( <>

{t("toggle_calendars_conflict")}

    {item.calendars.map((cal) => ( ))}
)}
) : ( {item.integration.name}:{" "} {t("calendar_error")} } iconClassName="h-10 w-10 ml-2 mr-1 mt-0.5" actions={
} /> )}
))}
); }} /> ); } export function CalendarListContainer(props: { heading?: boolean; fromOnboarding?: boolean }) { const { t } = useLocale(); const { heading = true, fromOnboarding } = props; const utils = trpc.useContext(); const onChanged = () => Promise.allSettled([ utils.viewer.integrations.invalidate( { variant: "calendar", onlyInstalled: true }, { exact: true, } ), utils.viewer.connectedCalendars.invalidate(), ]); const query = trpc.viewer.connectedCalendars.useQuery(); const installedCalendars = trpc.viewer.integrations.useQuery({ variant: "calendar", onlyInstalled: true }); const mutation = trpc.viewer.setDestinationCalendar.useMutation({ onSuccess: () => { utils.viewer.connectedCalendars.invalidate(); }, }); return ( } success={({ data }) => { return ( <> {!!data.connectedCalendars.length || !!installedCalendars.data?.items.length ? ( <> {heading && (
{!!data.connectedCalendars.length && (
)}
} />

{t("create_events_on")}

{t("set_calendar")}

)} ) : fromOnboarding ? ( <> {!!query.data?.connectedCalendars.length && ( } /> )} ) : ( {t(`connect_calendar_apps`)} } /> )} ); }} /> ); }