Permission denied on git mv, used robocopy instead. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
65 lines
1.7 KiB
TypeScript
65 lines
1.7 KiB
TypeScript
import { useState, useEffect, createContext, useContext } from 'react'
|
|
import * as SecureStore from 'expo-secure-store'
|
|
import { login as apiLogin, getMe } from '../services/api'
|
|
|
|
interface User {
|
|
username: string
|
|
display_name: string
|
|
role: string
|
|
email?: string
|
|
}
|
|
|
|
interface AuthCtx {
|
|
user: User | null
|
|
token: string | null
|
|
loading: boolean
|
|
login: (u: string, p: string) => Promise<void>
|
|
logout: () => Promise<void>
|
|
}
|
|
|
|
import { createContext as _cc } from 'react'
|
|
export const AuthContext = _cc<AuthCtx>({} as AuthCtx)
|
|
|
|
export function useAuth() {
|
|
return useContext(AuthContext)
|
|
}
|
|
|
|
export function useAuthState(): AuthCtx {
|
|
const [user, setUser] = useState<User | null>(null)
|
|
const [token, setToken] = useState<string | null>(null)
|
|
const [loading, setLoading] = useState(true)
|
|
|
|
useEffect(() => {
|
|
;(async () => {
|
|
try {
|
|
const t = await SecureStore.getItemAsync('grd_token')
|
|
const u = await SecureStore.getItemAsync('grd_user')
|
|
if (t && u) {
|
|
setToken(t)
|
|
setUser(JSON.parse(u))
|
|
}
|
|
} catch {}
|
|
setLoading(false)
|
|
})()
|
|
}, [])
|
|
|
|
const login = async (username: string, password: string) => {
|
|
const r = await apiLogin(username, password)
|
|
const { access_token } = r.data
|
|
await SecureStore.setItemAsync('grd_token', access_token)
|
|
const me = await getMe()
|
|
await SecureStore.setItemAsync('grd_user', JSON.stringify(me.data))
|
|
setToken(access_token)
|
|
setUser(me.data)
|
|
}
|
|
|
|
const logout = async () => {
|
|
await SecureStore.deleteItemAsync('grd_token')
|
|
await SecureStore.deleteItemAsync('grd_user')
|
|
setToken(null)
|
|
setUser(null)
|
|
}
|
|
|
|
return { user, token, loading, login, logout }
|
|
}
|