Prmbr/src/hooks/useAuth.ts
2025-07-30 14:46:42 +08:00

58 lines
1.4 KiB
TypeScript

'use client'
import { createClient } from '@/lib/supabase'
import { User } from '@supabase/supabase-js'
import { useEffect, useState } from 'react'
export function useAuth() {
const [user, setUser] = useState<User | null>(null)
const [loading, setLoading] = useState(true)
const supabase = createClient()
useEffect(() => {
// 同步用户到Prisma数据库
const syncUser = async (_userData: User) => {
try {
await fetch('/api/users/sync', {
method: 'POST',
headers: { 'Content-Type': 'application/json' }
})
} catch (error) {
console.error('Failed to sync user:', error)
}
}
const getUser = async () => {
const { data: { user: userData } } = await supabase.auth.getUser()
if (userData) {
await syncUser(userData)
}
setUser(userData)
setLoading(false)
}
getUser()
const { data: { subscription } } = supabase.auth.onAuthStateChange(async (event, session) => {
const userData = session?.user ?? null
if (userData && (event === 'SIGNED_IN' || event === 'TOKEN_REFRESHED')) {
await syncUser(userData)
}
setUser(userData)
setLoading(false)
})
return () => subscription.unsubscribe()
}, [supabase.auth])
const signOut = async () => {
await supabase.auth.signOut()
window.location.href = '/'
}
return {
user,
loading,
signOut
}
}