/** * Auth Login Button with Dropdown Menu * Shows available authentication providers in a dropdown menu */ import { useState } from 'react' import { IconLogin, IconBrandGoogleFilled } from '@tabler/icons-react' import { useTranslation } from '@/i18n/react-i18next-compat' import { useAuth } from '@/hooks/useAuth' import { toast } from 'sonner' import type { ProviderType } from '@jan/extensions-web' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' export const AuthLoginButton = () => { const { t } = useTranslation() const { getAllProviders, loginWithProvider } = useAuth() const [isLoading, setIsLoading] = useState(false) const enabledProviders = getAllProviders() const handleProviderLogin = async (providerId: ProviderType) => { try { setIsLoading(true) await loginWithProvider(providerId) } catch (error) { console.error('Failed to login with provider:', error) toast.error(t('common:loginFailed')) } finally { setIsLoading(false) } } const getProviderIcon = (iconName: string) => { switch (iconName) { case 'IconBrandGoogleFilled': return IconBrandGoogleFilled default: return IconLogin } } if (enabledProviders.length === 0) { return null } return ( {enabledProviders.map((provider) => { const IconComponent = getProviderIcon(provider.icon) return ( handleProviderLogin(provider.id as ProviderType)} disabled={isLoading} className="gap-2" > {t('common:loginWith', { provider: provider.name, })} ) })} ) }