86 lines
2.4 KiB
JavaScript

import axios from 'axios';
import Cookies from 'js-cookie';
const api = axios.create({
baseURL: 'http://127.0.0.1:8000/api',
timeout: 2500,
withCredentials: true,
});
export const createUser = async (userData) => {
const response = await api.post('/users', userData);
const { access, refresh } = response.data;
Cookies.set('refresh', refresh,{
expires: 1,
secure: true,
sameSite: 'strict',
});
sessionStorage.setItem('access_token', access);
return response.data
};
export const loginUser = async (userData) => {
const response = await api.post('/token/', userData);
const { access, refresh } = response.data;
Cookies.set('refresh', refresh,{
expires: 1,
secure: true,
sameSite: 'strict',
});
sessionStorage.setItem('access_token', access);
return response.data;
};
export const updateUser = async (userData) => {
const response = await api.put('/users/me/', userData, {
headers: {Authorization: `Bearer ${sessionStorage.getItem('access_token')}`},
});
return response.data;
}
export const getuserinfo = async () => {
const response = await api.get('/users/me/', {
headers: {Authorization: `Bearer ${sessionStorage.getItem('access_token')}`},
});
return response.data;
};
const refreshAccessToken = async () => {
try {
const response = await api.post('/token/refresh', {'refresh': Cookies.get('refresh')}, {
withCredentials: true,
});
const { access, refresh } = response.data;
return [access, refresh];
} catch (error) {
console.error('Refresh token request failed:', error);
return null;
}
};
api.interceptors.response.use(
(response) => response,
async (error) => {
if (error.response && error.response.status === 401) {
const errorMessage = error.response.data.detail;
if (errorMessage === "No active account found with the given credentials") {
return Promise.reject(error);
} else {
const tokens = await refreshAccessToken();
if (tokens) {
const [newAccessToken, newRefreshToken] = tokens;
Cookies.set('refresh', newRefreshToken, {
expires: 1,
secure: true,
sameSite: 'strict',
});
error.config.headers['Authorization'] = `Bearer ${newAccessToken}`;
return api(error.config);
}
}
}
return Promise.reject(error);
}
);