+ {/* Bar indicator */}
+
+ {Array.from({ length: 5 }).map((_, i) => (
+
+ ))}
+
+
+ {/* Label and feedback */}
+
+ {level === "excellent" || level === "strong" ? (
+
+ ) : level === "weak" ? (
+
+ ) : (
+
+ )}
+
+
+ {levelLabels[level]}
+
+ {feedback.length > 0 &&
+ feedback[0] !== "Great password!" && (
+
+ — {feedback[0]}
+
+ )}
+
+
+
+ )
+}
diff --git a/components/auth/social-buttons.tsx b/components/auth/social-buttons.tsx
new file mode 100644
index 0000000..77facb2
--- /dev/null
+++ b/components/auth/social-buttons.tsx
@@ -0,0 +1,87 @@
+"use client"
+
+import { useState } from "react"
+import { Loader2 } from "lucide-react"
+import { authClient } from "@/lib/auth-client"
+
+interface SocialButtonsProps {
+ callbackURL?: string
+ disabled?: boolean
+}
+
+export default function SocialButtons({
+ callbackURL = "/",
+ disabled = false,
+}: SocialButtonsProps) {
+ const [loadingProvider, setLoadingProvider] = useState<
+ "google" | "discord" | null
+ >(null)
+
+ const handleSocialLogin = async (provider: "google" | "discord") => {
+ setLoadingProvider(provider)
+ await authClient.signIn.social(
+ {
+ provider,
+ callbackURL,
+ },
+ {
+ onError: () => {
+ setLoadingProvider(null)
+ },
+ },
+ )
+ }
+
+ const isLoading = loadingProvider !== null
+
+ return (
+
+ {Array.from({ length: totalSteps }).map((_, i) => (
+
+ ))}
+
+ )
+}