import { useState } from "react"; import { Dialog } from "@calcom/features/components/controlled-dialog"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; import type { AppRouter } from "@calcom/trpc/types/server/routers/_app"; import { Button } from "@calcom/ui/components/button"; import { ConfirmationDialogContent } from "@calcom/ui/components/dialog"; import { Dropdown, DropdownItem, DropdownMenuContent, DropdownMenuLabel, DropdownMenuItem, DropdownMenuTrigger, } from "@calcom/ui/components/dropdown"; import { showToast } from "@calcom/ui/components/toast"; import type { inferRouterOutputs } from "@trpc/server"; type RouterOutput = inferRouterOutputs; type Credentials = RouterOutput["viewer"]["apps"]["appCredentialsByType"]["credentials"]; interface Props { credentials: Credentials; onSuccess?: () => void; } export function MultiDisconnectIntegration({ credentials, onSuccess }: Props) { const { t } = useLocale(); const utils = trpc.useUtils(); const [credentialToDelete, setCredentialToDelete] = useState<{ id: number; teamId: number | null; name: string | null; } | null>(null); const [confirmationDialogOpen, setConfirmationDialogOpen] = useState(false); const mutation = trpc.viewer.deleteCredential.useMutation({ onSuccess: () => { showToast(t("app_removed_successfully"), "success"); onSuccess && onSuccess(); setConfirmationDialogOpen(false); }, onError: () => { showToast(t("error_removing_app"), "error"); setConfirmationDialogOpen(false); }, async onSettled() { await utils.viewer.connectedCalendars.invalidate(); await utils.viewer.apps.integrations.invalidate(); }, }); const getUserDisplayName = (user: (typeof credentials)[number]["user"]) => { if (!user) return null; // Check if 'name' property exists on user if ("name" in user) return user.name; // Otherwise use email if available if ("email" in user) return user.email; return null; }; return ( <>
{t("disconnect_app_from")}
{credentials.map((cred) => ( { setCredentialToDelete({ id: cred.id, teamId: cred.teamId, name: cred.team?.name || getUserDisplayName(cred.user) || null, }); setConfirmationDialogOpen(true); }}>
{cred.team?.name || getUserDisplayName(cred.user) || t("unnamed")}
))}
{ if (credentialToDelete) { mutation.mutate({ id: credentialToDelete.id, ...(credentialToDelete.teamId ? { teamId: credentialToDelete.teamId } : {}), }); } }}>

{t("are_you_sure_you_want_to_remove_this_app_from")} {credentialToDelete?.name || t("unnamed")}?

); }