From e55765160068792c849cb1e4223d3233085a605b Mon Sep 17 00:00:00 2001 From: JAESEON PARK Date: Tue, 3 Feb 2026 00:53:10 +0900 Subject: [PATCH 1/9] =?UTF-8?q?fix:=EB=A7=88=EC=9D=B4=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EC=97=90=EC=84=9C=20=EB=92=A4=EB=A1=9C=EA=B0=80?= =?UTF-8?q?=EA=B8=B0=20=EC=9E=91=EB=8F=99=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/myPage/myPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/myPage/myPage.tsx b/src/pages/myPage/myPage.tsx index edf6d51..80edcf8 100644 --- a/src/pages/myPage/myPage.tsx +++ b/src/pages/myPage/myPage.tsx @@ -11,7 +11,7 @@ export default function MyPage() { return ( }> - } /> + } /> } /> } /> } /> From c6b9051a22de6dcf90c5007f914e85c3f4560756 Mon Sep 17 00:00:00 2001 From: JAESEON PARK Date: Tue, 3 Feb 2026 01:05:26 +0900 Subject: [PATCH 2/9] =?UTF-8?q?chore:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=83=81=EB=8B=A8=EC=97=90=20=EC=A0=9C?= =?UTF-8?q?=EB=AA=A9=20=EC=84=A0=ED=83=9D=EC=8B=9C=20=ED=99=88=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EA=B0=80=EB=8F=84=EB=A1=9D=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/layouts/myPageLayout.tsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/layouts/myPageLayout.tsx b/src/layouts/myPageLayout.tsx index d9340d2..06b24c7 100644 --- a/src/layouts/myPageLayout.tsx +++ b/src/layouts/myPageLayout.tsx @@ -1,4 +1,4 @@ -import { Outlet, NavLink } from "react-router-dom"; +import { Outlet, NavLink, Link } from "react-router-dom"; import { Calendar, CreditCard, @@ -24,10 +24,13 @@ export default function MyPageLayout() { {/* Header */}
-
- 잇츠파인 Eatsfine -
-
From f5ff9ad06fab53150ba36452a51a65a0ef908d56 Mon Sep 17 00:00:00 2001 From: JAESEON PARK Date: Tue, 3 Feb 2026 01:21:26 +0900 Subject: [PATCH 3/9] =?UTF-8?q?style:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=95=88=20=EB=82=B4=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EB=B6=80=EB=B6=84=20=EB=94=94=EC=9E=90=EC=9D=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/myPage/myInfoPage.tsx | 67 ++++++++++++++------------------- 1 file changed, 28 insertions(+), 39 deletions(-) diff --git a/src/pages/myPage/myInfoPage.tsx b/src/pages/myPage/myInfoPage.tsx index d21fda3..02093c9 100644 --- a/src/pages/myPage/myInfoPage.tsx +++ b/src/pages/myPage/myInfoPage.tsx @@ -21,14 +21,14 @@ export default function MyInfoPage() { }; const handleImageChange = (e: React.ChangeEvent) => { - const file = e.target.files?.[0]; - if (!file) return; + const file = e.target.files?.[0]; + if (!file) return; - const previewUrl = URL.createObjectURL(file); - setProfileImage(previewUrl); + const previewUrl = URL.createObjectURL(file); + setProfileImage(previewUrl); - // TODO: 서버 업로드용 file은 따로 저장해도 됨 -}; + // TODO: 서버 업로드용 file은 따로 저장해도 됨 + }; const handleSave = () => { // TODO: API 호출 @@ -49,26 +49,24 @@ export default function MyInfoPage() { {!isEditing ? ( ) : ( -
+
)} @@ -78,45 +76,42 @@ export default function MyInfoPage() {
{/* avatar */}
-
+
{profileImage ? ( - 프로필 이미지 + /> ) : ( - + )} -
+
- {isEditing && ( + {isEditing && ( <> - - + + /> - )} + )}
- {/* form */}
{/* 아이디 */}
- + - + - + - + Date: Tue, 3 Feb 2026 01:27:50 +0900 Subject: [PATCH 4/9] =?UTF-8?q?fix:=20=EC=A0=84=ED=99=94=EB=B2=88=ED=98=B8?= =?UTF-8?q?=EC=97=90=20number=ED=83=80=EC=9E=85=EB=A7=8C=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EB=90=98=EB=8F=84=EB=A1=9D=20phoneNumber=ED=95=A8?= =?UTF-8?q?=EC=88=98=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/myPage/myInfoPage.tsx | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/pages/myPage/myInfoPage.tsx b/src/pages/myPage/myInfoPage.tsx index 02093c9..89b2d98 100644 --- a/src/pages/myPage/myInfoPage.tsx +++ b/src/pages/myPage/myInfoPage.tsx @@ -1,3 +1,4 @@ +import { phoneNumber } from "@/utils/phoneNumber"; import { Camera, Save } from "lucide-react"; import { useRef, useState } from "react"; @@ -30,8 +31,17 @@ export default function MyInfoPage() { // TODO: 서버 업로드용 file은 따로 저장해도 됨 }; + const isValidPhone = (value: string) => { + const digits = value.replace(/\D/g, ""); + return digits.length === 10 || digits.length === 11; + }; + const handleSave = () => { // TODO: API 호출 + if (!isValidPhone(form.phone)) { + alert("전화번호를 올바르게 입력해주세요."); + return; + } setIsEditing(false); }; @@ -158,7 +168,11 @@ export default function MyInfoPage() { handleChange("phone", e.target.value)} + onChange={(e) => + handleChange("phone", phoneNumber(e.target.value)) + } + inputMode="numeric" + autoComplete="tel" className={`w-full rounded-lg border px-4 py-3 text-md ${ isEditing ? "border-gray-300 bg-white" From bfdf50203d2bf64d3169cd641a72a8fe91699c21 Mon Sep 17 00:00:00 2001 From: JAESEON PARK Date: Tue, 3 Feb 2026 01:44:13 +0900 Subject: [PATCH 5/9] =?UTF-8?q?fix:=20=EB=82=B4=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=EA=B0=80=EB=8A=A5=ED=95=9C=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=93=A4=20=EC=B7=A8=EC=86=8C=20=EB=88=84=EB=A5=BC?= =?UTF-8?q?=EC=8B=9C=20=EC=9B=90=EC=83=81=EB=B3=B5=EA=B5=AC=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=ED=95=98=EB=8F=84=EB=A1=9D=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/myPage/myInfoPage.tsx | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/pages/myPage/myInfoPage.tsx b/src/pages/myPage/myInfoPage.tsx index 89b2d98..0d0817e 100644 --- a/src/pages/myPage/myInfoPage.tsx +++ b/src/pages/myPage/myInfoPage.tsx @@ -2,19 +2,30 @@ import { phoneNumber } from "@/utils/phoneNumber"; import { Camera, Save } from "lucide-react"; import { useRef, useState } from "react"; +type Form = { + email: string; + nickname: string; + phone: string; +}; + export default function MyInfoPage() { const [isEditing, setIsEditing] = useState(false); const fileInputRef = useRef(null); const [profileImage, setProfileImage] = useState(null); - - const [form, setForm] = useState({ + const [original, setOriginal] = useState
({ email: "user@example.com", nickname: "맛있는유저", phone: "010-1234-5678", }); + const [draft, setDraft] = useState(original); + + const handleEditStart = () => { + setDraft(original); + setIsEditing(true); + }; - const handleChange = (key: keyof typeof form, value: string) => { - setForm((prev) => ({ ...prev, [key]: value })); + const handleChange = (key: keyof Form, value: string) => { + setDraft((prev) => ({ ...prev, [key]: value })); }; const handleImageClick = () => { @@ -38,15 +49,17 @@ export default function MyInfoPage() { const handleSave = () => { // TODO: API 호출 - if (!isValidPhone(form.phone)) { + if (!isValidPhone(draft.phone)) { alert("전화번호를 올바르게 입력해주세요."); return; } + // TODO: API 성공후 + setOriginal(draft); setIsEditing(false); }; const handleCancel = () => { - // TODO: 원래 값으로 롤백하고 싶으면 여기서 처리 + setDraft(original); setIsEditing(false); }; @@ -58,7 +71,7 @@ export default function MyInfoPage() { {!isEditing ? (
@@ -48,8 +46,8 @@ export default function SettingsPage() {
-

알림 설정

-

+

알림 설정

+

받고 싶은 알림을 선택하세요

@@ -76,18 +74,14 @@ export default function SettingsPage() {
-

- 알림 수신 방법 -

-
- 이메일 +

알림 수신 방법

+
+ 이메일 toggleNotification("email")} /> -
-
- SMS + SMS toggleNotification("sms")} @@ -95,7 +89,7 @@ export default function SettingsPage() {
-
@@ -108,12 +102,12 @@ export default function SettingsPage() {
-

계정 탈퇴

-

+

계정 탈퇴

+

계정을 삭제하면 모든 데이터가 영구적으로 삭제됩니다

-
@@ -138,7 +132,7 @@ function ToggleButton({ return (
-

{label}

+

{label}

{description}

From 971a7a8503f20f07c2705542c6403ae9f40f6e5d Mon Sep 17 00:00:00 2001 From: JAESEON PARK Date: Tue, 3 Feb 2026 02:28:25 +0900 Subject: [PATCH 8/9] =?UTF-8?q?style:=20myInfoPage=20=EB=82=B4=EC=97=90=20?= =?UTF-8?q?text-md=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/myPage/myInfoPage.tsx | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/pages/myPage/myInfoPage.tsx b/src/pages/myPage/myInfoPage.tsx index b6e5b00..6be9068 100644 --- a/src/pages/myPage/myInfoPage.tsx +++ b/src/pages/myPage/myInfoPage.tsx @@ -85,12 +85,12 @@ export default function MyInfoPage() {
{/* title */}
-

내 정보

+

내 정보

{!isEditing ? ( @@ -98,7 +98,7 @@ export default function MyInfoPage() {
@@ -152,11 +152,11 @@ export default function MyInfoPage() {
{/* 아이디 */}
- +

아이디는 변경할 수 없습니다 @@ -165,12 +165,12 @@ export default function MyInfoPage() { {/* 이메일 */}

- + handleChange("email", e.target.value)} - className={`w-full rounded-lg border px-4 py-3 text-md ${ + className={`w-full rounded-lg border px-4 py-3 ${ isEditing ? "border-gray-300 bg-white" : "border-gray-200 bg-gray-50 text-gray-500" @@ -180,12 +180,12 @@ export default function MyInfoPage() { {/* 닉네임 */}
- + handleChange("nickname", e.target.value)} - className={`w-full rounded-lg border px-4 py-3 text-md ${ + className={`w-full rounded-lg border px-4 py-3 ${ isEditing ? "border-gray-300 bg-white" : "border-gray-200 bg-gray-50 text-gray-500" @@ -195,7 +195,7 @@ export default function MyInfoPage() { {/* 전화번호 */}
- + Date: Tue, 3 Feb 2026 03:26:27 +0900 Subject: [PATCH 9/9] =?UTF-8?q?style:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=8A=A4=ED=83=80=EC=9D=BC=ED=86=B5?= =?UTF-8?q?=EC=9D=BC=20=EB=B0=8F=20text=EC=9C=84=EC=B9=98=ED=86=B5?= =?UTF-8?q?=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/myPage/myInfoPage.tsx | 9 +- src/pages/myPage/paymentPage.tsx | 39 +++--- src/pages/myPage/reservationPage.tsx | 41 +++---- src/pages/myPage/settingPage.tsx | 164 +++++++++++++------------- src/pages/myPage/storePage.tsx | 44 +++---- src/pages/myPage/subscriptionPage.tsx | 4 +- 6 files changed, 142 insertions(+), 159 deletions(-) diff --git a/src/pages/myPage/myInfoPage.tsx b/src/pages/myPage/myInfoPage.tsx index 6be9068..c981e30 100644 --- a/src/pages/myPage/myInfoPage.tsx +++ b/src/pages/myPage/myInfoPage.tsx @@ -80,17 +80,16 @@ export default function MyInfoPage() { setDraftImageFile(originalImageFile); setIsEditing(false); }; - return ( -
+
{/* title */} -
-

내 정보

+
+

내 정보

{!isEditing ? ( diff --git a/src/pages/myPage/paymentPage.tsx b/src/pages/myPage/paymentPage.tsx index 686e508..73f1249 100644 --- a/src/pages/myPage/paymentPage.tsx +++ b/src/pages/myPage/paymentPage.tsx @@ -5,7 +5,7 @@ import PaymentAddModal from "@/components/modals/paymentAddModal"; interface PaymentMethod { id: string; - type: "easy-pay"; + type: "간편결제"; name: string; detail: string; isDefault: boolean; @@ -16,7 +16,7 @@ export default function PaymentPage() { const [methods, setMethods] = useState([ { id: "1", - type: "easy-pay", + type: "간편결제", name: "카카오페이", detail: "", isDefault: false, @@ -41,20 +41,20 @@ export default function PaymentPage() { const [isModalOpen, setIsModalOpen] = useState(false); return ( -
+
{/* 헤더 영역 */}
-

결제수단 관리

-

+

결제수단 관리

+

예약 시 사용할 결제수단을 관리하세요

@@ -65,10 +65,10 @@ export default function PaymentPage() {
@@ -80,7 +80,7 @@ export default function PaymentPage() { {/* 정보 영역 */}
- {method.name} + {method.name} {method.detail} {method.isDefault && ( @@ -88,7 +88,7 @@ export default function PaymentPage() { )}
-

간편결제

+

{method.type}

@@ -97,26 +97,27 @@ export default function PaymentPage() { {!method.isDefault && ( )}
))}
- - setIsModalOpen(false)} - /> + {isModalOpen && ( + setIsModalOpen(false)} + /> + )} {methods.length === 0 && (
diff --git a/src/pages/myPage/reservationPage.tsx b/src/pages/myPage/reservationPage.tsx index 2dd82dc..dd5ce56 100644 --- a/src/pages/myPage/reservationPage.tsx +++ b/src/pages/myPage/reservationPage.tsx @@ -70,8 +70,8 @@ export default function ReservationPage() { return (
-

예약 현황

-

+

예약 현황

+

내 예약 내역을 확인하고 관리하세요

@@ -83,10 +83,8 @@ export default function ReservationPage() { key={tab} onClick={() => setActiveTab(tab as ReservationStatus)} className={cn( - "cursor-pointer pb-4 text-sm font-medium transition-all relative", - activeTab === tab - ? "text-blue-600" - : "text-gray-800 hover:text-gray-600", + "cursor-pointer pb-4 font-medium transition-all relative", + activeTab === tab ? "text-blue-600" : "hover:text-gray-700", )} > {tab} @@ -107,11 +105,11 @@ export default function ReservationPage() { >
-
-

{res.shopName}

+
+

{res.shopName}

-

{res.address}

+

{res.address}

@@ -156,7 +154,7 @@ export default function ReservationPage() {
{res.step} -
+
{res.status === "예약 확정" && ( <> - - )} {res.status === "방문 완료" && ( - )} @@ -210,13 +208,8 @@ function InfoItem({
{icon}
-

{label}

-

+

{label}

+

{value}

diff --git a/src/pages/myPage/settingPage.tsx b/src/pages/myPage/settingPage.tsx index b57f354..132e03c 100644 --- a/src/pages/myPage/settingPage.tsx +++ b/src/pages/myPage/settingPage.tsx @@ -17,103 +17,101 @@ export default function SettingsPage() { }; return ( -
-
-

계정 설정

+
+

계정 설정

- {/* 비밀번호 변경 섹션 */} -
-
- -
-
-
-

비밀번호 변경

-

- 정기적인 비밀번호 변경으로 계정을 안전하게 보호하세요 -

-
- + {/* 비밀번호 변경 섹션 */} +
+
+ +
+
+
+

비밀번호 변경

+

+ 정기적인 비밀번호 변경으로 계정을 안전하게 보호하세요 +

+ +
+
+ + {/* 알림 설정 섹션 */} +
+
+
+
+
+

알림 설정

+

+ 받고 싶은 알림을 선택하세요 +

+
- {/* 알림 설정 섹션 */} -
-
- +
+ toggleNotification("reservation")} + /> + toggleNotification("promotion")} + /> + toggleNotification("review")} + />
-
-
-

알림 설정

-

- 받고 싶은 알림을 선택하세요 -

-
-
- toggleNotification("reservation")} +
+

알림 수신 방법

+
+ 이메일 + toggleNotification("email")} /> - toggleNotification("promotion")} - /> - toggleNotification("review")} + SMS + toggleNotification("sms")} />
- -
-

알림 수신 방법

-
- 이메일 - toggleNotification("email")} - /> - SMS - toggleNotification("sms")} - /> -
-
- -
+ +
+
- {/* 계정 탈퇴 섹션 */} -
-
- -
-
-
-

계정 탈퇴

-

- 계정을 삭제하면 모든 데이터가 영구적으로 삭제됩니다 -

-
- + {/* 계정 탈퇴 섹션 */} +
+
+ +
+
+
+

계정 탈퇴

+

+ 계정을 삭제하면 모든 데이터가 영구적으로 삭제됩니다 +

+
-
-
+
+
); } diff --git a/src/pages/myPage/storePage.tsx b/src/pages/myPage/storePage.tsx index 904e214..75e558b 100644 --- a/src/pages/myPage/storePage.tsx +++ b/src/pages/myPage/storePage.tsx @@ -73,14 +73,14 @@ export default function StorePage() {
-

내 가게 관리

-

+

내 가게 관리

+

등록한 식당을 관리하고 대시보드로 이동하세요

새 가게 등록 @@ -119,10 +119,10 @@ export default function StorePage() {
-

{shop.name}

+

{shop.name}

-

{shop.address}

- +

{shop.address}

+ {shop.category}
@@ -147,18 +147,14 @@ export default function StorePage() { {shop.status !== "승인 대기" && (
-

+

총 예약

-

- {shop.totalReservations} -

+

{shop.totalReservations}

-

- 평점 -

-

+

평점

+

-

- 리뷰 -

-

{shop.reviews}

+

리뷰

+

{shop.reviews}

)} @@ -178,7 +172,7 @@ export default function StorePage() { {/* 승인 대기 알림창: 승인 대기일 때만 표시 */} {shop.status === "승인 대기" && shop.notice && (
-

+

{shop.notice}

@@ -194,16 +188,14 @@ export default function StorePage() {
-

- 더 많은 데이터가 필요하신가요? -

-

+

더 많은 데이터가 필요하신가요?

+

프리미엄 플랜으로 업그레이드하고 AI 데이터 인사이트, 상세 분석 리포트를 받아보세요.

-
diff --git a/src/pages/myPage/subscriptionPage.tsx b/src/pages/myPage/subscriptionPage.tsx index c31b2ee..3b4c39e 100644 --- a/src/pages/myPage/subscriptionPage.tsx +++ b/src/pages/myPage/subscriptionPage.tsx @@ -93,8 +93,8 @@ export default function SubscriptionPage() { return (
-

구독 관리

-

+

구독 관리

+

나에게 맞는 플랜을 선택하세요