[theme]#1
- 테마 아이템 포커스 관련 처리. - 테마 4방향키 클릭시 두번 열리는부분 처리 - 모바일 샌드 팝업 기록 노출부분 수정 - 모바일 샌드 팝업 기록 4개까지만 디자인에 맞춰 노출되도록 수정.
This commit is contained in:
@@ -1,10 +1,12 @@
|
|||||||
import React, { useCallback } from "react";
|
import React, { useCallback } from 'react';
|
||||||
|
|
||||||
import { SpotlightContainerDecorator } from "@enact/spotlight/SpotlightContainerDecorator";
|
import {
|
||||||
import { Spottable } from "@enact/spotlight/Spottable";
|
SpotlightContainerDecorator,
|
||||||
|
} from '@enact/spotlight/SpotlightContainerDecorator';
|
||||||
|
import { Spottable } from '@enact/spotlight/Spottable';
|
||||||
|
|
||||||
import TButton from "../../TButton/TButton";
|
import TButton from '../../TButton/TButton';
|
||||||
import css from "./HistoryPhoneNumber.module.less";
|
import css from './HistoryPhoneNumber.module.less';
|
||||||
|
|
||||||
const SpottableComponent = Spottable("div");
|
const SpottableComponent = Spottable("div");
|
||||||
|
|
||||||
@@ -39,26 +41,28 @@ export default function HistoryPhoneNumber({
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{recentSentNumber &&
|
{recentSentNumber &&
|
||||||
recentSentNumber.filter((number) => number !== "")?.length > 0 &&
|
recentSentNumber
|
||||||
recentSentNumber.map((number, index) => {
|
.filter((number) => number !== "")
|
||||||
return (
|
.slice(0, 4)
|
||||||
<Container
|
.map((number, index) => {
|
||||||
className={css.container}
|
return (
|
||||||
key={"history-phone-number-" + index}
|
<Container
|
||||||
>
|
className={css.container}
|
||||||
<SpottableComponent
|
key={"history-phone-number-" + index}
|
||||||
onClick={handleClickNumber(number)}
|
|
||||||
className={css.phoneNumberList}
|
|
||||||
>
|
>
|
||||||
{number}
|
<SpottableComponent
|
||||||
</SpottableComponent>
|
onClick={handleClickNumber(number)}
|
||||||
<TButton
|
className={css.phoneNumberList}
|
||||||
className={css.deleteButton}
|
>
|
||||||
onClick={handleClickDelete(index)}
|
{number}
|
||||||
/>
|
</SpottableComponent>
|
||||||
</Container>
|
<TButton
|
||||||
);
|
className={css.deleteButton}
|
||||||
})}
|
onClick={handleClickDelete(index)}
|
||||||
|
/>
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
})}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,8 @@
|
|||||||
@import "../../../style/utils.module.less";
|
@import "../../../style/utils.module.less";
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
width: 492px;
|
margin-top:10px;
|
||||||
|
width: 100%;
|
||||||
height: 68px;
|
height: 68px;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|||||||
@@ -652,8 +652,7 @@ export default function MobileSendPopUp({
|
|||||||
)}
|
)}
|
||||||
<span>{mobileNumber}</span>
|
<span>{mobileNumber}</span>
|
||||||
</SpottableComponent>
|
</SpottableComponent>
|
||||||
</InputContainer>
|
</InputContainer>
|
||||||
<div className={css.errTxt}></div>
|
|
||||||
<Container className={css.flex}>
|
<Container className={css.flex}>
|
||||||
{keyPadOff && recentSentNumber.length > 0 ? (
|
{keyPadOff && recentSentNumber.length > 0 ? (
|
||||||
<HistoryPhoneNumber
|
<HistoryPhoneNumber
|
||||||
|
|||||||
@@ -178,6 +178,7 @@
|
|||||||
.flex {
|
.flex {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
flex-wrap:wrap;
|
||||||
}
|
}
|
||||||
.instruction {
|
.instruction {
|
||||||
width: 492.5px; // 고정 너비
|
width: 492.5px; // 고정 너비
|
||||||
|
|||||||
@@ -1,7 +1,14 @@
|
|||||||
import React, { useEffect, useRef, useState } from 'react';
|
import React, {
|
||||||
|
useEffect,
|
||||||
|
useRef,
|
||||||
|
useState,
|
||||||
|
} from 'react';
|
||||||
|
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { useDispatch, useSelector } from 'react-redux';
|
import {
|
||||||
|
useDispatch,
|
||||||
|
useSelector,
|
||||||
|
} from 'react-redux';
|
||||||
|
|
||||||
import Spotlight from '@enact/spotlight';
|
import Spotlight from '@enact/spotlight';
|
||||||
import Spottable from '@enact/spotlight/Spottable';
|
import Spottable from '@enact/spotlight/Spottable';
|
||||||
@@ -70,6 +77,7 @@ export default function TToastEnhanced({
|
|||||||
if (type === 'themeContents') {
|
if (type === 'themeContents') {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
Spotlight.focus('theme-contents-close-button');
|
Spotlight.focus('theme-contents-close-button');
|
||||||
|
Spotlight.focus('theme-toast-item-0');
|
||||||
}, 100);
|
}, 100);
|
||||||
}
|
}
|
||||||
}, 50);
|
}, 50);
|
||||||
|
|||||||
@@ -1,38 +1,61 @@
|
|||||||
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
import React, {
|
||||||
|
useCallback,
|
||||||
|
useEffect,
|
||||||
|
useMemo,
|
||||||
|
useRef,
|
||||||
|
useState,
|
||||||
|
} from 'react';
|
||||||
|
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
// import { throttle } from 'lodash';
|
// import { throttle } from 'lodash';
|
||||||
import { PropTypes } from 'prop-types';
|
import { PropTypes } from 'prop-types';
|
||||||
import { useDispatch, useSelector } from 'react-redux';
|
import {
|
||||||
|
useDispatch,
|
||||||
|
useSelector,
|
||||||
|
} from 'react-redux';
|
||||||
|
|
||||||
import Spotlight from '@enact/spotlight';
|
import Spotlight from '@enact/spotlight';
|
||||||
/* eslint-disable react/jsx-no-bind */
|
/* eslint-disable react/jsx-no-bind */
|
||||||
// src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx
|
// src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx
|
||||||
import SpotlightContainerDecorator from '@enact/spotlight/SpotlightContainerDecorator';
|
import SpotlightContainerDecorator
|
||||||
|
from '@enact/spotlight/SpotlightContainerDecorator';
|
||||||
import Spottable from '@enact/spotlight/Spottable';
|
import Spottable from '@enact/spotlight/Spottable';
|
||||||
|
|
||||||
import couponImg from '../../../../assets/images/icons/coupon.png';
|
import couponImg from '../../../../assets/images/icons/coupon.png';
|
||||||
|
import arrowDownIcon from '../../../../assets/images/icons/ic-arrow-down.svg';
|
||||||
// import Spottable from '@enact/spotlight/Spottable';
|
// import Spottable from '@enact/spotlight/Spottable';
|
||||||
//image
|
//image
|
||||||
import arrowDown from '../../../../assets/images/icons/ic_arrow_down_3x_new.png';
|
import arrowDown
|
||||||
import arrowDownIcon from '../../../../assets/images/icons/ic-arrow-down.svg';
|
from '../../../../assets/images/icons/ic_arrow_down_3x_new.png';
|
||||||
import indicatorDefaultImage from '../../../../assets/images/img-thumb-empty-144@3x.png';
|
import indicatorDefaultImage
|
||||||
import { setHidePopup, setShowPopup } from '../../../actions/commonActions.js';
|
from '../../../../assets/images/img-thumb-empty-144@3x.png';
|
||||||
|
import {
|
||||||
|
setHidePopup,
|
||||||
|
setShowPopup,
|
||||||
|
} from '../../../actions/commonActions.js';
|
||||||
import {
|
import {
|
||||||
getProductCouponDownload,
|
getProductCouponDownload,
|
||||||
getProductCouponSearch,
|
getProductCouponSearch,
|
||||||
getProductCouponTotDownload,
|
getProductCouponTotDownload,
|
||||||
} from '../../../actions/couponActions.js';
|
} from '../../../actions/couponActions.js';
|
||||||
// import { pushPanel } from '../../../actions/panelActions';
|
// import { pushPanel } from '../../../actions/panelActions';
|
||||||
import { minimizeModalMedia, restoreModalMedia } from '../../../actions/mediaActions';
|
import {
|
||||||
|
minimizeModalMedia,
|
||||||
|
restoreModalMedia,
|
||||||
|
} from '../../../actions/mediaActions';
|
||||||
import { pauseFullscreenVideo } from '../../../actions/playActions';
|
import { pauseFullscreenVideo } from '../../../actions/playActions';
|
||||||
import { resetShowAllReviews } from '../../../actions/productActions';
|
import { resetShowAllReviews } from '../../../actions/productActions';
|
||||||
import { clearAllToasts, removeToast, showToast } from '../../../actions/toastActions';
|
import {
|
||||||
|
clearAllToasts,
|
||||||
|
removeToast,
|
||||||
|
showToast,
|
||||||
|
} from '../../../actions/toastActions';
|
||||||
import CustomImage from '../../../components/CustomImage/CustomImage.jsx';
|
import CustomImage from '../../../components/CustomImage/CustomImage.jsx';
|
||||||
// ProductInfoSection imports
|
// ProductInfoSection imports
|
||||||
import TButton from '../../../components/TButton/TButton';
|
import TButton from '../../../components/TButton/TButton';
|
||||||
import TPopUp from '../../../components/TPopUp/TPopUp.jsx';
|
import TPopUp from '../../../components/TPopUp/TPopUp.jsx';
|
||||||
import TVirtualGridList from '../../../components/TVirtualGridList/TVirtualGridList.jsx';
|
import TVirtualGridList
|
||||||
|
from '../../../components/TVirtualGridList/TVirtualGridList.jsx';
|
||||||
import useReviews from '../../../hooks/useReviews/useReviews';
|
import useReviews from '../../../hooks/useReviews/useReviews';
|
||||||
import useScrollTo from '../../../hooks/useScrollTo';
|
import useScrollTo from '../../../hooks/useScrollTo';
|
||||||
import { BUYNOW_CONFIG } from '../../../utils/BuyNowConfig';
|
import { BUYNOW_CONFIG } from '../../../utils/BuyNowConfig';
|
||||||
@@ -64,13 +87,19 @@ import StarRating from '../components/StarRating';
|
|||||||
// ProductContentSection imports
|
// ProductContentSection imports
|
||||||
import TScrollerDetail from '../components/TScroller/TScrollerDetail';
|
import TScrollerDetail from '../components/TScroller/TScrollerDetail';
|
||||||
import DetailPanelSkeleton from '../DetailPanelSkeleton/DetailPanelSkeleton';
|
import DetailPanelSkeleton from '../DetailPanelSkeleton/DetailPanelSkeleton';
|
||||||
import ProductDescription from '../ProductContentSection/ProductDescription/ProductDescription';
|
import ProductDescription
|
||||||
import ProductDetail from '../ProductContentSection/ProductDetail/ProductDetail.new';
|
from '../ProductContentSection/ProductDescription/ProductDescription';
|
||||||
import { ProductVideoV2 } from '../ProductContentSection/ProductVideo/ProductVideo.v2.jsx';
|
import ProductDetail
|
||||||
import ProductVideo from '../ProductContentSection/ProductVideo/ProductVideo.v3';
|
from '../ProductContentSection/ProductDetail/ProductDetail.new';
|
||||||
|
import {
|
||||||
|
ProductVideoV2,
|
||||||
|
} from '../ProductContentSection/ProductVideo/ProductVideo.v2.jsx';
|
||||||
|
import ProductVideo
|
||||||
|
from '../ProductContentSection/ProductVideo/ProductVideo.v3';
|
||||||
import UserReviews from '../ProductContentSection/UserReviews/UserReviews';
|
import UserReviews from '../ProductContentSection/UserReviews/UserReviews';
|
||||||
// import ViewAllReviewsButton from '../ProductContentSection/UserReviews/ViewAllReviewsButton';
|
// import ViewAllReviewsButton from '../ProductContentSection/UserReviews/ViewAllReviewsButton';
|
||||||
import YouMayAlsoLike from '../ProductContentSection/YouMayAlsoLike/YouMayAlsoLike';
|
import YouMayAlsoLike
|
||||||
|
from '../ProductContentSection/YouMayAlsoLike/YouMayAlsoLike';
|
||||||
import QRCode from '../ProductInfoSection/QRCode/QRCode';
|
import QRCode from '../ProductInfoSection/QRCode/QRCode';
|
||||||
import ProductOverview from '../ProductOverview/ProductOverview';
|
import ProductOverview from '../ProductOverview/ProductOverview';
|
||||||
// CSS imports
|
// CSS imports
|
||||||
@@ -923,7 +952,8 @@ export default function ProductAllSection({
|
|||||||
[]
|
[]
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleThemeItemButtonClick = useCallback(() => {
|
const handleThemeItemButtonClick = useCallback((e) => {
|
||||||
|
e.stopPropagation();
|
||||||
dispatch(
|
dispatch(
|
||||||
showToast({
|
showToast({
|
||||||
id: 'theme-contents-toast',
|
id: 'theme-contents-toast',
|
||||||
@@ -942,13 +972,13 @@ export default function ProductAllSection({
|
|||||||
panelInfo,
|
panelInfo,
|
||||||
direction: 'horizontal',
|
direction: 'horizontal',
|
||||||
version: 2,
|
version: 2,
|
||||||
onToastClose: () => {
|
// onToastClose: () => {
|
||||||
setTimeout(() => {
|
// setTimeout(() => {
|
||||||
Spotlight.focus('theme-open-button');
|
// Spotlight.focus('theme-open-button');
|
||||||
}, 100);
|
// }, 100);
|
||||||
},
|
// },
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}, [dispatch, themeProducts, setSelectedIndex, panelInfo]);
|
}, [dispatch, themeProducts, setSelectedIndex, panelInfo]);
|
||||||
|
|
||||||
const handleProductDetailsClick = useCallback(() => {
|
const handleProductDetailsClick = useCallback(() => {
|
||||||
|
|||||||
@@ -158,6 +158,9 @@ export default function ThemeContents({
|
|||||||
if (onThemeItemClose) {
|
if (onThemeItemClose) {
|
||||||
onThemeItemClose();
|
onThemeItemClose();
|
||||||
}
|
}
|
||||||
|
setTimeout(()=>{
|
||||||
|
Spotlight.focus("theme-open-button")
|
||||||
|
},100)
|
||||||
}, [onThemeItemClose]);
|
}, [onThemeItemClose]);
|
||||||
|
|
||||||
const renderItem = useCallback(
|
const renderItem = useCallback(
|
||||||
@@ -206,6 +209,7 @@ export default function ThemeContents({
|
|||||||
blockTimeoutRef.current = setTimeout(() => {
|
blockTimeoutRef.current = setTimeout(() => {
|
||||||
isClickBlocked.current = false;
|
isClickBlocked.current = false;
|
||||||
blockTimeoutRef.current = null;
|
blockTimeoutRef.current = null;
|
||||||
|
Spotlight.focus("product-img-0");
|
||||||
}, 600);
|
}, 600);
|
||||||
|
|
||||||
if (!prdtId) return;
|
if (!prdtId) return;
|
||||||
@@ -262,9 +266,12 @@ export default function ThemeContents({
|
|||||||
// 토스트가 열리면 THEME ITEM 버튼에 포커스되도록 보정
|
// 토스트가 열리면 THEME ITEM 버튼에 포커스되도록 보정
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// 약간의 지연을 주어 컴포넌트가 렌더링된 후 포커스 이동
|
// 약간의 지연을 주어 컴포넌트가 렌더링된 후 포커스 이동
|
||||||
setTimeout(() => {
|
const timeOut = setTimeout(() => {
|
||||||
Spotlight.focus('theme-contents-close-button');
|
Spotlight.focus('theme-items-container');
|
||||||
}, 100);
|
}, 100);
|
||||||
|
return (()=>{
|
||||||
|
clearTimeout(timeOut);
|
||||||
|
})
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
// 키 이동 보정: 위/아래/좌우 이동 설정
|
// 키 이동 보정: 위/아래/좌우 이동 설정
|
||||||
|
|||||||
Reference in New Issue
Block a user