diff --git a/src/app/(user-access)/components/modal/Modal.module.css b/src/app/(user-access)/components/modal/Modal.module.css
new file mode 100644
index 0000000..44aa445
--- /dev/null
+++ b/src/app/(user-access)/components/modal/Modal.module.css
@@ -0,0 +1,33 @@
+.modalContainer {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: rgba(0, 0, 0, 0.5);
+ z-index: 1000;
+}
+
+.modal {
+ width: 308px;
+ height: 152px;
+ background-color: white;
+ padding: 20px;
+ border-radius: 8px;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+}
+
+.message {
+ margin-top: 20px;
+ font-size: 18px;
+ font-weight: 500;
+ text-align: center;
+}
+
+.button {
+ margin-top: 30px;
+ height: 40px;
+}
diff --git a/src/app/(user-access)/components/modal/Modal.tsx b/src/app/(user-access)/components/modal/Modal.tsx
new file mode 100644
index 0000000..a528693
--- /dev/null
+++ b/src/app/(user-access)/components/modal/Modal.tsx
@@ -0,0 +1,35 @@
+import useModalStore from '../../modalStore/modalStore';
+import Button from '@/components/Button';
+import styles from './Modal.module.css';
+import { useRouter } from 'next/navigation';
+
+interface AlertModalProps {
+ message: string;
+}
+
+const AlertModal = ({ message }: AlertModalProps) => {
+ const { closeModal, messageType } = useModalStore();
+ const router = useRouter();
+
+ const handleConfirm = () => {
+ closeModal();
+ if (messageType === 'success') {
+ router.push('/login');
+ }
+ };
+
+ return (
+
+ );
+};
+
+export default AlertModal;
diff --git a/src/app/(user-access)/components/modal/ModalContainer.tsx b/src/app/(user-access)/components/modal/ModalContainer.tsx
new file mode 100644
index 0000000..7f5f534
--- /dev/null
+++ b/src/app/(user-access)/components/modal/ModalContainer.tsx
@@ -0,0 +1,17 @@
+import useModalStore from '../../modalStore/modalStore';
+import styles from './Modal.module.css';
+import AlertModal from './Modal';
+
+const ModalContainer = () => {
+ const { isOpen, message } = useModalStore();
+
+ if (!isOpen) return null;
+
+ return (
+
+ );
+};
+
+export default ModalContainer;
diff --git a/src/app/(user-access)/layout.module.css b/src/app/(user-access)/layout.module.css
index 61e1788..c93b01d 100644
--- a/src/app/(user-access)/layout.module.css
+++ b/src/app/(user-access)/layout.module.css
@@ -5,20 +5,18 @@
align-items: center;
min-height: 100vh;
width: 100%;
- background-color: var(--white);
+ background-color: var(--gray-100);
}
-
.authContent {
width: 100%;
max-width: 400px;
box-sizing: border-box;
display: flex;
justify-content: center;
- background-color: var(--white);
+ background-color: var(--gray-100);
border-radius: 8px;
padding: 20px;
}
-
.logoContainer {
display: flex;
flex-direction: column;
@@ -26,12 +24,10 @@
align-items: center;
margin: 16px 0;
}
-
.logo {
width: 100%;
height: auto;
}
-
@media screen and (min-width: 768px) {
.authContent {
max-width: 351px;
diff --git a/src/api/auth/login.ts b/src/app/(user-access)/lib/loginService.ts
similarity index 100%
rename from src/api/auth/login.ts
rename to src/app/(user-access)/lib/loginService.ts
diff --git a/src/api/auth/signup.ts b/src/app/(user-access)/lib/signupService.ts
similarity index 100%
rename from src/api/auth/signup.ts
rename to src/app/(user-access)/lib/signupService.ts
diff --git a/src/app/(user-access)/login/loginPage.module.css b/src/app/(user-access)/login/loginPage.module.css
index 6ae59b8..b0cba24 100644
--- a/src/app/(user-access)/login/loginPage.module.css
+++ b/src/app/(user-access)/login/loginPage.module.css
@@ -33,6 +33,7 @@
border-color: var(--violet);
outline: none;
}
+
.errorMessage {
color: var(--red);
font-size: 12px;
@@ -49,3 +50,9 @@
font-size: 20px;
text-align: center;
}
+
+.signupLink {
+ color: var(--violet);
+ text-decoration: underline;
+ cursor: pointer;
+}
diff --git a/src/app/(user-access)/login/page.tsx b/src/app/(user-access)/login/page.tsx
index e92f0c2..68ddc56 100644
--- a/src/app/(user-access)/login/page.tsx
+++ b/src/app/(user-access)/login/page.tsx
@@ -1,7 +1,6 @@
'use client';
import React from 'react';
-import axios from 'axios';
import { useForm, FieldValues, UseFormReturn } from 'react-hook-form';
import { useRouter } from 'next/navigation';
import useAuthStore from '@/store/authStore';
@@ -9,6 +8,10 @@ import Button from '@/components/Button';
import { ERROR_MESSAGES } from '@/constants/message';
import type { User } from '@/types/user';
import styles from './loginPage.module.css';
+import ModalContainer from '../components/modal/ModalContainer';
+import useModalStore from '../modalStore/modalStore';
+import axios from 'axios';
+import { EMAIL_REGEX } from '@/constants/regex';
type LoginFormInputs = {
email: string;
@@ -33,6 +36,7 @@ export default function LoginPage() {
const router = useRouter();
const { setUser } = useAuthStore();
+ const { openModal } = useModalStore();
const onSubmit = async (data: LoginFormInputs) => {
try {
@@ -43,78 +47,76 @@ export default function LoginPage() {
router.replace('/mydashboard');
} catch (error) {
- console.error('로그인 실패:', error);
- alert('비밀번호가 일치하지 않습니다.');
+ openModal('비밀번호가 일치하지 않습니다.', 'error');
}
};
return (
-