11'use client' ;
22
33import { Button } from "@/components/ui/button" ;
4- import googleLogo from "@/public/google.svg" ;
54import Image from "next/image" ;
65import { signIn } from "next-auth/react" ;
76import { Fragment , useCallback , useMemo } from "react" ;
87import { Card } from "@/components/ui/card" ;
9- import { cn , getCodeHostIcon } from "@/lib/utils" ;
8+ import { cn , getAuthProviderInfo } from "@/lib/utils" ;
109import { MagicLinkForm } from "./magicLinkForm" ;
1110import { CredentialsForm } from "./credentialsForm" ;
1211import { SourcebotLogo } from "@/app/components/sourcebotLogo" ;
@@ -22,15 +21,10 @@ const PRIVACY_POLICY_URL = "https://sourcebot.dev/privacy";
2221interface LoginFormProps {
2322 callbackUrl ?: string ;
2423 error ?: string ;
25- enabledMethods : {
26- github : boolean ;
27- google : boolean ;
28- magicLink : boolean ;
29- credentials : boolean ;
30- }
24+ providers : Array < { id : string ; name : string } > ;
3125}
3226
33- export const LoginForm = ( { callbackUrl, error, enabledMethods } : LoginFormProps ) => {
27+ export const LoginForm = ( { callbackUrl, error, providers } : LoginFormProps ) => {
3428 const captureEvent = useCaptureEvent ( ) ;
3529 const onSignInWithOauth = useCallback ( ( provider : string ) => {
3630 signIn ( provider , { redirectTo : callbackUrl ?? "/" } ) ;
@@ -50,6 +44,33 @@ export const LoginForm = ({ callbackUrl, error, enabledMethods }: LoginFormProps
5044 }
5145 } , [ error ] ) ;
5246
47+ // Separate OAuth providers from special auth methods
48+ const oauthProviders = providers . filter ( p =>
49+ ! [ "credentials" , "nodemailer" ] . includes ( p . id )
50+ ) ;
51+ const hasCredentials = providers . some ( p => p . id === "credentials" ) ;
52+ const hasMagicLink = providers . some ( p => p . id === "nodemailer" ) ;
53+
54+ // Helper function to get the correct analytics event name
55+ const getLoginEventName = ( providerId : string ) => {
56+ switch ( providerId ) {
57+ case "github" :
58+ return "wa_login_with_github" as const ;
59+ case "google" :
60+ return "wa_login_with_google" as const ;
61+ case "gitlab" :
62+ return "wa_login_with_gitlab" as const ;
63+ case "okta" :
64+ return "wa_login_with_okta" as const ;
65+ case "keycloak" :
66+ return "wa_login_with_keycloak" as const ;
67+ case "microsoft-entra-id" :
68+ return "wa_login_with_microsoft_entra_id" as const ;
69+ default :
70+ return "wa_login_with_github" as const ; // fallback
71+ }
72+ } ;
73+
5374 return (
5475 < div className = "flex flex-col items-center justify-center w-full" >
5576 < div className = "mb-6 flex flex-col items-center" >
@@ -71,36 +92,28 @@ export const LoginForm = ({ callbackUrl, error, enabledMethods }: LoginFormProps
7192 ) }
7293 < DividerSet
7394 elements = { [
74- ...( enabledMethods . github || enabledMethods . google ? [
75- < >
76- { enabledMethods . github && (
77- < ProviderButton
78- key = "github"
79- name = "GitHub"
80- logo = { getCodeHostIcon ( "github" ) ! }
81- onClick = { ( ) => {
82- captureEvent ( "wa_login_with_github" , { } ) ;
83- onSignInWithOauth ( "github" )
84- } }
85- />
86- ) }
87- { enabledMethods . google && (
88- < ProviderButton
89- key = "google"
90- name = "Google"
91- logo = { { src : googleLogo } }
92- onClick = { ( ) => {
93- captureEvent ( "wa_login_with_google" , { } ) ;
94- onSignInWithOauth ( "google" )
95- } }
96- />
97- ) }
98- </ >
95+ ...( oauthProviders . length > 0 ? [
96+ < div key = "oauth-providers" className = "w-full space-y-3" >
97+ { oauthProviders . map ( ( provider ) => {
98+ const providerInfo = getAuthProviderInfo ( provider . id ) ;
99+ return (
100+ < ProviderButton
101+ key = { provider . id }
102+ name = { providerInfo . displayName }
103+ logo = { providerInfo . icon }
104+ onClick = { ( ) => {
105+ captureEvent ( getLoginEventName ( provider . id ) , { } ) ;
106+ onSignInWithOauth ( provider . id ) ;
107+ } }
108+ />
109+ ) ;
110+ } ) }
111+ </ div >
99112 ] : [ ] ) ,
100- ...( enabledMethods . magicLink ? [
113+ ...( hasMagicLink ? [
101114 < MagicLinkForm key = "magic-link" callbackUrl = { callbackUrl } />
102115 ] : [ ] ) ,
103- ...( enabledMethods . credentials ? [
116+ ...( hasCredentials ? [
104117 < CredentialsForm key = "credentials" callbackUrl = { callbackUrl } />
105118 ] : [ ] )
106119 ] }
@@ -120,7 +133,7 @@ const ProviderButton = ({
120133 className,
121134} : {
122135 name : string ;
123- logo : { src : string , className ?: string } ;
136+ logo : { src : string , className ?: string } | null ;
124137 onClick : ( ) => void ;
125138 className ?: string ;
126139} ) => {
0 commit comments