import React, { useCallback, useEffect, useState } from "react"; import classNames from "classnames"; import CryptoJS from "crypto-js"; import { useDispatch, useSelector } from "react-redux"; import Spotlight from "@enact/spotlight"; import SpotlightContainerDecorator from "@enact/spotlight/SpotlightContainerDecorator"; import Spottable from "@enact/spotlight/Spottable"; import { setHidePopup, setShowPopup } from "../../../actions/commonActions"; import { getMyInfoCardPincodeCheck } from "../../../actions/pinCodeActions"; import TButton from "../../../components/TButton/TButton"; import TPopUp from "../../../components/TPopUp/TPopUp"; import TQRCode from "../../../components/TQRCode/TQRCode"; import * as Config from "../../../utils/Config"; import { $L } from "../../../utils/helperMethods"; import { SpotlightIds } from "../../../utils/SpotlightIds"; import css from "./PinCodeInput.module.less"; const PinCodeContainer = SpotlightContainerDecorator("div"); const SpottableButton = Spottable("div"); export default function PinCodeInput({ setPlaceOrderPopup }) { const dispatch = useDispatch(); const { activePopup, popupVisible } = useSelector( (state) => state.common.popup ); const pinCodeDatas = useSelector((state) => state.pinCode.pinCodeData); const userNumber = useSelector( (state) => state.common.appStatus.loginUserData.userNumber ); const [pin, setPin] = useState(["", "", "", ""]); const [errorMsg, setErrorMsg] = useState(""); const [okClicked, setOkClicked] = useState(false); useEffect(() => { if (pinCodeDatas && pinCodeDatas.retCode !== 0 && okClicked) { if (pinCodeDatas.data.pwdErrorCnt >= 3) { dispatch(setShowPopup(Config.ACTIVE_POPUP.setPinCodePopup)); } else { setErrorMsg($L("Your entries did not match. Please try again.")); } } }, [pinCodeDatas, dispatch, okClicked]); useEffect(() => { setOkClicked(false); }, []); useEffect(() => { if (popupVisible && activePopup) { setTimeout(() => { Spotlight.focus("tPopupBtn1"); }, 0); } }, [popupVisible, activePopup]); const handleDigitClick = useCallback( (digit) => { const newPin = [...pin]; const nextIndex = pin.findIndex((p) => p === ""); if (nextIndex !== -1) { newPin[nextIndex] = digit; setPin(newPin); } }, [pin] ); const handleBackspace = useCallback(() => { const newPin = [...pin]; const lastIndex = newPin.findIndex((p) => p === ""); const index = lastIndex === -1 ? 3 : lastIndex - 1; if (index >= 0) { newPin[index] = ""; setPin(newPin); } }, [pin]); const onClickCancel = useCallback(() => { setPin(["", "", "", ""]); setPlaceOrderPopup(false); }, [setPlaceOrderPopup]); const onClickConfirm = useCallback(() => { if (pin.includes("")) { setErrorMsg($L("Please enter a PIN CODE.")); return; } setOkClicked(true); const pinString = pin.join(""); const encryptedPin = CryptoJS.SHA256(pinString).toString(); dispatch( getMyInfoCardPincodeCheck({ mbrNo: userNumber, pinCd: encryptedPin, }) ); }, [pin, userNumber, dispatch]); const handleClickSetPinCode = useCallback(() => { dispatch(setShowPopup(Config.ACTIVE_POPUP.qrPopup)); }, [dispatch]); const handleCancelPopup = useCallback(() => { dispatch(setHidePopup()); Spotlight.focus(SpotlightIds.PINCODE_CONTAINER); }, [dispatch]); return ( <> {$L("Enter PIN CODE")} {pin.map((digit, index) => ( p === "") === index, })} > {digit ? "•" : ""} ))} {errorMsg} {[...Array(10).keys()].map((digit) => ( handleDigitClick(digit.toString())} > {digit} ))} {$L("Cancel")} {$L("OK")} {activePopup === Config.ACTIVE_POPUP.setPinCodePopup && ( )} {activePopup === Config.ACTIVE_POPUP.qrPopup && ( {$L("QR CODE")} {$L( "If you want to add or edit your address and payment information, please scan the QR CODE." )} {$L("CLOSE")} )} > ); }