Files
shoptime/com.twin.app.shoptime/src/api/TAxios.js
2024-06-21 14:45:22 +09:00

141 lines
4.2 KiB
JavaScript

import axios from "axios";
import Spotlight from "@enact/spotlight";
import { types } from "../actions/actionTypes";
import { changeLocalSettings, setShowPopup } from "../actions/commonActions";
import {
getAuthenticationCode,
getReAuthenticationCode,
} from "../actions/deviceActions";
import { ACTIVE_POPUP } from "../utils/Config";
import * as HelperMethods from "../utils/helperMethods";
import { getUrl } from "./apiConfig";
let tokenRefreshing = false;
export const setTokenRefreshing = (value) => {
console.log("TAxios setTokenRefreshing ", value);
tokenRefreshing = value;
};
export const TAxios = (
dispatch,
getState,
type,
baseUrl,
urlParams = {},
params = {},
onSuccess,
onFail,
noTokenRefresh = false
) => {
const checkAccessToken = () => {
return new Promise((resolve) => {
const accessToken = getState().localSettings.accessToken;
if (noTokenRefresh || (!tokenRefreshing && accessToken)) {
resolve(accessToken);
} else {
if (!accessToken && !tokenRefreshing) {
dispatch(getAuthenticationCode());
}
HelperMethods.wait(100).then(() => {
resolve(checkAccessToken());
});
}
});
};
const executeRequest = (accessToken) => {
const httpHeader = getState().common.httpHeader;
const { mbr_no, deviceId } = getState().common.appStatus;
const refreshToken = getState().localSettings.refreshToken;
const AUTHORIZATION = { headers: { ...httpHeader } };
if (accessToken) {
AUTHORIZATION.headers["lgsp_auth"] = accessToken;
}
AUTHORIZATION.headers["dvc_id"] = deviceId;
AUTHORIZATION.headers["refresh-token"] = refreshToken;
if (typeof window === "object") {
let url = Array.isArray(baseUrl)
? getUrl(getState, baseUrl[0])
: getUrl(getState, baseUrl);
if (!url) {
//todo error page
return;
}
if (type === "get") {
const _urlparams = HelperMethods.createQueryString(urlParams);
url += _urlparams ? `?${_urlparams}` : "";
}
let axiosInstance;
switch (type) {
case "get":
axiosInstance = axios.get(url, AUTHORIZATION);
break;
case "post":
axiosInstance = axios.post(url, params, AUTHORIZATION);
break;
// TODO: 다른 HTTP 메소드 있다면 처리 (chw)
}
if (axiosInstance) {
axiosInstance
.then((res) => {
console.log("TAxios response", url, res);
// if(res?.data?.retCode === 501){
// //약관 비동의
// dispatch(changeLocalSettings({accessToken: null}));
// dispatch({type: types.GET_TERMS_AGREE_YN, payload: {}});
// return;
// }
// AccessToken 만료
if (res?.data?.retCode === 401) {
dispatch(getReAuthenticationCode());
checkAccessToken().then((token) => {
executeRequest(token);
});
return;
}
//RefreshToken 만료
if (res?.data?.retCode === 402 || res?.data?.retCode === 501) {
dispatch(getAuthenticationCode());
checkAccessToken().then((token) => {
executeRequest(token);
});
return;
}
// 602 요청 국가 불일치
if (res?.data?.retCode === 602) {
dispatch(setShowPopup(ACTIVE_POPUP.unSupportedCountryPopup));
Spotlight.focus("tPopupBtn1");
return;
}
// 603 서비스 국가 아님
if (res?.data?.retCode === 603) {
dispatch(setShowPopup(ACTIVE_POPUP.changeCountyPopup));
Spotlight.focus("tPopupBtn1");
return;
}
if (res?.data?.retCode === 604) {
//todo "NotServiceLanguage"
return;
}
if (onSuccess) onSuccess(res);
})
.catch((error) => {
console.error("TAxios ", url, error);
if (onFail) onFail(error);
});
}
}
};
checkAccessToken().then((token) => {
executeRequest(token);
});
};