🕐 커밋 시간: 2025. 11. 15. 20:10:38 📊 변경 통계: • 총 파일: 7개 • 추가: +134줄 • 삭제: -63줄 📝 수정된 파일: ~ com.twin.app.shoptime/src/actions/actionTypes.js ~ com.twin.app.shoptime/src/actions/homeActions.js ~ com.twin.app.shoptime/src/components/VideoPlayer/TReactPlayer.jsx ~ com.twin.app.shoptime/src/reducers/homeReducer.js ~ com.twin.app.shoptime/src/views/HomePanel/HomeBanner/RandomUnit.jsx ~ com.twin.app.shoptime/src/views/HomePanel/HomePanel.jsx ~ com.twin.app.shoptime/src/views/MediaPanel/MediaPanel.v3.jsx 🔧 함수 변경 내용: 📄 com.twin.app.shoptime/src/actions/homeActions.js (javascript): ✅ Added: setDefaultFocus() 📄 com.twin.app.shoptime/src/views/HomePanel/HomeBanner/RandomUnit.jsx (javascript): 🔄 Modified: SpotlightContainerDecorator() 📄 com.twin.app.shoptime/src/views/MediaPanel/MediaPanel.v3.jsx (javascript): 🔄 Modified: normalizeModalStyle() 🔧 주요 변경 내용: • 타입 시스템 안정성 강화 • 핵심 비즈니스 로직 개선 • UI 컴포넌트 아키텍처 개선
256 lines
5.8 KiB
JavaScript
256 lines
5.8 KiB
JavaScript
import { types } from '../actions/actionTypes';
|
|
import { panel_names } from '../utils/Config';
|
|
|
|
const initialState = {
|
|
termsData: {},
|
|
menuData: {},
|
|
layoutData: {},
|
|
themeCurationInfoData: {},
|
|
themeCurationDetailInfoData: {},
|
|
themeCurationHotelDetailData: {},
|
|
homeTopDisplayInfo: {},
|
|
bannerData: {
|
|
data: {},
|
|
status: 'idle',
|
|
},
|
|
defaultFocus: null,
|
|
enterThroughGNB: false,
|
|
themeCurationInfoDataCode: null,
|
|
bannerIndices: {},
|
|
themeMenuShelfInfoData: null,
|
|
homeInfo: null,
|
|
curationId: '',
|
|
curationTitle: '',
|
|
playerControl: {
|
|
ownerId: null,
|
|
videoInfo: null,
|
|
},
|
|
termsIdMap: {}, // added new property to initialState
|
|
optionalTermsAvailable: false, // 선택약관 존재 여부
|
|
persistentVideoInfo: null, // 영구재생 비디오 정보
|
|
videoTransitionLocked: false,
|
|
};
|
|
|
|
export const homeReducer = (state = initialState, action) => {
|
|
switch (action.type) {
|
|
case types.GET_HOME_TERMS:
|
|
return {
|
|
...state,
|
|
termsData: action.payload,
|
|
};
|
|
|
|
case types.SET_TERMS_ID_MAP:
|
|
return {
|
|
...state,
|
|
termsIdMap: action.payload,
|
|
};
|
|
|
|
case types.SET_OPTIONAL_TERMS_AVAILABILITY:
|
|
return {
|
|
...state,
|
|
optionalTermsAvailable: action.payload,
|
|
};
|
|
|
|
case types.GET_HOME_MENU: {
|
|
let menuItems = [];
|
|
|
|
const menuData = action.payload.data;
|
|
if (menuData?.gnb) {
|
|
const info = menuData.gnb.map((item) => {
|
|
return {
|
|
menuNm: item.menuNm,
|
|
menuId: item.menuId,
|
|
};
|
|
});
|
|
|
|
for (let i = 0; i < info.length; i++) {
|
|
const title = info[i].menuNm;
|
|
const menuId = info[i].menuId;
|
|
menuItems.push({
|
|
title: title,
|
|
menuId: menuId,
|
|
});
|
|
}
|
|
}
|
|
|
|
// Cart 메뉴 임시 추가
|
|
menuItems.push({
|
|
title: 'Cart',
|
|
menuId: 10800,
|
|
});
|
|
|
|
return {
|
|
...state,
|
|
menuData: action.payload,
|
|
menuItems: menuItems,
|
|
};
|
|
}
|
|
|
|
case types.GET_HOME_LAYOUT:
|
|
return {
|
|
...state,
|
|
layoutData: action.payload,
|
|
};
|
|
|
|
case types.GET_HOME_MAIN_CONTENTS: {
|
|
const homeTopDisplayInfo = action.payload?.homeTopDisplayInfos?.[0] ?? {};
|
|
const bannerData = action.payload?.homeMainContentsBannerInfos?.[0] ?? {};
|
|
|
|
const curationTitle = action.payload?.homeMainContentsBannerInfos?.[0].curtNm;
|
|
const curationId = action.payload?.homeMainContentsBannerInfos?.[0].curationId;
|
|
|
|
if (bannerData.bannerInfos) {
|
|
for (let i = 0; i < bannerData.bannerInfos.length; i++) {
|
|
const info = bannerData.bannerInfos[i];
|
|
if (info.shptmDspyTpNm === 'Random') {
|
|
const dataLength = info.bannerDetailInfos.length;
|
|
info.randomIndex = Math.floor(Math.random() * dataLength);
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
...state,
|
|
homeTopDisplayInfo: homeTopDisplayInfo,
|
|
bannerData: bannerData,
|
|
curationId,
|
|
curationTitle,
|
|
};
|
|
}
|
|
case types.GET_THEME_CURATION_INFO:
|
|
return {
|
|
...state,
|
|
themeCurationInfoData: action.payload,
|
|
themeCurationInfoDataCode: action.retCode,
|
|
};
|
|
case types.GET_THEME_CURATION_DETAIL_INFO: {
|
|
const productInfo = action.payload.themeInfo[0].productInfos;
|
|
|
|
return {
|
|
...state,
|
|
themeCurationDetailInfoData: productInfo,
|
|
productData: action.payload,
|
|
};
|
|
}
|
|
|
|
case types.GET_THEME_HOTEL_DETAIL_INFO: {
|
|
const hotelInfos = action.payload.hotelInfo.hotelInfos;
|
|
|
|
return {
|
|
...state,
|
|
themeCurationHotelDetailData: hotelInfos,
|
|
hotelData: action.payload,
|
|
};
|
|
}
|
|
|
|
case types.GET_THEME_MENU_SHELF_INFO: {
|
|
return {
|
|
...state,
|
|
themeMenuShelfInfoData: action.payload.themeMenuInfo,
|
|
};
|
|
}
|
|
|
|
case types.CLEAR_THEME_MENU_SHELF_INFO: {
|
|
return {
|
|
...state,
|
|
themeMenuShelfInfoData: null,
|
|
};
|
|
}
|
|
|
|
case types.UPDATE_HOME_INFO: {
|
|
return {
|
|
...state,
|
|
homeInfo: {
|
|
...action.payload,
|
|
panelInfo: {
|
|
...state.homeInfo?.panelInfo,
|
|
...action.payload?.panelInfo,
|
|
},
|
|
},
|
|
};
|
|
}
|
|
|
|
case types.RESET_HOME_INFO: {
|
|
return {
|
|
...state,
|
|
homeInfo: {},
|
|
};
|
|
}
|
|
|
|
case types.CLEAR_THEME_DETAIL: {
|
|
return {
|
|
...state,
|
|
themeCurationHotelDetailData: null,
|
|
themeCurationDetailInfoData: [],
|
|
productData: null,
|
|
hotelData: null,
|
|
};
|
|
}
|
|
|
|
case types.SET_DEFAULT_FOCUS: {
|
|
return {
|
|
...state,
|
|
defaultFocus: action.payload,
|
|
};
|
|
}
|
|
|
|
case types.SET_VIDEO_TRANSITION_LOCK:
|
|
return {
|
|
...state,
|
|
videoTransitionLocked: action.payload,
|
|
};
|
|
|
|
case types.CHECK_ENTER_THROUGH_GNB: {
|
|
return {
|
|
...state,
|
|
enterThroughGNB: action.payload,
|
|
};
|
|
}
|
|
|
|
case types.SET_BANNER_INDEX: {
|
|
const { bannerId, index } = action.payload;
|
|
|
|
if (bannerId) {
|
|
return {
|
|
...state,
|
|
bannerIndices: {
|
|
...state.bannerIndices,
|
|
[bannerId]: index,
|
|
},
|
|
};
|
|
}
|
|
}
|
|
|
|
// 🔽 [수정] 새로운 플레이어 제어 로직
|
|
case types.SET_PLAYER_CONTROL: {
|
|
return {
|
|
...state,
|
|
playerControl: {
|
|
ownerId: action.payload.ownerId,
|
|
videoInfo: action.payload.videoInfo,
|
|
},
|
|
};
|
|
}
|
|
|
|
case types.CLEAR_PLAYER_CONTROL: {
|
|
return {
|
|
...state,
|
|
playerControl: {
|
|
ownerId: null,
|
|
videoInfo: null,
|
|
},
|
|
};
|
|
}
|
|
|
|
case types.SET_PERSISTENT_VIDEO_INFO: {
|
|
return {
|
|
...state,
|
|
persistentVideoInfo: action.payload,
|
|
};
|
|
}
|
|
// 🔼 [수정]
|
|
|
|
default:
|
|
return state;
|
|
}
|
|
};
|