You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

75 lines
2.5 KiB

import axios from 'axios';
import { toast } from 'react-toastify';
const baseURL = 'http://localhost:4040/api/v1'; //'https://chatstory.ir/api/v1';
const token = '';
const loginURL = 'user/otp/login';
const logoutURL = 'user/logout';
window.baseURL = baseURL;
const Axios = axios.create({
withCredentials: true,
validateStatus: null,
baseURL,
});
class dispatch {}
class Proxy {
get = (url, params, opt = {}) => this.check(url, () => Axios.get(url, { params, ...opt }));
post = (url, params, opt = {}) => this.check(url, () => Axios.post(url, params, opt));
put = (url, params, opt = {}) => this.check(url, () => Axios.put(url, params, opt));
delete = (url, params, opt = {}) => this.check(url, () => Axios.delete(url, params, opt));
result = (url, data) => ({
...data,
dispatch: (dispatch) => {
dispatch({ type: url, data });
return data;
},
});
check = async (url, fetch) => {
let response = await fetch();
switch (response.status) {
case 200:
return this.result(url, response.data.data);
case 401:
if (await this.refresh()) return this.result(url, (await fetch()).data.data);
break;
default:
toast.error(response.data.message);
}
return false;
};
refresh = async () => {
let refresh = localStorage.getItem('refresh');
if (!refresh) window.location.href = '/';
let login = await this.login({}, { headers: { Authorization: `Bearer ${refresh}` } });
return login ? true : false;
};
login = async (data, opt = { headers: { Authorization: `Bearer ${token}` } }) => {
const login = await this.post(loginURL, data, opt);
if (!login || !login.refreshToken) return this.result('login', false);
localStorage.setItem('refresh', login.refreshToken);
delete login.refreshToken;
localStorage.setItem('userData', JSON.stringify(login));
if (data != {}) window.router.setState({ islogin: true });
return this.result('login', login);
};
logout = async () => {
this.post(logoutURL);
localStorage.removeItem('refresh');
localStorage.removeItem('userData');
window.router.setState({ islogin: false });
return this.result('logout', {});
};
status = () => {
let refresh = localStorage.getItem('refresh');
let userData = localStorage.getItem('userData');
if (!refresh) return false;
if (refresh == 'undefined') {
localStorage.removeItem('refresh');
localStorage.removeItem('userData');
return false;
}
return JSON.parse(userData);
};
}
const _proxy = new Proxy();
export default _proxy;