1
0
Fork 0
mirror of https://github.com/kou029w/_.git synced 2025-01-31 14:28:04 +00:00
_/frourio/components/UserBanner.tsx

66 lines
1.8 KiB
TypeScript
Raw Normal View History

2020-10-12 13:35:33 +09:00
import { useState, useCallback, ChangeEvent } from 'react'
import styles from '~/styles/UserBanner.module.css'
import { apiClient } from '~/utils/apiClient'
import { UserInfo } from '$/types'
const UserBanner = () => {
const [isLoggedIn, setIsLoggedIn] = useState(false)
const [token, setToken] = useState('')
const [userInfo, setUserInfo] = useState({} as UserInfo)
const editIcon = useCallback(
async (e: ChangeEvent<HTMLInputElement>) => {
if (!e.target.files?.length) return
setUserInfo(
await apiClient.user.$post({
headers: { token },
body: { icon: e.target.files[0] }
})
)
},
[token]
)
const login = useCallback(async () => {
const id = prompt('Enter the user id (See server/.env)')
const pass = prompt('Enter the user pass (See server/.env)')
if (!id || !pass) return alert('Login failed')
let newToken = ''
try {
newToken = (await apiClient.token.$post({ body: { id, pass } })).token
setToken(newToken)
} catch (e) {
return alert('Login failed')
}
setUserInfo(await apiClient.user.$get({ headers: { token: newToken } }))
setIsLoggedIn(true)
}, [])
const logout = useCallback(async () => {
await apiClient.token.delete({ headers: { token } })
setToken('')
setIsLoggedIn(false)
}, [token])
return (
<div className={styles.userBanner}>
{isLoggedIn ? (
<div>
<img src={userInfo.icon} className={styles.userIcon} />
<span>{userInfo.name}</span>
<input type="file" accept="image/*" onChange={editIcon} />
<button onClick={logout}>LOGOUT</button>
</div>
) : (
<button onClick={login}>LOGIN</button>
)}
</div>
)
}
export default UserBanner