From 98dde0d6a0c63fada2b9da376e09f76ac5c49b9b Mon Sep 17 00:00:00 2001 From: optrader Date: Sat, 15 Nov 2025 14:47:48 +0900 Subject: [PATCH] =?UTF-8?q?[251115]=20fix:=20ProductVideo.v3.jsx=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=ED=99=94=EB=A9=B4=20=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ๐Ÿ• ์ปค๋ฐ‹ ์‹œ๊ฐ„: 2025. 11. 15. 14:47:47 ๐Ÿ“Š ๋ณ€๊ฒฝ ํ†ต๊ณ„: โ€ข ์ด ํŒŒ์ผ: 8๊ฐœ โ€ข ์ถ”๊ฐ€: +261์ค„ โ€ข ์‚ญ์ œ: -242์ค„ ๐Ÿ“ ์ˆ˜์ •๋œ ํŒŒ์ผ: ~ com.twin.app.shoptime/src/actions/deviceActions.js ~ com.twin.app.shoptime/src/actions/homeActions.js ~ com.twin.app.shoptime/src/actions/mainActions.js ~ com.twin.app.shoptime/src/actions/productActions.js ~ com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx ~ com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductVideo/ProductVideo.jsx ~ com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductVideo/ProductVideo.v3.jsx ~ com.twin.app.shoptime/src/views/MediaPanel/MediaPanel.v3.jsx ๐Ÿ”ง ํ•จ์ˆ˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ: ๐Ÿ“„ com.twin.app.shoptime/src/actions/homeActions.js (javascript): ๐Ÿ”„ Modified: checkEnterThroughGNB() โŒ Deleted: clearPersistentVideoInfo() ๐Ÿ“„ com.twin.app.shoptime/src/actions/productActions.js (javascript): ๐Ÿ”„ Modified: createGetThunk(), getVideoIndicatorFocus() โŒ Deleted: fetchAllReviewsWithSequentialPaging() ๐Ÿ“„ com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx (javascript): ๐Ÿ”„ Modified: extractProductMeta() ๐Ÿ“„ com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductVideo/ProductVideo.jsx (javascript): ๐Ÿ”„ Modified: Spottable() ๐Ÿ“„ com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductVideo/ProductVideo.v3.jsx (javascript): ๐Ÿ”„ Modified: Spottable() ๐Ÿ“„ com.twin.app.shoptime/src/views/MediaPanel/MediaPanel.v3.jsx (javascript): ๐Ÿ”„ Modified: normalizeModalStyle() ๐Ÿ”ง ์ฃผ์š” ๋ณ€๊ฒฝ ๋‚ด์šฉ: โ€ข ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฐœ์„  --- .../src/actions/deviceActions.js | 66 +-- .../src/actions/homeActions.js | 290 ++++++------- .../src/actions/mainActions.js | 16 +- .../src/actions/productActions.js | 399 +++++++++--------- .../ProductAllSection/ProductAllSection.jsx | 20 +- .../ProductVideo/ProductVideo.jsx | 28 +- .../ProductVideo/ProductVideo.v3.jsx | 56 ++- .../src/views/MediaPanel/MediaPanel.v3.jsx | 2 +- 8 files changed, 426 insertions(+), 451 deletions(-) diff --git a/com.twin.app.shoptime/src/actions/deviceActions.js b/com.twin.app.shoptime/src/actions/deviceActions.js index 4f4d2a97..2c997a64 100644 --- a/com.twin.app.shoptime/src/actions/deviceActions.js +++ b/com.twin.app.shoptime/src/actions/deviceActions.js @@ -1,14 +1,9 @@ -import { URLS } from "../api/apiConfig"; -import { - runDelayedAction, - setTokenRefreshing, - TAxios, - TAxiosAdvancedPromise, -} from "../api/TAxios"; -import * as lunaSend from "../lunaSend"; -import { types } from "./actionTypes"; -import { changeLocalSettings } from "./commonActions"; -import { fetchCurrentUserHomeTerms } from "./homeActions"; +import { URLS } from '../api/apiConfig'; +import { runDelayedAction, setTokenRefreshing, TAxios, TAxiosAdvancedPromise } from '../api/TAxios'; +import * as lunaSend from '../lunaSend'; +import { types } from './actionTypes'; +import { changeLocalSettings } from './commonActions'; +import { fetchCurrentUserHomeTerms } from './homeActions'; const MAX_RETRY_COUNT = 3; const RETRY_DELAY = 2000; // 2 seconds @@ -17,7 +12,7 @@ const RETRY_DELAY = 2000; // 2 seconds export const getAuthenticationCode = () => (dispatch, getState) => { setTokenRefreshing(true); const onSuccess = (response) => { - console.log("getAuthenticationCode onSuccess: ", response.data); + console.log('getAuthenticationCode onSuccess: ', response.data); const accessToken = response.data.data.accessToken; const refreshToken = response.data.data.refreshToken ?? null; @@ -27,21 +22,11 @@ export const getAuthenticationCode = () => (dispatch, getState) => { }; const onFail = (error) => { - console.error("getAuthenticationCode onFail: ", error); + console.error('getAuthenticationCode onFail: ', error); setTokenRefreshing(false); }; - TAxios( - dispatch, - getState, - "get", - URLS.GET_AUTHENTICATION_CODE, - {}, - {}, - onSuccess, - onFail, - true - ); + TAxios(dispatch, getState, 'get', URLS.GET_AUTHENTICATION_CODE, {}, {}, onSuccess, onFail, true); }; // IF-LGSP-001 ๋””๋ฐ”์ด์Šค ๋“ฑ๋ก ๋ฐ ์•ฝ๊ด€ ๋™์˜ @@ -50,7 +35,7 @@ export const registerDevice = const { agreeTerms } = params; const onSuccess = (response) => { - console.log("registerDevice onSuccess: ", response.data); + console.log('registerDevice onSuccess: ', response.data); dispatch({ type: types.REGISTER_DEVICE, @@ -65,7 +50,7 @@ export const registerDevice = }; const onFail = (error) => { - console.error("registerDevice onFail: ", error); + console.error('registerDevice onFail: ', error); if (onFailCallback) { onFailCallback(error); } @@ -74,7 +59,7 @@ export const registerDevice = TAxios( dispatch, getState, - "post", + 'post', URLS.REGISTER_DEVICE, {}, { agreeTerms }, @@ -89,7 +74,7 @@ export const registerDeviceInfo = (params) => (dispatch, getState) => { const { evntTpCd, evntId, evntApplcnFlag, entryMenu, mbphNo } = params; const onSuccess = (response) => { - console.log("registerDeviceInfo onSuccess: ", response.data); + console.log('registerDeviceInfo onSuccess: ', response.data); dispatch({ type: types.REGISTER_DEVICE_INFO, @@ -99,13 +84,13 @@ export const registerDeviceInfo = (params) => (dispatch, getState) => { }; const onFail = (error) => { - console.error("registerDeviceInfo onFail: ", error); + console.error('registerDeviceInfo onFail: ', error); }; TAxios( dispatch, getState, - "post", + 'post', URLS.REGISTER_DEVICE_INFO, {}, { evntTpCd, evntId, evntApplcnFlag, entryMenu, mbphNo }, @@ -117,7 +102,7 @@ export const registerDeviceInfo = (params) => (dispatch, getState) => { // ๋””๋ฐ”์ด์Šค ๋ถ€๊ฐ€ ์ •๋ณด ์กฐํšŒ IF-LGSP-003 export const getDeviceAdditionInfo = () => (dispatch, getState) => { const onSuccess = (response) => { - console.log("getDeviceAdditionInfo onSuccess: ", response.data); + console.log('getDeviceAdditionInfo onSuccess: ', response.data); dispatch({ type: types.GET_DEVICE_INFO, @@ -126,26 +111,17 @@ export const getDeviceAdditionInfo = () => (dispatch, getState) => { }; const onFail = (error) => { - console.error("getDeviceAdditionInfo onFail: ", error); + console.error('getDeviceAdditionInfo onFail: ', error); }; - TAxios( - dispatch, - getState, - "get", - URLS.GET_DEVICE_INFO, - {}, - {}, - onSuccess, - onFail - ); + TAxios(dispatch, getState, 'get', URLS.GET_DEVICE_INFO, {}, {}, onSuccess, onFail); }; // ์ธ์ฆ๋ฒˆํ˜ธ ์žฌ์š”์ฒญ IF-LGSP-096 export const getReAuthenticationCode = () => (dispatch, getState) => { setTokenRefreshing(true); const onSuccess = (response) => { - console.log("getReAuthenticationCode onSuccess: ", response.data); + // console.log("getReAuthenticationCode onSuccess: ", response.data); const accessToken = response.data.data.accessToken; dispatch(changeLocalSettings({ accessToken })); setTokenRefreshing(false); @@ -153,14 +129,14 @@ export const getReAuthenticationCode = () => (dispatch, getState) => { }; const onFail = (error) => { - console.error("getReAuthenticationCode onFail: ", error); + console.error('getReAuthenticationCode onFail: ', error); setTokenRefreshing(false); }; TAxios( dispatch, getState, - "get", + 'get', URLS.GET_RE_AUTHENTICATION_CODE, {}, {}, diff --git a/com.twin.app.shoptime/src/actions/homeActions.js b/com.twin.app.shoptime/src/actions/homeActions.js index 59a1b2f6..d9f02e9f 100644 --- a/com.twin.app.shoptime/src/actions/homeActions.js +++ b/com.twin.app.shoptime/src/actions/homeActions.js @@ -1,62 +1,67 @@ -import { URLS } from "../api/apiConfig"; -import { TAxios,TAxiosPromise } from "../api/TAxios"; -import { types } from "./actionTypes"; -import { changeAppStatus, getTermsAgreeYn } from "./commonActions"; -import { collectBannerPositions } from "../utils/domUtils"; +import { URLS } from '../api/apiConfig'; +import { TAxios, TAxiosPromise } from '../api/TAxios'; +import { types } from './actionTypes'; +import { changeAppStatus, getTermsAgreeYn } from './commonActions'; +import { collectBannerPositions } from '../utils/domUtils'; // ์•ฝ๊ด€ ์ •๋ณด ์กฐํšŒ IF-LGSP-005 export const getHomeTerms = (props) => (dispatch, getState) => { const { trmsTpCdList, mbrNo } = props; const onSuccess = (response) => { - console.log("getHomeTerms onSuccess ", response.data); - + console.log('getHomeTerms onSuccess ', response.data); + if (response.data.retCode === 0) { dispatch({ type: types.GET_HOME_TERMS, payload: response.data, }); - + // ์•ฝ๊ด€ ID ๋งคํ•‘์„ ๋ณ„๋„๋กœ ์ƒ์„ฑํ•˜์—ฌ ์ €์žฅ // Chromium68 ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด Optional Chaining ์ œ๊ฑฐ if (response.data && response.data.data && response.data.data.terms) { const termsIdMap = {}; let hasOptionalTerms = false; // MST00405 ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ - - response.data.data.terms.forEach(term => { + + response.data.data.terms.forEach((term) => { if (term.trmsTpCd && term.trmsId) { termsIdMap[term.trmsTpCd] = term.trmsId; } - + // MST00405 ์„ ํƒ์•ฝ๊ด€ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ - if (term.trmsTpCd === "MST00405") { + if (term.trmsTpCd === 'MST00405') { hasOptionalTerms = true; } }); - + dispatch({ type: types.SET_TERMS_ID_MAP, payload: termsIdMap, }); - + // ์„ ํƒ์•ฝ๊ด€ ์กด์žฌ ์—ฌ๋ถ€ ์ƒํƒœ ์„ค์ • // TODO: ํ…Œ์ŠคํŠธ์šฉ - ์ž„์‹œ๋กœ false ๊ฐ•์ œ ์„ค์ • const forceDisableOptionalTerms = false; // ํ…Œ์ŠคํŠธ ์™„๋ฃŒ ํ›„ false๋กœ ๋ณ€๊ฒฝ const finalOptionalTermsValue = forceDisableOptionalTerms ? false : hasOptionalTerms; - + dispatch({ type: types.SET_OPTIONAL_TERMS_AVAILABILITY, payload: finalOptionalTermsValue, }); - console.log("[optionalTermsAvailable] ์‹ค์ œ๊ฐ’:", hasOptionalTerms, "๊ฐ•์ œ์„ค์ •๊ฐ’:", finalOptionalTermsValue); - - if (process.env.NODE_ENV === "development") { - console.log("์•ฝ๊ด€ ID ๋งคํ•‘ ์ƒ์„ฑ:", termsIdMap); - console.log("์„ ํƒ์•ฝ๊ด€ ์กด์žฌ ์—ฌ๋ถ€:", hasOptionalTerms); + console.log( + '[optionalTermsAvailable] ์‹ค์ œ๊ฐ’:', + hasOptionalTerms, + '๊ฐ•์ œ์„ค์ •๊ฐ’:', + finalOptionalTermsValue + ); + + if (process.env.NODE_ENV === 'development') { + console.log('์•ฝ๊ด€ ID ๋งคํ•‘ ์ƒ์„ฑ:', termsIdMap); + console.log('์„ ํƒ์•ฝ๊ด€ ์กด์žฌ ์—ฌ๋ถ€:', hasOptionalTerms); } } - + setTimeout(() => { dispatch(getTermsAgreeYn()); }, 0); @@ -64,13 +69,13 @@ export const getHomeTerms = (props) => (dispatch, getState) => { }; const onFail = (error) => { - console.error("getHomeTerms onFail ", error); + console.error('getHomeTerms onFail ', error); }; TAxios( dispatch, getState, - "get", + 'get', URLS.GET_HOME_TERMS, { trmsTpCdList, mbrNo }, {}, @@ -82,64 +87,71 @@ export const getHomeTerms = (props) => (dispatch, getState) => { // ํ˜„์žฌ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž ๊ธฐ์ค€์œผ๋กœ ์•ฝ๊ด€ ์ •๋ณด ์กฐํšŒ (์ธ์ž ์—†์ด ํ˜ธ์ถœ ๊ฐ€๋Šฅ) export const fetchCurrentUserHomeTerms = () => (dispatch, getState) => { const loginUserData = getState().common.appStatus.loginUserData; - + if (!loginUserData || !loginUserData.userNumber) { - console.error("fetchCurrentUserHomeTerms: userNumber (mbrNo) is not available. User might not be logged in."); + console.error( + 'fetchCurrentUserHomeTerms: userNumber (mbrNo) is not available. User might not be logged in.' + ); dispatch({ type: types.GET_TERMS_AGREE_YN_FAILURE }); return; } - + const mbrNo = loginUserData.userNumber; - const trmsTpCdList = "MST00401, MST00402, MST00405"; // ๊ธฐ๋ณธ ์•ฝ๊ด€ ์ฝ”๋“œ ๋ฆฌ์ŠคํŠธ - + const trmsTpCdList = 'MST00401, MST00402, MST00405'; // ๊ธฐ๋ณธ ์•ฝ๊ด€ ์ฝ”๋“œ ๋ฆฌ์ŠคํŠธ + const onSuccess = (response) => { - console.log("fetchCurrentUserHomeTerms onSuccess ", response.data); - + console.log('fetchCurrentUserHomeTerms onSuccess ', response.data); + if (response.data.retCode === 0) { dispatch({ type: types.GET_HOME_TERMS, // ๊ธฐ์กด GET_HOME_TERMS ํƒ€์ž…์„ ์žฌ์‚ฌ์šฉ payload: response.data, }); - + // ์•ฝ๊ด€ ID ๋งคํ•‘์„ ๋ณ„๋„๋กœ ์ƒ์„ฑํ•˜์—ฌ ์ €์žฅ // Chromium68 ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด Optional Chaining ์ œ๊ฑฐ if (response.data && response.data.data && response.data.data.terms) { const termsIdMap = {}; let hasOptionalTerms = false; // MST00405 ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ - - response.data.data.terms.forEach(term => { + + response.data.data.terms.forEach((term) => { if (term.trmsTpCd && term.trmsId) { termsIdMap[term.trmsTpCd] = term.trmsId; } - + // MST00405 ์„ ํƒ์•ฝ๊ด€ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ - if (term.trmsTpCd === "MST00405") { + if (term.trmsTpCd === 'MST00405') { hasOptionalTerms = true; } }); - + dispatch({ type: types.SET_TERMS_ID_MAP, payload: termsIdMap, }); - + // ์„ ํƒ์•ฝ๊ด€ ์กด์žฌ ์—ฌ๋ถ€ ์ƒํƒœ ์„ค์ • // TODO: ํ…Œ์ŠคํŠธ์šฉ - ์ž„์‹œ๋กœ false ๊ฐ•์ œ ์„ค์ • const forceDisableOptionalTerms = false; // ํ…Œ์ŠคํŠธ ์™„๋ฃŒ ํ›„ false๋กœ ๋ณ€๊ฒฝ const finalOptionalTermsValue = forceDisableOptionalTerms ? false : hasOptionalTerms; - + dispatch({ type: types.SET_OPTIONAL_TERMS_AVAILABILITY, payload: finalOptionalTermsValue, }); - console.log("[optionalTermsAvailable] ์‹ค์ œ๊ฐ’:", hasOptionalTerms, "๊ฐ•์ œ์„ค์ •๊ฐ’:", finalOptionalTermsValue); + console.log( + '[optionalTermsAvailable] ์‹ค์ œ๊ฐ’:', + hasOptionalTerms, + '๊ฐ•์ œ์„ค์ •๊ฐ’:', + finalOptionalTermsValue + ); - if (process.env.NODE_ENV === "development") { - console.log("์•ฝ๊ด€ ID ๋งคํ•‘ ์ƒ์„ฑ:", termsIdMap); - console.log("์„ ํƒ์•ฝ๊ด€ ์กด์žฌ ์—ฌ๋ถ€:", hasOptionalTerms); + if (process.env.NODE_ENV === 'development') { + console.log('์•ฝ๊ด€ ID ๋งคํ•‘ ์ƒ์„ฑ:', termsIdMap); + console.log('์„ ํƒ์•ฝ๊ด€ ์กด์žฌ ์—ฌ๋ถ€:', hasOptionalTerms); } } - + // getHomeTerms์™€ ๋™์ผํ•˜๊ฒŒ getTermsAgreeYn ํ›„์† ์ฒ˜๋ฆฌ setTimeout(() => { dispatch(getTermsAgreeYn()); @@ -149,129 +161,129 @@ export const fetchCurrentUserHomeTerms = () => (dispatch, getState) => { dispatch({ type: types.GET_TERMS_AGREE_YN_FAILURE }); } }; - + const onFail = (error) => { - console.error("fetchCurrentUserHomeTerms onFail ", error); + console.error('fetchCurrentUserHomeTerms onFail ', error); dispatch({ type: types.GET_TERMS_AGREE_YN_FAILURE }); }; - + TAxios( dispatch, getState, - "get", + 'get', URLS.GET_HOME_TERMS, // ๋™์ผํ•œ API ์—”๋“œํฌ์ธํŠธ ์‚ฌ์šฉ { trmsTpCdList, mbrNo }, {}, onSuccess, onFail ); - }; +}; // ๊ธฐ์กด TAxios ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ์•ˆ์ „ํ•œ Redux Action export const fetchCurrentUserHomeTermsSafe = () => async (dispatch, getState) => { const loginUserData = getState().common.appStatus.loginUserData; - + if (!loginUserData || !loginUserData.userNumber) { - console.error("fetchCurrentUserHomeTerms: userNumber is not available"); + console.error('fetchCurrentUserHomeTerms: userNumber is not available'); dispatch({ type: types.GET_TERMS_AGREE_YN_FAILURE }); - return { success: false, message: "์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค." }; + return { success: false, message: '์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.' }; } - + const mbrNo = loginUserData.userNumber; - const trmsTpCdList = "MST00401, MST00402, MST00405"; - - console.log("Fetching home terms for user:", mbrNo); - + const trmsTpCdList = 'MST00401, MST00402, MST00405'; + + console.log('Fetching home terms for user:', mbrNo); + // ์•ˆ์ „ํ•œ API ํ˜ธ์ถœ (๊ธฐ์กด TAxios ํŒจํ„ด๊ณผ ๋™์ผ) - const result = await TAxiosPromise( - dispatch, - getState, - "get", - URLS.GET_HOME_TERMS, - { trmsTpCdList, mbrNo } - ); - + const result = await TAxiosPromise(dispatch, getState, 'get', URLS.GET_HOME_TERMS, { + trmsTpCdList, + mbrNo, + }); + // ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ์ธ ๊ฒฝ์šฐ if (!result.success) { - console.error("fetchCurrentUserHomeTerms network error:", result.error); + console.error('fetchCurrentUserHomeTerms network error:', result.error); dispatch({ type: types.GET_TERMS_AGREE_YN_FAILURE }); - return { success: false, message: "๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค." }; + return { success: false, message: '๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.' }; } - + // ๊ธฐ์กด TAxios์ฒ˜๋Ÿผ ํŠน๋ณ„ํ•œ retCode๋“ค์€ TAxios ๋‚ด๋ถ€์—์„œ ์ด๋ฏธ ์ฒ˜๋ฆฌ๋จ // (401, 402, 501, 602, 603, 604 ๋“ฑ์€ TAxios์—์„œ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  onSuccess๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Œ) - - console.log("fetchCurrentUserHomeTerms response:", result.data); - + + console.log('fetchCurrentUserHomeTerms response:', result.data); + // ์ •์ƒ์ ์œผ๋กœ onSuccess๊ฐ€ ํ˜ธ์ถœ๋œ ๊ฒฝ์šฐ์—๋งŒ ์—ฌ๊ธฐ๊นŒ์ง€ ์˜ด if (result.data && result.data.retCode === 0) { dispatch({ type: types.GET_HOME_TERMS, payload: result.data, }); - + // ์•ฝ๊ด€ ID ๋งคํ•‘์„ ๋ณ„๋„๋กœ ์ƒ์„ฑํ•˜์—ฌ ์ €์žฅ // Chromium68 ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด Optional Chaining ์ œ๊ฑฐ if (result.data && result.data.data && result.data.data.terms) { const termsIdMap = {}; let hasOptionalTerms = false; // MST00405 ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ - - result.data.data.terms.forEach(term => { + + result.data.data.terms.forEach((term) => { if (term.trmsTpCd && term.trmsId) { termsIdMap[term.trmsTpCd] = term.trmsId; } - + // MST00405 ์„ ํƒ์•ฝ๊ด€ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ - if (term.trmsTpCd === "MST00405") { + if (term.trmsTpCd === 'MST00405') { hasOptionalTerms = true; } }); - + dispatch({ type: types.SET_TERMS_ID_MAP, payload: termsIdMap, }); - + // ์„ ํƒ์•ฝ๊ด€ ์กด์žฌ ์—ฌ๋ถ€ ์ƒํƒœ ์„ค์ • 2025-07-03 // TODO: ํ…Œ์ŠคํŠธ์šฉ - ์ž„์‹œ๋กœ false ๊ฐ•์ œ ์„ค์ • const forceDisableOptionalTerms = false; // ํ…Œ์ŠคํŠธ ์™„๋ฃŒ ํ›„ false๋กœ ๋ณ€๊ฒฝ const finalOptionalTermsValue = forceDisableOptionalTerms ? false : hasOptionalTerms; - + dispatch({ type: types.SET_OPTIONAL_TERMS_AVAILABILITY, payload: finalOptionalTermsValue, }); - - if (process.env.NODE_ENV === "development") { - console.log("์•ฝ๊ด€ ID ๋งคํ•‘ ์ƒ์„ฑ:", termsIdMap); - console.log("์„ ํƒ์•ฝ๊ด€ ์กด์žฌ ์—ฌ๋ถ€ - ์‹ค์ œ๊ฐ’:", hasOptionalTerms, "๊ฐ•์ œ์„ค์ •๊ฐ’:", finalOptionalTermsValue); + + if (process.env.NODE_ENV === 'development') { + console.log('์•ฝ๊ด€ ID ๋งคํ•‘ ์ƒ์„ฑ:', termsIdMap); + console.log( + '์„ ํƒ์•ฝ๊ด€ ์กด์žฌ ์—ฌ๋ถ€ - ์‹ค์ œ๊ฐ’:', + hasOptionalTerms, + '๊ฐ•์ œ์„ค์ •๊ฐ’:', + finalOptionalTermsValue + ); } } - + // ํ›„์† ์•ก์…˜ ํ˜ธ์ถœ (๊ธฐ์กด๊ณผ ๋™์ผ) setTimeout(() => { dispatch(getTermsAgreeYn()); }, 0); - + return { success: true, data: result.data }; } else { // retCode๊ฐ€ 0์ด ์•„๋‹Œ ์ผ๋ฐ˜์ ์ธ API ์—๋Ÿฌ // Chromium68 ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด Optional Chaining ์ œ๊ฑฐ - console.error("API returned non-zero retCode:", result.data && result.data.retCode); + console.error('API returned non-zero retCode:', result.data && result.data.retCode); dispatch({ type: types.GET_TERMS_AGREE_YN_FAILURE }); - return { - success: false, - message: (result.data && result.data.retMsg) || "์„œ๋ฒ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค." + return { + success: false, + message: (result.data && result.data.retMsg) || '์„œ๋ฒ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.', }; } }; - - // ๋ฉ”๋‰ด ๋ชฉ๋ก ์กฐํšŒ IF-LGSP-044 export const getHomeMenu = () => (dispatch, getState) => { const onSuccess = (response) => { - console.log("getHomeMenu onSuccess ", response.data); + // console.log("getHomeMenu onSuccess ", response.data); dispatch({ type: types.GET_HOME_MENU, @@ -280,29 +292,20 @@ export const getHomeMenu = () => (dispatch, getState) => { }; const onFail = (error) => { - console.error("getHomeMenu onFail ", error); + console.error('getHomeMenu onFail ', error); }; - TAxios( - dispatch, - getState, - "get", - URLS.GET_HOME_MENU, - {}, - {}, - onSuccess, - onFail - ); + TAxios(dispatch, getState, 'get', URLS.GET_HOME_MENU, {}, {}, onSuccess, onFail); }; // ํ…Œ๋งˆ ์ „์‹œ ์ •๋ณด ์ƒ์„ธ ์กฐํšŒ IF-LGSP-060 export const getThemeCurationDetailInfo = (params) => (dispatch, getState) => { const { patnrId, curationId, bgImgNo } = params; - dispatch(changeAppStatus({ showLoadingPanel: { show: true, type: "wait" } })); + dispatch(changeAppStatus({ showLoadingPanel: { show: true, type: 'wait' } })); const onSuccess = (response) => { - console.log("getThemeCurationDetailInfo onSuccess", response.data); + console.log('getThemeCurationDetailInfo onSuccess', response.data); dispatch({ type: types.GET_THEME_CURATION_DETAIL_INFO, @@ -313,14 +316,14 @@ export const getThemeCurationDetailInfo = (params) => (dispatch, getState) => { }; const onFail = (error) => { - console.error("getThemeCurationDetailInfo onFail", error); + console.error('getThemeCurationDetailInfo onFail', error); dispatch(changeAppStatus({ showLoadingPanel: { show: false } })); }; TAxios( dispatch, getState, - "get", + 'get', URLS.GET_THEME_CURATION_DETAIL_INFO, { patnrId, curationId, bgImgNo }, {}, @@ -332,10 +335,10 @@ export const getThemeCurationDetailInfo = (params) => (dispatch, getState) => { export const getThemeHotelDetailInfo = (params) => (dispatch, getState) => { const { patnrId, curationId } = params; - dispatch(changeAppStatus({ showLoadingPanel: { show: true, type: "wait" } })); + dispatch(changeAppStatus({ showLoadingPanel: { show: true, type: 'wait' } })); const onSuccess = (response) => { - console.log("getThemeHotelDetailInfo onSuccess", response.data); + console.log('getThemeHotelDetailInfo onSuccess', response.data); dispatch({ type: types.GET_THEME_HOTEL_DETAIL_INFO, @@ -346,14 +349,14 @@ export const getThemeHotelDetailInfo = (params) => (dispatch, getState) => { }; const onFail = (error) => { - console.error("getThemeHotelDetailInfo onFail", error); + console.error('getThemeHotelDetailInfo onFail', error); dispatch(changeAppStatus({ showLoadingPanel: { show: false } })); }; TAxios( dispatch, getState, - "get", + 'get', URLS.GET_THEME_HOTEL_DETAIL_INFO, { patnrId, curationId }, {}, @@ -364,7 +367,7 @@ export const getThemeHotelDetailInfo = (params) => (dispatch, getState) => { // HOME LAYOUT ์ •๋ณด ์กฐํšŒ IF-LGSP-300 export const getHomeLayout = () => (dispatch, getState) => { const onSuccess = (response) => { - console.log("getHomeLayout onSuccess", response.data); + console.log('getHomeLayout onSuccess', response.data); dispatch({ type: types.GET_HOME_LAYOUT, @@ -374,57 +377,39 @@ export const getHomeLayout = () => (dispatch, getState) => { }; const onFail = (error) => { - console.error("getHomeLayout onFail", error); + console.error('getHomeLayout onFail', error); dispatch(changeAppStatus({ showLoadingPanel: { show: false } })); }; - TAxios( - dispatch, - getState, - "get", - URLS.GET_HOME_LAYOUT, - {}, - {}, - onSuccess, - onFail - ); + TAxios(dispatch, getState, 'get', URLS.GET_HOME_LAYOUT, {}, {}, onSuccess, onFail); }; // HOME Main Contents Banner ์ •๋ณด ์กฐํšŒ IF-LGSP-301 export const getHomeMainContents = () => (dispatch, getState) => { const onSuccess = (response) => { - console.log("getHomeMainContents onSuccess", response.data); + console.log('getHomeMainContents onSuccess', response.data); dispatch({ type: types.GET_HOME_MAIN_CONTENTS, payload: response.data.data, - status: "fulfilled", + status: 'fulfilled', }); dispatch(changeAppStatus({ showLoadingPanel: { show: false } })); }; const onFail = (error) => { - console.error("getHomeMainContents onFail", error); + console.error('getHomeMainContents onFail', error); dispatch(changeAppStatus({ showLoadingPanel: { show: false } })); }; - TAxios( - dispatch, - getState, - "get", - URLS.GET_HOME_MAIN_CONTENTS, - {}, - {}, - onSuccess, - onFail - ); + TAxios(dispatch, getState, 'get', URLS.GET_HOME_MAIN_CONTENTS, {}, {}, onSuccess, onFail); }; // Theme ์ „์‹œ ์ •๋ณด ์กฐํšŒ : IF-LGSP-045 export const getThemeCurationInfo = () => (dispatch, getState) => { const onSuccess = (response) => { - console.log("getThemeCurationInfo onSuccess", response.data); + console.log('getThemeCurationInfo onSuccess', response.data); dispatch({ type: types.GET_THEME_CURATION_INFO, @@ -435,30 +420,21 @@ export const getThemeCurationInfo = () => (dispatch, getState) => { }; const onFail = (error) => { - console.error("getThemeCurationInfo onFail", error); + console.error('getThemeCurationInfo onFail', error); dispatch(changeAppStatus({ showLoadingPanel: { show: false } })); }; - TAxios( - dispatch, - getState, - "get", - URLS.GET_THEME_CURATION_INFO, - {}, - {}, - onSuccess, - onFail - ); + TAxios(dispatch, getState, 'get', URLS.GET_THEME_CURATION_INFO, {}, {}, onSuccess, onFail); }; // ํ…Œ๋งˆ ๋ฉ”๋‰ด(=ํ…Œ๋งˆ ํŽ˜์ด์ง€) ์„ ๋ฐ˜ ์กฐํšŒ : IF-LGSP-095 export const getThemeMenuShelfInfo = (props) => (dispatch, getState) => { const { curationId } = props; - dispatch(changeAppStatus({ showLoadingPanel: { show: true, type: "wait" } })); + dispatch(changeAppStatus({ showLoadingPanel: { show: true, type: 'wait' } })); const onSuccess = (response) => { - console.log("getThemeMenuShelfInfo onSuccess", response.data); + console.log('getThemeMenuShelfInfo onSuccess', response.data); dispatch(changeAppStatus({ showLoadingPanel: { show: false } })); dispatch({ type: types.GET_THEME_MENU_SHELF_INFO, @@ -467,14 +443,14 @@ export const getThemeMenuShelfInfo = (props) => (dispatch, getState) => { }; const onFail = (error) => { - console.error("getThemeMenuShelfInfo onFail", error); + console.error('getThemeMenuShelfInfo onFail', error); dispatch(changeAppStatus({ showLoadingPanel: { show: false } })); }; TAxios( dispatch, getState, - "get", + 'get', URLS.GET_THEME_MENU_SHELF_INFO, { curationId }, {}, @@ -514,8 +490,8 @@ export const checkEnterThroughGNB = (boolean) => ({ export const setBannerIndex = (bannerId, index) => { if (!bannerId) { - console.warn("setBannerIndex called with undefined bannerId"); - return { type: "NO_OP" }; + console.warn('setBannerIndex called with undefined bannerId'); + return { type: 'NO_OP' }; } return { type: types.SET_BANNER_INDEX, @@ -568,11 +544,11 @@ export const collectAndSaveBannerPositions = (bannerIds) => async (dispatch) => try { const positions = await collectBannerPositions(bannerIds); dispatch(setBannerPositions(positions)); - - if (process.env.NODE_ENV === "development") { - console.log("[homeActions] ๋ฐฐ๋„ˆ ์œ„์น˜ ์ˆ˜์ง‘ ์™„๋ฃŒ:", positions); + + if (process.env.NODE_ENV === 'development') { + console.log('[homeActions] ๋ฐฐ๋„ˆ ์œ„์น˜ ์ˆ˜์ง‘ ์™„๋ฃŒ:', positions); } } catch (error) { - console.error("[homeActions] ๋ฐฐ๋„ˆ ์œ„์น˜ ์ˆ˜์ง‘ ์‹คํŒจ:", error); + console.error('[homeActions] ๋ฐฐ๋„ˆ ์œ„์น˜ ์ˆ˜์ง‘ ์‹คํŒจ:', error); } }; diff --git a/com.twin.app.shoptime/src/actions/mainActions.js b/com.twin.app.shoptime/src/actions/mainActions.js index 448b4f1d..b11c1d06 100644 --- a/com.twin.app.shoptime/src/actions/mainActions.js +++ b/com.twin.app.shoptime/src/actions/mainActions.js @@ -1,18 +1,10 @@ import { URLS } from '../api/apiConfig'; import { TAxios } from '../api/TAxios'; import { convertUtcToLocal } from '../components/MediaPlayer/util'; -import { - CATEGORY_DATA_MAX_RESULTS_LIMIT, - LOG_CONTEXT_NAME, - LOG_MESSAGE_ID, -} from '../utils/Config'; +import { CATEGORY_DATA_MAX_RESULTS_LIMIT, LOG_CONTEXT_NAME, LOG_MESSAGE_ID } from '../utils/Config'; import * as HelperMethods from '../utils/helperMethods'; import { types } from './actionTypes'; -import { - addReservation, - changeAppStatus, - deleteReservation, -} from './commonActions'; +import { addReservation, changeAppStatus, deleteReservation } from './commonActions'; //IF-LGSP-007 export const getMainLiveShow = (props) => (dispatch, getState) => { @@ -233,7 +225,7 @@ export const getSubCategory = getState, 'get', URLS.GET_SUB_CATEGORY, - { lgCatCd, patnrIdList, pageSize, pageNo, tabType, filterType,recommendIncFlag }, + { lgCatCd, patnrIdList, pageSize, pageNo, tabType, filterType, recommendIncFlag }, {}, onSuccess, onFail @@ -435,7 +427,7 @@ export const getMainLiveShowNowProduct = ({ patnrId, showId, lstChgDt }) => (dispatch, getState) => { const onSuccess = (response) => { - console.log('getMainLiveShowNowProduct onSuccess', response.data); + // console.log('getMainLiveShowNowProduct onSuccess', response.data); dispatch({ type: types.GET_MAIN_LIVE_SHOW_NOW_PRODUCT, diff --git a/com.twin.app.shoptime/src/actions/productActions.js b/com.twin.app.shoptime/src/actions/productActions.js index f2435c73..d9fdc580 100644 --- a/com.twin.app.shoptime/src/actions/productActions.js +++ b/com.twin.app.shoptime/src/actions/productActions.js @@ -169,15 +169,15 @@ export const getProductOption = createGetThunk({ // IF-LGSP-101์šฉ API ์‘๋‹ต์—์„œ reviewList + reviewDetail ์ถ”์ถœ const extractReviewListApiData = (apiResponse) => { try { - console.log('[UserReviewList] ๐Ÿ“ฅ extractReviewListApiData ํ˜ธ์ถœ - ์›๋ณธ ์‘๋‹ต:', apiResponse); + // console.log('[UserReviewList] ๐Ÿ“ฅ extractReviewListApiData ํ˜ธ์ถœ - ์›๋ณธ ์‘๋‹ต:', apiResponse); // โญ ํ•ต์‹ฌ: retCode๊ฐ€ 0์ธ์ง€ ๋จผ์ € ํ™•์ธ (HTTP 200์ด์–ด๋„ API ์—๋Ÿฌ์ผ ์ˆ˜ ์žˆ์Œ) if (apiResponse && apiResponse.retCode !== 0) { - console.error('[UserReviewList] โŒ API ์—๋Ÿฌ - retCode !== 0:', { - retCode: apiResponse.retCode, - retMsg: apiResponse.retMsg, - fullResponse: apiResponse - }); + // console.error('[UserReviewList] โŒ API ์—๋Ÿฌ - retCode !== 0:', { + // retCode: apiResponse.retCode, + // retMsg: apiResponse.retMsg, + // fullResponse: apiResponse + // }); return null; } @@ -193,59 +193,67 @@ const extractReviewListApiData = (apiResponse) => { const reviewDetail = apiData.reviewDetail || {}; // reviewDetail.reviewList์— ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์‚ฌ์šฉ - if (reviewDetail.reviewList && Array.isArray(reviewDetail.reviewList) && reviewList.length === 0) { + if ( + reviewDetail.reviewList && + Array.isArray(reviewDetail.reviewList) && + reviewList.length === 0 + ) { reviewList = reviewDetail.reviewList; - console.log('[UserReviewList] ๐Ÿ”„ reviewDetail.reviewList์—์„œ ๋ฐ์ดํ„ฐ ์ถ”์ถœ๋จ'); + // console.log('[UserReviewList] ๐Ÿ”„ reviewDetail.reviewList์—์„œ ๋ฐ์ดํ„ฐ ์ถ”์ถœ๋จ'); } data = { reviewList: reviewList, - reviewDetail: reviewDetail + reviewDetail: reviewDetail, }; - console.log('[UserReviewList] ๐Ÿ“Š apiResponse.data ๊ฒฝ๋กœ์—์„œ ์ถ”์ถœ:', { - reviewListLength: data.reviewList.length, - reviewDetailKeys: Object.keys(data.reviewDetail), - reviewDetail: data.reviewDetail, - reviewListSample: data.reviewList.length > 0 ? data.reviewList[0] : 'empty' - }); + // console.log('[UserReviewList] ๐Ÿ“Š apiResponse.data ๊ฒฝ๋กœ์—์„œ ์ถ”์ถœ:', { + // reviewListLength: data.reviewList.length, + // reviewDetailKeys: Object.keys(data.reviewDetail), + // reviewDetail: data.reviewDetail, + // reviewListSample: data.reviewList.length > 0 ? data.reviewList[0] : 'empty' + // }); } else if (apiResponse) { // ์ง์ ‘ ๊ฒฝ๋กœ์—์„œ ์ถ”์ถœ let reviewList = apiResponse.reviewList || []; const reviewDetail = apiResponse.reviewDetail || {}; // reviewDetail.reviewList์— ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์‚ฌ์šฉ - if (reviewDetail.reviewList && Array.isArray(reviewDetail.reviewList) && reviewList.length === 0) { + if ( + reviewDetail.reviewList && + Array.isArray(reviewDetail.reviewList) && + reviewList.length === 0 + ) { reviewList = reviewDetail.reviewList; - console.log('[UserReviewList] ๐Ÿ”„ reviewDetail.reviewList์—์„œ ๋ฐ์ดํ„ฐ ์ถ”์ถœ๋จ'); + // console.log('[UserReviewList] ๐Ÿ”„ reviewDetail.reviewList์—์„œ ๋ฐ์ดํ„ฐ ์ถ”์ถœ๋จ'); } data = { reviewList: reviewList, - reviewDetail: reviewDetail + reviewDetail: reviewDetail, }; - console.log('[UserReviewList] ๐Ÿ“Š ์ง์ ‘ ๊ฒฝ๋กœ์—์„œ ์ถ”์ถœ:', { - reviewListLength: data.reviewList.length, - reviewDetailKeys: Object.keys(data.reviewDetail), - reviewDetail: data.reviewDetail, - reviewListSample: data.reviewList.length > 0 ? data.reviewList[0] : 'empty' - }); + // console.log('[UserReviewList] ๐Ÿ“Š ์ง์ ‘ ๊ฒฝ๋กœ์—์„œ ์ถ”์ถœ:', { + // reviewListLength: data.reviewList.length, + // reviewDetailKeys: Object.keys(data.reviewDetail), + // reviewDetail: data.reviewDetail, + // reviewListSample: data.reviewList.length > 0 ? data.reviewList[0] : 'empty' + // }); } if (!data || (!data.reviewList && !data.reviewDetail)) { - console.warn('[UserReviewList] โš ๏ธ reviewList์™€ reviewDetail ๋ชจ๋‘ ์—†์Œ:', apiResponse); + // console.warn('[UserReviewList] โš ๏ธ reviewList์™€ reviewDetail ๋ชจ๋‘ ์—†์Œ:', apiResponse); return null; } - console.log('[UserReviewList] โœ… ์ถ”์ถœ ์™„๋ฃŒ:', { - reviewListLength: data.reviewList.length, - reviewDetail: data.reviewDetail - }); + // console.log('[UserReviewList] โœ… ์ถ”์ถœ ์™„๋ฃŒ:', { + // reviewListLength: data.reviewList.length, + // reviewDetail: data.reviewDetail + // }); return data; } catch (error) { - console.error('[UserReviewList] โŒ extractReviewListApiData ์—๋Ÿฌ:', error); + // console.error('[UserReviewList] โŒ extractReviewListApiData ์—๋Ÿฌ:', error); return null; } }; @@ -367,7 +375,12 @@ export const getVideoIndicatorFocus = (focused) => (dispatch) => { // ์ˆœ์ฐจ ํŽ˜์ด์ง•์œผ๋กœ ๋ชจ๋“  ๋ฆฌ๋ทฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ํ•จ์ˆ˜ (TV ์•ฑ ์„ฑ๋Šฅ ์ตœ์ ํ™”) // Option 2: ์ˆœ์ฐจ ํŽ˜์นญ (๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ, ์„œ๋ฒ„ ๋ถ€ํ•˜ ๊ฐ์†Œ) // โญ ์žฌ์‹œ๋„ ๋กœ์ง ํฌํ•จ: ํƒ€์ž„์•„์›ƒ/๋ฏธ์‘๋‹ต ์ผ€์ด์Šค ๋Œ€๋น„ -const fetchAllReviewsWithSequentialPaging = async (dispatch, getState, requestParams, retryCount = 0) => { +const fetchAllReviewsWithSequentialPaging = async ( + dispatch, + getState, + requestParams, + retryCount = 0 +) => { const MAX_RETRIES = 2; // ์ตœ๋Œ€ 2ํšŒ ์žฌ์‹œ๋„ (์ด 3ํšŒ ์‹œ๋„) const { prdtId, @@ -377,15 +390,15 @@ const fetchAllReviewsWithSequentialPaging = async (dispatch, getState, requestPa pageSize = 100, // ์ตœ๋Œ€๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ํŽ˜์ด์ง• ํšŸ์ˆ˜ ์ตœ์†Œํ™” } = requestParams; - console.log('[UserReviewList] ๐Ÿš€ ์ˆœ์ฐจ ํŽ˜์ด์ง• ์‹œ์ž‘:', { - prdtId, - patnrId, - filterTpCd, - filterTpVal, - pageSize, - retryCount, - isRetry: retryCount > 0 - }); + // console.log('[UserReviewList] ๐Ÿš€ ์ˆœ์ฐจ ํŽ˜์ด์ง• ์‹œ์ž‘:', { + // prdtId, + // patnrId, + // filterTpCd, + // filterTpVal, + // pageSize, + // retryCount, + // isRetry: retryCount > 0 + // }); let allReviews = []; let currentReviewDetail = null; @@ -401,13 +414,13 @@ const fetchAllReviewsWithSequentialPaging = async (dispatch, getState, requestPa filterTpCd, pageSize, pageNo, - cntryCd: 'US' + cntryCd: 'US', }; // filterTpCd๊ฐ€ 'ALL'์ด ์•„๋‹ˆ๋ฉด filterTpVal ์ถ”๊ฐ€ if (filterTpCd !== 'ALL') { if (!filterTpVal) { - console.warn('[UserReviewList] โš ๏ธ filterTpCd๊ฐ€ ALL์ด ์•„๋‹ˆ๋ฉด filterTpVal์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค'); + // console.warn('[UserReviewList] โš ๏ธ filterTpCd๊ฐ€ ALL์ด ์•„๋‹ˆ๋ฉด filterTpVal์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค'); } params.filterTpVal = filterTpVal; } @@ -416,13 +429,13 @@ const fetchAllReviewsWithSequentialPaging = async (dispatch, getState, requestPa // โญ ํƒ€์ž„์•„์›ƒ ์ถ”๊ฐ€: TAxios์˜ ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ (๋ชจ๋“  ์˜ค๋ฅ˜ ์ƒํ™ฉ ์ฒ˜๋ฆฌ) const REQUEST_TIMEOUT = 5000; // 5์ดˆ ํƒ€์ž„์•„์›ƒ (์žฌ์ธ์ฆ, ํŒ์—… ๋“ฑ ์˜ค๋ฅ˜ ์ƒํ™ฉ ์ฒ˜๋ฆฌ ํฌํ•จ) - console.log(`[UserReviewList] ๐Ÿ”„ API ์š”์ฒญ ์‹œ์ž‘ (page ${pageNo}):`, { - prdtId, - patnrId, - filterTpCd, - pageSize, - pageNo - }); + // console.log(`[UserReviewList] ๐Ÿ”„ API ์š”์ฒญ ์‹œ์ž‘ (page ${pageNo}):`, { + // prdtId, + // patnrId, + // filterTpCd, + // pageSize, + // pageNo + // }); const response = await Promise.race([ new Promise((resolve, reject) => { @@ -430,80 +443,89 @@ const fetchAllReviewsWithSequentialPaging = async (dispatch, getState, requestPa const onSuccess = (res) => { if (callbackCalled) { - console.warn(`[UserReviewList] โš ๏ธ onSuccess ์ค‘๋ณต ํ˜ธ์ถœ (page ${pageNo})`); + // console.warn(`[UserReviewList] โš ๏ธ onSuccess ์ค‘๋ณต ํ˜ธ์ถœ (page ${pageNo})`); return; } callbackCalled = true; - console.log(`[UserReviewList] โœ… API ์‘๋‹ต ์ˆ˜์‹  (page ${pageNo}):`, { - status: res?.status, - statusText: res?.statusText, - retCode: res?.data?.retCode, - dataExists: !!res?.data, - reviewDetailExists: !!res?.data?.data?.reviewDetail - }); + // console.log(`[UserReviewList] โœ… API ์‘๋‹ต ์ˆ˜์‹  (page ${pageNo}):`, { + // status: res?.status, + // statusText: res?.statusText, + // retCode: res?.data?.retCode, + // dataExists: !!res?.data, + // reviewDetailExists: !!res?.data?.data?.reviewDetail + // }); resolve(res); }; const onFail = (err) => { if (callbackCalled) { - console.warn(`[UserReviewList] โš ๏ธ onFail ์ค‘๋ณต ํ˜ธ์ถœ (page ${pageNo})`); + // console.warn(`[UserReviewList] โš ๏ธ onFail ์ค‘๋ณต ํ˜ธ์ถœ (page ${pageNo})`); return; } callbackCalled = true; - console.error(`[UserReviewList] โŒ API ์ฝœ๋ฐฑ ์—๋Ÿฌ ๋ฐœ์ƒ (page ${pageNo}):`, { - errorMessage: err?.message, - errorStatus: err?.response?.status, - errorStatusText: err?.response?.statusText, - errorRetCode: err?.data?.retCode, - errorRetMsg: err?.data?.retMsg, - errorType: typeof err - }); + // console.error(`[UserReviewList] โŒ API ์ฝœ๋ฐฑ ์—๋Ÿฌ ๋ฐœ์ƒ (page ${pageNo}):`, { + // errorMessage: err?.message, + // errorStatus: err?.response?.status, + // errorStatusText: err?.response?.statusText, + // errorRetCode: err?.data?.retCode, + // errorRetMsg: err?.data?.retMsg, + // errorType: typeof err + // }); reject(err); }; // API ํ˜ธ์ถœ - console.log(`[UserReviewList] ๐Ÿ“ก TAxios ํ˜ธ์ถœ (page ${pageNo})`); - TAxios(dispatch, getState, 'get', URLS.GET_USER_REVIEW_LIST, params, {}, onSuccess, onFail); + // console.log(`[UserReviewList] ๐Ÿ“ก TAxios ํ˜ธ์ถœ (page ${pageNo})`); + TAxios( + dispatch, + getState, + 'get', + URLS.GET_USER_REVIEW_LIST, + params, + {}, + onSuccess, + onFail + ); }), // ํƒ€์ž„์•„์›ƒ Promise (onFail์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ๋Œ€๋น„) new Promise((_, reject) => setTimeout(() => { const timeoutError = new Error(`API request timeout without callback (page ${pageNo})`); - console.error(`[UserReviewList] โฑ๏ธ API ์‘๋‹ต ํƒ€์ž„์•„์›ƒ (page ${pageNo}):`, { - timeout: REQUEST_TIMEOUT, - prdtId, - patnrId, - pageNo, - reason: '5์ดˆ ์ด๋‚ด onSuccess/onFail ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Œ' - }); + // console.error(`[UserReviewList] โฑ๏ธ API ์‘๋‹ต ํƒ€์ž„์•„์›ƒ (page ${pageNo}):`, { + // timeout: REQUEST_TIMEOUT, + // prdtId, + // patnrId, + // pageNo, + // reason: '5์ดˆ ์ด๋‚ด onSuccess/onFail ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์Œ' + // }); reject(timeoutError); }, REQUEST_TIMEOUT) - ) + ), ]); // โญ ํ•ต์‹ฌ: HTTP 200์ด์–ด๋„ response.data.retCode๋ฅผ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•ด์•ผ ํ•จ const retCode = response?.data?.retCode; - console.log(`[UserReviewList] ๐Ÿ“„ ํŽ˜์ด์ง€ ${pageNo} ์‘๋‹ต ์ƒํƒœ ํ™•์ธ:`, { - pageNo, - httpStatus: response?.status, - retCode: retCode, - retMsg: response?.data?.retMsg, - reviewListLength: response?.data?.data?.reviewDetail?.reviewList?.length || 0, - totRvwCnt: response?.data?.data?.reviewDetail?.totRvwCnt - }); + // console.log(`[UserReviewList] ๐Ÿ“„ ํŽ˜์ด์ง€ ${pageNo} ์‘๋‹ต ์ƒํƒœ ํ™•์ธ:`, { + // pageNo, + // httpStatus: response?.status, + // retCode: retCode, + // retMsg: response?.data?.retMsg, + // reviewListLength: response?.data?.data?.reviewDetail?.reviewList?.length || 0, + // totRvwCnt: response?.data?.data?.reviewDetail?.totRvwCnt + // }); // retCode๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด API ์—๋Ÿฌ (HTTP 200์ด์–ด๋„ ์‹ค์ œ ๋ฐ์ดํ„ฐ ์—†์„ ์ˆ˜ ์žˆ์Œ) if (retCode !== 0) { - console.error(`[UserReviewList] โŒ API ์—๋Ÿฌ - retCode !== 0 (page ${pageNo}):`, { - retCode, - retMsg: response?.data?.retMsg, - pageNo, - prdtId, - totalCollected: allReviews.length - }); + // console.error(`[UserReviewList] โŒ API ์—๋Ÿฌ - retCode !== 0 (page ${pageNo}):`, { + // retCode, + // retMsg: response?.data?.retMsg, + // pageNo, + // prdtId, + // totalCollected: allReviews.length + // }); throw new Error(`API Error: retCode=${retCode}, message=${response?.data?.retMsg}`); } @@ -511,7 +533,7 @@ const fetchAllReviewsWithSequentialPaging = async (dispatch, getState, requestPa const reviewData = extractReviewListApiData(response.data); if (!reviewData || !reviewData.reviewList) { - console.warn('[UserReviewList] โš ๏ธ ๋ฆฌ๋ทฐ ๋ฐ์ดํ„ฐ ์ถ”์ถœ ์‹คํŒจ, ํŽ˜์ด์ง• ์ข…๋ฃŒ'); + // console.warn('[UserReviewList] โš ๏ธ ๋ฆฌ๋ทฐ ๋ฐ์ดํ„ฐ ์ถ”์ถœ ์‹คํŒจ, ํŽ˜์ด์ง• ์ข…๋ฃŒ'); break; } @@ -523,12 +545,12 @@ const fetchAllReviewsWithSequentialPaging = async (dispatch, getState, requestPa // 5. ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ๋ฆฌ๋ทฐ๋“ค์„ ์ „์ฒด ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ allReviews = allReviews.concat(reviewData.reviewList); - console.log(`[UserReviewList] โœ… ํŽ˜์ด์ง€ ${pageNo} ์ˆ˜์ง‘ ์™„๋ฃŒ:`, { - pageNo, - currentPageCount: reviewData.reviewList.length, - totalCollected: allReviews.length, - totRvwCnt: currentReviewDetail?.totRvwCnt - }); + // console.log(`[UserReviewList] โœ… ํŽ˜์ด์ง€ ${pageNo} ์ˆ˜์ง‘ ์™„๋ฃŒ:`, { + // pageNo, + // currentPageCount: reviewData.reviewList.length, + // totalCollected: allReviews.length, + // totRvwCnt: currentReviewDetail?.totRvwCnt + // }); // 6. ํŽ˜์ด์ง• ์ข…๋ฃŒ ์กฐ๊ฑด ํ™•์ธ // rvwListCnt < pageSize์ด๋ฉด ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€ @@ -538,24 +560,24 @@ const fetchAllReviewsWithSequentialPaging = async (dispatch, getState, requestPa if (receivedCount < pageSize || allReviews.length >= totalReviews) { hasMore = false; - console.log('[UserReviewList] ๐Ÿ“Š ํŽ˜์ด์ง• ์ข…๋ฃŒ:', { - reason: receivedCount < pageSize ? '๋ฐ›์€ ๊ฐœ์ˆ˜ < pageSize' : '์ˆ˜์ง‘๋œ ๊ฐœ์ˆ˜ >= ์ด ๊ฐœ์ˆ˜', - receivedCount, - pageSize, - totalCollected: allReviews.length, - totalReviews - }); + // console.log('[UserReviewList] ๐Ÿ“Š ํŽ˜์ด์ง• ์ข…๋ฃŒ:', { + // reason: receivedCount < pageSize ? '๋ฐ›์€ ๊ฐœ์ˆ˜ < pageSize' : '์ˆ˜์ง‘๋œ ๊ฐœ์ˆ˜ >= ์ด ๊ฐœ์ˆ˜', + // receivedCount, + // pageSize, + // totalCollected: allReviews.length, + // totalReviews + // }); } else { pageNo++; } } // 7. ๋ชจ๋“  ๋ฆฌ๋ทฐ ์ˆ˜์ง‘ ์™„๋ฃŒ, Redux์— ๋””์ŠคํŒจ์น˜ - console.log('[UserReviewList] ๐ŸŽ‰ ๋ชจ๋“  ๋ฆฌ๋ทฐ ์ˆ˜์ง‘ ์™„๋ฃŒ:', { - totalCollected: allReviews.length, - totRvwCnt: currentReviewDetail?.totRvwCnt, - pages: pageNo - 1 - }); + // console.log('[UserReviewList] ๐ŸŽ‰ ๋ชจ๋“  ๋ฆฌ๋ทฐ ์ˆ˜์ง‘ ์™„๋ฃŒ:', { + // totalCollected: allReviews.length, + // totRvwCnt: currentReviewDetail?.totRvwCnt, + // pages: pageNo - 1 + // }); // Redux ๋””์ŠคํŒจ์น˜๋ฅผ ์œ„ํ•œ ์ตœ์ข… ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ const isAllFilter = filterTpCd === 'ALL'; @@ -565,59 +587,61 @@ const fetchAllReviewsWithSequentialPaging = async (dispatch, getState, requestPa reviewList: allReviews, reviewDetail: currentReviewDetail, prdtId, - ...(isAllFilter ? {} : { filterTpCd, filterTpVal }) + ...(isAllFilter ? {} : { filterTpCd, filterTpVal }), }; const action = { type: actionType, - payload: finalPayload + payload: finalPayload, }; - console.log('[UserReviewList] ๐Ÿ“ฆ Redux ๋””์ŠคํŒจ์น˜:', { - actionType, - totalReviews: allReviews.length, - totRvwCnt: currentReviewDetail?.totRvwCnt, - prdtId - }); + // console.log('[UserReviewList] ๐Ÿ“ฆ Redux ๋””์ŠคํŒจ์น˜:', { + // actionType, + // totalReviews: allReviews.length, + // totRvwCnt: currentReviewDetail?.totRvwCnt, + // prdtId + // }); dispatch(action); return finalPayload; } catch (error) { // โญ ํ•ต์‹ฌ: ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์—๋Ÿฌ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ - const errorMessage = error?.message || (error instanceof Error ? error.toString() : JSON.stringify(error)); + const errorMessage = + error?.message || (error instanceof Error ? error.toString() : JSON.stringify(error)); const httpStatus = error?.response?.status; const apiRetCode = error?.response?.data?.retCode; const apiRetMsg = error?.response?.data?.retMsg; - console.error('[fetchAllReviewsWithSequentialPaging] โŒ ์—๋Ÿฌ ๋ฐœ์ƒ:', { - errorMessage: errorMessage, - errorType: typeof error, - httpStatus: httpStatus, - apiRetCode: apiRetCode, - apiRetMsg: apiRetMsg, - prdtId, - patnrId, - pageNo, - currentCollected: allReviews.length, - retryCount, - maxRetries: MAX_RETRIES - }); + // console.error('[fetchAllReviewsWithSequentialPaging] โŒ ์—๋Ÿฌ ๋ฐœ์ƒ:', { + // errorMessage: errorMessage, + // errorType: typeof error, + // httpStatus: httpStatus, + // apiRetCode: apiRetCode, + // apiRetMsg: apiRetMsg, + // prdtId, + // patnrId, + // pageNo, + // currentCollected: allReviews.length, + // retryCount, + // maxRetries: MAX_RETRIES + // }); // โญ ํƒ€์ž„์•„์›ƒ ์—๋Ÿฌ์ธ ๊ฒฝ์šฐ ์žฌ์‹œ๋„ - const isTimeoutError = errorMessage.includes('timeout') || errorMessage.includes('without callback'); + const isTimeoutError = + errorMessage.includes('timeout') || errorMessage.includes('without callback'); if (isTimeoutError && retryCount < MAX_RETRIES) { - console.log(`[fetchAllReviewsWithSequentialPaging] ๐Ÿ”„ ํƒ€์ž„์•„์›ƒ์œผ๋กœ ์ธํ•œ ์žฌ์‹œ๋„ (${retryCount + 1}/${MAX_RETRIES}):`, { - prdtId, - patnrId, - pageNo, - retryCount, - delayMs: 1000 * (retryCount + 1) - }); + // console.log(`[fetchAllReviewsWithSequentialPaging] ๐Ÿ”„ ํƒ€์ž„์•„์›ƒ์œผ๋กœ ์ธํ•œ ์žฌ์‹œ๋„ (${retryCount + 1}/${MAX_RETRIES}):`, { + // prdtId, + // patnrId, + // pageNo, + // retryCount, + // delayMs: 1000 * (retryCount + 1) + // }); // ์ง€์ˆ˜ ๋ฐฑ์˜คํ”„: 1์ดˆ, 2์ดˆ ๋Œ€๊ธฐ ํ›„ ์žฌ์‹œ๋„ const delayMs = 1000 * (retryCount + 1); - await new Promise(resolve => setTimeout(resolve, delayMs)); + await new Promise((resolve) => setTimeout(resolve, delayMs)); // ์žฌ๊ท€ ํ˜ธ์ถœ๋กœ ์žฌ์‹œ๋„ return fetchAllReviewsWithSequentialPaging(dispatch, getState, requestParams, retryCount + 1); @@ -630,51 +654,47 @@ const fetchAllReviewsWithSequentialPaging = async (dispatch, getState, requestPa // User Review List ์ถ”๊ฐ€ ์กฐํšŒ IF-LGSP-101 (์ˆœ์ฐจ ํŽ˜์ด์ง•์œผ๋กœ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘) export const getUserReviewList = (requestParams) => async (dispatch, getState) => { - const { - prdtId, - patnrId, - filterTpCd = 'ALL', - filterTpVal - } = requestParams; + const { prdtId, patnrId, filterTpCd = 'ALL', filterTpVal } = requestParams; - console.log('[getUserReviewList] ๐Ÿš€ getUserReviewList ํ˜ธ์ถœ๋จ (์ˆœ์ฐจ ํŽ˜์ด์ง• ์‚ฌ์šฉ):', { - prdtId, - patnrId, - filterTpCd, - filterTpVal, - timestamp: new Date().toISOString() - }); + // console.log('[getUserReviewList] ๐Ÿš€ getUserReviewList ํ˜ธ์ถœ๋จ (์ˆœ์ฐจ ํŽ˜์ด์ง• ์‚ฌ์šฉ):', { + // prdtId, + // patnrId, + // filterTpCd, + // filterTpVal, + // timestamp: new Date().toISOString() + // }); try { // fetchAllReviewsWithSequentialPaging ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ชจ๋“  ๋ฆฌ๋ทฐ ์ˆ˜์ง‘ const result = await fetchAllReviewsWithSequentialPaging(dispatch, getState, requestParams); - console.log('[getUserReviewList] โœ… ๋ชจ๋“  ๋ฆฌ๋ทฐ ์ˆ˜์ง‘ ์™„๋ฃŒ:', { - totalReviews: result.reviewList.length, - totRvwCnt: result.reviewDetail?.totRvwCnt, - prdtId, - filterTpCd, - filterTpVal - }); + // console.log('[getUserReviewList] โœ… ๋ชจ๋“  ๋ฆฌ๋ทฐ ์ˆ˜์ง‘ ์™„๋ฃŒ:', { + // totalReviews: result.reviewList.length, + // totRvwCnt: result.reviewDetail?.totRvwCnt, + // prdtId, + // filterTpCd, + // filterTpVal + // }); } catch (error) { // โญ ํ•ต์‹ฌ: ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์—๋Ÿฌ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ - const errorMessage = error?.message || (error instanceof Error ? error.toString() : JSON.stringify(error)); + const errorMessage = + error?.message || (error instanceof Error ? error.toString() : JSON.stringify(error)); const httpStatus = error?.response?.status; const apiRetCode = error?.response?.data?.retCode; const apiRetMsg = error?.response?.data?.retMsg; - console.error('[getUserReviewList] โŒ ์ˆœ์ฐจ ํŽ˜์ด์ง• ์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ:', { - errorMessage: errorMessage, - errorType: typeof error, - httpStatus: httpStatus, - apiRetCode: apiRetCode, - apiRetMsg: apiRetMsg, - prdtId, - patnrId, - filterTpCd, - filterTpVal, - stack: error?.stack - }); + // console.error('[getUserReviewList] โŒ ์ˆœ์ฐจ ํŽ˜์ด์ง• ์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ:', { + // errorMessage: errorMessage, + // errorType: typeof error, + // httpStatus: httpStatus, + // apiRetCode: apiRetCode, + // apiRetMsg: apiRetMsg, + // prdtId, + // patnrId, + // filterTpCd, + // filterTpVal, + // stack: error?.stack + // }); // Redux ์ƒํƒœ์— ์—๋Ÿฌ ์ •๋ณด ์ €์žฅ (์„ ํƒ์‚ฌํ•ญ) // dispatch({ @@ -708,7 +728,7 @@ const extractReviewFiltersApiData = (apiResponse) => { console.error('[ReviewFilters] โŒ API ์—๋Ÿฌ - retCode !== 0:', { retCode: retCode, retMsg: apiResponse?.retMsg, - fullResponse: apiResponse + fullResponse: apiResponse, }); return null; } @@ -721,7 +741,7 @@ const extractReviewFiltersApiData = (apiResponse) => { prdtId: reviewFilterInfos.prdtId, hasFilters: !!reviewFilterInfos.filters, filtersLength: reviewFilterInfos.filters ? reviewFilterInfos.filters.length : 0, - reviewFilterInfosKeys: Object.keys(reviewFilterInfos) + reviewFilterInfosKeys: Object.keys(reviewFilterInfos), }); data = reviewFilterInfos; @@ -734,7 +754,7 @@ const extractReviewFiltersApiData = (apiResponse) => { console.log('[ReviewFilters] โœ… ์ถ”์ถœ ์™„๋ฃŒ:', { patnrId: data.patnrId, prdtId: data.prdtId, - filtersLength: data.filters.length + filtersLength: data.filters.length, }); return data; @@ -746,16 +766,13 @@ const extractReviewFiltersApiData = (apiResponse) => { // Review Filters ์กฐํšŒ IF-LGSP-100 export const getReviewFilters = (requestParams) => (dispatch, getState) => { - const { - prdtId, - patnrId - } = requestParams; + const { prdtId, patnrId } = requestParams; const params = { prdtId, patnrId, // ์šฐ์„ ์ˆœ์œ„ 1: cntryCd ๊ธฐ๋ณธ๊ฐ’ 'US' ์„ค์ • (TV ํ™˜๊ฒฝ์—์„œ๋Š” ์ž๋™์œผ๋กœ header๋กœ ์ „๋‹ฌ๋จ) - cntryCd: 'US' + cntryCd: 'US', }; const body = {}; @@ -765,7 +782,7 @@ export const getReviewFilters = (requestParams) => (dispatch, getState) => { params, body, url: URLS.GET_REVIEW_FILTERS, - timestamp: new Date().toISOString() + timestamp: new Date().toISOString(), }); const onSuccess = (response) => { @@ -777,8 +794,8 @@ export const getReviewFilters = (requestParams) => (dispatch, getState) => { httpStatus: response?.status, retCode: retCode, retMsg: retMsg, - hasData: !!(response?.data?.data), - dataExists: !!response?.data + hasData: !!response?.data?.data, + dataExists: !!response?.data, }); // retCode !== 0์ด๋ฉด extractReviewFiltersApiData์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  null ๋ฐ˜ํ™˜๋จ @@ -788,7 +805,7 @@ export const getReviewFilters = (requestParams) => (dispatch, getState) => { console.warn('[ReviewFilters] โš ๏ธ ํ•„ํ„ฐ ๋ฐ์ดํ„ฐ ์ถ”์ถœ ์‹คํŒจ:', { retCode: retCode, retMsg: retMsg, - reason: retCode !== 0 ? 'retCode !== 0' : 'filters ๋ฐ์ดํ„ฐ ์—†์Œ' + reason: retCode !== 0 ? 'retCode !== 0' : 'filters ๋ฐ์ดํ„ฐ ์—†์Œ', }); return; // ์‹คํŒจ ์‹œ dispatchํ•˜์ง€ ์•Š์Œ } @@ -796,7 +813,7 @@ export const getReviewFilters = (requestParams) => (dispatch, getState) => { console.log('[ReviewFilters] ๐Ÿ“Š ํ•„ํ„ฐ ๋ฐ์ดํ„ฐ ์ถ”์ถœ ์„ฑ๊ณต:', { patnrId: filtersData.patnrId, prdtId: filtersData.prdtId, - filtersLength: filtersData.filters ? filtersData.filters.length : 0 + filtersLength: filtersData.filters ? filtersData.filters.length : 0, }); const action = { @@ -804,7 +821,7 @@ export const getReviewFilters = (requestParams) => (dispatch, getState) => { payload: { ...filtersData, prdtId: prdtId, - patnrId: patnrId + patnrId: patnrId, }, }; @@ -812,7 +829,7 @@ export const getReviewFilters = (requestParams) => (dispatch, getState) => { actionType: types.GET_REVIEW_FILTERS, patnrId: patnrId, prdtId: prdtId, - filtersLength: filtersData.filters ? filtersData.filters.length : 0 + filtersLength: filtersData.filters ? filtersData.filters.length : 0, }); dispatch(action); @@ -839,6 +856,6 @@ export const getReviewFilters = (requestParams) => (dispatch, getState) => { // All Star ํ•„ํ„ฐ ํ•ด์ œ - API ํ˜ธ์ถœ ์—†์ด ์ƒํƒœ๋งŒ ์ดˆ๊ธฐํ™” export const clearReviewFilter = () => (dispatch) => { dispatch({ - type: types.CLEAR_REVIEW_FILTER + type: types.CLEAR_REVIEW_FILTER, }); -}; \ No newline at end of file +}; diff --git a/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx b/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx index 23cd5437..75c5646c 100644 --- a/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx +++ b/com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx @@ -628,15 +628,15 @@ export default function ProductAllSection({ [setOpenThemeItemOverlay] ); - const handleProductDetailsClick = useCallback( - () => scrollToSection('scroll-marker-product-details'), - [scrollToSection] - ); + const handleProductDetailsClick = useCallback(() => { + dispatch(minimizeModalMedia()); + scrollToSection('scroll-marker-product-details'); + }, [scrollToSection, dispatch]); - const handleYouMayAlsoLikeClick = useCallback( - () => scrollToSection('scroll-marker-you-may-also-like'), - [scrollToSection] - ); + const handleYouMayAlsoLikeClick = useCallback(() => { + dispatch(minimizeModalMedia()); + scrollToSection('scroll-marker-you-may-also-like'); + }, [scrollToSection, dispatch]); const scrollPositionRef = useRef(0); const prevScrollPositionRef = useRef(0); // ์ด์ „ ์Šคํฌ๋กค ์œ„์น˜ ์ถ”์  const prevScrollTopRef = useRef(0); // HomePanel ์Šคํƒ€์ผ ์Šคํฌ๋กค ์œ„์น˜ ์ถ”์  @@ -644,6 +644,8 @@ export default function ProductAllSection({ const mediaMinimizedRef = useRef(false); const handleArrowClickAlternative = useCallback(() => { + dispatch(minimizeModalMedia()); + const currentHeight = scrollPositionRef.current; const scrollAmount = 200; @@ -659,7 +661,7 @@ export default function ProductAllSection({ if (isAtBottom) { setIsBottom(isAtBottom); } - }, [documentHeight, scrollTop]); + }, [documentHeight, scrollTop, dispatch]); const handleScroll = useCallback( (e) => { diff --git a/com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductVideo/ProductVideo.jsx b/com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductVideo/ProductVideo.jsx index 4ec4a678..0f05da83 100644 --- a/com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductVideo/ProductVideo.jsx +++ b/com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductVideo/ProductVideo.jsx @@ -54,7 +54,7 @@ export default function ProductVideo({ // autoPlay ๊ธฐ๋Šฅ: ์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ ์‹œ ์ž๋™์œผ๋กœ ๋น„๋””์˜ค ์žฌ์ƒ useEffect(() => { if (autoPlay && canPlayVideo && !hasAutoPlayed && productInfo) { - console.log('[ProductVideo] Auto-playing video'); + // console.log('[ProductVideo] Auto-playing video'); setHasAutoPlayed(true); // ์งง์€ ๋”ธ๋ ˆ์ด ํ›„ ์žฌ์ƒ ์‹œ์ž‘ (์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ ์™„๋ฃŒ ํ›„) @@ -113,7 +113,7 @@ export default function ProductVideo({ const videoContainerOnFocus = useCallback(() => { if (canPlayVideo) { setFocused(true); - console.log('[ProductVideo] Calling restoreModalMedia'); + // console.log('[ProductVideo] Calling restoreModalMedia'); // ProductVideo์— ํฌ์ปค์Šค๊ฐ€ ๋Œ์•„์˜ค๋ฉด ๋น„๋””์˜ค ๋ณต์› // dispatch(restoreModalMedia()); @@ -125,7 +125,7 @@ export default function ProductVideo({ }, [canPlayVideo, dispatch, onFocus]); const videoContainerOnBlur = useCallback(() => { - console.log('[ProductVideo] onBlur called - canPlayVideo:', canPlayVideo); + // console.log('[ProductVideo] onBlur called - canPlayVideo:', canPlayVideo); // if (canPlayVideo) { // setFocused(false); // // ํฌ์ปค์Šค๋ฅผ ์žƒ์œผ๋ฉด ๋ชจ๋‹ฌ MediaPanel์„ ์ตœ์†Œํ™”ํ•˜์—ฌ 1px ์ƒํƒœ๋กœ ์œ ์ง€ @@ -149,10 +149,10 @@ export default function ProductVideo({ // MediaPanel ๋น„๋””์˜ค ํด๋ฆญ ํ•ธ๋“ค๋Ÿฌ + ๋ชจ๋‹ฌ ํ† ๊ธ€ ๊ธฐ๋Šฅ const handleVideoClick = useCallback(() => { - console.log('[ProductVideo] ========== handleVideoClick ํ˜ธ์ถœ =========='); - console.log('[ProductVideo] canPlayVideo:', canPlayVideo); - console.log('[ProductVideo] panels.length:', panels.length); - console.log('[ProductVideo] All panels:', JSON.stringify(panels, null, 2)); + // console.log('[ProductVideo] ========== handleVideoClick ํ˜ธ์ถœ =========='); + // console.log('[ProductVideo] canPlayVideo:', canPlayVideo); + // console.log('[ProductVideo] panels.length:', panels.length); + // console.log('[ProductVideo] All panels:', JSON.stringify(panels, null, 2)); if (canPlayVideo) { const currentTopPanel = panels[panels.length - 1]; @@ -163,19 +163,19 @@ export default function ProductVideo({ currentTopPanel.name === panel_names.MEDIA_PANEL && currentTopPanel.panelInfo.modal === true; - console.log('[ProductVideo] currentTopPanel:', JSON.stringify(currentTopPanel, null, 2)); - console.log('[ProductVideo] isCurrentlyPlayingModal:', isCurrentlyPlayingModal); + // console.log('[ProductVideo] currentTopPanel:', JSON.stringify(currentTopPanel, null, 2)); + // console.log('[ProductVideo] isCurrentlyPlayingModal:', isCurrentlyPlayingModal); // modal๋กœ ์žฌ์ƒ ์ค‘์ด๋ฉด ์ „์ฒดํ™”๋ฉด์œผ๋กœ ์ „ํ™˜ if (isCurrentlyPlayingModal) { - console.log( - '[ProductVideo] *** Switching to fullscreen mode via switchMediaToFullscreen ***' - ); + // console.log( + // '[ProductVideo] *** Switching to fullscreen mode via switchMediaToFullscreen ***' + // ); dispatch(switchMediaToFullscreen()); setModalState(false); } else { - console.log('[ProductVideo] *** Starting modal MediaPanel ***'); - console.log('[ProductVideo] productInfo:', JSON.stringify(productInfo, null, 2)); + // console.log('[ProductVideo] *** Starting modal MediaPanel ***'); + // console.log('[ProductVideo] productInfo:', JSON.stringify(productInfo, null, 2)); // ์ฒ˜์Œ ์žฌ์ƒ ์‹œ์ž‘ - modal=true๋กœ ์‹œ์ž‘ dispatch( startMediaPlayer({ diff --git a/com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductVideo/ProductVideo.v3.jsx b/com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductVideo/ProductVideo.v3.jsx index bca55589..32095f2e 100644 --- a/com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductVideo/ProductVideo.v3.jsx +++ b/com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductVideo/ProductVideo.v3.jsx @@ -58,17 +58,17 @@ export default function ProductVideo({ topPanel.panelInfo.modal === true && prevModalStateRef.current === false ) { - console.log('[ProductVideo] MediaPanel returned to modal - restoring focus to ProductVideo'); + // console.log('[ProductVideo] MediaPanel returned to modal - restoring focus to ProductVideo'); // VideoPlayer์˜ controlsHandleAbove๊ฐ€ ์ž๋™์œผ๋กœ ํฌ์ปค์Šค๋ฅผ ๋นผ์•—์ง€ ์•Š๋„๋ก // ์•ฝ๊ฐ„์˜ ๋”œ๋ ˆ์ด ํ›„์— ๊ฐ•์ œ๋กœ ํฌ์ปค์Šค ์„ค์ • setTimeout(() => { - console.log('[ProductVideo] Forcing focus to product-video-player'); + // console.log('[ProductVideo] Forcing focus to product-video-player'); const element = document.querySelector('[data-spotlight-id="product-video-player"]'); if (element) { // Spotlight ๋‚ด๋ถ€ ํฌ์ปค์Šค ๊ฐ•์ œ ์„ค์ • Spotlight.focus('product-video-player'); - console.log('[ProductVideo] Focus set to product-video-player'); + // console.log('[ProductVideo] Focus set to product-video-player'); } }, 50); @@ -77,7 +77,7 @@ export default function ProductVideo({ // MediaPanel์ด ๋‹ซํ˜”์„ ๋•Œ modalState๋ฅผ true๋กœ ๋ณต์› if (!topPanel || topPanel.name !== panel_names.MEDIA_PANEL) { - console.log('[ProductVideo] MediaPanel closed - restoring modal state'); + // console.log('[ProductVideo] MediaPanel closed - restoring modal state'); setModalState(true); prevModalStateRef.current = null; } @@ -91,11 +91,11 @@ export default function ProductVideo({ topPanel?.name === panel_names.MEDIA_PANEL && topPanel?.panelInfo?.modal === true; if (autoPlay && canPlayVideo && !hasAutoPlayed && productInfo && !isMediaPanelAlreadyPlaying) { - console.log('[ProductVideo]-LoadingVideo ๐ŸŽฏ AutoPlay ์‹œ์ž‘:', { - prdtId: productInfo?.prdtId, - prdtNm: productInfo?.prdtNm, - prdtMediaUrl: productInfo?.prdtMediaUrl?.substring(0, 50), - }); + // console.log('[ProductVideo]-LoadingVideo ๐ŸŽฏ AutoPlay ์‹œ์ž‘:', { + // prdtId: productInfo?.prdtId, + // prdtNm: productInfo?.prdtNm, + // prdtMediaUrl: productInfo?.prdtMediaUrl?.substring(0, 50), + // }); setHasAutoPlayed(true); // ์งง์€ ๋”œ๋ ˆ์ด ํ›„ ์žฌ์ƒ ์‹œ์ž‘ (์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ ์™„๋ฃŒ ํ›„) @@ -160,7 +160,7 @@ export default function ProductVideo({ const videoContainerOnFocus = useCallback(() => { if (canPlayVideo) { setFocused(true); - console.log('[ProductVideo] Calling restoreModalMedia'); + // console.log('[ProductVideo] Calling restoreModalMedia'); // ProductVideo์— ํฌ์ปค์Šค๊ฐ€ ๋Œ์•„์˜ค๋ฉด ๋น„๋””์˜ค ๋ณต์› // dispatch(restoreModalMedia()); @@ -172,7 +172,7 @@ export default function ProductVideo({ }, [canPlayVideo, dispatch, onFocus]); const videoContainerOnBlur = useCallback(() => { - console.log('[ProductVideo] onBlur called - canPlayVideo:', canPlayVideo); + // console.log('[ProductVideo] onBlur called - canPlayVideo:', canPlayVideo); // if (canPlayVideo) { // setFocused(false); // // ํฌ์ปค์Šค๋ฅผ ์žƒ์œผ๋ฉด ๋ชจ๋‹ฌ MediaPanel์„ ์ตœ์†Œํ™”ํ•˜์—ฌ 1px ์ƒํƒœ๋กœ ์œ ์ง€ @@ -197,10 +197,10 @@ export default function ProductVideo({ // MediaPanel ๋น„๋””์˜ค ํด๋ฆญ ํ•ธ๋“ค๋Ÿฌ + ๋ชจ๋‹ฌ ํ† ๊ธ€ ๊ธฐ๋Šฅ const handleVideoClick = useCallback(() => { - console.log('[ProductVideo] ========== handleVideoClick ํ˜ธ์ถœ =========='); - console.log('[ProductVideo] canPlayVideo:', canPlayVideo); - console.log('[ProductVideo] panels.length:', panels.length); - console.log('[ProductVideo] All panels:', JSON.stringify(panels, null, 2)); + // console.log('[ProductVideo] ========== handleVideoClick ํ˜ธ์ถœ =========='); + // console.log('[ProductVideo] canPlayVideo:', canPlayVideo); + // console.log('[ProductVideo] panels.length:', panels.length); + // console.log('[ProductVideo] All panels:', JSON.stringify(panels, null, 2)); if (canPlayVideo) { const currentTopPanel = panels[panels.length - 1]; @@ -211,19 +211,31 @@ export default function ProductVideo({ currentTopPanel.name === panel_names.MEDIA_PANEL && currentTopPanel.panelInfo.modal === true; - console.log('[ProductVideo] currentTopPanel:', JSON.stringify(currentTopPanel, null, 2)); - console.log('[ProductVideo] isCurrentlyPlayingModal:', isCurrentlyPlayingModal); + // console.log('[ProductVideo] currentTopPanel:', JSON.stringify(currentTopPanel, null, 2)); + // console.log('[ProductVideo] isCurrentlyPlayingModal:', isCurrentlyPlayingModal); // modal๋กœ ์žฌ์ƒ ์ค‘์ด๋ฉด ์ „์ฒดํ™”๋ฉด์œผ๋กœ ์ „ํ™˜ if (isCurrentlyPlayingModal) { - console.log( - '[ProductVideo] *** Switching to fullscreen mode via switchMediaToFullscreen ***' - ); + // console.log( + // '[ProductVideo] *** Switching to fullscreen mode via switchMediaToFullscreen ***' + // ); dispatch(switchMediaToFullscreen()); setModalState(false); + + // ์ „์ฒดํ™”๋ฉด ์ „ํ™˜ ํ›„ VideoPlayer์— ํฌ์ปค์Šค ์„ค์ • + setTimeout(() => { + // console.log('[ProductVideo] Focusing to fullscreen video player'); + const focusTarget = + document.querySelector('[data-spotlight-id="modal-video-player"]') || + document.querySelector('[data-spotlight-id="product-video-player"]'); + if (focusTarget) { + Spotlight.focus('modal-video-player'); + // console.log('[ProductVideo] Focus set to fullscreen video player'); + } + }, 50); } else { - console.log('[ProductVideo] *** Starting modal MediaPanel ***'); - console.log('[ProductVideo] productInfo:', JSON.stringify(productInfo, null, 2)); + // console.log('[ProductVideo] *** Starting modal MediaPanel ***'); + // console.log('[ProductVideo] productInfo:', JSON.stringify(productInfo, null, 2)); // ์ฒ˜์Œ ์žฌ์ƒ ์‹œ์ž‘ - modal=true๋กœ ์‹œ์ž‘ setIsVideoPlaying(true); // ๋น„๋””์˜ค ์žฌ์ƒ flag ์„ค์ • if (onVideoPlaying) { diff --git a/com.twin.app.shoptime/src/views/MediaPanel/MediaPanel.v3.jsx b/com.twin.app.shoptime/src/views/MediaPanel/MediaPanel.v3.jsx index b9f1186b..ed424868 100644 --- a/com.twin.app.shoptime/src/views/MediaPanel/MediaPanel.v3.jsx +++ b/com.twin.app.shoptime/src/views/MediaPanel/MediaPanel.v3.jsx @@ -2237,7 +2237,7 @@ const MediaPanel = React.forwardRef( modalScale={panelInfo.modal ? modalScale : 1} modalClassName={panelInfo.modal && panelInfo.modalClassName} spotlightId={ - panelInfo.modal ? undefined : panelInfo.modalContainerId || spotlightId + panelInfo.modal ? 'modal-video-player' : panelInfo.modalContainerId || spotlightId } handleIndicatorDownClick={handleIndicatorDownClick} handleIndicatorUpClick={handleIndicatorUpClick}