oauth-buttons.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. 'use client';
  2. import { signIn } from "next-auth/react"
  3. import { Button } from "@/components/ui/button"
  4. import { useTranslations } from "next-intl"
  5. import { Github } from "lucide-react"
  6. interface OAuthButtonsProps {
  7. locale: string;
  8. mode?: 'login' | 'register';
  9. }
  10. export default function OAuthButtons({ locale, mode = 'login' }: OAuthButtonsProps) {
  11. const t = useTranslations(`auth.${mode}`);
  12. const handleOAuthSignIn = async (provider: 'google' | 'github') => {
  13. try {
  14. await signIn(provider, {
  15. callbackUrl: `/${locale}/dashboard`,
  16. redirect: true,
  17. });
  18. } catch (error) {
  19. console.error(`${provider} OAuth error:`, error);
  20. }
  21. };
  22. return (
  23. <div className="space-y-3">
  24. <Button
  25. type="button"
  26. variant="outline"
  27. onClick={() => handleOAuthSignIn('google')}
  28. className="w-full"
  29. >
  30. <svg className="mr-2 h-4 w-4" viewBox="0 0 24 24">
  31. <path
  32. fill="currentColor"
  33. d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"
  34. />
  35. <path
  36. fill="currentColor"
  37. d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"
  38. />
  39. <path
  40. fill="currentColor"
  41. d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"
  42. />
  43. <path
  44. fill="currentColor"
  45. d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"
  46. />
  47. </svg>
  48. {mode === 'login' ? t('loginWithGoogle') : t('signUpWithGoogle')}
  49. </Button>
  50. <Button
  51. type="button"
  52. variant="outline"
  53. onClick={() => handleOAuthSignIn('github')}
  54. className="w-full"
  55. >
  56. <Github className="mr-2 h-4 w-4" />
  57. {mode === 'login' ? t('loginWithGithub') : t('signUpWithGithub')}
  58. </Button>
  59. <div className="relative">
  60. <div className="absolute inset-0 flex items-center">
  61. <span className="w-full border-t" />
  62. </div>
  63. <div className="relative flex justify-center text-xs uppercase">
  64. <span className="bg-background px-2 text-muted-foreground">
  65. {t('orContinueWith')}
  66. </span>
  67. </div>
  68. </div>
  69. </div>
  70. );
  71. }