"use client"; /* eslint-disable react-hooks/exhaustive-deps */ import { useSession } from "next-auth/react"; import { useRouter } from "next/navigation"; import { useState, useEffect } from "react"; import { APP_NAME } from "@calcom/lib/constants"; import { useCompatSearchParams } from "@calcom/lib/hooks/useCompatSearchParams"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; import useMeQuery from "@calcom/trpc/react/hooks/useMeQuery"; import { Avatar } from "@calcom/ui/components/avatar"; import { Button } from "@calcom/ui/components/button"; import { Select } from "@calcom/ui/components/form"; import { InfoIcon, PlusIcon } from "@coss/ui/icons"; import { Tooltip } from "@calcom/ui/components/tooltip"; export function Authorize() { const { t } = useLocale(); const { status } = useSession(); const { data: user } = useMeQuery(); const router = useRouter(); const searchParams = useCompatSearchParams(); const client_id = (searchParams?.get("client_id") as string) || ""; const redirect_uri = searchParams?.get("redirect_uri") as string; const state = searchParams?.get("state") as string; const scope = searchParams?.get("scope") as string; const code_challenge = searchParams?.get("code_challenge") as string; const code_challenge_method = searchParams?.get("code_challenge_method") as string; const show_account_selector = searchParams?.get("show_account_selector") === "true"; const queryString = searchParams?.toString(); const [selectedAccount, setSelectedAccount] = useState<{ value: string; label: string; } | null>(); const scopes = scope ? scope.toString().split(",") : []; const { data: client, error: getClientError, isPending: isPendingGetClient, } = trpc.viewer.oAuth.getClientForAuthorization.useQuery( { clientId: client_id as string, redirectUri: redirect_uri, }, { enabled: status === "authenticated" && !!redirect_uri, } ); const { data, isPending: isPendingProfiles } = trpc.viewer.loggedInViewerRouter.teamsAndUserProfilesQuery.useQuery(undefined, { enabled: show_account_selector, }); const generateAuthCodeMutation = trpc.viewer.oAuth.generateAuthCode.useMutation({ onSuccess: (data) => { window.location.href = data.redirectUrl ?? `${client?.redirectUri}?code=${data.authorizationCode}&state=${state}`; }, onError: (error) => { if (client?.redirectUri) { redirectToOAuthError({ redirectUri: client.redirectUri, trpcError: error, state, }); } }, }); const mappedProfiles = data ? data .filter((profile) => !profile.readOnly) .map((profile) => ({ label: profile.name || profile.slug || "", value: profile.slug || "", })) : []; useEffect(() => { if (show_account_selector && mappedProfiles.length > 0) { setSelectedAccount(mappedProfiles[0]); } }, [isPendingProfiles, show_account_selector]); // Auto-authorize trusted clients useEffect(() => { if (client?.isTrusted) { generateAuthCodeMutation.mutate({ clientId: client_id as string, redirectUri: client.redirectUri, scopes, codeChallenge: code_challenge || undefined, codeChallengeMethod: (code_challenge_method as "S256") || undefined, state, }); } }, [client?.isTrusted]); useEffect(() => { if (status === "unauthenticated") { const urlSearchParams = new URLSearchParams({ callbackUrl: `auth/oauth2/authorize?${queryString}`, }); // Pass register param directly so login page can hide "Don't have an account" link const registerParam = searchParams?.get("register"); if (registerParam) { urlSearchParams.set("register", registerParam); } router.replace(`/auth/login?${urlSearchParams.toString()}`); } }, [status]); if (getClientError) { return