SHOPTIME-1933 [Shoptime 고도화] TV 앱 테스트 (시스템 운영팀) / [SHOPTIME-3323] SBM / 빈 전화번호 히스토리 발생
1. MobileSendPopup.jsx 2. HistoryPhoneNumber.jsx - 원인: 재현 경로 알 수 없음 - 대책: 방어 logic 추가 (rendering 조건 수정, 히스토리 배열 filtering)
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import React, { useEffect } from "react";
|
import React, { useCallback } from "react";
|
||||||
|
|
||||||
import { SpotlightContainerDecorator } from "@enact/spotlight/SpotlightContainerDecorator";
|
import { SpotlightContainerDecorator } from "@enact/spotlight/SpotlightContainerDecorator";
|
||||||
import { Spottable } from "@enact/spotlight/Spottable";
|
import { Spottable } from "@enact/spotlight/Spottable";
|
||||||
@@ -15,17 +15,31 @@ const Container = SpotlightContainerDecorator(
|
|||||||
|
|
||||||
export default function HistoryPhoneNumber({
|
export default function HistoryPhoneNumber({
|
||||||
handleClickSelect,
|
handleClickSelect,
|
||||||
recentSentNumber,
|
|
||||||
handleDelete,
|
handleDelete,
|
||||||
|
recentSentNumber,
|
||||||
}) {
|
}) {
|
||||||
const handleClickNumber = (number) => {
|
const handleClickNumber = useCallback(
|
||||||
handleClickSelect(number);
|
(number) => () => {
|
||||||
};
|
if (handleClickSelect) {
|
||||||
|
handleClickSelect(number);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[handleClickSelect]
|
||||||
|
);
|
||||||
|
|
||||||
|
const handleClickDelete = useCallback(
|
||||||
|
(index) => () => {
|
||||||
|
if (handleDelete) {
|
||||||
|
handleDelete(index);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[handleDelete]
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{recentSentNumber &&
|
{recentSentNumber &&
|
||||||
recentSentNumber.length > 0 &&
|
recentSentNumber.filter((number) => number !== "")?.length > 0 &&
|
||||||
recentSentNumber.map((number, index) => {
|
recentSentNumber.map((number, index) => {
|
||||||
return (
|
return (
|
||||||
<Container
|
<Container
|
||||||
@@ -33,18 +47,14 @@ export default function HistoryPhoneNumber({
|
|||||||
key={"history-phone-number-" + index}
|
key={"history-phone-number-" + index}
|
||||||
>
|
>
|
||||||
<SpottableComponent
|
<SpottableComponent
|
||||||
onClick={() => {
|
onClick={handleClickNumber(number)}
|
||||||
handleClickNumber(number);
|
|
||||||
}}
|
|
||||||
className={css.phoneNumberList}
|
className={css.phoneNumberList}
|
||||||
>
|
>
|
||||||
{number}
|
{number}
|
||||||
</SpottableComponent>
|
</SpottableComponent>
|
||||||
<TButton
|
<TButton
|
||||||
className={css.deleteButton}
|
className={css.deleteButton}
|
||||||
onClick={() => {
|
onClick={handleClickDelete(index)}
|
||||||
handleDelete(index);
|
|
||||||
}}
|
|
||||||
/>
|
/>
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -86,11 +86,8 @@ export default function MobileSendPopUp({
|
|||||||
shopByMobileLogRef,
|
shopByMobileLogRef,
|
||||||
spotlightId,
|
spotlightId,
|
||||||
}) {
|
}) {
|
||||||
|
const dispatch = useDispatch();
|
||||||
const deviceInfo = useSelector((state) => state.device.deviceInfo);
|
const deviceInfo = useSelector((state) => state.device.deviceInfo);
|
||||||
const [mobileNumber, setMobileNumber] = useState("");
|
|
||||||
const [recentSentNumber, setRecentSentNumber] = useState([]);
|
|
||||||
const [keyPadOff, setKeyPadOff] = useState(false);
|
|
||||||
const [smsRetCode, setSmsRetCode] = useState(undefined);
|
|
||||||
const { httpHeader } = useSelector((state) => state.common);
|
const { httpHeader } = useSelector((state) => state.common);
|
||||||
const regDeviceInfoRetCode = useSelector(
|
const regDeviceInfoRetCode = useSelector(
|
||||||
(state) => state.device?.regDeviceInfoData?.retCode
|
(state) => state.device?.regDeviceInfoData?.retCode
|
||||||
@@ -106,11 +103,23 @@ export default function MobileSendPopUp({
|
|||||||
);
|
);
|
||||||
const popupVisible = useSelector((state) => state.common.popup.popupVisible);
|
const popupVisible = useSelector((state) => state.common.popup.popupVisible);
|
||||||
const nowMenu = useSelector((state) => state.common.menu.nowMenu);
|
const nowMenu = useSelector((state) => state.common.menu.nowMenu);
|
||||||
const deviceCountryCode = httpHeader["X-Device-Country"];
|
|
||||||
const dispatch = useDispatch();
|
const [inputDisabled, setInputDisabled] = useState(true);
|
||||||
|
const [mobileNumber, setMobileNumber] = useState("");
|
||||||
|
const [recentSentNumber, setRecentSentNumber] = useState([]);
|
||||||
|
const [keyPadOff, setKeyPadOff] = useState(false);
|
||||||
|
const [smsRetCode, setSmsRetCode] = useState(undefined);
|
||||||
|
|
||||||
const agreeBtnClickedRef = useRef(false);
|
const agreeBtnClickedRef = useRef(false);
|
||||||
|
|
||||||
|
const deviceCountryCode = httpHeader["X-Device-Country"];
|
||||||
|
|
||||||
|
const mobileSendPopUpSpotlightId = useMemo(() => {
|
||||||
|
return !keyPadOff && recentSentNumber.length <= 0
|
||||||
|
? "keypad-number-1"
|
||||||
|
: "agreeAndSend";
|
||||||
|
}, [keyPadOff, recentSentNumber]);
|
||||||
|
|
||||||
const getMaxNum = useCallback((_deviceCountryCode) => {
|
const getMaxNum = useCallback((_deviceCountryCode) => {
|
||||||
if (_deviceCountryCode === "DE" || _deviceCountryCode === "GB") {
|
if (_deviceCountryCode === "DE" || _deviceCountryCode === "GB") {
|
||||||
return 11;
|
return 11;
|
||||||
@@ -236,16 +245,22 @@ export default function MobileSendPopUp({
|
|||||||
}
|
}
|
||||||
}, [deviceInfo, dispatch]);
|
}, [deviceInfo, dispatch]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const timer = setTimeout(() =>
|
||||||
|
setInputDisabled(mobileSendPopUpSpotlightId === "keypad-number-1")
|
||||||
|
);
|
||||||
|
|
||||||
|
return () => clearTimeout(timer);
|
||||||
|
}, [mobileSendPopUpSpotlightId]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!agreeBtnClickedRef.current && recentSentNumber) {
|
if (!agreeBtnClickedRef.current && recentSentNumber) {
|
||||||
if (recentSentNumber.length > 0) {
|
if (recentSentNumber.length > 0) {
|
||||||
setKeyPadOff(true);
|
setKeyPadOff(true);
|
||||||
setMobileNumber(recentSentNumber[0]);
|
setMobileNumber(recentSentNumber[0]);
|
||||||
setTimeout(() => Spotlight.focus("agreeAndSend"));
|
|
||||||
} else {
|
} else {
|
||||||
setKeyPadOff(false);
|
setKeyPadOff(false);
|
||||||
setMobileNumber("");
|
setMobileNumber("");
|
||||||
setTimeout(() => Spotlight.focus("keypad-number-1"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, [recentSentNumber]);
|
}, [recentSentNumber]);
|
||||||
@@ -279,9 +294,6 @@ export default function MobileSendPopUp({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
setTimeout(() => {
|
|
||||||
spotlight.focus("history-container");
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -531,6 +543,7 @@ export default function MobileSendPopUp({
|
|||||||
open={open}
|
open={open}
|
||||||
onClose={onClose}
|
onClose={onClose}
|
||||||
hasText
|
hasText
|
||||||
|
spotlightId={mobileSendPopUpSpotlightId}
|
||||||
>
|
>
|
||||||
<div className={css.header}>
|
<div className={css.header}>
|
||||||
{productImg && (
|
{productImg && (
|
||||||
@@ -570,7 +583,7 @@ export default function MobileSendPopUp({
|
|||||||
<SpottableComponent
|
<SpottableComponent
|
||||||
className={css.inputNum}
|
className={css.inputNum}
|
||||||
onClick={handleInputClick}
|
onClick={handleInputClick}
|
||||||
spotlightDisabled
|
spotlightDisabled={inputDisabled}
|
||||||
>
|
>
|
||||||
{deviceCountryCode && deviceCountryCode === "RU" && (
|
{deviceCountryCode && deviceCountryCode === "RU" && (
|
||||||
<span className={css.rucInput}>{"+7 "}</span>
|
<span className={css.rucInput}>{"+7 "}</span>
|
||||||
@@ -578,19 +591,18 @@ export default function MobileSendPopUp({
|
|||||||
<span>{mobileNumber}</span>
|
<span>{mobileNumber}</span>
|
||||||
</SpottableComponent>
|
</SpottableComponent>
|
||||||
</InputContainer>
|
</InputContainer>
|
||||||
{keyPadOff ? (
|
|
||||||
<Container spotlightId="history-container">
|
<Container>
|
||||||
|
{keyPadOff && recentSentNumber.length > 0 ? (
|
||||||
<HistoryPhoneNumber
|
<HistoryPhoneNumber
|
||||||
handleClickSelect={handleClickSelect}
|
handleClickSelect={handleClickSelect}
|
||||||
handleDelete={handleDelete}
|
handleDelete={handleDelete}
|
||||||
recentSentNumber={recentSentNumber}
|
recentSentNumber={recentSentNumber}
|
||||||
/>
|
/>
|
||||||
</Container>
|
) : (
|
||||||
) : (
|
|
||||||
<Container>
|
|
||||||
<SMSNumKeyPad onKeyDown={numKeypadClicked} />
|
<SMSNumKeyPad onKeyDown={numKeypadClicked} />
|
||||||
</Container>
|
)}
|
||||||
)}
|
</Container>
|
||||||
</div>
|
</div>
|
||||||
<div className={css.instruction}>
|
<div className={css.instruction}>
|
||||||
{deviceCountryCode && (
|
{deviceCountryCode && (
|
||||||
|
|||||||
Reference in New Issue
Block a user