# DetailPanel - Theme Product vs Hotel Product λΉκ΅ λΆμ
## π μ 체 κ°μ
| κ΅¬λΆ | Theme Product (μΌ/곡μ°) | Hotel Product (μλ°) |
|------|------------------------|----------------------|
| **λ°μ΄ν° μμ€** | `themeCurationDetailInfoData[]` | `themeCurationHotelDetailData[]` |
| **λ©μΈ μ»΄ν¬λνΈ** | ShowProduct | HotelProduct |
| **ν¨λ νμ
** | `panelInfo.type === "theme"` | `panelInfo.type === "hotel"` |
| **μλ² API** | getThemeCurationDetailInfo | getThemeHotelDetailInfo |
| **Redux μ‘μ
** | GET_THEME_CURATION_DETAIL_INFO | GET_THEME_HOTEL_DETAIL_INFO |
---
## π― ν΅μ¬ μ°¨μ΄μ
### 1. λ°μ΄ν° ꡬ쑰
#### Theme Product
```javascript
themeCurationDetailInfoData: [
{
prdtId, prdtNm, // μν ID, μ΄λ¦
imgUrls600: [], // μ΄λ―Έμ§ λ°°μ΄
priceInfo: "299|199|Y|...", // κ°κ²© μ 보 (νμ΄ν ꡬλΆ)
prdtMediaUrl, // λΉλμ€ URL
showId, showNm, // μΌ μ 보
catCd, catNm, // μΉ΄ν
κ³ λ¦¬
soldoutFlag, // λ§€μ§ μ¬λΆ
pmtSuptYn, // κ²°μ μ§μ
revwGrd, // νμ
}
]
```
#### Hotel Product
```javascript
themeCurationHotelDetailData: [
{
hotelId, hotelNm, // νΈν
ID, μ΄λ¦
hotelImgUrl, // νΈν
μΈλ€μΌ
imgUrls600: [], // μ΄λ―Έμ§ λ°°μ΄
qrcodeUrl, // QR μ½λ
hotelDetailInfo: {
price, // κ°κ²© (λ¨μ μ«μ)
currencySign, // ν΅ν κΈ°νΈ
revwGrd, // νμ
hotelType, // νΈν
νμ
hotelAddr, // μ£Όμ
nights, adultsCount, // μλ°μΌ, μ±μΈ μ
roomType, // λ°© νμ
amenities: [], // νΈμμμ€ ID λ°°μ΄
imgUrls: [] // μ΄λ―Έμ§
}
}
]
hotelData: {
hotelInfo: { curationId, curationNm, ... },
amenities: [
{ amntId, lgAmntNm, lgAmntImgUrl },
// ...
]
}
```
---
### 2. UI ꡬ쑰
#### Theme Product
```
ShowProduct
ββ ThemeIndicator
β ββ [λ©μΈ μ΄λ―Έμ§] λλ [λΉλμ€]
β ββ [μΈλ€μΌ μ€ν¬λ‘€]
ββ IndicatorOptions
β ββ [μ€λͺ
] [κ΅νμ μ±
] [SMS]
β ββ QR μ½λ
ββ ShowSingleOption / ShowUnableOption
ββ ꡬ맀 μ΅μ
λλ ꡬ맀λΆκ° λ©μμ§
```
#### Hotel Product
```
HotelProduct
ββ ThemeIndicator
β ββ [λ©μΈ μ΄λ―Έμ§]
β ββ [μΈλ€μΌ μ€ν¬λ‘€]
ββ IndicatorOptions
β ββ [μ£Όμ μ 보]
ββ optionContainer
ββ [λ‘κ³ + λ³μ ]
ββ [νΈν
λͺ
+ νμ
]
ββ [νΈμμμ€ κ·Έλ¦¬λ] (μ΅λ 10κ°)
ββ [μμ½μ 보 + κ°κ²© + QR]
ββ [SEE MORE] λ²νΌ
```
---
### 3. κ°κ²© μ²λ¦¬
#### Theme Product
```javascript
// priceInfo = "299|199|Y|discount10|10%"
const befPrice = priceInfo.split("|")[0]; // μκ°
const lastPrice = priceInfo.split("|")[1]; // ν μΈκ°
const rewdAplyFlag = priceInfo.split("|")[2]; // 보μ μ μ©
const discountRate = priceInfo.split("|")[4]; // ν μΈμ¨
// λ‘κ·Έ μ μ‘
params.befPrice = befPrice;
params.lastPrice = lastPrice;
```
#### Hotel Product
```javascript
// price = "299.99" (λ¨μ μ«μ)
// currencySign = "$"
// UI νμ
{hotelInfos[selectedIndex]?.hotelDetailInfo.currencySign}
{hotelInfos[selectedIndex]?.hotelDetailInfo.price}
// λ‘κ·Έ μ μ‘
params.price = selectedHotelInfo.hotelInfo?.hotelDetailInfo?.price;
```
---
### 4. νΉμ κΈ°λ₯
#### Theme Product
β
**λΉλμ€ μλ μ¬μ**
- `prdtMediaUrl` μ‘΄μ¬ μ 첫 μ΄λ―Έμ§ μμΉμ λΉλμ€
- `launchedFromPlayer = false`μΌ λλ§ μλ μ¬μ
- λΉλμ€ μλ§ μ§μ (`prdtMediaSubtitlUrl`)
β
**μμΈ μ 보 νμ
**
- [DESCRIPTION] λ²νΌ: μν μ€λͺ
- [RETURNS & EXCHANGES] λ²νΌ: λ°ν/κ΅ν μ μ±
- HTML λ§ν¬μ
μ§μ (`dangerouslySetInnerHTML`)
β
**κ²°μ μ΅μ
μ ν**
- μ΅μ
μ ν (μ΄μ©μΌμ, μ’μ λ±)
- μλ μ ν
- μ΅μ
λ³ κ°κ²© κ³μ°
β **νΈμμμ€ νμ μμ**
---
#### Hotel Product
β
**νΈμμμ€ κ·Έλ¦¬λ νμ**
- μ΅λ 10κ° νΈμμμ€ μμ΄μ½ + ν
μ€νΈ
- κ°μ μΉ΄ν
κ³ λ¦¬ μ€λ³΅ μ κ±°
- νΈμμμ€λ³ μ΄λ―Έμ§ λ° μ€λͺ
β
**μμ½ μ 보 νμ**
- μλ° κΈ°κ° (nights)
- μ±μΈ μ (adultsCount)
- λ°© νμ
(roomType)
- μλ ν¬λ§·ν
(μ: "2 Nights 2 Adults")
β
**λ³μ λ±κΈ μμ€ν
**
- νμ μμΉ β λ¬Έμ λ±κΈ λ³ν
- Fair (β€2.4) / Good (2.5~3.4) / Very Good (3.5~4.4) / Excellent (β₯4.5)
β **λΉλμ€ μ§μ μμ**
β **μ΅μ
μ ν μμ** (μλ° μ 보λ 미리 μ ν΄μ§)
---
### 5. κ²°μ μ¬λΆ νλ¨
#### 곡ν΅μ
```javascript
// κ²°μ OS λ²μ 체ν¬
webOSVersion >= "6.0" // TRUEμΌ λλ§ κ²°μ UI νμ
```
#### Theme Product
```javascript
const isBillingProductVisible = (
productInfo[selectedIndex]?.pmtSuptYn === "Y" &&
webOSVersion >= "6.0"
);
// YES β ShowSingleOption (ꡬ맀 μ΅μ
)
// NO β ShowUnableOption (ꡬ맀λΆκ°)
```
#### Hotel Product
```javascript
// νΈν
μ pmtSuptYn μ²΄ν¬ μμ (λͺ¨λ ꡬ맀λΆκ°)
// SMS "SEE MORE" λ²νΌλ§ μ 곡
// λͺ¨λ νΈν
μνμ΄ UnableOption ꡬ쑰
```
---
### 6. SMS νμ
μ½λ
#### Theme Product
```javascript
smsTpCd = "APP00204" // ν
λ§/μΌ μν
```
#### Hotel Product
```javascript
smsTpCd = "APP00205" // νΈν
μν
```
---
### 7. λ‘κ·Έ νλ
#### κ³΅ν΅ νλ
```javascript
{
curationId, curationNm, // ν
λ§/νλ μ΄μ
patnrId, patncNm, // ννΈλ
prdtId, prdtNm, // μν ID, μ΄λ¦
revwGrd, // νμ
expsOrd, // μν μλ²
}
```
#### Theme Product μΆκ° νλ
```javascript
{
showId, showNm, // μΌ μ 보
catCd, catNm, // μΉ΄ν
κ³ λ¦¬
befPrice, lastPrice, // μκ°, ν μΈκ°
rewdAplyFlag, // 보μ μ μ©
tsvFlag, // μ€λμ νΉκ°
shopTpNm: "product", // μν νμ
}
```
#### Hotel Product μΆκ° νλ
```javascript
{
hotelId, // νΈν
ID (prdtId λ체)
price, // κ°κ²© (λ¨μ)
shopTpNm: "hotel", // μν νμ
}
```
---
### 8. μ ν μΈλ±μ€ μ²λ¦¬
#### Theme Product
```javascript
// URL νλΌλ―Έν°λ‘ νΉμ μν μ§μ
if (panelInfo?.themePrdtId) {
for (let i = 0; i < themeProductInfos.length; i++) {
if (themeProductInfos[i].prdtId === panelInfo?.themePrdtId) {
setSelectedIndex(i); // β ν΄λΉ μνμΌλ‘ μ΄λ
}
}
}
```
#### Hotel Product
```javascript
// URL νλΌλ―Έν°λ‘ νΉμ νΈν
μ§μ
if (panelInfo?.themeHotelId) {
for (let i = 0; i < hotelInfos.length; i++) {
if (hotelInfos[i].hotelId === panelInfo?.themeHotelId) {
setSelectedIndex(i); // β ν΄λΉ νΈν
λ‘ μ΄λ
}
}
}
```
---
## π λ μ΄μμ λΉκ΅
### Theme Product
| μμ | ν¬κΈ° |
|------|------|
| ThemeIndicator | 834Γ930px |
| λ©μΈ μ΄λ―Έμ§ | 600Γ600px |
| μΈλ€μΌ | 150Γ150px (λ°λ³΅) |
| QR μ½λ | 160Γ160px |
### Hotel Product
| μμ | ν¬κΈ° |
|------|------|
| ThemeIndicator | 774Γ930px |
| λ©μΈ μ΄λ―Έμ§ | 600Γ600px |
| optionContainer | 1026Γ990px |
| νΈμμμ€ λ°μ€ | 138Γ138px (λ°λ³΅, μ΅λ 10κ°) |
| QR μ½λ | 160Γ160px |
---
## π μ»΄ν¬λνΈ μ¬μ¬μ©
### 곡μ μ»΄ν¬λνΈ
```
ThemeIndicator
ββ Theme Productμμ μ¬μ©
ββ Hotel Productμμλ μ¬μ©
(λΉλμ€ μ¬μμ X)
IndicatorOptions
ββ Theme Productμμ μ¬μ©
ββ Hotel Productμμλ μ¬μ©
(μ£Όμ μ λ³΄λ§ νμ)
StarRating
ββ Theme Productμμ μ¬μ©
ββ Hotel Productμμλ μ¬μ©
```
### μ μ© μ»΄ν¬λνΈ
```
Theme Product:
ββ ShowProduct.jsx
ββ ShowSingleOption.jsx
ββ ShowUnableOption.jsx
ββ SingleOption / UnableOption (κΈ°μ‘΄)
Hotel Product:
ββ HotelProduct.jsx
ββ StarRating (νΈν
λ±κΈμ©)
```
---
## π μ 리 ν
μ΄λΈ
| κΈ°λ₯ | Theme | Hotel |
|------|-------|-------|
| **λΉλμ€ μ§μ** | β
| β |
| **μλ μ¬μ** | β
| β |
| **νΈμμμ€ νμ** | β | β
(μ΅λ 10κ°) |
| **μμ½ μ 보** | β | β
(μλ°μΌ, μ±μΈ μ) |
| **λ±κΈ λ³ν** | β | β
(Fair/Good/Very Good/Excellent) |
| **μ΅μ
μ ν** | β
| β |
| **μλ μ ν** | β
| β |
| **κ²°μ κ°λ₯** | μ‘°κ±΄λΆ (pmtSuptYn) | β (νμ λΆκ°) |
| **μμΈ νμ
** | β
(μ€λͺ
/κ΅ν) | β |
| **κ°κ²© νμ** | `"299\|199\|Y\|..."` | `"299.99"` |
| **ν΅ν κΈ°νΈ** | λ―Έμ¬μ© | β
(`$`, `β¬`, `Β₯` λ±) |
| **SMS νμ
** | APP00204 | APP00205 |
| **QR μ½λ** | β
| β
|
| **λ‘κ·Έ μΆμ ** | μμΈ (κ°κ²©, ν μΈμ¨) | κΈ°λ³Έ (κ°κ²©λ§) |
---
## π― μ¬μ© μλ리μ€
### Theme Product μ¬μ© μ
```
μ¬μ©μκ° "μ€νλΌ κ³΅μ°" ν΄λ¦
β
DetailPanel λ‘λ (type: "theme")
β
ShowProduct λ λλ§
β
κ³΅μ° λΉλμ€ μλ μ¬μ
β
μ¬μ©μκ° μ€λͺ
λ²νΌ ν΄λ¦
β
μν μ€λͺ
νμ
νμ
β
μ¬μ©μκ° SMS λ²νΌ ν΄λ¦
β
μΉκ΅¬μκ² κ³΅μ° μ 보 μ μ‘
```
### Hotel Product μ¬μ© μ
```
μ¬μ©μκ° "λλ°μ΄ νΈν
" ν΄λ¦
β
DetailPanel λ‘λ (type: "hotel")
β
HotelProduct λ λλ§
β
νΈν
μ¬μ§, νΈμμμ€, κ°κ²© νμ
β
μ¬μ©μκ° νμ΄νλ‘ λ€λ₯Έ νΈν
μ ν
β
λ³μ /νΈμμμ€/κ°κ²© μ
λ°μ΄νΈ
β
μ¬μ©μκ° SEE MORE λ²νΌ ν΄λ¦
β
νΈν
μμΈ μ 보 SMS μ μ‘
```
---
## π‘ κ°λ° κ°μ΄λ
### μλ‘μ΄ μν νμ
μΆκ° μ
1. **DetailPanelμ λΆκΈ° μΆκ°**
```javascript
if (panelInfo?.type === "newtype") {
dispatch(getNewTypeDetailInfo(...));
}
```
2. **Redux Action/Reducer μμ±**
```javascript
GET_NEWTYPE_DETAIL_INFO action μΆκ°
state.home.newTypeData μν μΆκ°
```
3. **λ©μΈ μ»΄ν¬λνΈ μμ±** (ShowProduct/HotelProduct μ°Έκ³ )
- ThemeIndicator μ¬μ¬μ© (λλ 컀μ€ν°λ§μ΄μ§)
- IndicatorOptions μ¬μ¬μ© (λλ 컀μ€ν°λ§μ΄μ§)
- μΈλΆ UI μ»΄ν¬λνΈ μμ±
4. **ThemeProductμ λΌμ°ν
μΆκ°**
```javascript
{themeType === "newtype" && (
)}
```
---
## π κ΄λ ¨ νμΌ κ΅¬μ‘°
```
src/views/DetailPanel/
ββ DetailPanel.jsx / DetailPanel.backup.jsx
ββ ThemeProduct/
β ββ ThemeProduct.jsx (λΌμ°ν
)
β ββ ShowProduct.jsx (ν
λ§ μν)
β ββ HotelProduct.jsx (νΈν
μν)
β ββ ShowOptions/
β β ββ ShowSingleOption.jsx
β β ββ ShowUnableOption.jsx
β ββ *.module.less
ββ components/
β ββ ProductOption.jsx (λνΌ)
β ββ indicator/
β β ββ ThemeIndicator.jsx (곡μ )
β β ββ IndicatorOptions.jsx (곡μ )
β β ββ *.module.less
β ββ StarRating.jsx (곡μ )
β ββ ...
ββ SingleProduct/
β ββ SingleOption.jsx (ν
λ§μ©)
ββ UnableProduct/
β ββ UnableOption.jsx (ν
λ§μ©)
ββ ...
src/actions/
ββ homeActions.js
β ββ getThemeCurationDetailInfo()
β ββ getThemeHotelDetailInfo()
ββ ...
src/reducers/
ββ homeReducer.js
ββ GET_THEME_CURATION_DETAIL_INFO case
ββ GET_THEME_HOTEL_DETAIL_INFO case
```
---
## β
μ΅μ’
체ν¬λ¦¬μ€νΈ
### Theme Product
- β
λΉλμ€ μλ μ¬μ (쑰건λΆ)
- β
μμΈ μ 보 νμ
(μ€λͺ
/κ΅ν)
- β
μ΅μ
μ ν (λ μ§/μ’μ)
- β
μλ μ ν
- β
κ°κ²© ν μΈμ¨ νμ
- β
κ²°μ κ°λ₯ μ¬λΆ νλ¨
- β
SMS 곡μ (λͺ¨λ μν)
- β
μμΈ λ‘κΉ
### Hotel Product
- β
νΈν
μ΄λ―Έμ§ κ°€λ¬λ¦¬
- β
νΈμμμ€ κ·Έλ¦¬λ (μ΅λ 10κ°)
- β
λ³μ λ±κΈ λ³ν
- β
μμ½ μ 보 νμ (μλ°μΌ, μ±μΈ μ)
- β
κ°κ²© + ν΅ν κΈ°νΈ
- β
μ£Όμ μ 보
- β
QR μ½λ
- β
SMS 곡μ (SEE MORE)
- β
λ‘κΉ
---
μ΄ λ¬Έμλ₯Ό ν΅ν΄ Theme Productμ Hotel Productμ μ°¨μ΄μ μ λͺ
νν μ΄ν΄ν μ μμΌλ©°, ν₯ν μ μ¬ν μν νμ
μΆκ° μ μ°Έκ³ ν μ μμ΅λλ€.