1
Fork 0
mirror of https://github.com/pds-nest/nest.git synced 2024-11-30 00:14:19 +00:00
pds-2021-g2-nest/nest_frontend/components/providers/GlobalUser.js

87 lines
2.6 KiB
JavaScript
Raw Normal View History

import React, { useCallback, useContext } from "react"
2021-04-29 14:58:31 +00:00
import useLocalStorageState from "../../hooks/useLocalStorageState"
import ContextServer from "../../contexts/ContextServer"
import ContextUser from "../../contexts/ContextUser"
2021-04-26 16:36:41 +00:00
/**
* Provides {@link ContextUser} to all contained elements.
*
* @param children
* @returns {JSX.Element}
* @constructor
*/
export default function GlobalUser({ children }) {
2021-05-11 14:37:15 +00:00
const { fetchData } = useContext(ContextServer)
2021-04-26 16:36:41 +00:00
const [user, setUser] = useLocalStorageState("login", null)
/**
* Fetch JSON data from the API as the authenticated user.
*
* Requires an user to be logged in!
*
2021-05-07 01:35:39 +00:00
* @param method - The HTTP method to use.
2021-04-26 16:36:41 +00:00
* @param path - The path to request data at (ex. `/api/repositories`)
* @param body - The body of the request (it will be automatically converted to JSON.
* @param init - Additional arguments to pass to the `init` parameter of {@link fetch}.
* @returns {Promise<*>}
*/
const fetchDataAuth = useCallback(async (method, path, body, init) => {
2021-04-26 16:36:41 +00:00
if(!user) {
throw new Error("Not logged in")
}
if(!init) {
init = {}
}
if(!init["headers"]) {
init["headers"] = {}
}
init["headers"]["Authorization"] = `Bearer ${user["token"]}`
return await fetchData(method, path, body, init)
}, [fetchData, user])
2021-04-26 16:36:41 +00:00
/**
* Try to login to the active server with the passed credentials.
*
* @param email - The user's email.
* @param password - The user's password.
* @returns {Promise<void>}
*/
const login = useCallback(async (email, password) => {
2021-04-26 16:36:41 +00:00
console.debug("Contacting server to login...")
2021-04-30 13:49:18 +00:00
const data = await fetchData("POST", `/api/v1/login`, {
2021-04-26 16:36:41 +00:00
"email": email,
"password": password,
})
console.debug("Storing login state...")
setUser({
email: data["user"]["email"],
isAdmin: data["user"]["isAdmin"],
username: data["user"]["username"],
token: data["access_token"],
})
console.info("Login successful!")
}, [fetchData, setUser])
2021-04-26 16:36:41 +00:00
/**
* Logout from the currently active server.
*/
const logout = useCallback(() => {
2021-04-26 16:36:41 +00:00
console.debug("Clearing login state...")
setUser(null)
console.debug("Cleared login state!")
console.info("Logout successful!")
}, [setUser])
2021-04-26 16:36:41 +00:00
return (
2021-05-11 14:37:15 +00:00
<ContextUser.Provider value={{ user, login, logout, fetchDataAuth }}>
2021-04-26 16:36:41 +00:00
{children}
</ContextUser.Provider>
)
}