Skip to content
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
be4b793
feat: ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€์—์„œ ๋ชจ๋‹ฌ ๊ด€๋ฆฌ ๋กœ์ง ๊ฐœ์„  ๋ฐ ์•ฝ๊ด€ ๋ชจ๋‹ฌ ํ†ตํ•ฉ
IISweetHeartII Jul 10, 2025
5bebccc
rename: ์•„์ด์ฝ˜ SVG ํŒŒ์ผ ์ด๋ฆ„ ๋ณ€๊ฒฝ๊ฒฝ
IISweetHeartII Jul 10, 2025
b565650
feat: AlertModal ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€ ๋ฐ Input ์ปดํฌ๋„ŒํŠธ์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ€์‹œ์„ฑ ํ† ๊ธ€ ๊ธฐ๋Šฅ ์ œ๊ฑฐ
IISweetHeartII Jul 10, 2025
90c2206
style: ์•ฝ๊ด€ ๋ชจ๋‹ฌ ์ œ๋ชฉ ๋ฐ ๋‚ด์šฉ ํ…์ŠคํŠธ ์ƒ‰์ƒ ๋ณ€๊ฒฝ
IISweetHeartII Jul 10, 2025
ef40352
fix: ๋กœ๊ทธ์ธ ๊ฒฝ๋กœ๋ฅผ '/auth/login'์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ๊ฒฝ๋กœ ์ถ”๊ฐ€
IISweetHeartII Jul 10, 2025
a1c7051
style: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ๋ฉ”์ผ ๋ฐœ์†ก ํŽ˜์ด์ง€์˜ ๋ ˆ์ด์•„์›ƒ ๋ฐ ํ…์ŠคํŠธ ์Šคํƒ€์ผ ์ˆ˜์ •
IISweetHeartII Jul 10, 2025
0b459da
style: ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ ๋ฐ ์ž…๋ ฅ ํ•„๋“œ ์Šคํƒ€์ผ ์ˆ˜์ •, ์ธ์ฆ๋ฒˆํ˜ธ ์ž…๋ ฅ ํ•„๋“œ ์ถ”๊ฐ€
IISweetHeartII Jul 10, 2025
7c743e7
feat: ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ€์‹œ์„ฑ ํ† ๊ธ€ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ฐ ๋กœ๊ทธ์ธ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ํฌ๋งท ์ˆ˜์ •
IISweetHeartII Jul 10, 2025
0f3e7b6
feat: ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ํŽ˜์ด์ง€ ์ถ”๊ฐ€ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ํ•„๋“œ์™€ ๋ชจ๋‹ฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„
IISweetHeartII Jul 10, 2025
55d439f
style: ํ”„๋กœํ•„ ๋‹จ๊ณ„์—์„œ ์ด๋ฏธ์ง€ ๋ฒ„ํŠผ ๋ฐ ๋ ˆ์ด์•„์›ƒ ์ˆ˜์ •, ํ”„๋กœํ•„ ์ด๋ฏธ์ง€์™€ ์นด๋ฉ”๋ผ ์•„์ด์ฝ˜ ๋ณ€๊ฒฝ
IISweetHeartII Jul 10, 2025
33a53a2
style: ํ”„๋กœํ•„ ๋‹จ๊ณ„์—์„œ ํ…์ŠคํŠธ ์Šคํƒ€์ผ ๋ฐ ์ด๋ฏธ์ง€ ๋ฒ„ํŠผ ๋ ˆ์ด์•„์›ƒ ์ˆ˜์ •, ํ”„๋กœํ•„ ์‚ฌ์ง„ ์•„์ด์ฝ˜ ๋ณ€๊ฒฝ
IISweetHeartII Jul 10, 2025
91f5177
Merge branch 'develop' into feature/auth-UI-refactor-#50
IISweetHeartII Jul 12, 2025
e9dd6e8
Merge branch 'develop' into feature/auth-UI-refactor-#50
IISweetHeartII Jul 12, 2025
2b77d3b
Merge branch 'fix/build-errors' of github.com:Team-Omechu/Omechu-web โ€ฆ
IISweetHeartII Jul 12, 2025
28cbcc1
chore: ์—…๋ฐ์ดํŠธ๋œ ์˜์กด์„ฑ ๋ฐ ๋ฒ„์ „ ์ •๋ฆฌ - eslint, socks, ๊ธฐํƒ€ ํŒจํ‚ค์ง€
IISweetHeartII Jul 12, 2025
80c48cb
Merge branch 'develop' of github.com:Team-Omechu/Omechu-web into featโ€ฆ
IISweetHeartII Jul 12, 2025
559b33f
refactor: ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ ์ œ๊ฑฐ ๋ฐ ํ•„์š”ํ•œ import ์ถ”๊ฐ€
IISweetHeartII Jul 12, 2025
0b30bfd
Merge branch 'refactor/samepage-#38' of github.com:Team-Omechu/Omechuโ€ฆ
IISweetHeartII Jul 12, 2025
e462a70
feat: ๋กœ๊ทธ์ธ ์Šคํ‚ค๋งˆ์— rememberMe ํ•„๋“œ ์ถ”๊ฐ€
IISweetHeartII Jul 12, 2025
88820b1
refactor: ์˜จ๋ณด๋”ฉ ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ ๊ฐœ์„  ๋ฐ ๋ฒ„ํŠผ ์Šคํƒ€์ผ ํ†ต์ผ
IISweetHeartII Jul 14, 2025
3cb7b88
fix: ์˜จ๋ณด๋”ฉ ํŽ˜์ด์ง€ ๋ฒ„ํŠผ ๋น„ํ™œ์„ฑํ™” ์‹œ ์Šคํƒ€์ผ ์ถ”๊ฐ€
IISweetHeartII Jul 14, 2025
0ffa09d
refactor: ์˜จ๋ณด๋”ฉ ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ์—์„œ ๋ถˆํ•„์š”ํ•œ ํด๋ž˜์Šค ์ œ๊ฑฐ
IISweetHeartII Jul 14, 2025
692f855
Merge branch 'develop' into feature/auth-UI-refactor-#50
IISweetHeartII Jul 14, 2025
b34d32e
signup ํŽ˜์ด์ง€์—์„œ ์•ฝ๊ด€ ๋ชจ๋‹ฌ์„ TermsModal๋กœ ํ†ตํ•ฉํ•˜๊ณ , ์„œ๋น„์Šค ์ด์šฉ์•ฝ๊ด€, ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ, ์œ„์น˜๊ธฐ๋ฐ˜์„œ๋น„์Šค ์ด์šฉโ€ฆ
IISweetHeartII Jul 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions omechu-app/public/mdi-light_eye.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

