58 lines
1.5 KiB
TypeScript
58 lines
1.5 KiB
TypeScript
import { create } from 'zustand'
|
|
import { authClient } from '@/lib/auth-client'
|
|
import AsyncStorage from '@react-native-async-storage/async-storage'
|
|
|
|
interface Session {
|
|
user: { id: string; email: string; name: string }
|
|
}
|
|
|
|
interface AuthState {
|
|
session: Session | null
|
|
isInitialized: boolean
|
|
initialize: () => Promise<void>
|
|
setSession: (session: Session | null, token?: string) => Promise<void>
|
|
signOut: () => Promise<void>
|
|
}
|
|
|
|
export const useAuthStore = create<AuthState>((set) => ({
|
|
session: null,
|
|
isInitialized: false,
|
|
|
|
initialize: async () => {
|
|
try {
|
|
// Check if we have a stored token and validate it
|
|
const token = await AsyncStorage.getItem('better-auth-session')
|
|
if (!token) {
|
|
set({ session: null, isInitialized: true })
|
|
return
|
|
}
|
|
// authClient now sends the token via cookie header (see auth-client.ts)
|
|
const result = await authClient.getSession()
|
|
if (result?.data?.user) {
|
|
set({
|
|
session: { user: result.data.user },
|
|
isInitialized: true,
|
|
})
|
|
} else {
|
|
await AsyncStorage.removeItem('better-auth-session')
|
|
set({ session: null, isInitialized: true })
|
|
}
|
|
} catch {
|
|
set({ session: null, isInitialized: true })
|
|
}
|
|
},
|
|
|
|
setSession: async (session, token) => {
|
|
if (token) {
|
|
await AsyncStorage.setItem('better-auth-session', token)
|
|
}
|
|
set({ session })
|
|
},
|
|
|
|
signOut: async () => {
|
|
await authClient.signOut()
|
|
await AsyncStorage.removeItem('better-auth-session')
|
|
set({ session: null })
|
|
},
|
|
}))
|