refactor: migrate auth pages to better-auth client

This commit is contained in:
2026-04-06 22:41:37 -04:00
parent 490c601dc1
commit d7d52ef1a8
3 changed files with 61 additions and 40 deletions

View File

@@ -1,15 +1,35 @@
import { signIn, auth } from "@/auth" "use client"
import { signIn, useSession } from "@/lib/auth-client"
import { Button } from "@/components/ui/button" import { Button } from "@/components/ui/button"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
import { redirect } from "next/navigation"
import Link from "next/link" import Link from "next/link"
import { useRouter } from "next/navigation"
import { useEffect } from "react"
export default async function SignInPage() { export default function SignInPage() {
const session = await auth() const { data: session, isPending } = useSession()
const router = useRouter()
// If already signed in, redirect to home useEffect(() => {
if (session?.user) { if (session?.user) {
redirect("/") router.push("/")
}
}, [session, router])
const handleSignIn = async () => {
await signIn.social({
provider: "authentik",
callbackURL: "/",
})
}
if (isPending) {
return null
}
if (session?.user) {
return null
} }
return ( return (
@@ -22,16 +42,9 @@ export default async function SignInPage() {
</CardDescription> </CardDescription>
</CardHeader> </CardHeader>
<CardContent className="space-y-4"> <CardContent className="space-y-4">
<form <Button onClick={handleSignIn} className="w-full" size="lg">
action={async () => {
"use server"
await signIn("authentik", { redirectTo: "/" })
}}
>
<Button type="submit" className="w-full" size="lg">
Continue with Authentik Continue with Authentik
</Button> </Button>
</form>
<div className="text-center"> <div className="text-center">
<Link href="/" className="text-sm text-muted-foreground hover:underline"> <Link href="/" className="text-sm text-muted-foreground hover:underline">

View File

@@ -1,14 +1,29 @@
import { signOut, auth } from "@/auth" "use client"
import { signOut, useSession } from "@/lib/auth-client"
import { Button } from "@/components/ui/button" import { Button } from "@/components/ui/button"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
import { redirect } from "next/navigation"
import Link from "next/link" import Link from "next/link"
import { useRouter } from "next/navigation"
import { useEffect } from "react"
export default async function SignOutPage() { export default function SignOutPage() {
const session = await auth() const { data: session, isPending } = useSession()
const router = useRouter()
useEffect(() => {
if (!session) { if (!session) {
redirect("/") router.push("/")
}
}, [session, router])
const handleSignOut = async () => {
await signOut()
router.push("/")
}
if (isPending || !session) {
return null
} }
return ( return (
@@ -27,16 +42,9 @@ export default async function SignOutPage() {
</div> </div>
<div className="grid grid-cols-2 gap-3"> <div className="grid grid-cols-2 gap-3">
<form <Button onClick={handleSignOut} variant="destructive" className="w-full">
action={async () => {
"use server"
await signOut({ redirectTo: "/" })
}}
>
<Button type="submit" variant="destructive" className="w-full">
Sign Out Sign Out
</Button> </Button>
</form>
<Button variant="outline" asChild> <Button variant="outline" asChild>
<Link href="/">Cancel</Link> <Link href="/">Cancel</Link>

View File

@@ -1,20 +1,20 @@
"use client" "use client"
import { signOut, useSession } from "next-auth/react" import { signOut, useSession } from "@/lib/auth-client"
import { Button } from "@/components/ui/button" import { Button } from "@/components/ui/button"
import { useRouter } from "next/navigation" import { useRouter } from "next/navigation"
export default function SignIn() { export default function SignIn() {
const { data: session, status } = useSession() const { data: session, isPending } = useSession()
const router = useRouter() const router = useRouter()
const handleSignOut = async () => { const handleSignOut = async () => {
await signOut({ redirect: false }) await signOut()
router.push("/") router.push("/")
router.refresh() router.refresh()
} }
if (status === "loading") { if (isPending) {
return <div className="h-8 w-16 bg-muted animate-pulse rounded"></div> return <div className="h-8 w-16 bg-muted animate-pulse rounded"></div>
} }