
오늘 구현한 로그인 관련 기능은 다음과 같음
const [isShowPassword, setIsShowPassword] = useState(false);
const clickTogglePasswordhandler = () => {
setIsShowPassword(!isShowPassword);
};
// ...
<span onClick={clickTogglePasswordhandler}>
{isShowPassword ? <AiOutlineEyeInvisible /> : <AiOutlineEye />}
</span>
const [isResetModalOpen, setIsResetModalOpen] = useState(false);
// ...
<Modal isOpen={isResetModalOpen} onClose={closeResetModal}>
{/* 모달 내용 */}
</Modal>
const [isLoading, setIsLoading] = useState(true);
// ...
if (isLoading) {
return <MoonLoader />;
}
const clickPasswordResetHandler = async () => {
try {
await sendPasswordResetEmail(auth, resetEmail);
// 성공 메시지 처리
} catch (error) {
// 에러 처리
}
};
if (!emailExists) {
setEmailCheckMessage('가입되지 않은 이메일입니다.');
return;
}
오늘 구현한 회원가입 관련 기능은 다음과 같음
const progressBarStyle = {
width: '${progress}%',
transition: 'width 0.3s ease-in-out',
};
<div className="bg-gray-200 w-full h-4 rounded-lg">
<div className="bg-blue-500 h-4 rounded-lg" style={progressBarStyle}></div>
</div>
if (!email) {
setEmailCheck('이메일을 입력해주세요');
setEmailValidationClass('text-red-500');
} else if (!emailValidation.test(email)) {
setEmailCheck('유효한 이메일 형식이 아닙니다');
setEmailValidationClass('text-red-500');
}
<Button className="mt-[20px] w-full bg-[#0051FF] text-white" size="lg">
회원가입
</Button>
const triggerConfetti = () => {
confetti({
angle: 90,
spread: 180,
particleCount: 100,
origin: {y: 0.6},
});
};
{isJoining && (
<div>
<SyncLoader color="#0051FF" loading={isJoining} size={15} />
<p>회원가입이 진행중입니다. 잠시만 기다려주세요...</p>
</div>
)}
오늘의 한줄평 : 유능함을 증명하는 거 같아서 좋다.