diff --git a/src/api/SwaggerApi.js b/src/api/SwaggerApi.js index e150a094cd08504a56fa3fcdd7b1ee3be75b4f93..fe3e035ea569dbd5c79ec740d0bdbb5af5ebe676 100644 --- a/src/api/SwaggerApi.js +++ b/src/api/SwaggerApi.js @@ -41,39 +41,42 @@ export function UserProvider({ children }) { setLoginError(message); } - const [user, setUser] = useState(); + const [user, getUser, resetUser, userLoading] = useUser(); const [loginError, setLoginError] = useState(); - const [userRoles, getUserRoles, resetUserRoles] = useUserRoles(); - const [userInfo, getUserInfo] = useUserInfo(); const [loginResponse, loginFcn] = useLogin(onLoginError); const logoutFcn = useLogout(); const resetLoginError = useCallback(() => setLoginError(null), [setLoginError]); console.log("rendering UserProvider") - console.log(user); - - useEffect(getUserInfo, [Boolean(loginResponse), getUserInfo]); - useEffect(() => userInfo && setUser(userInfo), [setUser, userInfo]); - - useEffect(getUserRoles, [Boolean(loginResponse), getUserRoles]); + useEffect(getUser, [Boolean(loginResponse), getUser]); const logout = useCallback(async () => { console.log("Logging out!") - setUser(null); - resetUserRoles(); + resetUser(); logoutFcn(); - }, [setUser, resetUserRoles, logoutFcn]) + }, [resetUser, logoutFcn]) const login = useCallback(async (username, password) => { console.log("Logging in!"); await loginFcn(username, password); - await getUserRoles(); - setUser(await getUserInfo()); - }, [loginFcn, getUserRoles, getUserInfo, setUser]) + getUser(); + }, [loginFcn, getUser]) + + const createValue = useCallback(() => { + return { user: user?.userInfo, userRoles: user?.userRoles, getUser, login, loginError, resetLoginError, logout }; + }, [user, getUser, login, loginError, resetLoginError, logout ]); + + const [value, setValue] = useState(createValue()); + + useEffect(() => { + if (!userLoading) { + setValue(createValue()) + } + }, [userLoading, setValue, createValue]) return ( - <userContext.Provider value={{ user, userRoles, getUserRoles, login, loginError, resetLoginError, logout }}> + <userContext.Provider value={value}> {children} </userContext.Provider> ); @@ -521,6 +524,37 @@ export function unpackUser(user) { return { ...user }; } +export function useUser() { + const [userInfo, getUserInfo, resetUserInfo, userInfoLoading] = useUserInfo(); + const [userRoles, getUserRoles, resetUserRoles, userRolesLoading] = useUserRoles(); + const [user, setUser] = useState(); + + useEffect(() => { + // userInfo and user Roles should: + // - both be defined when logged in + // - both be undefined when logged out + const loginStateConsistent = Boolean(userInfo) === Boolean(userRoles); + if (loginStateConsistent) { + setUser({userInfo, userRoles}); + } + }, [userInfo, userRoles]) + + const getUser = useCallback(() => { + getUserInfo(); + getUserRoles(); + }, [getUserInfo, getUserRoles]); + + const resetUser = useCallback(() => { + resetUserInfo(); + resetUserRoles(); + }, [resetUserInfo, resetUserRoles]); + + const loading = userInfoLoading || userRolesLoading; + + return [user, getUser, resetUser, loading] +} + + export function useUserInfo() { const api = useContext(apiContext); const method = useCallAndUnpack(api.apis.Git.userInfo, unpackUser);