You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
1.9 KiB
79 lines
1.9 KiB
import React, { createContext, useContext, useState } from 'react' |
|
import { message } from 'antd' |
|
import { useHistory } from 'react-router' |
|
import { User } from '../types' |
|
import { useAppContext } from './AppContext' |
|
import { logOut } from '../api' |
|
|
|
type Props = { |
|
children: React.ReactNode |
|
} |
|
|
|
type Context = { |
|
user: User | null |
|
handleLogin: (name: string, password: string) => void |
|
handleLogout: () => void |
|
} |
|
|
|
const UserContext = createContext<Context | null>(null) |
|
|
|
export const UserContextProvider = ({ children }: Props) => { |
|
const api = useAppContext() |
|
const history = useHistory() |
|
|
|
const [user, setUser] = useState<User | null>(null) |
|
|
|
const handleLogin = async (username: string, password: string) => { |
|
try { |
|
const { key } = await api.post<any, { key: string }>( |
|
'/dj-rest-auth/login/', |
|
{ |
|
username, |
|
password, |
|
}, |
|
) |
|
if (!key) throw new Error('Problem logging in!') |
|
window.localStorage.setItem('cash-stacks-token', key) |
|
const user = await api.get<User>(`/dj-rest-auth/user/`) |
|
|
|
console.log('user', user) |
|
|
|
if (!user) message.error(`Couldn't find user`) |
|
setUser(user) |
|
|
|
message.success(`logged in as ${user?.name}`, 0.5) |
|
} catch (err) { |
|
message.error('Login Failed!') |
|
} |
|
} |
|
|
|
const handleLogout = async () => { |
|
await logOut() |
|
setUser(null) |
|
message.success('logged out!', 0.5) |
|
history.push('/') |
|
} |
|
|
|
return ( |
|
<UserContext.Provider |
|
value={{ |
|
user, |
|
handleLogin, |
|
handleLogout, |
|
}} |
|
> |
|
{children} |
|
</UserContext.Provider> |
|
) |
|
} |
|
|
|
export const useUserContext = () => { |
|
const context = useContext(UserContext) |
|
|
|
if (!context) |
|
throw new Error( |
|
'UserContext must be called from within the UserContextProvider', |
|
) |
|
|
|
return context |
|
}
|
|
|