From 0b4135543983fbebca89df5ceedeb5cf69f79dac Mon Sep 17 00:00:00 2001 From: Vut Pov Date: Thu, 16 Jul 2020 10:39:05 +0700 Subject: [PATCH] add get token --- src/ResponseError.ts | 9 ++++++ src/TokenInstance.ts | 18 ++++++++++++ src/index.tsx | 70 +++++++++++++++++++++++++++++++------------- 3 files changed, 76 insertions(+), 21 deletions(-) create mode 100644 src/ResponseError.ts create mode 100644 src/TokenInstance.ts diff --git a/src/ResponseError.ts b/src/ResponseError.ts new file mode 100644 index 0000000..b1fcbb7 --- /dev/null +++ b/src/ResponseError.ts @@ -0,0 +1,9 @@ +class ResponseError extends Error{ + response = null + constructor(message: string, response: any) { + super(message) + this.response = response + } +} + +export default ResponseError diff --git a/src/TokenInstance.ts b/src/TokenInstance.ts new file mode 100644 index 0000000..eb3b1fd --- /dev/null +++ b/src/TokenInstance.ts @@ -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 } diff --git a/src/index.tsx b/src/index.tsx index 9453b1e..037065f 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -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 { isLogin: boolean isFetchingUser: boolean user: T + tokenInstance?: TokenInstance } + const Context = React.createContext({}) class AuthContextProvider extends BaseContextProvider< AuthContextProps, AuthState > { - state = { + state: AuthState = { 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 } } }