ํฐ์คํ ๋ฆฌ ๋ทฐ
Issue
ํ๋ก์ ํธ ๋์ค ํ์ ๊ฐ์ ์ฐฝ์ด ๋จ๊ธฐ ์ ์ ์ด์ฉ ์ฝ๊ด ๋์ ์ฐฝ์ ๋ํ ๋์์ธ ์์์ด ์ถ๊ฐ๋์๋ค.
์ฒ์์๋ ์ด์ฉ ์ฝ๊ด ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ์ง๋ง, ์ฒดํฌ ๋ฐ์ค ๊ด๋ จ ๊ธฐ๋ฅ์ ์์ผ๋ก๋ ๋ง์ด ์ฐ์ผ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฒ ๊ธฐํ์ ์ค์ค๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด๊ธฐ๋ก ํ์๋ค.
Code
์ฐ์ , ๊ฐ ์ฒดํฌ ๋ฐ์ค์ ์ฒดํฌ ํ์ฑ์ ๋ํ ์ฌ๋ถ๋ฅผ ์ ์ฅํด์ฃผ์ด์ผ ์ด์ฉ ์ฝ๊ด ๋์ ์ฐฝ์์ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ ์ฒดํฌ ๋ฐ์ค์ Key๊ฐ์ ๋ํ ์ฒดํฌ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ Boolean Value๋ฅผ ์ง๋ ๊ฐ์ฒด๋ฅผ state๊ฐ์ผ๋ก ์ด๊ธฐํ ํ์๋ค.
const [checkInfo, setCheckInfo] = useState({
webAccessCheck: false,
privateInfoCheck: false,
advertiseCheck: false,
});
๊ฐ ์ฒดํฌ ๋ฐ์ค๋ฅผ ํด๋ฆญํ์์ ๊ฒฝ์ฐ ๊ฐ์ ์ด๋ฒคํธ ๋์์ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ ์ฒดํฌ ๋ฐ์ค์ onClick ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉํด์ฃผ๋ ๊ฒ์ด ์๋ ์ด๋ค์ ๊ฐ์ธ๊ณ ์๋ ์์ ํ๊ทธ ํ๋์๋ง onClick ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉ์์ผ ์ฃผ์ด, event targeting์ด ๋ฐ์๋๋๋ก ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
const checkClickSort = event => {
const currentTargetElementInfo = nodeName: event.target.nodeName
if (currentTargetElementInfo.nodeName !== "BUTTON") return;
const currentTargetButtonSort = event.target.dataset.buttonsort;
const currentButtonName = event.target.name;
switch (currentTargetButtonSort) {
case "checkButton":
setCheckValue("checkInfo", currentButtonName);
break;
case "nextButton":
goToRegisterForm();
break;
default:
break;
}
};
ํ์ฌ ์ด์ฉ ์ฝ๊ด ๋์ ํผ์๋ ํฌ๊ฒ ์ฒดํฌ ๋ฒํผ๊ณผ next ๋ฒํผ์ด ์๊ธฐ ๋๋ฌธ์ curret.event.target ๊ฐ์ ์ ํํ๊ฒ ํ๊ฒํ ํด์ฃผ๊ธฐ ์ํด ์์ ํ๊ทธ ์์์ onClick ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ด๋ฅผ ์๋ณํด ์ค ์ ์๋ checkClickSort ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐ์ธ๋ฉํด์ฃผ์๋ค.
๋ง์ฝ์ ํ์ฌ ํด๋ฆญ๋ ๋ฒํผ์ด ์ฒดํฌ ๋ฐ์ค ๋ฒํผ์ผ ๊ฒฝ์ฐ์๋ setCheckValue ํจ์๋ฅผ ํธ์ถํ์ฌ ์ฃผ์๋ค.
const setCheckValue = (currentTargetedState, currentButtonName) => {
if (currentTargetedState === "checkInfo")
if (currentButtonName === "allCheck") {
if (isAllChecked()) {
setCheckInfo({ //๋ชจ๋ ์ฒดํฌ๊ฐ ๋ ๊ฒฝ์ฐ => ๋ค๋ฅธ ์ฒดํฌ ๊ฐ๋ค์ unactive ์ฒ๋ฆฌ
...checkInfo,
webAccessCheck: false,
privateInfoCheck: false,
advertiseCheck: false,
});
} else { // ๋ชจ๋ ์ฒดํฌ๊ฐ ๋ ๊ฒฝ์ฐ => ๋ค๋ฅธ ์ฒดํฌ ๊ฐ๋ค์ active ์ฒ๋ฆฌ
setCheckInfo({
...checkInfo,
webAccessCheck: true,
privateInfoCheck: true,
advertiseCheck: true,
});
}
} else {
setCheckInfo({
...checkInfo,
[currentButtonName]: !checkInfo[currentButtonName],
});
}
};
ํด๋น ํจ์๋ ํฌ๊ฒ ๋ ๋ถ๊ธฐ๋ก ๋๋๋ค.
์ฒซ ๋ฒ์งธ๋ ํด๋น ์ฒดํฌ ๋ฐ์ค ๋ฒํผ์ด AllCheck ๋ฒํผ์ผ ๊ฒฝ์ฐ์ ๋ ๋ฒ์งธ๋ ๊ทธ ์ธ์ Check ๋ฒํผ์ ๋๋ ์ ๊ฒฝ์ฐ๋ก ๋ถ๊ธฐ ๋ฐ ์๋ณ ์ฒ๋ฆฌํ๋ค.
์ ์์ผ ๊ฒฝ์ฐ์๋ isAllChecked ๋ผ๋ ํจ์๋ฅผ ํธ์ถํ์ฌ Object.entries() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์ฒดํฌ๋ฐ์ค ํค ๊ฐ์ ๋ํ Boolean Value๋ฅผ ํ์ธํด์ฃผ๋ฉฐ ์ต์ข ์ ์ผ๋ก ์ํ๋ ๋๊น์ง ํ๋๋ผ๋ false์ผ ๊ฒฝ์ฐ์๋ ์ฌ์ ์ ์ ์ํ allChecked ๋ณ์๋ฅผ false๋ก ๋ฆฌํด์ํค๋ฉฐ ๊ทธ ๋ฐ๋๋ true๋ฅผ ๋ฆฌํด์ํค๋๋ก ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
const isAllChecked = () => {
let allChecked = true;
for (const value of Object.values(checkInfo)) {
if (!value) allChecked = false; // ํ๋๋ผ๋ ์ฒดํฌ๊ฐ ๋์ด ์์ง ์์ผ๋ฉด allChecked => false
}
return allChecked;
};
๊ทธ๋ฐ ๋ค์ ๊ฐ ์ฒดํฌ ๋ฐ์ค์ ๋ํด checkActvie() ํจ์๋ฅผ ๋ฐ์ธ๋ฉํด์ฃผ๊ณ ๋ง์ฝ์ ํด๋น ๊ฐ์ด true์ธ์ง false์ธ์ง์ ๋ฐ๋ผ style img๊ฐ ๋์ ์ผ๋ก ๋ฐ๋๋๋ก ๋ค์๊ณผ ๊ฐ์ด styled-components๋ฅผ ์ฌ์ฉํ์ฌ background-image ๊ฐ์ ๋ฐ๊ฟ์ฃผ์๋ค.
const CheckIcon = styled.button`
width: 40px;
height: 40px;
background: ${({ active }) =>
active
? "url(./images/icon_active_check.png)"
: "url(./images/icon_unactive_check.png)"}
no-repeat;
background-position: center;
background-size: contain;
border: none;
cursor: pointer;
`;
๋ํ ํ์ ์ฒดํฌ ํญ๋ชฉ์ด ๋ชจ๋ ์ฒดํฌ๋์ด ์์ง ์์ผ๋ฉด next button์ disabled ์ฒ๋ฆฌํด์ฃผ์๋ค.
const checkPrimaryAccessTerms = () => {
const { webAccessCheck, privateInfoCheck } = checkInfo;
if (webAccessCheck && privateInfoCheck) return false;
else return true;
};
๋ง์ง๋ง์ผ๋ก ์ฌ์ฉ์๊ฐ ๊ด๊ณ ๋์๋ฅผ ์ฒดํฌํ์ ๊ฒฝ์ฐ์๋ ์๋ฒ๋ก ๊ด๊ณ ๋์ ์ฌ๋ถ ๊ฐ์ ๋๊ฒจ์ค์ผ ํ๊ธฐ ๋๋ฌธ์ checkCurrentAdvertiseAccess ๋ผ๋ ํจ์๋ฅผ Container Components์์ props๋ก ๋๊ฒจ ๋ฐ์ ๊ด๊ณ ๋์๊ฐ ์ฒดํฌ๊ฐ ๋์์ ๊ฒฝ์ฐ์ useEffect ๋ด์์ ํด๋น ๊ฐ์ด ์ ๋ฐ์ดํธ ๋์์์ ํ์ธํ๊ณ checkCurrentAdvertiseAccess ํจ์๋ฅผ ํธ์ถํด์ฃผ๋๋ก ํ์๋ค.
ํด๋น ํจ์๊ฐ ํธ์ถ๋๋ฉด ๊ด๊ณ ์ฒดํฌ์ ๋ํ true๊ฐ์ Auth store์ is_receive_email key์ ํ ๋นํด์ฃผ๋๋ก ๋ฆฌ๋์๋ฅผ ์์ฑํ์๋ค.
// RegisterContainer
const checkCurrentAdvertiseAccess = useCallback(
isCurrentAdvertiseAccess => {
dispatch(setCurrentAdvertiseAccess(isCurrentAdvertiseAccess));
},
[dispatch]
);
// AccessTermForm
useEffect(() => {
checkCurrentAdvertiseAccess(advertiseCheck);
}, [checkCurrentAdvertiseAccess, advertiseCheck]);
๋์ ์์