ํ์๊ฐ์ ์์ ์๋์ ๊ฐ์ด ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์งํํ๋ค.
์ ํจ์ฑ ๊ฒ์ฌ ํญ๋ชฉ
- ๋๋ค์ ๊ธธ์ด๊ฐ 2 ์ด์์ด์ด์ผ ํ๋ค.
- ๊ธฐ์กด ๋๋ค์๊ณผ ์ค๋ณต๋์ง ์์์ผ ํ๋ค.
๐๐ป ์ ๋ ฅ์ฐฝ์ ์ ๋ ฅ๋๋ ๋ด์ฉ์ state์ ์ ์ฅํด ๊ธธ์ด๊ฐ 2 ์ด์์ธ์ง ์ฒดํฌํ๋ค.
๐๐ป ์ ๋ ฅ๋ ๋๋ค์์ ๋ฐฑ์๋๋ก ๋ณด๋ด ์ค๋ณต ์ฌ๋ถ๋ฅผ ๋ฐ์์จ๋ค.
๐๐ป useRef๋ฅผ ์ด์ฉํด ์ ๋ ฅ์ฐฝ์ focus ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ , ์ด๋ฅผ state์ ์ ์ฅํ๋ค. ์ด state ๊ฐ์ด true์ผ ๋๋ง ๊ฒฝ๊ณ ์ฐฝ์ด ๋จ๋๋ก ์ค์ ํ๋ค.
๐๐ป ๋๋ค์ ๊ธธ์ด๊ฐ 2๋ณด๋ค ์์ ๋ focus๋ฅผ true๋ก ๋ฐ๊พผ๋ค.
๐๐ป ๋ฐฑ์๋์์ ์ค๋ณต๋๋ค๋ ์๋ต(400)์ ๋ฐ์ผ๋ฉด focus์ isOverlap์ true๋ก ๋ฐ๊พผ๋ค. ์ด๋ ์ ๋ ฅํ ๊ฐ์ temp์ ์ ์ฅํด๋๋ค.
๐๐ป ํ์ฌ ์ ๋ ฅ์ค์ธ ๊ฐ๊ณผ temp๋ฅผ ๋น๊ตํด์ ๊ฐ์ผ๋ฉด(์ฌ์ ํ ์ค๋ณต๋๋ ์ํ) ๊ฒฝ๊ณ ์ฐฝ์ ๊ณ์ ๋์ฐ๊ณ , ๊ฐ์ง ์์ผ๋ฉด ๊ฒฝ๊ณ ์ฐฝ์ด ๋์ค์ง ์๊ฒ ํ๋ค.
const Nickname = () => {
const [nickname, setNickName] = useState(""); // ๋๋ค์ ์
๋ ฅ๋ฐ๊ธฐ
const [isOverlap, setIsOverlap] = useState(false); // ๋๋ค์ ์ค๋ณต ์ฒดํฌ
const [isFocused, setIsFocused] = useState(false); // focus ์ฌ๋ถ
const [temp, setTemp] = useState(""); // ํ์ฌ ์
๋ ฅ๊ฐ์ด ์ค๋ณต๋๋์ง ์ฒดํฌ
const inputRef = useRef(null); // focus ๊ฐ์ง
const navigate = useNavigate();
const handleNavigateBack = () => {
navigate(-1);
};
const handleNickName = e => {
setNickName(e.target.value);
};
// focus ์ฌ๋ถ ๊ฐ์ง
useEffect(() => {
const inputElement = inputRef.current;
inputElement.addEventListener("focus", () => setIsFocused(true));
inputElement.addEventListener("blur", () => setIsFocused(false));
return () => {
inputElement.removeEventListener("focus", () => setIsFocused(true));
inputElement.removeEventListener("blur", () => setIsFocused(false));
};
}, []);
const putNickName = async () => {
if (nickname.length < 2) {
setIsFocused(true);
} else {
const token = localStorage.getItem("bagtoken");
try {
const res = await axios.put(
"https://server.bageasy.net/members/nickname",
{
nickname: nickname,
},
{
headers: {
Authorization: token,
},
},
);
console.log(res);
if (res.status == "400") {
setIsOverlap(true);
setIsFocused(true);
setTemp(nickname);
}
if (res.status == "200") {
setIsOverlap(false);
setIsFocused(false);
setTemp("");
navigate("/home");
}
} catch (error) {
console.log(error);
}
}
};
return (
<NickNameContainer>
<ArrowIcon src={Arrow} onClick={handleNavigateBack} />
<Copy>๋๋ค์์ ์
๋ ฅํด์ฃผ์ธ์!</Copy>
<Copy2>์ดํ ๋๋ค์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐํ๋ ์ ์คํ๊ฒ ๊ฒฐ์ ํด์ฃผ์ธ์.</Copy2>
<Container>
<Input
placeholder="์ฌ๊ธฐ์ ์
๋ ฅํ์ธ์..."
onChange={handleNickName}
ref={inputRef}
color={
isFocused &&
(nickname.length < 2 || (isOverlap && nickname === temp))
? "T"
: "F"
}
/>
{isFocused && nickname.length < 2 && (
<Copy3>- ๋๋ค์์ 2๊ธ์ ์ด์ ์
๋ ฅํด์ฃผ์ธ์.</Copy3>
)}
{isFocused && isOverlap && nickname === temp && (
<Copy3>- ์ค๋ณต๋๋ ๋๋ค์์
๋๋ค.</Copy3>
)}
</Container>
<Btn onClick={putNickName}>ํ์ธ</Btn>
</NickNameContainer>
);
};
์ ๋ดค์ต๋๋ค. ์ข์ ๊ธ ๊ฐ์ฌํฉ๋๋ค.