From 6d02533d69f6979fd1deddd49f19bffad6c50e2e Mon Sep 17 00:00:00 2001 From: Jonasz Bigda Date: Sun, 29 Nov 2020 20:23:20 +0100 Subject: [PATCH] JWT refresh --- src/actions/index.js | 39 +++++++++++++++++-- src/components/Dialogs/Dish.js | 1 + src/components/Dialogs/EditDish.js | 3 +- src/components/Dialogs/NewDish.js | 3 +- src/components/Dialogs/NewRestaurant.js | 3 +- .../EditRestaurant/EditRestaurantInfo.js | 7 +++- .../EditRestaurant/EditRestaurantLocation.js | 1 + .../EditRestaurant/EditRestaurantMenu.js | 6 ++- .../EditRestaurant/EditRestaurantPhoto.js | 3 +- .../EditRestaurantSubscription.js | 3 +- src/components/EditRestaurant/LunchMenu.js | 3 +- src/components/Input/ImageUpload.js | 1 + src/components/Input/ImageUploadWide.js | 1 + src/components/Output/EditDishList.js | 2 +- src/components/Output/LunchSetDishList.js | 2 +- src/config.js | 9 ++--- src/index.js | 2 + src/reducers/data.js | 2 + 18 files changed, 69 insertions(+), 22 deletions(-) diff --git a/src/actions/index.js b/src/actions/index.js index 42191fa..ad73a82 100644 --- a/src/actions/index.js +++ b/src/actions/index.js @@ -2,6 +2,29 @@ import axios from "axios"; import * as toggles from "./toggles"; import { push } from "connected-react-router"; import { backend } from "../config.js"; +import store from "../index.js"; + +axios.defaults.withCredentials = true; + +axios.interceptors.response.use( + (response) => { + return response; + }, + (error) => { + return new Promise((resolve) => { + if (error.response && error.response.status === 401 && error.config && !error.config.__isRetryRequest) { + const response = axios.post(backend + "user/refreshtoken", {withCredentials: true}).then((res) => { + const jwt = res.headers['x-auth-token']; + store.dispatch(setNewToken(jwt)) + error.config.__isRetryRequest = true + error.config.headers['x-auth-token'] = jwt + return axios(error.config); + }) + resolve(response) + } + throw error + }) + }); const autocomplete = (input) => { return { @@ -16,6 +39,13 @@ export const clearAutocomplete = () => { }; }; +export const setNewToken = (token) => { + return { + type: "SET_NEW_TOKEN", + payload: token + } +} + export const fetchAutocomplete = (input) => { return function (dispatch) { axios @@ -124,13 +154,14 @@ export const fetchDish = (id) => { }; }; -export const refreshUserData = (token) => { +export const refreshUserData = () => { return function (dispatch) { + const state = store.getState() axios({ url: backend + "user/refresh", method: "POST", headers: { - "x-auth-token": token, + "x-auth-token": state.data.userData.jwt, }, }) .then((response) => { @@ -138,7 +169,7 @@ export const refreshUserData = (token) => { toggles.setLoggedIn( response.data.firstname, response.data.lastname, - token, + state.data.userData.jwt, response.data.id, response.data.email, response.data.NIP, @@ -149,7 +180,7 @@ export const refreshUserData = (token) => { ); }) .catch((err) => { - if (err.status === 401) { + if (err.status === 401 || err.status === 500) { dispatch(logout()); } console.log(err); diff --git a/src/components/Dialogs/Dish.js b/src/components/Dialogs/Dish.js index 3ec05e5..0c460c6 100644 --- a/src/components/Dialogs/Dish.js +++ b/src/components/Dialogs/Dish.js @@ -33,6 +33,7 @@ export default function Dish(props) { }) .catch((err) => { console.log(err); + throw err; }); }, [id]); diff --git a/src/components/Dialogs/EditDish.js b/src/components/Dialogs/EditDish.js index eab126a..1d9fa52 100644 --- a/src/components/Dialogs/EditDish.js +++ b/src/components/Dialogs/EditDish.js @@ -316,7 +316,7 @@ export default function EditDish() { .then((response) => { dispatch(hideBackdrop()); dispatch(notification("Danie zmienione.", "success")); - dispatch(refreshUserData(token)); + dispatch(refreshUserData()); history.push(`/dish/${dish._id}`); }) .catch((error) => { @@ -324,6 +324,7 @@ export default function EditDish() { dispatch( notification("Wystąpił nieoczekiwany błąd, przepraszamy.", "error") ); + throw error; }); }; diff --git a/src/components/Dialogs/NewDish.js b/src/components/Dialogs/NewDish.js index 30f0ff4..1fd67f1 100644 --- a/src/components/Dialogs/NewDish.js +++ b/src/components/Dialogs/NewDish.js @@ -318,7 +318,7 @@ export default function NewRestaurant() { .then((response) => { dispatch(hideBackdrop()); dispatch(notification("Danie dodane pomyślnie.", "success")); - dispatch(refreshUserData(token)); + dispatch(refreshUserData()); history.push(`/editRestaurant/${restaurantID}`); }) .catch((error) => { @@ -329,6 +329,7 @@ export default function NewRestaurant() { "error" ) ); + throw error; }); }; diff --git a/src/components/Dialogs/NewRestaurant.js b/src/components/Dialogs/NewRestaurant.js index fb398c2..4286872 100644 --- a/src/components/Dialogs/NewRestaurant.js +++ b/src/components/Dialogs/NewRestaurant.js @@ -202,7 +202,7 @@ export default function NewRestaurant() { "success" ) ); - dispatch(refreshUserData(token)); + dispatch(refreshUserData()); history.push("/"); }) .catch((error) => { @@ -215,6 +215,7 @@ export default function NewRestaurant() { ) ); history.push("/"); + throw error; }); }; diff --git a/src/components/EditRestaurant/EditRestaurantInfo.js b/src/components/EditRestaurant/EditRestaurantInfo.js index 7b7fbb0..dc0ea3d 100644 --- a/src/components/EditRestaurant/EditRestaurantInfo.js +++ b/src/components/EditRestaurant/EditRestaurantInfo.js @@ -173,7 +173,7 @@ export default function EditRestaurantInfo(props) { }, }) .then((response) => { - dispatch(refreshUserData(jwt)); + dispatch(refreshUserData()); setState({ ...state, hidden: !state.hidden }); dispatch(hideBackdrop()); dispatch(notification("Widoczność zmieniona poprawnie", "success")); @@ -182,6 +182,7 @@ export default function EditRestaurantInfo(props) { console.log(err); dispatch(hideBackdrop()); dispatch(notification("Wystąpił błąd :(", "error")); + throw err; }); } @@ -200,7 +201,7 @@ export default function EditRestaurantInfo(props) { }, }) .then((response) => { - dispatch(refreshUserData(jwt)); + dispatch(refreshUserData()); dispatch(hideBackdrop()); dispatch(notification("Restauracja została usunięta", "success")); history.push("/"); @@ -209,6 +210,7 @@ export default function EditRestaurantInfo(props) { console.log(err); dispatch(hideBackdrop()); dispatch(notification("Wystąpił nieoczekiwany błąd :(", "error")); + throw err; }); }; @@ -257,6 +259,7 @@ export default function EditRestaurantInfo(props) { console.log(err); dispatch(hideBackdrop()); dispatch(notification("Wystąpił nieoczekiwany błąd :(", "error")); + throw err; }); } }; diff --git a/src/components/EditRestaurant/EditRestaurantLocation.js b/src/components/EditRestaurant/EditRestaurantLocation.js index e5db897..0760640 100644 --- a/src/components/EditRestaurant/EditRestaurantLocation.js +++ b/src/components/EditRestaurant/EditRestaurantLocation.js @@ -67,6 +67,7 @@ export default function EditRestaurantLocation(props) { .catch((e) => { dispatch(hideBackdrop()); dispatch(notification("Nie udało się zmienić lokalizacji :(", "error")); + throw e; }); }; diff --git a/src/components/EditRestaurant/EditRestaurantMenu.js b/src/components/EditRestaurant/EditRestaurantMenu.js index 00ef62e..451da7a 100644 --- a/src/components/EditRestaurant/EditRestaurantMenu.js +++ b/src/components/EditRestaurant/EditRestaurantMenu.js @@ -69,11 +69,12 @@ export default function EditRestaurantMenu(props) { .then((res) => { dispatch(hideBackdrop()); dispatch(notification("Dodano kategorię.", "success")); - dispatch(refreshUserData(token)); + dispatch(refreshUserData()); }) .catch((e) => { dispatch(hideBackdrop()); dispatch(notification("Nie udało się dodać kategorii :(", "error")); + throw e; }); } }; @@ -96,11 +97,12 @@ export default function EditRestaurantMenu(props) { .then((res) => { dispatch(hideBackdrop()); dispatch(notification("Usunięto kategorię.", "success")); - dispatch(refreshUserData(token)); + dispatch(refreshUserData()); }) .catch((e) => { dispatch(hideBackdrop()); dispatch(notification("Nie udało się usunąć kategorii :(", "error")); + throw e; }); }; diff --git a/src/components/EditRestaurant/EditRestaurantPhoto.js b/src/components/EditRestaurant/EditRestaurantPhoto.js index 13d778e..c21423a 100644 --- a/src/components/EditRestaurant/EditRestaurantPhoto.js +++ b/src/components/EditRestaurant/EditRestaurantPhoto.js @@ -60,11 +60,12 @@ export default function EditRestaurantPhoto(props) { .then((res) => { dispatch(hideBackdrop()); dispatch(notification("Zmieniono zdjęcie.", "success")); - dispatch(refreshUserData(token)); + dispatch(refreshUserData()); }) .catch((e) => { dispatch(hideBackdrop()); dispatch(notification("Nie udało się zmienić zdjęcia :(", "error")); + throw e; }); }; return ( diff --git a/src/components/EditRestaurant/EditRestaurantSubscription.js b/src/components/EditRestaurant/EditRestaurantSubscription.js index ebeefc3..9998b6a 100644 --- a/src/components/EditRestaurant/EditRestaurantSubscription.js +++ b/src/components/EditRestaurant/EditRestaurantSubscription.js @@ -55,6 +55,7 @@ export default function EditRestaurantSubscription(props) { .catch((error) => { dispatch(hideBackdrop()); dispatch(notification("Wystąpił błąd, spróbuj ponownie.", "error")); + throw error; }); }; @@ -63,7 +64,7 @@ export default function EditRestaurantSubscription(props) { }; const onAccept = () => { - dispatch(refreshUserData(token)); + dispatch(refreshUserData()); openInNewTab("https://secure.przelewy24.pl/trnRequest/0"); }; diff --git a/src/components/EditRestaurant/LunchMenu.js b/src/components/EditRestaurant/LunchMenu.js index 4c58459..aa4a145 100644 --- a/src/components/EditRestaurant/LunchMenu.js +++ b/src/components/EditRestaurant/LunchMenu.js @@ -159,11 +159,12 @@ export default function EditCategoriesList(props) { .then((response) => { dispatch(hideBackdrop()); dispatch(notification("Zmieniono zestaw.", "success")); - dispatch(refreshUserData(token)); + dispatch(refreshUserData()); }) .catch((error) => { dispatch(hideBackdrop()); dispatch(notification("Wystąpił błąd.", "error")); + throw error; }); } else { dispatch(notification("Popraw dane.", "error")); diff --git a/src/components/Input/ImageUpload.js b/src/components/Input/ImageUpload.js index 74346fc..2c3e1d4 100644 --- a/src/components/Input/ImageUpload.js +++ b/src/components/Input/ImageUpload.js @@ -30,6 +30,7 @@ export default function ImageUpload(props) { .catch((error) => { console.log("Wystąpił błąd podczas wgrywania pliku."); setLoading(false); + throw error; }); }; diff --git a/src/components/Input/ImageUploadWide.js b/src/components/Input/ImageUploadWide.js index 1d4c2ae..5e6c253 100644 --- a/src/components/Input/ImageUploadWide.js +++ b/src/components/Input/ImageUploadWide.js @@ -30,6 +30,7 @@ export default function ImageUpload(props) { .catch((error) => { console.log("Wystąpił błąd podczas wgrywania pliku."); setLoading(false); + throw error; }); }; diff --git a/src/components/Output/EditDishList.js b/src/components/Output/EditDishList.js index 9df0abe..60d4cf9 100644 --- a/src/components/Output/EditDishList.js +++ b/src/components/Output/EditDishList.js @@ -110,7 +110,7 @@ export default function EditDishList(props) { .then((response) => { dispatch(hideBackdrop()); dispatch(notification("Dodano do zestawu.", "success")); - dispatch(refreshUserData(token)); + dispatch(refreshUserData()); }) .catch((error) => { dispatch(hideBackdrop()); diff --git a/src/components/Output/LunchSetDishList.js b/src/components/Output/LunchSetDishList.js index 370c876..80f2a3c 100644 --- a/src/components/Output/LunchSetDishList.js +++ b/src/components/Output/LunchSetDishList.js @@ -59,7 +59,7 @@ export default function EditDishList(props) { .then((response) => { dispatch(hideBackdrop()); dispatch(notification("Zmodyfikowano zestaw.", "success")); - dispatch(refreshUserData(token)); + dispatch(refreshUserData()); }) .catch((error) => { dispatch(hideBackdrop()); diff --git a/src/config.js b/src/config.js index 945c80c..a34d20d 100644 --- a/src/config.js +++ b/src/config.js @@ -1,4 +1,5 @@ -export const backend = "https://api.menui.pl/"; +//export const backend = "https://api.menui.pl/"; +export const backend = "http://localhost:4000/"; export const restaurantTypes = [ "afrykańska", @@ -34,8 +35,4 @@ export const restaurantTypes = [ "żydowska", "mieszane", "inna", - ]; - - export const authErrorInterceptor = (error) => { - - } \ No newline at end of file + ]; \ No newline at end of file diff --git a/src/index.js b/src/index.js index d189a29..0f9efab 100644 --- a/src/index.js +++ b/src/index.js @@ -29,6 +29,8 @@ ReactDOM.render( document.getElementById("root") ); +export default store; + // If you want your app to work offline and load faster, you can change // unregister() to register() below. Note this comes with some pitfalls. // Learn more about service workers: https://bit.ly/CRA-PWA diff --git a/src/reducers/data.js b/src/reducers/data.js index 6f06af4..46943c4 100644 --- a/src/reducers/data.js +++ b/src/reducers/data.js @@ -98,6 +98,8 @@ const data = (state = initialState, action) => { }), }, }); + case "SET_NEW_TOKEN": + return (state = {...state, userData: {...state.userData, jwt: action.payload}}) default: return state; }