zioinfo-mail/workspace/guardia-messenger/hooks/useAuth.ts
DESKTOP-TKLFCPR\ython 777e027553 refactor(structure): move app -> workspace/guardia-messenger
Permission denied on git mv, used robocopy instead.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 23:53:57 +09:00

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 }
}