From b6d608a6fa69984818e1e5d13d7e46b5063367bb Mon Sep 17 00:00:00 2001 From: "focp212@naver.com" Date: Tue, 14 Oct 2025 16:01:06 +0900 Subject: [PATCH] test --- src/app/index.tsx | 2 + src/entities/user/lib/use-user-info.ts | 51 ++++++++++++-------------- src/shared/@types/global.d.ts | 4 +- src/shared/configs/axios/index.ts | 38 ++++++++++++++++++- src/shared/configs/axios/utils.ts | 1 + src/utils/api.ts | 5 ++- src/utils/tokenManager.ts | 1 + src/widgets/navigation/footer.tsx | 22 +---------- src/widgets/sub-layout/index.tsx | 11 +++++- 9 files changed, 82 insertions(+), 53 deletions(-) diff --git a/src/app/index.tsx b/src/app/index.tsx index 61b12da..6fed9cb 100644 --- a/src/app/index.tsx +++ b/src/app/index.tsx @@ -5,9 +5,11 @@ import { App } from './app'; import { initAxios } from '@/shared/configs/axios'; import { initSentry } from '@/shared/configs/sentry'; import { AppProvider } from './providers/app-provider'; +import { useUserInfo } from '@/entities/user/lib/use-user-info'; // import appBridge from '@/shared/lib/appBridge'; const initApp = async () => { + //const { updateUserData } = useUserInfo(); initAxios(); initSentry(); // appBridge.sendMessage('login') diff --git a/src/entities/user/lib/use-user-info.ts b/src/entities/user/lib/use-user-info.ts index c0077a6..4dcf724 100644 --- a/src/entities/user/lib/use-user-info.ts +++ b/src/entities/user/lib/use-user-info.ts @@ -25,38 +25,14 @@ export const useUserInfo = () => { logout(); return; } - setLocalStorage(StorageKeys.TokenType, result.tokenType); - setLocalStorage(StorageKeys.AccessToken, result.accessToken); - setLocalStorage(StorageKeys.RefreshToken, result.refreshToken); - setLocalStorage(StorageKeys.AccessTokenExpiresIn, result.accessTokenExpiresIn); - setLocalStorage(StorageKeys.RefreshTokenExpiresIn, result.refreshTokenExpiresIn); - setLocalStorage(StorageKeys.MenuGrants, result.menuGrants); - setLocalStorage(StorageKeys.ClientAddressIP, result.clientAddressIP); - setLocalStorage(StorageKeys.Requires2FA, result.requires2FA); - setLocalStorage(StorageKeys.Usrid, result.usrid); - - useStore.getState().UserStore.setUserInfo({ - ...result - }); + updateUserData(result); } else{ // 개발용 ... if(params){ - const result = await login(params); - setLocalStorage(StorageKeys.TokenType, result.tokenType); - setLocalStorage(StorageKeys.AccessToken, result.accessToken); - setLocalStorage(StorageKeys.RefreshToken, result.refreshToken); - setLocalStorage(StorageKeys.AccessTokenExpiresIn, result.accessTokenExpiresIn); - setLocalStorage(StorageKeys.RefreshTokenExpiresIn, result.refreshTokenExpiresIn); - setLocalStorage(StorageKeys.MenuGrants, result.menuGrants); - setLocalStorage(StorageKeys.ClientAddressIP, result.clientAddressIP); - setLocalStorage(StorageKeys.Requires2FA, result.requires2FA); - setLocalStorage(StorageKeys.Usrid, params.id); - - useStore.getState().UserStore.setUserInfo({ - ...result, - usrid: params.id - }); + const result: LoginResponse = await login(params); + result.usrid = params.id; + updateUserData(result); } } } @@ -66,7 +42,26 @@ export const useUserInfo = () => { logout(); } }; + + const updateUserData = (data: LoginResponse) => { + console.log('updateUserData ==> ['+JSON.stringify(data)+']'); + setLocalStorage(StorageKeys.TokenType, data.tokenType); + setLocalStorage(StorageKeys.AccessToken, data.accessToken); + setLocalStorage(StorageKeys.RefreshToken, data.refreshToken); + setLocalStorage(StorageKeys.AccessTokenExpiresIn, data.accessTokenExpiresIn); + setLocalStorage(StorageKeys.RefreshTokenExpiresIn, data.refreshTokenExpiresIn); + setLocalStorage(StorageKeys.MenuGrants, data.menuGrants); + setLocalStorage(StorageKeys.ClientAddressIP, data.clientAddressIP); + setLocalStorage(StorageKeys.Requires2FA, data.requires2FA); + setLocalStorage(StorageKeys.Usrid, data.usrid); + + useStore.getState().UserStore.setUserInfo({ + ...data + }); + }; + return { callLogin, + updateUserData } } \ No newline at end of file diff --git a/src/shared/@types/global.d.ts b/src/shared/@types/global.d.ts index ad116ef..995c310 100644 --- a/src/shared/@types/global.d.ts +++ b/src/shared/@types/global.d.ts @@ -1,3 +1,4 @@ +import { LoginResponse } from '@/entities/user/model/types'; import type { DefaultEvents, EventEmitter } from '@webview-bridge/web'; export {}; @@ -41,5 +42,6 @@ declare global { ReactNativeWebView: { postMessage: (data: string) => void; }; + saveToken: (token: LoginResponse) => void; } -} +} \ No newline at end of file diff --git a/src/shared/configs/axios/index.ts b/src/shared/configs/axios/index.ts index 005f979..3f7b710 100644 --- a/src/shared/configs/axios/index.ts +++ b/src/shared/configs/axios/index.ts @@ -5,7 +5,16 @@ import { StorageKeys } from '@/shared/constants/local-storage'; import { checkIsAxiosError, getLocalStorage } from '@/shared/lib'; import { finalizeConfig, extractAccessToken, extractRequestId } from './utils'; import { HEADER_USER_AGENT } from '@/shared/constants/url'; +import { useAppBridge } from '@/hooks'; +import { useUserInfo } from '@/entities/user/lib/use-user-info'; +/* +const { + isNativeEnvironment, + requestRefreshToken +} = useAppBridge(); +const { updateUserData } = useUserInfo(); +*/ const onRequestFulfilled = (config: InternalAxiosRequestConfig) => { config.headers['Content-Type'] = 'application/json;charset=UTF-8'; config.headers['X-User-Agent'] = HEADER_USER_AGENT; @@ -26,6 +35,7 @@ const onRequestFulfilled = (config: InternalAxiosRequestConfig) => { const onRequestRejected = (error: any) => { const { method, url, params, data, headers } = error.config; + /* Sentry.setContext('API Request Detail', { method, url, @@ -33,7 +43,7 @@ const onRequestRejected = (error: any) => { data, headers, }); - + */ return Promise.reject(error); }; @@ -47,7 +57,30 @@ const onResponseFulfilled = (response: AxiosResponse) => { }; const onResponseRejected = (error: AxiosError) => { - if (error?.response) { + /* + const { + isNativeEnvironment, + requestRefreshToken + } = useAppBridge(); + const { updateUserData } = useUserInfo(); + */ + console.log('onResponseRejected --> ', error) + if(error?.status === 401){ + /* + if(isNativeEnvironment){ + requestRefreshToken().then((token) => { + updateUserData(token); + }); + } + else{ + requestRefreshToken().then((token) => { + updateUserData(token); + }); + } + */ + } + /* + else if (error?.response) { const { data, status } = error.response; extractRequestId(error?.response); Sentry.setContext('API Response Detail', { @@ -55,6 +88,7 @@ const onResponseRejected = (error: AxiosError) => { data, }); } + */ return new Promise((_resolve, reject) => { if (checkIsAxiosError(error)) { // iOS의 경우 window에서 unload event가 일어날때 네트워크 에러가 발생하곤 해서 이런 케이스를 방지하기 위해 지연시킴 diff --git a/src/shared/configs/axios/utils.ts b/src/shared/configs/axios/utils.ts index eeb7850..fc1365c 100644 --- a/src/shared/configs/axios/utils.ts +++ b/src/shared/configs/axios/utils.ts @@ -23,6 +23,7 @@ export const extractRequestId = (response: AxiosResponse): void => { const requestIdHeader = response?.headers?.['x-request-id']; if (requestIdHeader) { const requestId = requestIdHeader.replaceAll(', *', ''); + console.log('requestId --> ', requestId); setLocalStorage(StorageKeys.RequestId, requestId); } }; diff --git a/src/utils/api.ts b/src/utils/api.ts index 1cb9892..a145888 100644 --- a/src/utils/api.ts +++ b/src/utils/api.ts @@ -33,7 +33,9 @@ class ApiClient { this.instance.interceptors.request.use( (config) => { const token = tokenManager.getAccessToken(); - if (token) { + console.log('setupInterceptors request ==> ', token) + + if(token){ config.headers.Authorization = `Bearer ${token}`; } return config; @@ -45,6 +47,7 @@ class ApiClient { this.instance.interceptors.response.use( (response: AxiosResponse) => response, async (error: AxiosError) => { + console.log(' this.instance.interceptors.response' ); const originalRequest = error.config as AxiosRequestConfig & { _retry?: boolean }; console.log('originalRequest ==> ', JSON.stringify(originalRequest)); if (error.response?.status === 401 && !originalRequest._retry) { diff --git a/src/utils/tokenManager.ts b/src/utils/tokenManager.ts index 48f17ff..2fd2755 100644 --- a/src/utils/tokenManager.ts +++ b/src/utils/tokenManager.ts @@ -24,6 +24,7 @@ export class TokenManager { } getAccessToken(): string | null { + console.log('getAccessToken') return localStorage.getItem(ACCESS_TOKEN_KEY); } diff --git a/src/widgets/navigation/footer.tsx b/src/widgets/navigation/footer.tsx index cb0484d..7e8a868 100644 --- a/src/widgets/navigation/footer.tsx +++ b/src/widgets/navigation/footer.tsx @@ -16,34 +16,16 @@ export const FooterNavigation = ({ const { navigate } = useNavigate(); const [isFooterOn, setIsFooterOn] = useState(false); - const { - isNativeEnvironment, - openBiometricRegistrationPopup, - requestRefreshToken, - logout - } = useAppBridge(); - const onClickToNavigate = (path?: string) => { if(!!path){ - if(path === PATHS.settlement.list){ - callRefresh(); - } - else{ - navigate(path); - } - + navigate(path); } }; const onClickToOpenMenu = () => { setFavoriteEdit(false); setMenuOn(true); }; - const callRefresh = () => { - requestRefreshToken().then((token) => { - console.log('requestRefreshToken +[' + JSON.stringify(token) + ']' ); - }); - } - + const buttonItems = [ { activeIcon: IMAGE_ROOT + '/home-active.svg', diff --git a/src/widgets/sub-layout/index.tsx b/src/widgets/sub-layout/index.tsx index 9924c39..3be0170 100644 --- a/src/widgets/sub-layout/index.tsx +++ b/src/widgets/sub-layout/index.tsx @@ -18,6 +18,7 @@ import { useStore } from '@/shared/model/store'; import { getLocalStorage, setLocalStorage } from '@/shared/lib'; import { StorageKeys } from '@/shared/constants/local-storage'; import { HomeGroupsParams, HomeGroupsResponse } from '@/entities/home/model/types'; +import { LoginResponse } from '@/entities/user/model/types'; export interface ContextType { setOnBack: (onBack: () => void) => void; @@ -42,7 +43,10 @@ export const SubLayout = () => { const [favoriteEdit, setFavoriteEdit] = useState(false); const [headerNavigationKey, setHeaderNavigationKey] = useState(1); - const { callLogin } = useUserInfo(); + const { + callLogin, + updateUserData + } = useUserInfo(); const { isNativeEnvironment } = useAppBridge(); const { mutateAsync: homeGroups } = useHomeGroupsMutation(); @@ -89,6 +93,11 @@ export const SubLayout = () => { }); }, []); + const saveToken = (token: LoginResponse) => { + updateUserData(token); + }; + + window.saveToken = saveToken; useEffect(() => { handleLogin();