Files
shoptime/com.twin.app.shoptime/src/reducers/homeReducer.js
2025-07-03 10:45:17 +09:00

259 lines
6.0 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,
isPaused: false,
},
termsIdMap: {}, // added new property to initialState
optionalTermsAvailable: 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,
});
}
}
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.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,
},
};
}
}
// 🔽 [추가] 플레이 제어 매니저 Reducer 로직
case types.SET_PLAYER_CONTROL: {
return {
...state,
playerControl: {
...state.playerControl,
ownerId: action.payload.ownerId, // 제어권 소유주 ID 설정
isPaused: false, // 새로운 제어권이 부여되면 '일시정지' 상태는 해제
},
};
}
case types.CLEAR_PLAYER_CONTROL: {
return {
...state,
playerControl: {
...state.playerControl,
ownerId: null, // 제어권 소유주 없음
// isPaused는 유지할 수도, 초기화할 수도 있음. 여기선 초기화.
isPaused: false,
},
};
}
case types.PAUSE_PLAYER_CONTROL: {
return {
...state,
playerControl: {
...state.playerControl,
isPaused: true, // '일시정지' 상태로 설정
},
};
}
// 🔼 [추가]
case types.RESUME_PLAYER_CONTROL: {
return {
...state,
playerControl: {
...state.playerControl,
isPaused: false,
},
};
}
default:
return state;
}
};