bananas-commerce-admin
Version:
What's this, an admin for apes?
58 lines • 2.25 kB
JavaScript
import React, { useEffect, useState } from "react";
import { useSessionStorage } from "../hooks/useStorage";
import { useApi } from "./ApiContext";
const UserContext = React.createContext(undefined);
export const useUser = () => React.useContext(UserContext);
export const UserContextProvider = ({ children }) => {
const api = useApi();
const [user, setUser] = useSessionStorage("bcom-admin.user");
const [hasTriedToFetchUser, setHasTriedToFetchUser] = useState(false);
useEffect(() => {
const getInitialUser = async () => {
if (api == null)
return;
const user = (await api.getAuthenticatedUser()) ?? undefined; // `undefined` has meaning here! It resets the sessionStorage.
setUser(user);
setHasTriedToFetchUser(true);
};
if (!hasTriedToFetchUser)
getInitialUser();
}, [hasTriedToFetchUser, user, api]);
const login = async (username, password) => {
const response = await api?.operations["bananas.login:create"].call({
body: { username, password },
});
if (response?.ok) {
const user = await response.json();
setUser(user);
return user;
}
else {
setUser(undefined);
return null;
}
};
const changePassword = async (oldPassword, newPassword1, newPassword2) => {
const response = await api?.operations["bananas.change_password:create"].call({
body: {
old_password: oldPassword,
new_password1: newPassword1,
new_password2: newPassword2,
},
});
if (!response?.ok) {
throw new Error("Failed to change password");
}
};
const logout = async () => {
const response = await api?.operations["bananas.logout:create"].call();
if (response?.ok) {
setUser(undefined);
return;
}
throw new Error("Could not log out");
};
return (React.createElement(UserContext.Provider, { value: { user, login, logout, changePassword, hasTriedToFetchUser } }, children));
};
export default UserContext;
//# sourceMappingURL=UserContext.js.map