259 lines
6.0 KiB
JavaScript
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;
|
|
}
|
|
};
|