This file was deleted.

3 changes: 2 additions & 1 deletion omechu-app/src/app/ClientLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,11 @@ export default function ClientLayout({
"/mypage/terms/location-info",

// ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…, ์˜จ๋ณด๋”ฉ ํŽ˜์ด์ง€
"/auth/signin",
"/auth/login",
"/auth/signup",
"/auth/find-password",
"/auth/find-password/sent",
"/auth/reset-password",
"/onboarding/1",
"/onboarding/2",
"/onboarding/3",
Expand Down
114 changes: 54 additions & 60 deletions omechu-app/src/app/auth/find-password/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,77 +33,71 @@ export default function FindPasswordPage() {
router.push("/auth/find-password/sent");
} else {
setApiError(
"๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ๋ฉ”์ผ ๋ฐœ์†ก์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•ด ์ฃผ์„ธ์š”."
"๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ๋ฉ”์ผ ๋ฐœ์†ก์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. \n ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•ด ์ฃผ์„ธ์š”."
);
}
};

return (
<div className="flex flex-col w-full min-h-screen gap-8 py-10">
<div className="flex items-center justify-center h-[180px]">
<div className="flex flex-col gap-3 text-center">
<h1 className="text-xl font-medium text-[#393939]">๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ</h1>
<p className="text-[15px] font-normal text-[#828282]">
๊ฐ€์ž…ํ•˜์‹  ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ
<br />
๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žฌ์„ค์ •ํ•˜์‹ค ์ˆ˜ ์žˆ์–ด์š”
</p>
</div>
<div className="flex flex-col items-center w-full gap-6 pb-40">
<div className="flex flex-col gap-3 text-center">
<h1 className="text-xl font-medium text-[#393939]">๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ</h1>
<p className="text-sm font-normal text-[#828282]">
๊ฐ€์ž…ํ•˜์‹  ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ
<br />
๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žฌ์„ค์ •ํ•˜์‹ค ์ˆ˜ ์žˆ์–ด์š”
</p>
</div>

<div className="flex flex-col flex-grow w-full">
<div className="flex flex-col w-full">
<form
onSubmit={handleSubmit(onSubmit)}
className="flex flex-col w-full gap-4"
<form
onSubmit={handleSubmit(onSubmit)}
className="flex flex-col w-full gap-2 pt-4"
>
<Input
{...register("email")}
label="์ด๋ฉ”์ผ"
type="email"
placeholder="์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
error={errors.email?.message}
/>
<div className="mt-4">
<Button
type="submit"
variant="red"
size="large"
disabled={isSubmitting}
>
<Input
{...register("email")}
label="์ด๋ฉ”์ผ"
type="email"
placeholder="์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
error={errors.email?.message}
/>
<div className="mt-4">
<Button
type="submit"
variant="red"
size="large"
disabled={isSubmitting}
>
{isSubmitting ? "๋ฉ”์ผ ๋ฐœ์†ก ์ค‘..." : "๋ฉ”์ผ ๋ฐœ์†กํ•˜๊ธฐ"}
</Button>
</div>
</form>

<div className="flex flex-col items-center gap-2 mt-10 text-[13px] text-[#828282]">
<div className="flex items-center gap-4">
<span>๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ƒ๊ฐ๋‚ฌ์–ด์š”</span>
<Link
href="/auth/login"
className="font-medium text-[#494949] hover:underline"
>
๋กœ๊ทธ์ธ ํ•˜๊ธฐ
</Link>
</div>
<div className="flex items-center gap-4">
<span>๊ณ„์ •์ด ์•„์ง ์—†์–ด์š”</span>
<Link
href="/auth/signup"
className="font-medium text-[#494949] hover:underline"
>
ํšŒ์›๊ฐ€์ž…ํ•˜๊ธฐ
</Link>
</div>
</div>
{isSubmitting ? "๋ฉ”์ผ ๋ฐœ์†ก ์ค‘..." : "๋ฉ”์ผ ๋ฐœ์†กํ•˜๊ธฐ"}
</Button>
</div>
</form>

{apiError && (
<div className="mt-auto w-full h-[70px] flex items-center justify-center text-[15px] text-center text-white bg-[rgba(130,130,130,0.5)] rounded-[5px]">
{apiError}
</div>
)}
<div className="flex flex-col items-center gap-1 pt-1 text-[13px] text-[#828282]">

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

text-[13px] ์ด ๋ถ€๋ถ„๋งŒ rem๋‹จ์œ„๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”!

<div className="flex items-center gap-4">
<span>๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ƒ๊ฐ๋‚ฌ์–ด์š”</span>
<Link
href="/auth/login"
className="font-semibold text-[#494949] hover:underline"
>
๋กœ๊ทธ์ธ ํ•˜๊ธฐ
</Link>
</div>
<div className="flex items-center gap-4">
<span>๊ณ„์ •์ด ์•„์ง ์—†์–ด์š”</span>
<Link
href="/auth/signup"
className="font-semibold text-[#494949] hover:underline"
>
ํšŒ์›๊ฐ€์ž…ํ•˜๊ธฐ
</Link>
</div>
</div>

{apiError && (
<div className="w-full h-[70px] flex items-center justify-center text-sm text-center text-white bg-[rgba(130,130,130,0.5)] rounded-md mt-4 whitespace-pre-line">
{apiError}
</div>
)}
</div>
);
}
26 changes: 12 additions & 14 deletions omechu-app/src/app/auth/find-password/sent/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,20 @@ import Button from "@/app/components/auth/Button";

