TAxios 추가 및 features 구조 변경, api 호출 방식 변경

This commit is contained in:
hyunwoo93.cha
2024-01-25 13:40:53 +09:00
parent 465afb64e5
commit 0b5cd55235
18 changed files with 431 additions and 213 deletions

View File

@@ -0,0 +1,200 @@
import { getUrl, URLS } from "./apiConfig";
import { addPanels, resetPanels } from "../features/panels/panelsSlice";
import * as HelperMethods from "../utils/helperMethods";
import * as Config from "../utils/Config";
import axios from "axios";
// refresh-token 구현 필요
let tokenRefreshing = false;
export const tokenRefresh = async (dispatch, getState, autoLogin, callback) => {
// console.log('getState ', getState());
// const {serverType} = getState().common.localSettings;
// const url = getUrl(URLS.TOKEN_REFRESH, serverType);
// const webOSVersionReal = getState().common.appStatus.webOSVersionReal;
// const {authenticationResult, tokenRequiredTime, userId} = getState().common.localSettings;
// const deviceId = getState().common.appStatus.deviceId;
// if(!userId){
// console.warn('tokenRefresh : not logged');
// if(callback){
// callback(false);
// }
// return;
// }
// const currentTime = new Date();
// const gap = (currentTime - tokenRequiredTime)/1000;
// const ExpiredIn = Number(authenticationResult.ExpiresIn);
// const limitTime = ExpiredIn - (ExpiredIn * THRESHOLD_AUTH_REFRESH);
// if(!autoLogin && (gap < limitTime || tokenRefreshing)){
// if(callback){
// callback(false);
// }
// return;
// }
// const tokenInfo =
// {
// "authenticationResult": authenticationResult,
// deviceInfo: {
// "deviceId": deviceId,
// "deviceName": "deviceName01",
// "os": "webos",
// "model": webOSVersionReal,
// "serialNumber": "xxxx-xxxx-xxxx-xxxx"
// }
// , "userId" : userId
// };
// if(useQAServerURL !== 'prd'){
// console.log('tokenInfo...', tokenInfo, gap, ExpiredIn);
// }
// try{
// tokenRefreshing = true;
// const response = await axios.put(url, tokenInfo, AUTHORIZATION);
// console.log(' tokenRefresh response....', response);
// Actions.AUTHORIZATION.headers.authorization = response.data.authenticationResult.AccessToken;
// dispatch(CommonActions.changeLocalSettings({authenticationResult:response.data.authenticationResult, tokenRequiredTime: new Date()}));
// console.log('토큰 갱신 완료...');
// if(callback){
// callback(true);
// }
// }catch(res) {
// const error = res && res.toJSON ? res.toJSON() : {};
// console.error('tokenRefresh', error, res);
// if(error.message ){
// if(error.message.indexOf('code 400')
// || error.message.indexOf('code 401')
// || error.message.indexOf('code 403')){
// dispatch(Actions.logout());
// }
// }
// if(callback){
// callback(false);
// }
// };
tokenRefreshing = false;
};
export const TAxios = async (
dispatch,
getState,
type,
baseUrl,
urlParams = {},
params = {},
onSuccess,
onFail,
noTokenRefresh = false
) => {
let accessToken = getState().device.accessToken;
const AUTHORIZATION = { headers: {} };
AUTHORIZATION.headers["app_id"] = "com.lgshop.app";
AUTHORIZATION.headers["app_ver"] = "1.0.0";
AUTHORIZATION.headers["dvc_id"] = "testdeviceid";
AUTHORIZATION.headers["cntry_cd"] = "US";
AUTHORIZATION.headers["prod_cd"] = "webOSTV 5.0";
AUTHORIZATION.headers["plat_cd"] = "W20H";
AUTHORIZATION.headers["lang_cd"] = "en-US";
AUTHORIZATION.headers["os_ver"] = "3.0";
AUTHORIZATION.headers["sdk_ver"] = "1.0.0";
AUTHORIZATION.headers["publish_flag"] = "Y";
if (
baseUrl !== URLS.GET_AUTHENTICATION_CODE &&
!accessToken &&
!noTokenRefresh
) {
console.log("Waiting for access token...");
while (!accessToken) {
await HelperMethods.wait(100);
accessToken = getState().device.accessToken;
}
}
if (accessToken) {
AUTHORIZATION.headers["lgsp_auth"] = accessToken;
}
if (typeof window === "object") {
let url = "";
if (Array.isArray(baseUrl)) {
url = getUrl(baseUrl[0]);
} else {
url = getUrl(baseUrl);
}
switch (type) {
case "get": {
const _urlparams = HelperMethods.createQueryString(urlParams);
url += url ? `?${_urlparams}` : "";
break;
}
}
console.log("TAxios ", type + ": " + url, params);
if (!noTokenRefresh) {
await tokenRefresh(dispatch, getState);
}
while (tokenRefreshing) {
await HelperMethods.wait(100);
}
let axiosInstance = null;
switch (type) {
case "get":
AUTHORIZATION.headers = { ...AUTHORIZATION.headers, ...params };
axiosInstance = axios[type](url, AUTHORIZATION);
break;
case "put":
// put이 있다면 구현 필요
case "post":
axiosInstance = axios[type](url, params, AUTHORIZATION);
break;
case "delete":
// delete가 있다면 구현 필요
}
if (axiosInstance) {
axiosInstance
.then((res) => {
console.log("TAxios response", url, res);
if (onSuccess) {
onSuccess(res);
}
})
.catch((res) => {
const error = res && res.toJSON ? res.toJSON() : {};
console.error("TAxios ", url, error);
if (error.message === "Network Error") {
dispatch(resetPanels());
dispatch(
addPanels({
name: Config.panel_names.ERROR_PANEL,
panelInfo: { reason: "server Error" },
})
);
} else {
// todo
}
if (onFail) {
onFail(res);
}
});
} else {
console.warn("TAxios invalid case type ", type);
}
}
};