setOpen((prev) => !prev)}
+ onClick={toggleOpen}
className={cn(
- "bg-black-800 flex cursor-pointer items-center justify-between rounded-lg border px-4 transition-colors",
- open ? "border-blue" : "border-gray-400",
+ "bg-black-800 flex items-center justify-between rounded-lg border px-4 transition-colors",
+ disabled
+ ? "cursor-not-allowed border-gray-600 opacity-50"
+ : "cursor-pointer",
+ open && !disabled ? "border-blue" : "border-gray-400",
"h-[55px] w-[335px] text-[14px]",
"md:h-[60px] md:w-[360px] md:text-[14px]",
"xl:h-[70px] xl:w-[400px] xl:text-[16px]",
@@ -56,20 +67,23 @@ export const DropDown = ({
? options.find((opt) => opt.value === value)?.label
: placeholder}
- {open ? (
-

- ) : (
-

+
+ {!disabled && (
+ <>
+ {open ? (
+

+ ) : (
+

+ )}
+ >
)}
@@ -83,10 +97,10 @@ export const DropDown = ({
"w-[335px] gap-[5px] p-[10px]",
"md:w-[360px] md:gap-[5px] md:p-[10px]",
"xl:w-[400px] xl:gap-[5px] xl:p-[10px]",
- className,
- open
+ open && !disabled
? "pointer-events-auto scale-y-100 opacity-100"
: "pointer-events-none scale-y-0 opacity-0",
+ className,
)}
>
{options.map((opt) => (
@@ -102,7 +116,6 @@ export const DropDown = ({
"w-[380px] gap-[5px] p-[10px]",
"md:w-[360px] md:gap-[5px] md:p-[10px]",
"xl:w-[400px] xl:gap-[5px] xl:p-[10px]",
- className,
)}
>
{opt.label}
diff --git a/src/shared/ui/Loading/LoadingDots.tsx b/src/shared/ui/Loading/LoadingDots.tsx
new file mode 100644
index 00000000..7d059e9b
--- /dev/null
+++ b/src/shared/ui/Loading/LoadingDots.tsx
@@ -0,0 +1,17 @@
+"use client";
+
+export const LoadingDots = () => {
+ return (
+
+
+ •
+
+
+ •
+
+
+ •
+
+
+ );
+};
diff --git a/src/widgets/main/ui/Client/LoginPage.client.tsx b/src/widgets/main/ui/Client/LoginPage.client.tsx
index ec7ee67a..706ec3de 100644
--- a/src/widgets/main/ui/Client/LoginPage.client.tsx
+++ b/src/widgets/main/ui/Client/LoginPage.client.tsx
@@ -1,17 +1,19 @@
"use client";
-import React, { useEffect, useState } from "react";
+import { useEffect } from "react";
import { LoginForm } from "@/features/auth/ui/LoginForm/LoginForm";
-import { Modal } from "@/shared/ui/Modal/Modal";
import { useRouter, useSearchParams } from "next/navigation";
import { useAuthStore } from "@/features/auth/model/auth.store";
import { useChatStore } from "@/features/chat/model/chat.store";
+import { useModalStore } from "@/shared/model/modal.store";
+import Link from "next/link";
+
export default function LoginPageClient() {
const router = useRouter();
const searchParams = useSearchParams();
const expired = searchParams.get("expired");
- const [errorMessage, setErrorMessage] = useState
(null);
+ const { openModal, closeModal } = useModalStore();
const { setIsLogined, logout } = useAuthStore();
const { unmount } = useChatStore();
@@ -19,32 +21,36 @@ export default function LoginPageClient() {
if (expired === "true") {
unmount();
logout();
- setErrorMessage("세션이 만료되었습니다.\n다시 로그인해주세요.");
+
+ openModal("normal", {
+ message: "세션이 만료되었습니다.\n다시 로그인해주세요.",
+ buttonText: "확인",
+ onClick: () => closeModal(),
+ });
}
}, [expired]);
return (
로그인
+
{
setIsLogined(true);
- router.push("/"); //메인 페이지 이동
+ router.push("/");
}}
onError={(msg) => {
- setErrorMessage(msg);
+ openModal("normal", {
+ message: msg,
+ buttonText: "확인",
+ onClick: () => closeModal(),
+ });
}}
/>
- {!!errorMessage && (
- setErrorMessage(null)}
- className=""
- />
- )}
+
+ 아직 회원이 아니신가요? 회원가입
+
);
}