export default function FindPasswordEmailSentPage() {
return (
<div className="flex flex-col items-center w-full min-h-screen gap-8 px-5 py-10 text-center bg-[#F8F2FF]">
<div className="flex items-center justify-center flex-grow">
<div className="flex flex-col gap-3">
<h1 className="text-xl font-medium text-[#393939]">
๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ๋ฉ”์ผ์„ ๋ฐœ์†กํ–ˆ์–ด์š”
</h1>
<p className="text-[15px] font-normal text-[#828282]">
๋ณด๋‚ด๋“œ๋ฆฐ ๋ฉ”์ผ์„ ํ™•์ธํ•˜์‹  ํ›„,
<br />
๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋‹ค์‹œ ์„ค์ •ํ•ด ์ฃผ์„ธ์š”
</p>
</div>
<div className="flex flex-col items-center w-full gap-10 text-center pb-40">
<div className="flex flex-col gap-3">
<h1 className="text-xl font-medium text-[#393939]">
๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ๋ฉ”์ผ์„ ๋ฐœ์†กํ–ˆ์–ด์š”
</h1>
<p className="text-[15px] font-normal text-[#828282]">
๋ณด๋‚ด๋“œ๋ฆฐ ๋ฉ”์ผ์„ ํ™•์ธํ•˜์‹  ํ›„,
<br />
๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋‹ค์‹œ ์„ค์ •ํ•ด ์ฃผ์„ธ์š”
</p>
</div>
<div className="w-full">
<div className="w-full px-24">
<Link href="/auth/login" className="w-full">
<Button variant="red" size="large">
<Button variant="red" size="large" className="w-full rounded-full">
๋กœ๊ทธ์ธ ํ•˜๊ธฐ
</Button>
</Link>
Expand Down
2 changes: 1 addition & 1 deletion omechu-app/src/app/auth/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ export default function AuthLayout({
children: React.ReactNode;
}) {
return (
<div className="flex flex-col items-center justify-center min-h-screen bg-[#F8D5FF] px-4">
<div className="flex flex-col items-center justify-center min-h-screen">
<div className="w-full max-w-sm">{children}</div>
</div>
);
Expand Down
21 changes: 18 additions & 3 deletions omechu-app/src/app/auth/login/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import Input from "@/app/components/auth/Input";

export default function LoginPage() {
const [loginError, setLoginError] = useState<string | null>(null);
const [showPassword, setShowPassword] = useState(false);

const {
register,
Expand All @@ -25,7 +26,7 @@ export default function LoginPage() {
// ๊ฐ€์ƒ์˜ ๋กœ๊ทธ์ธ ์‹คํŒจ ์‹œ๋‚˜๋ฆฌ์˜ค
await new Promise((resolve) => setTimeout(resolve, 1000));
console.log(data);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋‚˜์ค‘์— ๋ฐฐํฌํ•˜๊ธฐ ์ „์—๋Š” console.log ์ง€์›Œ์ฃผ์…”๋„ ๋  ๊ฑฐ ๊ฐ™์•„์š”!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์•— ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์žํ•œํ…Œ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์€ ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋Š” toast ๊ณต์šฉ ์ปดํฌ๋„ŒํŠธ ํ™œ์šฉํ•ด๋„ ์ข‹์„ ๊ฑฐ ๊ฐ™์•„์š”!

setLoginError("์ด๋ฉ”์ผ ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
setLoginError("์ด๋ฉ”์ผ ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ \n ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
};

return (
Expand Down Expand Up @@ -54,9 +55,23 @@ export default function LoginPage() {
<Input
{...register("password")}
label="๋น„๋ฐ€๋ฒˆํ˜ธ"
type="password"
type={showPassword ? "text" : "password"}
placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
error={errors.password?.message}
rightAddon={
<button
type="button"
onClick={() => setShowPassword(!showPassword)}
className="p-2"
>
<Image
src={showPassword ? "/๋น„๋ฐ€๋ฒˆํ˜ธ๋ณด๊ธฐ.svg" : "/mdi-light_eye.svg"}
alt="toggle password visibility"
width={24}
height={24}
/>
</button>
}
/>

<div className="mt-4">
Expand Down Expand Up @@ -109,7 +124,7 @@ export default function LoginPage() {
</Button>

{loginError && (
<div className="w-full h-[70px] flex items-center justify-center text-center text-white bg-[rgba(130,130,130,0.5)] rounded-md mt-4">
<div className="w-full h-[70px] flex items-center justify-center text-sm text-center text-white bg-[rgba(130,130,130,0.5)] rounded-md mt-4 whitespace-pre-line">
{loginError}
</div>
)}
Expand Down
134 changes: 134 additions & 0 deletions omechu-app/src/app/auth/reset-password/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
"use client";

import { useState } from "react";
import { useRouter } from "next/navigation";
import Image from "next/image";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import {
resetPasswordSchema,
ResetPasswordFormValues,
} from "@/lib/schemas/auth.schema";
import Button from "@/app/components/auth/Button";
import Input from "@/app/components/auth/Input";
import AlertModal from "@/app/components/auth/AlertModal";

export default function ResetPasswordPage() {
const [showPassword, setShowPassword] = useState(false);
const [showPasswordConfirm, setShowPasswordConfirm] = useState(false);
const [isModalOpen, setIsModalOpen] = useState(false);
const router = useRouter();

const {
register,
handleSubmit,
formState: { errors, isSubmitting },
} = useForm<ResetPasswordFormValues>({
resolver: zodResolver(resetPasswordSchema),
});

const onSubmit = async (data: ResetPasswordFormValues) => {
console.log(data);
await new Promise((resolve) => setTimeout(resolve, 1000));
setIsModalOpen(true);
};

const handleModalConfirm = () => {
setIsModalOpen(false);
router.push("/auth/login");
};

return (
<>
<div className="flex flex-col items-center w-full gap-8">
<div className="flex flex-col gap-3 text-center">
<h1 className="text-xl font-medium text-[#393939]">
๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ •
</h1>
<p className="text-sm font-normal text-[#828282]">
์‚ฌ์šฉํ•˜์‹ค ์ƒˆ๋กœ์šด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•ด ์ฃผ์„ธ์š”
</p>
</div>

<form
onSubmit={handleSubmit(onSubmit)}
className="flex flex-col w-full gap-2"
>
<Input
{...register("password")}
label="์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ"
type={showPassword ? "text" : "password"}
placeholder="โ—โ—โ—โ—โ—โ—"
error={errors.password?.message}
rightAddon={
<button
type="button"
onClick={() => setShowPassword(!showPassword)}
className="p-2"
>
<Image
src={
showPassword ? "/๋น„๋ฐ€๋ฒˆํ˜ธ๋ณด๊ธฐ.svg" : "/mdi-light_eye.svg"
}
alt="toggle password visibility"
width={24}
height={24}
/>
</button>
}
/>
<p className="text-xs text-[#828282] mt-1 -translate-y-2">
* ๋Œ€์†Œ๋ฌธ์ž, ์ˆซ์ž ๋ฐ ํŠน์ˆ˜๋ฌธ์ž ํฌํ•จ 8์ž ์ด์ƒ
</p>

<div className="mt-2">
<Input
{...register("passwordConfirm")}
label="์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌํ™•์ธ"
type={showPasswordConfirm ? "text" : "password"}
placeholder="์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
error={errors.passwordConfirm?.message}
rightAddon={
<button
type="button"
onClick={() => setShowPasswordConfirm(!showPasswordConfirm)}
className="p-2"
>
<Image
src={
showPasswordConfirm
? "/๋น„๋ฐ€๋ฒˆํ˜ธ๋ณด๊ธฐ.svg"
: "/mdi-light_eye.svg"
}
alt="toggle password visibility"
width={24}
height={24}
/>
</button>
}
/>
</div>

<div className="mt-8">
<Button
type="submit"
variant="red"
size="large"
disabled={isSubmitting}
className="w-full"
>
{isSubmitting ? "์„ค์ • ์ค‘..." : "๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ •ํ•˜๊ธฐ"}
</Button>
</div>
</form>
</div>
{isModalOpen && (
<AlertModal
title="๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žฌ์„ค์ •ํ–ˆ์–ด์š”"
message="์ƒˆ๋กœ์šด ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธํ•˜์„ธ์š”"
onConfirm={handleModalConfirm}
/>
)}
</>
);
}
Loading