mirror of
https://github.com/marcogll/TaxHacker_s23.git
synced 2026-01-13 21:35:19 +00:00
97 lines
2.4 KiB
TypeScript
97 lines
2.4 KiB
TypeScript
"use client"
|
|
|
|
import { FormInput } from "@/components/forms/simple"
|
|
import { Button } from "@/components/ui/button"
|
|
import { authClient } from "@/lib/auth-client"
|
|
import { useRouter } from "next/navigation"
|
|
import { useState } from "react"
|
|
|
|
export default function SignupForm() {
|
|
const [name, setName] = useState("")
|
|
const [email, setEmail] = useState("")
|
|
const [otp, setOtp] = useState("")
|
|
const [isOtpSent, setIsOtpSent] = useState(false)
|
|
const [isLoading, setIsLoading] = useState(false)
|
|
const [error, setError] = useState<string | null>(null)
|
|
const router = useRouter()
|
|
|
|
const handleSendOtp = async (e: React.FormEvent) => {
|
|
e.preventDefault()
|
|
setIsLoading(true)
|
|
setError(null)
|
|
|
|
try {
|
|
await authClient.emailOtp.sendVerificationOtp({
|
|
email,
|
|
type: "sign-in",
|
|
})
|
|
setIsOtpSent(true)
|
|
} catch (err) {
|
|
setError(err instanceof Error ? err.message : "Failed to send OTP")
|
|
} finally {
|
|
setIsLoading(false)
|
|
}
|
|
}
|
|
|
|
const handleVerifyOtp = async (e: React.FormEvent) => {
|
|
e.preventDefault()
|
|
setIsLoading(true)
|
|
setError(null)
|
|
|
|
try {
|
|
await authClient.signIn.emailOtp({
|
|
email,
|
|
otp,
|
|
})
|
|
await authClient.updateUser({
|
|
name,
|
|
})
|
|
router.push("/dashboard")
|
|
} catch (err) {
|
|
setError(err instanceof Error ? err.message : "Failed to verify OTP")
|
|
} finally {
|
|
setIsLoading(false)
|
|
}
|
|
}
|
|
|
|
return (
|
|
<form onSubmit={isOtpSent ? handleVerifyOtp : handleSendOtp} className="flex flex-col gap-4 w-full">
|
|
<FormInput
|
|
title="Your Name"
|
|
type="text"
|
|
value={name}
|
|
onChange={(e) => setName(e.target.value)}
|
|
required
|
|
disabled={isOtpSent}
|
|
/>
|
|
|
|
<FormInput
|
|
title="Email"
|
|
type="email"
|
|
value={email}
|
|
onChange={(e) => setEmail(e.target.value)}
|
|
required
|
|
disabled={isOtpSent}
|
|
/>
|
|
|
|
{isOtpSent && (
|
|
<FormInput
|
|
title="Check your email for the verification code"
|
|
type="text"
|
|
value={otp}
|
|
onChange={(e) => setOtp(e.target.value)}
|
|
required
|
|
maxLength={6}
|
|
pattern="[0-9]{6}"
|
|
/>
|
|
)}
|
|
|
|
{error && <p className="text-red-500 text-sm">{error}</p>}
|
|
|
|
<Button type="submit" disabled={isLoading}>
|
|
{isLoading ? "Loading..." : isOtpSent ? "Verify Code" : "Create Account"}
|
|
</Button>
|
|
</form>
|
|
)
|
|
}
|