diff --git a/com.twin.app.shoptime/assets/images/btn/btn-dropdown-foc@3x.png b/com.twin.app.shoptime/assets/images/btn/btn-dropdown-foc@3x.png new file mode 100644 index 00000000..36d326e2 Binary files /dev/null and b/com.twin.app.shoptime/assets/images/btn/btn-dropdown-foc@3x.png differ diff --git a/com.twin.app.shoptime/assets/images/btn/btn-dropdown-nor@3x.png b/com.twin.app.shoptime/assets/images/btn/btn-dropdown-nor@3x.png new file mode 100644 index 00000000..aa3fa2b1 Binary files /dev/null and b/com.twin.app.shoptime/assets/images/btn/btn-dropdown-nor@3x.png differ diff --git a/com.twin.app.shoptime/src/views/DetailPanel/components/ProductTag.module.less b/com.twin.app.shoptime/src/views/DetailPanel/components/ProductTag.module.less index ce13d50e..53c0808b 100644 --- a/com.twin.app.shoptime/src/views/DetailPanel/components/ProductTag.module.less +++ b/com.twin.app.shoptime/src/views/DetailPanel/components/ProductTag.module.less @@ -4,7 +4,7 @@ .tag-default(@backgroundColor,@fontColor) { display: block; border-radius: 4px; - margin-right: 6px; + margin-left: 6px; .font(@fontFamily:@baseFontBold,@fontSize:24px); background-color: @backgroundColor; color: @fontColor; @@ -24,7 +24,7 @@ .freeShipping { display: block; border-radius: 4px; - margin-right: 6px; + margin-left: 6px; background-color: rgba(199, 8, 80, 0.1); color: @PRIMARY_COLOR_RED; text-align: center; @@ -50,6 +50,7 @@ border-radius: 4px; .size(@w: 120px, @h: 42px); color: @COLOR_WHITE; + margin-left: 6px; text-align: center; line-height: 42px; .font(@fontFamily: @baseFontBold, @fontSize:24px); diff --git a/com.twin.app.shoptime/src/views/DetailPanel/components/optionTypes/OptionCommon.jsx b/com.twin.app.shoptime/src/views/DetailPanel/components/optionTypes/OptionCommon.jsx index 522c95af..c30c7885 100644 --- a/com.twin.app.shoptime/src/views/DetailPanel/components/optionTypes/OptionCommon.jsx +++ b/com.twin.app.shoptime/src/views/DetailPanel/components/optionTypes/OptionCommon.jsx @@ -1,5 +1,115 @@ -import React from 'react'; +import React, { useCallback, useEffect, useState } from "react"; -export default function OptionCommon() { - return
OptionCommon
; +import { useDispatch, useSelector } from "react-redux"; + +import SpotlightContainerDecorator from "@enact/spotlight/SpotlightContainerDecorator"; +import Spottable from "@enact/spotlight/Spottable"; + +import { getProductOption } from "../../../../actions/productActions"; +import TButton from "../../../../components/TButton/TButton"; +import TPopUp from "../../../../components/TPopUp/TPopUp"; +import TScroller from "../../../../components/TScroller/TScroller"; +import { $L } from "../../../../utils/helperMethods"; +import css from "./OptionCommon.module.less"; + +const Container = SpotlightContainerDecorator( + { enterTo: "last-focused", continue5WayHold: true }, + "div" +); + +export default function OptionCommon({ selectedPatnrId, selectedPardtId }) { + const dispatch = useDispatch(); + const productOptionInfos = useSelector((state) => state.product.prdtOptInfo); + + const [selectedIndex, setSelectedIndex] = useState(0); + const [optionPopupOpen, setOptionPopupOpen] = useState(false); + const [secondOptionOpen, setSecondOptionOpen] = useState(false); + + useEffect(() => { + dispatch( + getProductOption({ + patnrId: selectedPatnrId, + prdtId: selectedPardtId, + }) + ); + }, [dispatch]); + + const handleClose = useCallback(() => { + setOptionPopupOpen(false); + }, [optionPopupOpen]); + + const handleOptionClick = useCallback( + (idx) => { + idx === 0 ? setOptionPopupOpen(true) : setSecondOptionOpen(true); + }, + [productOptionInfos] + ); + + return ( + + + {productOptionInfos && + productOptionInfos.length > 0 && + productOptionInfos.map((option, idx) => { + const { + cntryCd, + concProdOptSno, + optNm, + patnrId, + prdtId, + prodOptSno, + prodOptTpCdCval, + prdtOptDtl, + } = option; + return ( +
+ {$L(optNm.toUpperCase())} + { + handleOptionClick(idx); + }} + > + + {prdtOptDtl[0].prodOptCval} + + + { + setOptionPopupOpen(false); + setSecondOptionOpen(false); + }} + open={idx === 0 ? optionPopupOpen : secondOptionOpen} + hasButton + hasText + title={$L(optNm.toUpperCase())} + button1Text={$L("CLOSE")} + selectedOptionIdx={selectedIndex} + setSelectedOptionIdx={setSelectedIndex} + /> +
+ ); + })} +
+
+
+ SHOPTIME PROMOTION + Coupon only applicable to this product! +
+ COUPON +
+
+ {$L("QVC Price")} + +
+
+ {$L("Shipping Free")} + +
+
+ ); } diff --git a/com.twin.app.shoptime/src/views/DetailPanel/components/optionTypes/OptionCommon.module.less b/com.twin.app.shoptime/src/views/DetailPanel/components/optionTypes/OptionCommon.module.less index e69de29b..d68f2812 100644 --- a/com.twin.app.shoptime/src/views/DetailPanel/components/optionTypes/OptionCommon.module.less +++ b/com.twin.app.shoptime/src/views/DetailPanel/components/optionTypes/OptionCommon.module.less @@ -0,0 +1,58 @@ +@import "../../../../style/CommonStyle.module.less"; +@import "../../../../style/utils.module.less"; + +.detailContainer { + width: 846px; + margin-top: 21px; + + .detailScroll { + width: 100%; + height: 214px; + background: @BG_COLOR_02; + padding: 10px 30px; + border-top: 1px solid @COLOR_GRAY02; + border-bottom: 1px solid @COLOR_GRAY02; + + .optionLayer { + .flex(@justifyCenter:space-between); + color: @COLOR_GRAY05; + .font(@baseFontBold,@fontSize:24px); + margin: 20px 0; + + .optionBtn { + .border-solid(1px,@COLOR_GRAY02); + .flex(); + .font(@baseFontBold,@fontSize:24px); + + min-width: 560px; + background-color: @COLOR_WHITE; + color: @COLOR_GRAY03; + background-image: url(../../../../../assets/images/btn/btn-dropdown-nor@3x.png); + .imgElement(42px, 42px, right 30px, center); + position: relative; + + &:focus { + color: @PRIMARY_COLOR_RED; + &::after { + .focused(@boxShadow: 22px, @borderRadius: 12px); + background-image: url(../../../../../assets/images/btn/btn-dropdown-foc@3x.png); + .imgElement(42px, 42px, right 26px, center); + } + } + + > div { + .flex(); + + span { + line-height: 1.33; + width: 458px; + } + img { + width: 42px; + height: 42px; + } + } + } + } + } +} diff --git a/com.twin.app.shoptime/src/views/DetailPanel/container/ProductOption.jsx b/com.twin.app.shoptime/src/views/DetailPanel/container/ProductOption.jsx index b699dd15..70963a55 100644 --- a/com.twin.app.shoptime/src/views/DetailPanel/container/ProductOption.jsx +++ b/com.twin.app.shoptime/src/views/DetailPanel/container/ProductOption.jsx @@ -1,53 +1,39 @@ -import React, { useEffect } from "react"; +import React from "react"; -import { useDispatch, useSelector } from "react-redux"; +import { useSelector } from "react-redux"; -import { getProductOption } from "../../../actions/productActions"; import { $L } from "../../../utils/helperMethods"; +import OptionCommon from "../components/optionTypes/OptionCommon"; import OptionGroup from "../components/optionTypes/OptionGroup"; import ProductTag from "../components/ProductTag"; import StarRating from "../components/StarRating"; import css from "./ProductOption.module.less"; export default function ProductOption({ selectedPatnrId, selectedPardtId }) { - const dispatch = useDispatch(); - - // const productOpionInfos = useSelector((state) => state.product.prdtOptInfo); const productDataInfos = useSelector((state) => state.main.productData); - - useEffect(() => { - dispatch( - getProductOption({ - patnrId: selectedPatnrId, - prdtId: selectedPardtId, - }) - ); - }, [dispatch]); + const { patncLogoPath, prdtId, prdtNm, revwGrd } = productDataInfos; return (
{productDataInfos && (
- patncLogoPath -
{$L(`ID: ${productDataInfos.prdtId}`)}
+ patncLogoPath +
{$L(`ID: ${prdtId}`)}
-
{$L(productDataInfos.prdtNm)}
+
{$L(prdtNm)}
- {productDataInfos.revwGrd && ( - - )} + {revwGrd && }
)}
- */} +