add get token
This commit is contained in:
parent
decc6acca9
commit
0b41355439
9
src/ResponseError.ts
Normal file
9
src/ResponseError.ts
Normal file
@ -0,0 +1,9 @@
|
||||
class ResponseError extends Error{
|
||||
response = null
|
||||
constructor(message: string, response: any) {
|
||||
super(message)
|
||||
this.response = response
|
||||
}
|
||||
}
|
||||
|
||||
export default ResponseError
|
18
src/TokenInstance.ts
Normal file
18
src/TokenInstance.ts
Normal file
@ -0,0 +1,18 @@
|
||||
interface TokenInstance {
|
||||
getToken: () => string
|
||||
setToken: (token: string) => void
|
||||
}
|
||||
|
||||
const tokenKey = 'token'
|
||||
|
||||
class LocalStorageToken implements TokenInstance {
|
||||
getToken = () => {
|
||||
return localStorage.getItem(tokenKey) || ''
|
||||
}
|
||||
|
||||
setToken = (token: string) => {
|
||||
localStorage.setItem(tokenKey, token)
|
||||
}
|
||||
}
|
||||
|
||||
export { LocalStorageToken, TokenInstance }
|
@ -4,6 +4,8 @@ import BaseContextProvider, {
|
||||
baseWithContext,
|
||||
baseContextWrap
|
||||
} from 'base-context-provider'
|
||||
import { LocalStorageToken, TokenInstance } from './TokenInstance'
|
||||
import ResponseError from './ResponseError'
|
||||
|
||||
export interface AuthContextProps {
|
||||
authUrl: string
|
||||
@ -14,15 +16,17 @@ export interface AuthState<T> {
|
||||
isLogin: boolean
|
||||
isFetchingUser: boolean
|
||||
user: T
|
||||
tokenInstance?: TokenInstance
|
||||
}
|
||||
|
||||
|
||||
const Context = React.createContext({})
|
||||
|
||||
class AuthContextProvider extends BaseContextProvider<
|
||||
AuthContextProps,
|
||||
AuthState<any>
|
||||
> {
|
||||
state = {
|
||||
state: AuthState<any> = {
|
||||
isLogin: false,
|
||||
isFetchingUser: false,
|
||||
user: {
|
||||
@ -30,16 +34,24 @@ class AuthContextProvider extends BaseContextProvider<
|
||||
}
|
||||
}
|
||||
|
||||
constructor(props: AuthContextProps) {
|
||||
super(props)
|
||||
|
||||
this.state.tokenInstance = new LocalStorageToken()
|
||||
}
|
||||
|
||||
getContext() {
|
||||
return Context
|
||||
}
|
||||
|
||||
fetchUser: (password: string) => void = async (password) => {
|
||||
fetchUser: (username: string, password: string) => void = async (
|
||||
username,
|
||||
password
|
||||
) => {
|
||||
this.setState({
|
||||
isFetchingUser: true
|
||||
})
|
||||
const { authUrl } = this.props
|
||||
const { username } = this.state.user
|
||||
|
||||
const response = await fetch(authUrl, {
|
||||
method: 'POST',
|
||||
@ -50,24 +62,35 @@ class AuthContextProvider extends BaseContextProvider<
|
||||
})
|
||||
|
||||
const data = await response.json()
|
||||
localStorage.setItem('token', data.token)
|
||||
if (response.status >= 400) {
|
||||
return Promise.reject(new ResponseError("Error while fetching data", data ))
|
||||
}
|
||||
// eslint-disable-next-line no-unused-expressions
|
||||
this.state.tokenInstance?.setToken(data.token)
|
||||
|
||||
this.setState((oldState) => {
|
||||
return {
|
||||
...oldState,
|
||||
user: {
|
||||
...oldState.user,
|
||||
username
|
||||
},
|
||||
isLogin: true,
|
||||
isFetchingUser: false
|
||||
}
|
||||
})
|
||||
|
||||
return Promise.resolve("")
|
||||
}
|
||||
|
||||
login = ({ username, password }: { username: string; password: string }) => {
|
||||
this.setState(
|
||||
(oldState) => {
|
||||
return {
|
||||
...oldState,
|
||||
user: {
|
||||
...oldState.user,
|
||||
username
|
||||
}
|
||||
}
|
||||
},
|
||||
() => {
|
||||
this.fetchUser(password)
|
||||
}
|
||||
)
|
||||
login = async ({
|
||||
username,
|
||||
password
|
||||
}: {
|
||||
username: string
|
||||
password: string
|
||||
}) => {
|
||||
return this.fetchUser(username, password)
|
||||
}
|
||||
|
||||
logout = async () => {
|
||||
@ -77,15 +100,20 @@ class AuthContextProvider extends BaseContextProvider<
|
||||
username: ''
|
||||
}
|
||||
})
|
||||
|
||||
this.state.tokenInstance?.setToken("")
|
||||
return Promise.resolve(true)
|
||||
}
|
||||
|
||||
getToken = ()=>{
|
||||
return this.state.tokenInstance?.getToken()
|
||||
}
|
||||
|
||||
getContextReturnValue() {
|
||||
return {
|
||||
...this.state,
|
||||
login: this.login,
|
||||
logout: this.logout
|
||||
logout: this.logout,
|
||||
getToken: this.getToken
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user