|
|
@@ -2,17 +2,16 @@ import { boot } from "quasar/wrappers";
|
|
|
import { Cookies, Notify } from "quasar";
|
|
|
import axios from "axios";
|
|
|
import { useRouter } from "vue-router";
|
|
|
-import { useAuth } from "src/composables/useAuth";
|
|
|
+import { userStore } from "src/stores/user";
|
|
|
|
|
|
const api = axios.create({
|
|
|
baseURL: process.env.API_URL + "/api",
|
|
|
withCredentials: true,
|
|
|
- withXSRFToken: true,
|
|
|
});
|
|
|
|
|
|
api.interceptors.request.use(
|
|
|
async (config) => {
|
|
|
- const accessToken = Cookies.get("access_token");
|
|
|
+ const accessToken = userStore().accessToken;
|
|
|
const savedLanguage = Cookies.get("locale");
|
|
|
const language = savedLanguage || window.navigator.language;
|
|
|
config.headers["Accept-Language"] = language;
|
|
|
@@ -41,13 +40,9 @@ const processQueue = (error, token = null) => {
|
|
|
failedQueue = [];
|
|
|
};
|
|
|
|
|
|
-const errorInterceptor = async (
|
|
|
- error,
|
|
|
- router,
|
|
|
- setAuthTokens,
|
|
|
- eraseAuthTokens,
|
|
|
-) => {
|
|
|
+const errorInterceptor = async (error, router) => {
|
|
|
const originalRequest = error.config;
|
|
|
+ const user_store = userStore();
|
|
|
|
|
|
if (error.response?.status === 422) {
|
|
|
return Promise.reject(error);
|
|
|
@@ -75,30 +70,20 @@ const errorInterceptor = async (
|
|
|
if (isRefreshing) {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
failedQueue.push({ resolve, reject, config: originalRequest });
|
|
|
- })
|
|
|
- .then((res) => res)
|
|
|
- .catch((err) => Promise.reject(err));
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
isRefreshing = true;
|
|
|
try {
|
|
|
- const refreshToken = Cookies.get("refresh_token");
|
|
|
- if (!refreshToken) {
|
|
|
- router.push("/login");
|
|
|
- return Promise.reject(new Error("No refresh token available."));
|
|
|
- }
|
|
|
-
|
|
|
- const response = await api.post("/refresh", {
|
|
|
- refresh_token: refreshToken,
|
|
|
- });
|
|
|
+ const response = await api.post("/refresh");
|
|
|
const newAccessToken = response.data.payload.access_token;
|
|
|
- setAuthTokens(response.data.payload);
|
|
|
+ user_store.accessToken = newAccessToken;
|
|
|
originalRequest.headers["Authorization"] = `Bearer ${newAccessToken}`;
|
|
|
processQueue(null, newAccessToken);
|
|
|
return api(originalRequest);
|
|
|
} catch (err) {
|
|
|
processQueue(err, null);
|
|
|
- eraseAuthTokens();
|
|
|
+ user_store.resetUser();
|
|
|
router.push("/login");
|
|
|
return Promise.reject(err);
|
|
|
} finally {
|
|
|
@@ -118,11 +103,10 @@ const successInterceptor = (response) => {
|
|
|
|
|
|
export default boot(({ app }) => {
|
|
|
const router = useRouter();
|
|
|
- const { setAuthTokens, eraseAuthTokens } = useAuth();
|
|
|
|
|
|
api.interceptors.response.use(
|
|
|
(response) => successInterceptor(response),
|
|
|
- (error) => errorInterceptor(error, router, setAuthTokens, eraseAuthTokens),
|
|
|
+ (error) => errorInterceptor(error, router),
|
|
|
);
|
|
|
|
|
|
// for use inside Vue files (Options API) through this.$axios and this.$api
|