Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | 2x 2x 2x 2x 2x 2x | import Axios, { AxiosResponse } from "axios";
import { hostname, userPath } from "./api";
import { UserState } from "../redux/actions/userTypes";
import store from "../redux/store";
import {
addAccessToken,
addRefreshToken,
checkedCookies,
removeTokens
} from "../redux/actions/tokens";
import { AccessToken, CookieStatus } from "../redux/actions/tokenTypes";
import { deleteCookie, getCookie, setCookie } from "../methods/cookies";
import {updateUser} from "../redux/actions/user";
// reference: https://daveceddia.com/access-redux-store-outside-react/
const cookieName: string = "refreshToken";
export interface BackendLoginData {
tokenValue: string;
user: UserState;
}
export interface BackendAuthData {
tokenValue: string;
userId: number;
validUntil: number;
}
export const checkForCookie = () => {
let refreshTokenCookieValue = getCookie(cookieName);
if (refreshTokenCookieValue) {
store.dispatch(addRefreshToken(refreshTokenCookieValue));
store.dispatch(checkedCookies(CookieStatus.LOADING));
getAccessTokenWithRefreshToken();
} else {
store.dispatch(checkedCookies(CookieStatus.FINISHED));
}
};
export const loginWithUsernameAndPassword = (
userName: string,
password: string,
stayLoggedIn: boolean
): Promise<BackendLoginData> => {
console.log("[Auth] loginWithUsernameAndPassword", userName, password);
return new Promise<BackendLoginData>((resolve, reject) => {
let config = {
headers: {
Authorization: `Basic ${btoa(userName + ":" + password)}`
}
};
return Axios.get<BackendLoginData>(hostname + userPath + "/login", config)
.then((data: AxiosResponse<BackendLoginData>) => {
console.log(data.data);
store.dispatch(addRefreshToken(data.data.tokenValue));
store.dispatch(updateUser(data.data.user as UserState));
if (stayLoggedIn) {
setCookie(cookieName, data.data.tokenValue, 60);
}
getAccessTokenWithRefreshToken();
})
.catch((error) => {
reject(error);
});
});
};
export const getAccessTokenWithRefreshToken = () => {
console.log("getAccessTokenWithRefreshToken");
let refreshToken: string | null = store.getState().tokens.refreshToken;
let config = {
headers: {
Authorization: `Bearer ${refreshToken}`
}
};
Axios.get<BackendAuthData>(hostname + userPath + "/auth", config)
.then((data: AxiosResponse<BackendAuthData>) => {
store.dispatch(checkedCookies(CookieStatus.FINISHED));
setAuthHeaderToAxios(data.data.tokenValue);
store.dispatch(
addAccessToken({
token: data.data.tokenValue,
timestamp: data.data.validUntil
} as AccessToken)
);
if (!store.getState().user.username) {
getOwnUserData(data.data.userId);
}
})
.catch((error) => {
store.dispatch(removeTokens());
store.dispatch(checkedCookies(CookieStatus.FINISHED));
console.log(error);
//you probably want to notify the user, maybe with a toast or similar
});
};
const getOwnUserData = (userId: number) => {
Axios.get<UserState>(`${hostname}${userPath}/${userId}/info`)
.then((response: AxiosResponse<UserState>) => {
store.dispatch(updateUser(response.data));
})
.catch((error) => {
console.log(error);
});
};
export const logout = () => {
store.dispatch(removeTokens());
deleteCookie(cookieName);
};
function setAuthHeaderToAxios(accessToken: string) {
Axios.defaults.headers.common["Authorization"] = `Bearer ${accessToken}`;
}
|