SignInWithCustom.tsx 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { useState } from 'react'
  2. import { toast } from 'sonner'
  3. import { Button } from 'ui'
  4. import { BASE_PATH } from '@/lib/constants'
  5. import { captureCriticalError } from '@/lib/error-reporting'
  6. import { auth, buildPathWithParams } from '@/lib/gotrue'
  7. interface SignInWithCustomProps {
  8. providerName: string
  9. }
  10. export const SignInWithCustom = ({ providerName }: SignInWithCustomProps) => {
  11. const [loading, setLoading] = useState(false)
  12. async function handleCustomSignIn() {
  13. setLoading(true)
  14. try {
  15. // redirects to /sign-in to check if the user has MFA setup (handled in SignInLayout.tsx)
  16. const redirectTo = buildPathWithParams(
  17. `${
  18. process.env.NEXT_PUBLIC_VERCEL_ENV === 'preview'
  19. ? location.origin
  20. : process.env.NEXT_PUBLIC_SITE_URL
  21. }${BASE_PATH}/sign-in-mfa?method=${providerName.toLowerCase()}`
  22. )
  23. const { error } = await auth.signInWithOAuth({
  24. // @ts-expect-error - providerName is a string
  25. provider: providerName.toLowerCase(),
  26. options: { redirectTo, scopes: 'email' },
  27. })
  28. if (error) throw error
  29. } catch (error: any) {
  30. toast.error(`Failed to sign in via ${providerName}: ${error.message}`)
  31. captureCriticalError(error, `sign in via ${providerName}`)
  32. setLoading(false)
  33. }
  34. }
  35. return (
  36. <Button block onClick={handleCustomSignIn} size="large" type="default" loading={loading}>
  37. Continue with {providerName}
  38. </Button>
  39. )
  40. }