58 lines
1.4 KiB
TypeScript
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
|
|
}
|
|
} |