[홈] 에너지 라벨 #1
1. 우선 홈 > 카테고리 부분에만 적용해둠. - TItemCard.new.jsx에 적용. - 노출이 어떨때 되어야하는지 아직 이야기없음. - api가 아직 나오지않아 이부분에 대해서는 1000달러 이상인 금액에만 나오도록 처리. 2. 에너지 라벨 관련에 대해서 이미지 assset/energyLabel 에 추가. 3. Config 파일에 energyPopup추가 4. Tpopup에 스타일 추가.
BIN
com.twin.app.shoptime/assets/images/energyLabel/energyDetail.png
Normal file
|
After Width: | Height: | Size: 94 KiB |
BIN
com.twin.app.shoptime/assets/images/energyLabel/labelgradeA.png
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
com.twin.app.shoptime/assets/images/energyLabel/labelgradeB.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
com.twin.app.shoptime/assets/images/energyLabel/labelgradeC.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
com.twin.app.shoptime/assets/images/energyLabel/labelgradeD.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
BIN
com.twin.app.shoptime/assets/images/energyLabel/labelgradeE.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
com.twin.app.shoptime/assets/images/energyLabel/labelgradeF.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
com.twin.app.shoptime/assets/images/energyLabel/labelgradeG.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
com.twin.app.shoptime/assets/images/energyLabel/qr.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
@@ -1,6 +1,8 @@
|
|||||||
@import "../../style/CommonStyle.module.less";
|
@import "../../style/CommonStyle.module.less";
|
||||||
@import "../../style/utils.module.less";
|
@import "../../style/utils.module.less";
|
||||||
|
|
||||||
|
// moved into scoped blocks
|
||||||
|
|
||||||
/* horizontal */
|
/* horizontal */
|
||||||
.horizontal {
|
.horizontal {
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -10,6 +12,14 @@
|
|||||||
border: solid 1px @COLOR_GRAY02;
|
border: solid 1px @COLOR_GRAY02;
|
||||||
background-color: @COLOR_WHITE;
|
background-color: @COLOR_WHITE;
|
||||||
|
|
||||||
|
.justForYouTag {
|
||||||
|
position: absolute;
|
||||||
|
width: 100px;
|
||||||
|
top: 40px;
|
||||||
|
right: 20px;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
.imageWrap {
|
.imageWrap {
|
||||||
position: relative;
|
position: relative;
|
||||||
.size(@w: 200px, @h: 200px);
|
.size(@w: 200px, @h: 200px);
|
||||||
@@ -117,6 +127,14 @@
|
|||||||
border: solid 1px @COLOR_GRAY02;
|
border: solid 1px @COLOR_GRAY02;
|
||||||
background-color: @COLOR_WHITE;
|
background-color: @COLOR_WHITE;
|
||||||
|
|
||||||
|
.justForYouTag {
|
||||||
|
position: absolute;
|
||||||
|
width: 100px;
|
||||||
|
top: 40px;
|
||||||
|
right: 20px;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
.imageWrap {
|
.imageWrap {
|
||||||
position: relative;
|
position: relative;
|
||||||
.size(@w: 288px, @h: 288px);
|
.size(@w: 288px, @h: 288px);
|
||||||
@@ -154,12 +172,46 @@
|
|||||||
font-size: 36px;
|
font-size: 36px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.flexBox {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
}
|
||||||
|
.labelImgBox {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-content: flex-end;
|
||||||
|
width: 60px;
|
||||||
|
gap: 3px;
|
||||||
|
> div {
|
||||||
|
position: relative;
|
||||||
|
z-index: 100;
|
||||||
|
&:focus {
|
||||||
|
&::after {
|
||||||
|
.focused(@boxShadow: 22px, @borderRadius: 2px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> img {
|
||||||
|
width: 60px;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
.descWrap {
|
.descWrap {
|
||||||
.flex(@direction: column, @alignCenter: flex-start);
|
.flex(@direction: column, @alignCenter: flex-start);
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
&.labelBox {
|
||||||
|
width: calc(100% - 60px);
|
||||||
|
> p {
|
||||||
|
font-size: 27px;
|
||||||
|
&.priceInfo {
|
||||||
|
> span {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
> div.title {
|
> div.title {
|
||||||
|
width: 100%;
|
||||||
height: 64px;
|
height: 64px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
line-height: 1.33;
|
line-height: 1.33;
|
||||||
@@ -315,8 +367,7 @@
|
|||||||
margin-top: 11px;
|
margin-top: 11px;
|
||||||
|
|
||||||
.size(@w: 508px, @h: 107px);
|
.size(@w: 508px, @h: 107px);
|
||||||
|
&.title {
|
||||||
.title {
|
|
||||||
margin-left: 15px;
|
margin-left: 15px;
|
||||||
.size(@w: 430px, @h: 100px);
|
.size(@w: 430px, @h: 100px);
|
||||||
.productNameTitle {
|
.productNameTitle {
|
||||||
@@ -414,4 +465,53 @@
|
|||||||
.size(@w: 108px, @h: 48px);
|
.size(@w: 108px, @h: 48px);
|
||||||
.position(@position: absolute, @top: 30px, @left: 30px);
|
.position(@position: absolute, @top: 30px, @left: 30px);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.justForYouTag {
|
||||||
|
position: absolute;
|
||||||
|
width: 100px;
|
||||||
|
top: 40px;
|
||||||
|
right: 20px;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.popupContainer {
|
||||||
|
.header {
|
||||||
|
.size(@w: 780px , @h: 102px);
|
||||||
|
.flex(@display: flex, @justifyCenter: center, @alignCenter: center, @direction: row);
|
||||||
|
background-color: #e7ebef;
|
||||||
|
|
||||||
|
> h3 {
|
||||||
|
font-size: 36px;
|
||||||
|
color: #222222;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.qrcodeContainer {
|
||||||
|
padding: 30px 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
.qrcode {
|
||||||
|
.size(@w: 360px , @h: 360px);
|
||||||
|
background-color: #ffffff;
|
||||||
|
border-radius: 12px;
|
||||||
|
box-shadow: 0 0 0 1px #dadada inset;
|
||||||
|
margin-bottom: 41px;
|
||||||
|
}
|
||||||
|
|
||||||
|
> h3 {
|
||||||
|
display: flex;
|
||||||
|
text-align: center;
|
||||||
|
word-break: break-word;
|
||||||
|
line-height: 1.27;
|
||||||
|
}
|
||||||
|
|
||||||
|
.popupBtn {
|
||||||
|
.size(@w: 300px , @h: 78px);
|
||||||
|
margin-top: 38px;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
473
com.twin.app.shoptime/src/components/TItemCard/TitemCard.new.jsx
Normal file
@@ -0,0 +1,473 @@
|
|||||||
|
import React, {
|
||||||
|
memo,
|
||||||
|
useCallback,
|
||||||
|
useEffect,
|
||||||
|
useMemo,
|
||||||
|
useState,
|
||||||
|
} from 'react';
|
||||||
|
|
||||||
|
import classNames from 'classnames';
|
||||||
|
import {
|
||||||
|
useDispatch,
|
||||||
|
useSelector,
|
||||||
|
} from 'react-redux';
|
||||||
|
|
||||||
|
import Spottable from '@enact/spotlight/Spottable';
|
||||||
|
|
||||||
|
import energyDetail from '../../../assets/images/energyLabel/energyDetail.png';
|
||||||
|
import energyLabelA from '../../../assets/images/energyLabel/labelgradeA.png';
|
||||||
|
import energyLabelB from '../../../assets/images/energyLabel/labelgradeB.png';
|
||||||
|
import energyLabelC from '../../../assets/images/energyLabel/labelgradeC.png';
|
||||||
|
import energyLabelD from '../../../assets/images/energyLabel/labelgradeD.png';
|
||||||
|
import energyLabelE from '../../../assets/images/energyLabel/labelgradeE.png';
|
||||||
|
import energyLabelF from '../../../assets/images/energyLabel/labelgradeF.png';
|
||||||
|
import energyLabelG from '../../../assets/images/energyLabel/labelgradeG.png';
|
||||||
|
//에너지 라벨
|
||||||
|
import qrImg from '../../../assets/images/energyLabel/qr.png';
|
||||||
|
import defaultLogoImg
|
||||||
|
from '../../../assets/images/ic-tab-partners-default@3x.png';
|
||||||
|
import defaultimgHorizontal
|
||||||
|
from '../../../assets/images/img-thumb-empty-hor@3x.png';
|
||||||
|
import defaultImageItem
|
||||||
|
from '../../../assets/images/img-thumb-empty-product@3x.png';
|
||||||
|
import defaultimgVertical
|
||||||
|
from '../../../assets/images/img-thumb-empty-ver@3x.png';
|
||||||
|
import IcLiveShow from '../../../assets/images/tag/tag-liveshow.png';
|
||||||
|
import {
|
||||||
|
setHidePopup,
|
||||||
|
setShowPopup,
|
||||||
|
} from '../../actions/commonActions';
|
||||||
|
import { sendLogTotalRecommend } from '../../actions/logActions';
|
||||||
|
import usePriceInfo from '../../hooks/usePriceInfo';
|
||||||
|
import * as Config from '../../utils/Config';
|
||||||
|
import {
|
||||||
|
$L,
|
||||||
|
getQRCodeUrl,
|
||||||
|
removeSpecificTags,
|
||||||
|
} from '../../utils/helperMethods';
|
||||||
|
import CustomImage from '../CustomImage/CustomImage';
|
||||||
|
import TPopUp from '../TPopUp/TPopUp';
|
||||||
|
import css from './TItemCard.module.less';
|
||||||
|
|
||||||
|
const SpottableComponent = Spottable("div");
|
||||||
|
const SpottableTemp = Spottable("div");
|
||||||
|
|
||||||
|
const TYPES = {
|
||||||
|
vertical: "vertical",
|
||||||
|
horizontal: "horizontal",
|
||||||
|
videoShow: "videoShow",
|
||||||
|
};
|
||||||
|
|
||||||
|
const IMAGETYPES = {
|
||||||
|
imgHorizontal: "imgHorizontal",
|
||||||
|
imgVertical: "imgVertical",
|
||||||
|
};
|
||||||
|
|
||||||
|
const STRING_CONF = {
|
||||||
|
SOLD_OUT: "SOLD OUT",
|
||||||
|
};
|
||||||
|
|
||||||
|
export const removeDotAndColon = (string) => {
|
||||||
|
return /[.:]/.test(string) ? string.replace(/[.:]/g, "") : string;
|
||||||
|
};
|
||||||
|
|
||||||
|
const parsePrice = (price) => {
|
||||||
|
return parseFloat(price?.replace(/[^0-9.-]+/g, "") || "0");
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(function TItemCardNew({
|
||||||
|
children,
|
||||||
|
className,
|
||||||
|
disabled,
|
||||||
|
imageAlt,
|
||||||
|
imageSource,
|
||||||
|
imgType = IMAGETYPES.imgHorizontal,
|
||||||
|
logo,
|
||||||
|
logoDisplay = false,
|
||||||
|
isBestSeller = false,
|
||||||
|
isLive = false,
|
||||||
|
onBlur,
|
||||||
|
onClick,
|
||||||
|
onFocus,
|
||||||
|
onError,
|
||||||
|
offerInfo,
|
||||||
|
priceInfo,
|
||||||
|
productId,
|
||||||
|
productName,
|
||||||
|
catNm,
|
||||||
|
rank,
|
||||||
|
soldoutFlag,
|
||||||
|
spotlightId,
|
||||||
|
nonPosition = false,
|
||||||
|
type = TYPES.vertical,
|
||||||
|
firstLabel,
|
||||||
|
label,
|
||||||
|
lastLabel,
|
||||||
|
contextName,
|
||||||
|
messageId,
|
||||||
|
order,
|
||||||
|
patnerName,
|
||||||
|
brandName,
|
||||||
|
shelfId,
|
||||||
|
shelfLocation,
|
||||||
|
shelfTitle,
|
||||||
|
contentTitle,
|
||||||
|
category,
|
||||||
|
curationId,
|
||||||
|
curationTitle,
|
||||||
|
nowProductId,
|
||||||
|
nowCategory,
|
||||||
|
nowProductTitle,
|
||||||
|
contentId,
|
||||||
|
...rest
|
||||||
|
}) {
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
const [defaultImage, setDefaultImage] = useState(null);
|
||||||
|
const [prdtId, setPrdtId] = useState(null);
|
||||||
|
const countryCode = useSelector((state) => state.common.httpHeader.cntry_cd);
|
||||||
|
const cursorVisible = useSelector(
|
||||||
|
(state) => state.common.appStatus.cursorVisible
|
||||||
|
);
|
||||||
|
const { activePopup, popupVisible } = useSelector(
|
||||||
|
(state) => state.common.popup
|
||||||
|
);
|
||||||
|
|
||||||
|
const serverHOST = useSelector((state) => state.common.appStatus.serverHOST);
|
||||||
|
const serverType = useSelector((state) => state.localSettings.serverType);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!imageSource) {
|
||||||
|
if (type === "videoShow") {
|
||||||
|
setDefaultImage(
|
||||||
|
imgType === IMAGETYPES.imgHorizontal
|
||||||
|
? defaultimgHorizontal
|
||||||
|
: defaultimgVertical
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
setDefaultImage(defaultImageItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [imageSource, type, imgType]);
|
||||||
|
|
||||||
|
const { originalPrice, discountedPrice, discountRate } =
|
||||||
|
usePriceInfo(priceInfo) || {};
|
||||||
|
|
||||||
|
const _onBlur = useCallback(() => {
|
||||||
|
if (onBlur) {
|
||||||
|
onBlur();
|
||||||
|
}
|
||||||
|
}, [onBlur]);
|
||||||
|
|
||||||
|
const _onClick = useCallback(
|
||||||
|
(e) => {
|
||||||
|
if (disabled) {
|
||||||
|
e.stopPropagation();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (onClick) {
|
||||||
|
onClick(e);
|
||||||
|
|
||||||
|
if (contextName && messageId) {
|
||||||
|
const params = {
|
||||||
|
contextName: contextName,
|
||||||
|
messageId: messageId,
|
||||||
|
shelfLocation: shelfLocation,
|
||||||
|
shelfId: shelfId,
|
||||||
|
shelfTitle: shelfTitle,
|
||||||
|
productId: productId,
|
||||||
|
productTitle: productName,
|
||||||
|
nowProductId: nowProductId,
|
||||||
|
nowCategory: nowCategory,
|
||||||
|
nowProductTitle: nowProductTitle,
|
||||||
|
partner: patnerName,
|
||||||
|
brand: brandName,
|
||||||
|
price: originalPrice,
|
||||||
|
discount: discountRate,
|
||||||
|
location: order,
|
||||||
|
category: category ? category : catNm,
|
||||||
|
contentTitle: contentTitle,
|
||||||
|
curationId: curationId,
|
||||||
|
curationTitle: curationTitle,
|
||||||
|
};
|
||||||
|
|
||||||
|
dispatch(sendLogTotalRecommend(params));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[
|
||||||
|
onClick,
|
||||||
|
disabled,
|
||||||
|
contextName,
|
||||||
|
messageId,
|
||||||
|
shelfLocation,
|
||||||
|
shelfId,
|
||||||
|
shelfTitle,
|
||||||
|
productId,
|
||||||
|
productName,
|
||||||
|
nowProductId,
|
||||||
|
nowCategory,
|
||||||
|
nowProductTitle,
|
||||||
|
patnerName,
|
||||||
|
brandName,
|
||||||
|
originalPrice,
|
||||||
|
discountRate,
|
||||||
|
order,
|
||||||
|
category,
|
||||||
|
catNm,
|
||||||
|
contentTitle,
|
||||||
|
curationId,
|
||||||
|
curationTitle,
|
||||||
|
dispatch,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
const _onFocus = useCallback(() => {
|
||||||
|
if (onFocus) {
|
||||||
|
onFocus();
|
||||||
|
}
|
||||||
|
}, [onFocus]);
|
||||||
|
|
||||||
|
const addDefaultImg = useCallback(
|
||||||
|
(e) => {
|
||||||
|
if (onError) {
|
||||||
|
onError(e);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[onError]
|
||||||
|
);
|
||||||
|
|
||||||
|
const ariaLabel = useMemo(() => {
|
||||||
|
const soldOutText = soldoutFlag === "Y" ? "Sold Out " : "";
|
||||||
|
const firstLabelText = firstLabel ? `${firstLabel} ` : "";
|
||||||
|
const discountLabel = discountRate ? `${discountRate} discount, ` : "";
|
||||||
|
const discountPriceLabel = discountRate
|
||||||
|
? `Sale price ${discountedPrice}, `
|
||||||
|
: "";
|
||||||
|
|
||||||
|
const parsedPrice = parsePrice(originalPrice);
|
||||||
|
const priceLabel =
|
||||||
|
parsedPrice === 0
|
||||||
|
? offerInfo
|
||||||
|
? ` ${offerInfo}`
|
||||||
|
: ""
|
||||||
|
: originalPrice
|
||||||
|
? ` Original price ${originalPrice}, `
|
||||||
|
: "";
|
||||||
|
|
||||||
|
const productLabel = label || "";
|
||||||
|
const lastLabelText = lastLabel || "";
|
||||||
|
|
||||||
|
return `${soldOutText}${firstLabelText}${discountLabel}${productName}${discountPriceLabel}${priceLabel}${productLabel}${lastLabelText}`;
|
||||||
|
}, [
|
||||||
|
soldoutFlag,
|
||||||
|
firstLabel,
|
||||||
|
discountRate,
|
||||||
|
productName,
|
||||||
|
discountedPrice,
|
||||||
|
originalPrice,
|
||||||
|
offerInfo,
|
||||||
|
label,
|
||||||
|
lastLabel,
|
||||||
|
]);
|
||||||
|
|
||||||
|
const productNameDangerousHTML = useMemo(() => {
|
||||||
|
const sanitizedString = removeSpecificTags(productName);
|
||||||
|
return sanitizedString;
|
||||||
|
}, [productName]);
|
||||||
|
|
||||||
|
const handleClosePopup = useCallback(() => {
|
||||||
|
dispatch(setHidePopup());
|
||||||
|
}, [dispatch]);
|
||||||
|
|
||||||
|
const { setupPinUrl } = useMemo(() => {
|
||||||
|
return getQRCodeUrl({ serverHOST, serverType });
|
||||||
|
}, [serverHOST, serverType]);
|
||||||
|
|
||||||
|
const onEnergyClick = useCallback(
|
||||||
|
(e, pId) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
setPrdtId(pId);
|
||||||
|
dispatch(setShowPopup(Config.ACTIVE_POPUP.energyPopup));
|
||||||
|
},
|
||||||
|
[dispatch]
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<SpottableComponent
|
||||||
|
className={classNames(
|
||||||
|
css[type],
|
||||||
|
nonPosition && css.nonPosition,
|
||||||
|
type === "videoShow" && css[imgType],
|
||||||
|
className && className
|
||||||
|
)}
|
||||||
|
onBlur={_onBlur}
|
||||||
|
onClick={_onClick}
|
||||||
|
onFocus={_onFocus}
|
||||||
|
spotlightId={
|
||||||
|
spotlightId ?? "spotlightId-" + removeDotAndColon(productId)
|
||||||
|
}
|
||||||
|
aria-label={ariaLabel}
|
||||||
|
role="button"
|
||||||
|
{...rest}
|
||||||
|
>
|
||||||
|
<div className={css.imageWrap}>
|
||||||
|
<CustomImage
|
||||||
|
alt={imageAlt}
|
||||||
|
delay={0}
|
||||||
|
src={imageSource}
|
||||||
|
fallbackSrc={
|
||||||
|
type === "videoShow"
|
||||||
|
? imgType === IMAGETYPES.imgHorizontal
|
||||||
|
? defaultimgHorizontal
|
||||||
|
: defaultimgVertical
|
||||||
|
: defaultImageItem
|
||||||
|
}
|
||||||
|
onError={addDefaultImg}
|
||||||
|
/>
|
||||||
|
{priceInfo &&
|
||||||
|
discountRate &&
|
||||||
|
Number(discountRate.replace("%", "")) > 4 && (
|
||||||
|
<span className={css.discount}>{discountRate}</span>
|
||||||
|
)}
|
||||||
|
{soldoutFlag && soldoutFlag === "Y" && (
|
||||||
|
<div
|
||||||
|
className={classNames(
|
||||||
|
css.soldout,
|
||||||
|
countryCode === "DE" && css.de
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{$L(STRING_CONF.SOLD_OUT)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{isLive && (
|
||||||
|
<img className={css.liveTag} src={IcLiveShow} alt="Live Show" />
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div className={css.flexBox}>
|
||||||
|
<div
|
||||||
|
className={classNames(
|
||||||
|
css.descWrap,
|
||||||
|
catNm && css.hstNmWrap,
|
||||||
|
originalPrice &&
|
||||||
|
parseFloat(originalPrice.replace("$", "").replace(",", "")) >
|
||||||
|
1000
|
||||||
|
? css.labelBox
|
||||||
|
: ""
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{logoDisplay && logo && (
|
||||||
|
<div className={css.logo}>
|
||||||
|
<CustomImage src={logo} fallbackSrc={defaultLogoImg} />
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<div className={css.title}>
|
||||||
|
<h3
|
||||||
|
className={css.productNameTitle}
|
||||||
|
dangerouslySetInnerHTML={{ __html: productNameDangerousHTML }}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{children}
|
||||||
|
{priceInfo ? (
|
||||||
|
<p className={css.priceInfo}>
|
||||||
|
{parseFloat(originalPrice?.replace(/[^0-9.-]+/g, "") || "0") ===
|
||||||
|
0 ? (
|
||||||
|
<strong>{offerInfo}</strong>
|
||||||
|
) : discountRate ? (
|
||||||
|
discountedPrice
|
||||||
|
) : (
|
||||||
|
originalPrice
|
||||||
|
)}
|
||||||
|
{discountRate && (
|
||||||
|
<span className={css.originalPrice}>{originalPrice}</span>
|
||||||
|
)}
|
||||||
|
</p>
|
||||||
|
) : (
|
||||||
|
<p className={css.offerInfo}>{offerInfo}</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
{originalPrice &&
|
||||||
|
parseFloat(Number(originalPrice.replace("$", "").replace(",", ""))) >
|
||||||
|
1000 ? (
|
||||||
|
<div className={css.labelImgBox}>
|
||||||
|
<SpottableTemp
|
||||||
|
spotlightDisabled={Boolean(!cursorVisible)}
|
||||||
|
onClick={(e) => onEnergyClick(e, productId)}
|
||||||
|
>
|
||||||
|
<CustomImage
|
||||||
|
alt="Energy Label A"
|
||||||
|
delay={0}
|
||||||
|
src={energyLabelA}
|
||||||
|
/>
|
||||||
|
</SpottableTemp>
|
||||||
|
<SpottableTemp
|
||||||
|
spotlightDisabled={Boolean(!cursorVisible)}
|
||||||
|
onClick={(e) => onEnergyClick(e, productId)}
|
||||||
|
>
|
||||||
|
<CustomImage
|
||||||
|
alt="Energy Label B"
|
||||||
|
delay={0}
|
||||||
|
src={energyLabelB}
|
||||||
|
/>
|
||||||
|
</SpottableTemp>
|
||||||
|
<SpottableTemp
|
||||||
|
spotlightDisabled={Boolean(!cursorVisible)}
|
||||||
|
onClick={(e) => onEnergyClick(e, productId)}
|
||||||
|
>
|
||||||
|
<CustomImage
|
||||||
|
alt="Energy Label C"
|
||||||
|
delay={0}
|
||||||
|
src={energyLabelC}
|
||||||
|
/>
|
||||||
|
</SpottableTemp>
|
||||||
|
</div>
|
||||||
|
) : null}
|
||||||
|
</div>
|
||||||
|
{isBestSeller && rank && (
|
||||||
|
<div className={css.bestSeller}>
|
||||||
|
<span>{rank}</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</SpottableComponent>
|
||||||
|
{activePopup === Config.ACTIVE_POPUP.energyPopup &&
|
||||||
|
prdtId === productId && (
|
||||||
|
<TPopUp
|
||||||
|
kind="energyPopup"
|
||||||
|
title="Energy Efficiency"
|
||||||
|
hasText
|
||||||
|
open={popupVisible}
|
||||||
|
hasButton
|
||||||
|
button1Text={$L("CLOSE")}
|
||||||
|
onClose={handleClosePopup}
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<span>
|
||||||
|
<CustomImage
|
||||||
|
alt="Energy Label C"
|
||||||
|
delay={0}
|
||||||
|
src={energyDetail}
|
||||||
|
/>
|
||||||
|
<div>
|
||||||
|
<CustomImage alt="Energy Label C" delay={0} src={qrImg} />
|
||||||
|
</div>
|
||||||
|
</span>
|
||||||
|
{/* <span>
|
||||||
|
<CustomImage
|
||||||
|
alt="Energy Label C"
|
||||||
|
delay={0}
|
||||||
|
src={energyDetail}
|
||||||
|
/>
|
||||||
|
<div>
|
||||||
|
<CustomImage alt="Energy Label C" delay={0} src={qrImg} />
|
||||||
|
</div>
|
||||||
|
</span> */}
|
||||||
|
</div>
|
||||||
|
</TPopUp>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
export { IMAGETYPES, TYPES };
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
// kind
|
// kind
|
||||||
|
|
||||||
.introTermsPopup {
|
.introTermsPopup {
|
||||||
.default-style();
|
.default-style();
|
||||||
|
|
||||||
.info {
|
.info {
|
||||||
.size(@w: 1100px , @h: 564px);
|
.size(@w: 1100px , @h: 564px);
|
||||||
@@ -767,7 +767,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
padding: 60px 57px 40px;
|
padding: 60px 57px 40px;
|
||||||
|
|
||||||
@@ -812,3 +812,59 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.energyPopup {
|
||||||
|
.default-style(@width: 960px);
|
||||||
|
.info {
|
||||||
|
background-color: #fff;
|
||||||
|
.textLayer {
|
||||||
|
.title {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> div {
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
> span {
|
||||||
|
display: inline-flex;
|
||||||
|
padding: 30px 0px;
|
||||||
|
width: 412px;
|
||||||
|
height: 434px;
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 30px;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
margin-right: 10px;
|
||||||
|
background-color: #f3f3f3;
|
||||||
|
justify-content: center;
|
||||||
|
> img {
|
||||||
|
width: 185px;
|
||||||
|
}
|
||||||
|
> div {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
> img {
|
||||||
|
justify-items: baseline;
|
||||||
|
width: 135px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
padding: 0 60px;
|
||||||
|
min-height: 180px;
|
||||||
|
margin: 30px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttonContainer {
|
||||||
|
margin: 0 0 30px 0;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
> div {
|
||||||
|
min-width: 240px;
|
||||||
|
height: 78px;
|
||||||
|
margin: 0 6px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { $L } from "./helperMethods";
|
import { $L } from './helperMethods';
|
||||||
|
|
||||||
export const SUPPORT_COUNTRIES = { US: "en", DE: "de", UK: "uk", RU: "ru" };
|
export const SUPPORT_COUNTRIES = { US: "en", DE: "de", UK: "uk", RU: "ru" };
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ export const panel_names = {
|
|||||||
// debug
|
// debug
|
||||||
DEBUG_PANEL: "debugpanel",
|
DEBUG_PANEL: "debugpanel",
|
||||||
VIDEO_TEST_PANEL: "videotestpanel",
|
VIDEO_TEST_PANEL: "videotestpanel",
|
||||||
|
|
||||||
// user review
|
// user review
|
||||||
USER_REVIEW_PANEL: "userreviewpanel",
|
USER_REVIEW_PANEL: "userreviewpanel",
|
||||||
};
|
};
|
||||||
@@ -94,6 +94,7 @@ export const ACTIVE_POPUP = {
|
|||||||
introTermsPopup: "introTermsPopup",
|
introTermsPopup: "introTermsPopup",
|
||||||
toast: "toast",
|
toast: "toast",
|
||||||
optionalConfirm: "optionalConfirm",
|
optionalConfirm: "optionalConfirm",
|
||||||
|
energyPopup: "energyPopup",
|
||||||
};
|
};
|
||||||
export const DEBUG_VIDEO_SUBTITLE_TEST = false;
|
export const DEBUG_VIDEO_SUBTITLE_TEST = false;
|
||||||
export const AUTO_SCROLL_DELAY = 600;
|
export const AUTO_SCROLL_DELAY = 600;
|
||||||
|
|||||||
@@ -1,28 +1,38 @@
|
|||||||
import React, { memo, useCallback, useEffect, useState } from "react";
|
import React, {
|
||||||
|
memo,
|
||||||
|
useCallback,
|
||||||
|
useEffect,
|
||||||
|
useState,
|
||||||
|
} from 'react';
|
||||||
|
|
||||||
import { useDispatch, useSelector } from "react-redux";
|
import {
|
||||||
|
useDispatch,
|
||||||
|
useSelector,
|
||||||
|
} from 'react-redux';
|
||||||
|
|
||||||
import { SpotlightContainerDecorator } from "@enact/spotlight/SpotlightContainerDecorator";
|
import {
|
||||||
import Spottable from "@enact/spotlight/Spottable";
|
SpotlightContainerDecorator,
|
||||||
import { setContainerLastFocusedElement } from "@enact/spotlight/src/container";
|
} from '@enact/spotlight/SpotlightContainerDecorator';
|
||||||
|
import Spottable from '@enact/spotlight/Spottable';
|
||||||
|
import { setContainerLastFocusedElement } from '@enact/spotlight/src/container';
|
||||||
|
|
||||||
import { sendLogCuration } from "../../../actions/logActions";
|
import { sendLogCuration } from '../../../actions/logActions';
|
||||||
import { getSubCategory } from "../../../actions/mainActions";
|
import { getSubCategory } from '../../../actions/mainActions';
|
||||||
import { pushPanel } from "../../../actions/panelActions";
|
import { pushPanel } from '../../../actions/panelActions';
|
||||||
import TItemCard from "../../../components/TItemCard/TItemCard";
|
import TItemCardNew from '../../../components/TItemCard/TitemCard.new';
|
||||||
import TScroller from "../../../components/TScroller/TScroller";
|
import TScroller from '../../../components/TScroller/TScroller';
|
||||||
import usePrevious from "../../../hooks/usePrevious";
|
import usePrevious from '../../../hooks/usePrevious';
|
||||||
import useScrollReset from "../../../hooks/useScrollReset";
|
import useScrollReset from '../../../hooks/useScrollReset';
|
||||||
import useScrollTo from "../../../hooks/useScrollTo";
|
import useScrollTo from '../../../hooks/useScrollTo';
|
||||||
import {
|
import {
|
||||||
LOG_CONTEXT_NAME,
|
LOG_CONTEXT_NAME,
|
||||||
LOG_MESSAGE_ID,
|
LOG_MESSAGE_ID,
|
||||||
LOG_TP_NO,
|
LOG_TP_NO,
|
||||||
panel_names,
|
panel_names,
|
||||||
} from "../../../utils/Config";
|
} from '../../../utils/Config';
|
||||||
import { SpotlightIds } from "../../../utils/SpotlightIds";
|
import { SpotlightIds } from '../../../utils/SpotlightIds';
|
||||||
import CategoryNav from "../../HomePanel/SubCategory/CategoryNav/CategoryNav";
|
import CategoryNav from '../../HomePanel/SubCategory/CategoryNav/CategoryNav';
|
||||||
import css from "../../HomePanel/SubCategory/SubCategory.module.less";
|
import css from '../../HomePanel/SubCategory/SubCategory.module.less';
|
||||||
|
|
||||||
const SpottableComponent = Spottable("div");
|
const SpottableComponent = Spottable("div");
|
||||||
const Container = SpotlightContainerDecorator({ enterTo: null }, "div");
|
const Container = SpotlightContainerDecorator({ enterTo: null }, "div");
|
||||||
@@ -207,7 +217,7 @@ export default memo(function SubCategory({
|
|||||||
handleShelfFocus();
|
handleShelfFocus();
|
||||||
}
|
}
|
||||||
}, [handleShelfFocus]);
|
}, [handleShelfFocus]);
|
||||||
|
console.log("###test pjh");
|
||||||
return (
|
return (
|
||||||
<Container
|
<Container
|
||||||
spotlightId={spotlightId}
|
spotlightId={spotlightId}
|
||||||
@@ -247,7 +257,7 @@ export default memo(function SubCategory({
|
|||||||
itemIndex
|
itemIndex
|
||||||
) => {
|
) => {
|
||||||
return (
|
return (
|
||||||
<TItemCard
|
<TItemCardNew
|
||||||
key={"subItem" + itemIndex}
|
key={"subItem" + itemIndex}
|
||||||
contextName={LOG_CONTEXT_NAME.HOME}
|
contextName={LOG_CONTEXT_NAME.HOME}
|
||||||
messageId={LOG_MESSAGE_ID.SHELF_CLICK}
|
messageId={LOG_MESSAGE_ID.SHELF_CLICK}
|
||||||
|
|||||||