guardia-messenger/hooks/useAuth.ts
DESKTOP-TKLFCPRython f29f525c77 refactor: 101.79.17.164 → zioinfo.co.kr 전체 도메인 변환 + Manager UI 배포
- 37개 파일 IP → zioinfo.co.kr 치환 (소스/매뉴얼/설정/하네스)
- Manager DrConsole/NetworkConsole/CsapConsole 빌드 + /var/www/manager/ 배포
- 테스트: Manager HTTP 200, ITSM 신규 API 7개 전체 200

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 10:09:17 +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 }
}