From c098d452951b5285c2ec20a690557cca73b08164 Mon Sep 17 00:00:00 2001 From: ZUITOPIA Date: Wed, 18 Dec 2024 18:34:23 +0900 Subject: [PATCH 01/10] =?UTF-8?q?fix:=20=EB=B0=98=EB=A0=A4=EA=B2=AC=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=95=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/svg/female-icon.svg | 16 +++++++++ public/svg/male_icon.svg | 14 ++++++++ src/assets/svg/FemaleIcon.tsx | 13 +++++++ src/assets/svg/MaleIcon.tsx | 13 +++++++ src/assets/svg/index.ts | 34 ++++++++++--------- .../ProfileImg/ProfileImg.styles.ts | 1 + .../customer/pet/info/components/Gender.tsx | 5 +-- .../info/components/OptionButton.styles.ts | 4 ++- src/pages/customer/pet/info/index.styles.ts | 18 +++++----- 9 files changed, 90 insertions(+), 28 deletions(-) create mode 100644 public/svg/female-icon.svg create mode 100644 public/svg/male_icon.svg create mode 100644 src/assets/svg/FemaleIcon.tsx create mode 100644 src/assets/svg/MaleIcon.tsx diff --git a/public/svg/female-icon.svg b/public/svg/female-icon.svg new file mode 100644 index 00000000..fb12cce6 --- /dev/null +++ b/public/svg/female-icon.svg @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/public/svg/male_icon.svg b/public/svg/male_icon.svg new file mode 100644 index 00000000..67adbb5c --- /dev/null +++ b/public/svg/male_icon.svg @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/src/assets/svg/FemaleIcon.tsx b/src/assets/svg/FemaleIcon.tsx new file mode 100644 index 00000000..14ece5ac --- /dev/null +++ b/src/assets/svg/FemaleIcon.tsx @@ -0,0 +1,13 @@ +import * as React from "react"; +import type { SVGProps } from "react"; +const SvgFemaleIcon = (props: SVGProps) => ( + + + +); +export default SvgFemaleIcon; diff --git a/src/assets/svg/MaleIcon.tsx b/src/assets/svg/MaleIcon.tsx new file mode 100644 index 00000000..8f730c7f --- /dev/null +++ b/src/assets/svg/MaleIcon.tsx @@ -0,0 +1,13 @@ +import * as React from "react"; +import type { SVGProps } from "react"; +const SvgMaleIcon = (props: SVGProps) => ( + + + +); +export default SvgMaleIcon; diff --git a/src/assets/svg/index.ts b/src/assets/svg/index.ts index 3e311038..8a2c356f 100644 --- a/src/assets/svg/index.ts +++ b/src/assets/svg/index.ts @@ -1,32 +1,21 @@ -export { default as AddImage } from "./AddImage"; export { default as AppBarBack } from "./AppBarBack"; export { default as Arrow } from "./Arrow"; export { default as Auth } from "./Auth"; export { default as BabyCut } from "./BabyCut"; export { default as BirthDay } from "./BirthDay"; -export { default as Bookmark } from "./Bookmark"; -export { default as Calendar } from "./Calendar"; -export { default as Camera } from "./Camera"; export { default as CareerIcon } from "./CareerIcon"; -export { default as Check } from "./Check"; export { default as CheckIcon2 } from "./CheckIcon2"; export { default as Circle } from "./Circle"; export { default as Clean } from "./Clean"; -export { default as Clock } from "./Clock"; -export { default as DefaultProfile } from "./DefaultProfile"; export { default as DownArrow } from "./DownArrow"; export { default as DropDown } from "./DropDown"; export { default as EarsPop } from "./EarsPop"; export { default as EggHead } from "./EggHead"; -export { default as Favicon } from "./Favicon"; export { default as Firework } from "./Firework"; export { default as Goddess } from "./Goddess"; export { default as HeartTag } from "./HeartTag"; export { default as Helmet } from "./Helmet"; -export { default as Home } from "./Home"; -export { default as Letter } from "./Letter"; export { default as LionCut } from "./LionCut"; -export { default as Logo } from "./Logo"; export { default as Maker } from "./Maker"; export { default as Medal } from "./Medal"; export { default as MoneyTag } from "./MoneyTag"; @@ -34,10 +23,7 @@ export { default as Mypage } from "./Mypage"; export { default as NoneComfirm } from "./NoneComfirm"; export { default as NoneQuote } from "./NoneQuote"; export { default as NoneRequset } from "./NoneRequset"; -export { default as Payment } from "./Payment"; -export { default as Pen } from "./Pen"; export { default as PetProfile } from "./PetProfile"; -export { default as Pin } from "./Pin"; export { default as PinTag } from "./PinTag"; export { default as QuoteTag } from "./QuoteTag"; export { default as RedSpeaker } from "./RedSpeaker"; @@ -46,7 +32,6 @@ export { default as Right } from "./Right"; export { default as Schedule } from "./Schedule"; export { default as ScissorsIcon } from "./ScissorsIcon"; export { default as SealCut } from "./SealCut"; -export { default as Search } from "./Search"; export { default as SelectIcon } from "./SelectIcon"; export { default as Shop } from "./Shop"; export { default as ShopHome } from "./ShopHome"; @@ -54,7 +39,6 @@ export { default as ShopMaker } from "./ShopMaker"; export { default as ShopPay } from "./ShopPay"; export { default as ShopTel } from "./ShopTel"; export { default as ShopTime } from "./ShopTime"; -export { default as Smile } from "./Smile"; export { default as Star } from "./Star"; export { default as StarBlue } from "./StarBlue"; export { default as StarGray } from "./StarGray"; @@ -62,4 +46,22 @@ export { default as Status } from "./Status"; export { default as TeddyCut } from "./TeddyCut"; export { default as TeddyTag } from "./TeddyTag"; export { default as UpArrow } from "./UpArrow"; +export { default as AddImage } from "./AddImage"; +export { default as Bookmark } from "./Bookmark"; +export { default as Calendar } from "./Calendar"; +export { default as Camera } from "./Camera"; +export { default as Check } from "./Check"; +export { default as Clock } from "./Clock"; +export { default as DefaultProfile } from "./DefaultProfile"; +export { default as Favicon } from "./Favicon"; +export { default as FemaleIcon } from "./FemaleIcon"; +export { default as Home } from "./Home"; +export { default as Letter } from "./Letter"; +export { default as Logo } from "./Logo"; +export { default as MaleIcon } from "./MaleIcon"; +export { default as Payment } from "./Payment"; +export { default as Pen } from "./Pen"; +export { default as Pin } from "./Pin"; +export { default as Search } from "./Search"; +export { default as Smile } from "./Smile"; export { default as Warning } from "./Warning"; diff --git a/src/components/profile-img/ProfileImg/ProfileImg.styles.ts b/src/components/profile-img/ProfileImg/ProfileImg.styles.ts index 09e066d9..0c7abbf8 100644 --- a/src/components/profile-img/ProfileImg/ProfileImg.styles.ts +++ b/src/components/profile-img/ProfileImg/ProfileImg.styles.ts @@ -14,6 +14,7 @@ export const StyleProfileImg = { display: flex; justify-content: center; position: relative; + margin: 20px 0; `, RoundImg: styled.img` width: ${(props) => (props.width ? props.width : "100%")}; diff --git a/src/pages/customer/pet/info/components/Gender.tsx b/src/pages/customer/pet/info/components/Gender.tsx index 69e2b8d0..ddc5d3dc 100644 --- a/src/pages/customer/pet/info/components/Gender.tsx +++ b/src/pages/customer/pet/info/components/Gender.tsx @@ -1,4 +1,5 @@ import { IoIosFemale, IoIosMale } from "react-icons/io"; +import { FemaleIcon, MaleIcon } from "../../../../../assets/svg"; interface GenderProps { gender: string; @@ -6,8 +7,8 @@ interface GenderProps { export default function Gender({ gender }: GenderProps) { if (gender == "M") { - return ; + return ; } else { - return ; + return ; } } diff --git a/src/pages/customer/pet/info/components/OptionButton.styles.ts b/src/pages/customer/pet/info/components/OptionButton.styles.ts index ebf1d920..50ef8337 100644 --- a/src/pages/customer/pet/info/components/OptionButton.styles.ts +++ b/src/pages/customer/pet/info/components/OptionButton.styles.ts @@ -5,12 +5,14 @@ export const GridWrapper = styled.div` display: flex; gap: 5px; align-items: center; + justify-content: space-between; margin-top: 20px; + width: 100%; `; export const ButtonStyle = styled.button<{ selected: boolean }>` padding: 12px 24px; - width: 200px; + width: 100%; height: 48px; border: 1px solid ${({ selected }) => (selected ? `${colors.white}` : `${colors.gray300}`)}; diff --git a/src/pages/customer/pet/info/index.styles.ts b/src/pages/customer/pet/info/index.styles.ts index 7a636b44..bafd09af 100644 --- a/src/pages/customer/pet/info/index.styles.ts +++ b/src/pages/customer/pet/info/index.styles.ts @@ -1,36 +1,36 @@ import { styled } from "styled-components"; -import { typography } from "../../../../style/typography"; import { colors } from "../../../../style/color"; +import theme from "../../../../style/theme"; export const PageWrapper = styled.div` - display: flex; - flex-direction: column; - align-items: center; padding-top: 60px; + height: calc(100vh - ${theme.size.gnbHeight}); `; export const ContentWrapper = styled.div` display: flex; flex-direction: column; align-items: center; - gap: 5px 5px; + justify-content: center; `; export const ButtonWrapper = styled.div` - margin-top: 30px; + width: 100%; + display: flex; + justify-content: space-between; `; export const MyInfoWrapper = styled.div` display: flex; align-items: center; justify-content: center; - gap: 5px; + gap: 8px; `; export const InfoWrapper = styled.div` - width: 410px; + width: 100%; min-height: 50px; - margin-top: 20px; + margin-top: 100px; background-color: ${colors.blue300}; display: flex; flex-direction: column; From 1419ca84b82189a95b5217bdfc5b231ced222016 Mon Sep 17 00:00:00 2001 From: ZUITOPIA Date: Wed, 18 Dec 2024 20:18:16 +0900 Subject: [PATCH 02/10] =?UTF-8?q?fix:=20=EC=9A=94=EC=B2=AD=ED=95=98?= =?UTF-8?q?=EA=B8=B0=EC=97=90=EC=84=9C=20=EC=97=90=EB=94=94=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EC=A0=9C=EA=B1=B0,=20=EA=B0=80=EA=B2=8C=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=9D=B4=EB=A6=84=20=ED=81=B4?= =?UTF-8?q?=EB=A6=AD=ED=96=88=EC=9D=84=EB=95=8C=EB=A7=8C=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=9D=B4=EB=8F=99=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0,=20=EA=B0=80=EA=B2=8C=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=EB=93=A4=EC=97=90=20space-evenly=20=EC=A3=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/components/DesignerListItem/index.styles.ts | 4 +++- .../components/search/components/DesignerListItem/index.tsx | 4 ++-- src/pages/customer/request/components/search/index.tsx | 2 -- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pages/customer/request/components/search/components/DesignerListItem/index.styles.ts b/src/pages/customer/request/components/search/components/DesignerListItem/index.styles.ts index 713fd9f9..48390702 100644 --- a/src/pages/customer/request/components/search/components/DesignerListItem/index.styles.ts +++ b/src/pages/customer/request/components/search/components/DesignerListItem/index.styles.ts @@ -61,6 +61,8 @@ export const Thumbnail = styled.img` export const Details = styled.div` display: flex; flex-direction: column; + justify-content: space-evenly; + height: 90px; line-height: 1.3; `; @@ -72,10 +74,10 @@ export const RatingWrapper = styled.div` export const BadgeWrapper = styled.div` display: flex; gap: 5px; + height: 20px; `; export const ContentsWrapper = styled.div` display: flex; gap: 20px; - align-items: center; `; diff --git a/src/pages/customer/request/components/search/components/DesignerListItem/index.tsx b/src/pages/customer/request/components/search/components/DesignerListItem/index.tsx index 2d26ecec..c952fca2 100644 --- a/src/pages/customer/request/components/search/components/DesignerListItem/index.tsx +++ b/src/pages/customer/request/components/search/components/DesignerListItem/index.tsx @@ -40,13 +40,13 @@ export default function DesignerItem({ onClick, }: DesignerItemProps) { return ( - + {isSelecting && ( )} - +
{name} diff --git a/src/pages/customer/request/components/search/index.tsx b/src/pages/customer/request/components/search/index.tsx index 36922a6c..4c4eb287 100644 --- a/src/pages/customer/request/components/search/index.tsx +++ b/src/pages/customer/request/components/search/index.tsx @@ -8,7 +8,6 @@ import { ContentWrapper, DesignerList, FilterWrapper, - InfoBox, LocationInfo, LocationWrapper, SelectButton, @@ -126,7 +125,6 @@ export default function Search({ onNext, handleArrayChange }: SearchStepProps) { <> - 에디 From 612d68f875795ccfa7c2dc1306bba49b4b8a9056 Mon Sep 17 00:00:00 2001 From: ZUITOPIA Date: Wed, 18 Dec 2024 20:20:11 +0900 Subject: [PATCH 03/10] =?UTF-8?q?fix:=20=EB=B0=98=EB=A0=A4=EA=B2=AC=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=95=84=EC=9D=B4=ED=85=9C=EB=93=A4=20?= =?UTF-8?q?=EB=86=92=EC=9D=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/cards/Card/Card.styles.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/cards/Card/Card.styles.ts b/src/components/cards/Card/Card.styles.ts index b8f5539a..20623474 100644 --- a/src/components/cards/Card/Card.styles.ts +++ b/src/components/cards/Card/Card.styles.ts @@ -10,7 +10,7 @@ export const CardWrapper = styled.div<{ ? `1px solid ${colors.blue200}` : `1px solid ${colors.background}`}; border-radius: 15px; - padding: 16px 22px; + padding-left: 20px; background-color: ${({ isSelected, disabled }) => disabled ? colors.gray200 : isSelected ? colors.blue300 : colors.white}; display: flex; From 6146e4199e4d7ee61186196fed34ce1890db0793 Mon Sep 17 00:00:00 2001 From: ZUITOPIA Date: Wed, 18 Dec 2024 20:44:57 +0900 Subject: [PATCH 04/10] =?UTF-8?q?fix:=20DateDropBox=EC=9D=98=20type?= =?UTF-8?q?=EC=9D=B4=20reservation=EC=9D=BC=EB=95=8C=EB=8A=94=20=EC=98=A4?= =?UTF-8?q?=EB=8A=98=20=EB=82=A0=EC=A7=9C=20=EA=B8=B0=EC=A4=80=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=8B=A4=EC=9D=8C=20=EB=82=A0=EB=B6=80=ED=84=B0=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../button/DateDropBox/DateDropBox.tsx | 43 ++++++++++++++----- .../customize-grooming/index.styles.ts | 14 +++--- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/components/button/DateDropBox/DateDropBox.tsx b/src/components/button/DateDropBox/DateDropBox.tsx index 672b261d..09709e13 100644 --- a/src/components/button/DateDropBox/DateDropBox.tsx +++ b/src/components/button/DateDropBox/DateDropBox.tsx @@ -69,17 +69,38 @@ export default function DateDropBox({ ), ]; - const filteredMonths = - type === "birthday" && selectedYear === currentYear.toString() - ? ["선택 없음", ...months.slice(1, currentMonth + 1)] // Only past months for current year - : months; - - const filteredDays = - type === "birthday" && - selectedYear === currentYear.toString() && - selectedMonth === currentMonth.toString().padStart(2, "0") - ? ["선택 없음", ...days.slice(1, currentDay + 1)] // Only past days for current month of current year - : days; + const filteredMonths = (() => { + if (type === "birthday" && selectedYear === currentYear.toString()) { + // 생일일 때는 현재 연도면 이전 월까지만 선택 가능 + return ["선택 없음", ...months.slice(1, currentMonth + 1)]; + } else if ( + type === "reservation" && + selectedYear === currentYear.toString() + ) { + // 예약일 때는 현재 연도에 오늘 이후의 월부터 가능 + return ["선택 없음", ...months.slice(currentMonth)]; + } + return months; + })(); + + const filteredDays = (() => { + if ( + type === "birthday" && + selectedYear === currentYear.toString() && + selectedMonth === currentMonth.toString().padStart(2, "0") + ) { + // 생일일 때는 현재 연도와 월이 현재 월과 같다면, 오늘 이전의 일만 선택 가능 + return ["선택 없음", ...days.slice(1, currentDay + 1)]; + } else if ( + type === "reservation" && + selectedYear === currentYear.toString() && + selectedMonth === currentMonth.toString().padStart(2, "0") + ) { + // 예약일 때는 현재 연도와 월이 현재 월과 같다면, 오늘의 다음 날부터 선택 가능 + return ["선택 없음", ...days.slice(currentDay + 1)]; + } + return days; + })(); const handleDateChange = () => { if (selectedYear && selectedMonth && selectedDay) { diff --git a/src/pages/customer/request/components/customize-grooming/index.styles.ts b/src/pages/customer/request/components/customize-grooming/index.styles.ts index d824e8f3..da94b8b9 100644 --- a/src/pages/customer/request/components/customize-grooming/index.styles.ts +++ b/src/pages/customer/request/components/customize-grooming/index.styles.ts @@ -14,7 +14,7 @@ export const ContentWrapper = styled.div` export const SectionWrapper = styled.div` display: flex; flex-direction: column; - gap: 10px; + gap: 20px; `; export const SelectedHair = styled.div` @@ -38,15 +38,13 @@ export const ItemWrapper = styled.div` flex-direction: column; `; -export const AddWrapper = styled.div` - width: 80px; - margin-top: 10px; -`; - export const ImageContainer = styled.div` display: flex; - flex-direction: row; - gap: 10px; + gap: 20px; +`; + +export const AddWrapper = styled.div` + width: 80px; `; export const ImageUnit = styled.img` From a2db06f1c4a88bae9a6c5a1cb4c9b3b3b6c28464 Mon Sep 17 00:00:00 2001 From: ZUITOPIA Date: Wed, 18 Dec 2024 20:50:47 +0900 Subject: [PATCH 05/10] =?UTF-8?q?fix:=20=EC=9D=B4=EB=AF=B8=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=EC=84=9C=EB=A5=BC=20=EB=B3=B4=EB=82=B8=20=EB=B0=98?= =?UTF-8?q?=EB=A0=A4=EA=B2=AC=EC=9D=80=20=EC=97=B0=ED=95=98=EA=B2=8C=20dis?= =?UTF-8?q?abled=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/cards/Card/Card.styles.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/cards/Card/Card.styles.ts b/src/components/cards/Card/Card.styles.ts index 20623474..cb9aa6e1 100644 --- a/src/components/cards/Card/Card.styles.ts +++ b/src/components/cards/Card/Card.styles.ts @@ -12,7 +12,7 @@ export const CardWrapper = styled.div<{ border-radius: 15px; padding-left: 20px; background-color: ${({ isSelected, disabled }) => - disabled ? colors.gray200 : isSelected ? colors.blue300 : colors.white}; + disabled ? colors.gray300 : isSelected ? colors.blue300 : colors.white}; display: flex; align-items: center; text-align: center; @@ -21,7 +21,7 @@ export const CardWrapper = styled.div<{ ? "not-allowed" : "pointer"}; // disabled일 때 pointer를 not-allowed로 설정 opacity: ${({ disabled }) => - disabled ? 0.6 : 1}; // disabled일 때 opacity를 낮춤 + disabled ? 0.3 : 1}; // disabled일 때 opacity를 낮춤 `; export const TagsWrapper = styled.div` From a2aad384b627e8abcaad437bbac06f0e135d328f Mon Sep 17 00:00:00 2001 From: ZUITOPIA Date: Wed, 18 Dec 2024 21:08:07 +0900 Subject: [PATCH 06/10] =?UTF-8?q?fix:=20=EA=B2=AC=EC=A0=81=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20=EC=8B=9C=20=EC=82=AC=EC=A7=84=20=EC=B2=A8=EB=B6=80?= =?UTF-8?q?=ED=95=A0=20=EB=95=8C=20+=20=EB=B2=84=ED=8A=BC=20=EB=A7=90?= =?UTF-8?q?=EA=B3=A0=20+=20=EB=B2=84=ED=8A=BC=EC=9D=B4=20=EA=B0=90?= =?UTF-8?q?=EC=8B=B8=EB=8A=94=20=EB=B0=95=EC=8A=A4=EB=A5=BC=20=ED=81=B4?= =?UTF-8?q?=EB=A6=AD=ED=96=88=EC=9D=84=EB=95=8C=20=EB=93=B1=EB=A1=9D?= =?UTF-8?q?=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/customize-grooming/index.styles.ts | 9 ++++++++- .../request/components/customize-grooming/index.tsx | 10 +++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/pages/customer/request/components/customize-grooming/index.styles.ts b/src/pages/customer/request/components/customize-grooming/index.styles.ts index da94b8b9..69b742d2 100644 --- a/src/pages/customer/request/components/customize-grooming/index.styles.ts +++ b/src/pages/customer/request/components/customize-grooming/index.styles.ts @@ -1,6 +1,5 @@ import styled from "styled-components"; import { colors } from "../../../../../style/color"; -import theme from "../../../../../style/theme"; export const ContentWrapper = styled.div` display: flex; @@ -33,6 +32,14 @@ export const TwoItemsWrapper = styled.div` gap: 5px; `; +export const AddLabel = styled.label` + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; +`; + export const ItemWrapper = styled.div` display: flex; flex-direction: column; diff --git a/src/pages/customer/request/components/customize-grooming/index.tsx b/src/pages/customer/request/components/customize-grooming/index.tsx index e4e49c81..aa30659c 100644 --- a/src/pages/customer/request/components/customize-grooming/index.tsx +++ b/src/pages/customer/request/components/customize-grooming/index.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from "react"; +import { useState } from "react"; import { AppBar, DropButton, @@ -13,6 +13,7 @@ import { GroomingType, } from "../../../../../components/button/RadioSelectButton/RadioSelectButton.stories"; import { + AddLabel, AddWrapper, ContentWrapper, DeleteButton, @@ -287,9 +288,12 @@ export default function CustomizeGrooming({ {imageUrls.length < 3 && ( - + Date: Thu, 19 Dec 2024 01:52:30 +0900 Subject: [PATCH 07/10] =?UTF-8?q?fix:=20=EC=9C=84=EC=B9=98=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EB=86=92=EC=9D=B4,=20=EA=B2=B0=EC=A0=9C=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=20=EC=84=A0=ED=83=9D=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LocationButton/LocationButton.styles.ts | 2 +- .../MultiSelectButton.stories.tsx | 11 ++ .../RadioSelectButton.stories.tsx | 9 -- .../input/CustomInput/CustomInput.tsx | 8 - .../components/ShopInfoInputSection.tsx | 137 ++++++++---------- src/pages/designer/signup-detail/index.tsx | 3 - 6 files changed, 75 insertions(+), 95 deletions(-) diff --git a/src/components/button/LocationButton/LocationButton.styles.ts b/src/components/button/LocationButton/LocationButton.styles.ts index b70b39e4..e3301dda 100644 --- a/src/components/button/LocationButton/LocationButton.styles.ts +++ b/src/components/button/LocationButton/LocationButton.styles.ts @@ -21,6 +21,6 @@ export const DisabledWrapper = styled.div` export const CustomButtonWrapper = styled.button` width: 67px; position: absolute; - top: 35px; + top: 32px; right: 12px; `; diff --git a/src/components/button/MultiSelectButton/MultiSelectButton.stories.tsx b/src/components/button/MultiSelectButton/MultiSelectButton.stories.tsx index 1982c473..4b4ec4e2 100644 --- a/src/components/button/MultiSelectButton/MultiSelectButton.stories.tsx +++ b/src/components/button/MultiSelectButton/MultiSelectButton.stories.tsx @@ -67,3 +67,14 @@ export const LargeGrid: Story = { onSelect: (indexes) => console.log("선택된 버튼 인덱스:", indexes), }, }; + +export const Payment: Story = { + args: { + row: 1, + col: 3, + buttonNames: [, "카드 결제", "현금 결제", "계좌 이체"], + selectedIndexes: [], + onSelect: (indexes: number[]) => + console.log("선택된 버튼 인덱스:", indexes), + }, +}; diff --git a/src/components/button/RadioSelectButton/RadioSelectButton.stories.tsx b/src/components/button/RadioSelectButton/RadioSelectButton.stories.tsx index d7a30f7f..063f1ba1 100644 --- a/src/components/button/RadioSelectButton/RadioSelectButton.stories.tsx +++ b/src/components/button/RadioSelectButton/RadioSelectButton.stories.tsx @@ -31,15 +31,6 @@ export const Gender: Story = { }, }; -export const Payment: Story = { - args: { - buttonNames: ["카드 결제", "현금 결제", "계좌이체"], - selectedIndex: 1, - col: 3, - onSelect: (index) => console.log("선택된 버튼 인덱스:", index), - }, -}; - export const GroomingType: Story = { args: { buttonNames: ["전체", "위생 미용"], diff --git a/src/components/input/CustomInput/CustomInput.tsx b/src/components/input/CustomInput/CustomInput.tsx index 8f432b60..68076744 100644 --- a/src/components/input/CustomInput/CustomInput.tsx +++ b/src/components/input/CustomInput/CustomInput.tsx @@ -6,7 +6,6 @@ import { StyledInputWrapper, StyledInput, StyledTextarea, - Message, SuffixContainer, NoticeContainer, } from "./CustomInput.styles"; @@ -73,13 +72,6 @@ export default function CustomInput({ props.onChange?.(e); }; - // 색상 결정 함수 - const getColor = () => { - if (error) return "red100"; - if (success) return "blue100"; - return "black100"; - }; - return ( {label && ( diff --git a/src/pages/designer/signup-detail/components/ShopInfoInputSection.tsx b/src/pages/designer/signup-detail/components/ShopInfoInputSection.tsx index 1c88a078..d3d0a952 100644 --- a/src/pages/designer/signup-detail/components/ShopInfoInputSection.tsx +++ b/src/pages/designer/signup-detail/components/ShopInfoInputSection.tsx @@ -1,53 +1,72 @@ -import { useState, useEffect } from "react"; +import { useMemo, useCallback } from "react"; import { CustomInput, MultiSelectButton, Text } from "../../../../components"; import { LocationButton } from "../../../../components/button/LocationButton"; import { MultiSelectButtonProps } from "../../../../components/button/MultiSelectButton/MultiSelectButton"; -import { CreateDesignerWorkspaceRequest } from "../../../../types/designer/designer"; +import { + CreateDesignerWorkspaceRequest, + PaymentOptionType, +} from "../../../../types/designer/designer"; import { Style } from "../index.styles"; +import { Payment } from "../../../../components/button/MultiSelectButton/MultiSelectButton.stories"; interface ShopInfoInputSectionProps { - onChange: (field: keyof CreateDesignerWorkspaceRequest, value: any) => void; initialValues: { address: string; addressDetail: string; openHours: string; - closeHours: string; - openDays: string; - directionGuide: string; phoneNumber: string; workspaceName: string; - paymentOptions: string[]; - }; // initialValues를 받는 prop 추가 + paymentOptions: PaymentOptionType[]; + }; + onChange: (field: keyof CreateDesignerWorkspaceRequest, value: any) => void; } -export const Payment: MultiSelectButtonProps = { - row: 1, - col: 3, - buttonNames: ["카드 결제", "현금 결제", "계좌 이체"], - selectedIndexes: [], - onSelect: (indexes: number[]) => console.log("선택된 버튼 인덱스:", indexes), -}; +// 1️⃣ as const로 고정된 타입을 명시 (타입 안정성 확보) +const paymentOptionMap = { + 1: "CARD", + 2: "CASH", + 3: "ACCOUNT", +} as const; export default function ShopInfoInputSection({ onChange, initialValues, // initialValues prop 추가 }: ShopInfoInputSectionProps) { - const [formValues, setFormValues] = useState(initialValues); + // 2️⃣ 초기값 디스트럭처링 + const { + address = "", + addressDetail = "", + openHours = "", + phoneNumber = "", + workspaceName = "", + paymentOptions = [], + } = initialValues; - // 초기값이 변경될 때마다 상태를 업데이트하도록 useEffect 추가 - useEffect(() => { - setFormValues(initialValues); - }, [initialValues]); + // 3️⃣ paymentOptionMap을 useMemo로 캐싱하여 불필요한 연산 제거 + const paymentEntries = useMemo(() => Object.entries(paymentOptionMap), []); + + // 4️⃣ 헬퍼 함수 생성 (onChange 중복 제거) + const updateShopInfoField = useCallback( + (field: keyof CreateDesignerWorkspaceRequest, value: any) => { + onChange(field, value); + }, + [onChange], + ); - const handleHowToPaySelect = (selectedPayIndexs: number[]) => { - const paymentOptions = selectedPayIndexs.map((index) => - index === 0 ? "CARD" : index === 1 ? "CASH" : "ACCOUNT", - ); - setFormValues((prevValues) => ({ - ...prevValues, - paymentOptions, - })); - onChange("paymentOptions", paymentOptions); // 부모에게 값 전달 + // 5️⃣ getSelectedIndexes의 불필요한 반복 제거 + const getSelectedIndexes = useMemo(() => { + const indexes = paymentEntries + .filter(([_, option]) => paymentOptions.includes(option)) + .map(([index]) => Number(index)); + return indexes; + }, [paymentOptions, paymentEntries]); + + // 6️⃣ 선택한 결제 방식을 PaymentOptionType 배열로 변환 + const mapSelectedIndexesToPaymentOptions = (selectedPayIndexes: number[]) => { + const mappedPaymentOptions = selectedPayIndexes + .map((index) => paymentOptionMap[index as keyof typeof paymentOptionMap]) // `index`를 명시적으로 타입 캐스팅 + .filter(Boolean); + updateShopInfoField("paymentOptions", mappedPaymentOptions); }; return ( @@ -62,74 +81,44 @@ export default function ShopInfoInputSection({ { - const value = e.target.value; - setFormValues((prevValues) => ({ - ...prevValues, - workspaceName: value, - })); - onChange("workspaceName", value); // 부모에게 값 전달 - }} + value={workspaceName} + onChange={(e) => updateShopInfoField("workspaceName", e.target.value)} /> { - setFormValues((prevValues) => ({ - ...prevValues, - address, - addressDetail, - })); - onChange("address", address); - onChange("addressDetail", addressDetail); + updateShopInfoField("address", address); + updateShopInfoField("addressDetail", addressDetail); }} /> { - const value = e.target.value; - setFormValues((prevValues) => ({ - ...prevValues, - openHours: value, - })); - onChange("openHours", value); // 부모에게 값 전달 - }} + value={openHours} + onChange={(e) => updateShopInfoField("openHours", e.target.value)} /> { - const value = e.target.value; - setFormValues((prevValues) => ({ - ...prevValues, - phoneNumber: value, - })); - onChange("phoneNumber", value); // 부모에게 값 전달 - }} + value={phoneNumber} + onChange={(e) => updateShopInfoField("phoneNumber", e.target.value)} /> - - 결제 방식{" "} + + 결제 방식 + {" "} (중복 선택도 가능해요) - option === "CARD" ? 0 : option === "CASH" ? 1 : 2, - )} - onSelect={handleHowToPaySelect} + {...(Payment.args as MultiSelectButtonProps)} + selectedIndexes={getSelectedIndexes} + onSelect={mapSelectedIndexesToPaymentOptions} /> diff --git a/src/pages/designer/signup-detail/index.tsx b/src/pages/designer/signup-detail/index.tsx index fa4a3d31..67e358ad 100644 --- a/src/pages/designer/signup-detail/index.tsx +++ b/src/pages/designer/signup-detail/index.tsx @@ -190,9 +190,6 @@ export default function DesignerSignUpDetail() { address: shopDetailInfo.address || "", addressDetail: shopDetailInfo.addressDetail || "", openHours: shopDetailInfo.openHours || "", - closeHours: shopDetailInfo.closeHours || "", - openDays: shopDetailInfo.openDays || "", - directionGuide: shopDetailInfo.directionGuide || "", phoneNumber: shopDetailInfo.phoneNumber || "", workspaceName: shopDetailInfo.workspaceName || "", paymentOptions: shopDetailInfo.paymentOptions || [], From 657e70882669a4a6277113833bab0e5b44a25654 Mon Sep 17 00:00:00 2001 From: ZUITOPIA Date: Thu, 19 Dec 2024 02:34:51 +0900 Subject: [PATCH 08/10] =?UTF-8?q?fix:=20=ED=9A=8C=EC=9B=90=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=88=98=EC=A0=95=20=EC=8B=9C=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=20=EC=95=88=20=EB=90=98=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/customer/mypage/edit/CustomerMyPageEdit.styles.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/customer/mypage/edit/CustomerMyPageEdit.styles.ts b/src/pages/customer/mypage/edit/CustomerMyPageEdit.styles.ts index 7dee00c4..a61da63a 100644 --- a/src/pages/customer/mypage/edit/CustomerMyPageEdit.styles.ts +++ b/src/pages/customer/mypage/edit/CustomerMyPageEdit.styles.ts @@ -5,6 +5,5 @@ export const MyPageEditWrapper = styled.div` flex-direction: column; gap: 20px; width: 100%; - height: 100vh; overflow-y: auto; `; \ No newline at end of file From 0c9cd45f8e7bcb51d3720dc3b543f588438d41d1 Mon Sep 17 00:00:00 2001 From: ZUITOPIA Date: Thu, 19 Dec 2024 04:52:39 +0900 Subject: [PATCH 09/10] =?UTF-8?q?fix:=20=ED=9A=8C=EC=9B=90=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=88=98=EC=A0=95=20=EC=84=B1=EA=B3=B5=20=EC=8B=9C?= =?UTF-8?q?=20=ED=86=A0=EC=8A=A4=ED=8A=B8=20=EC=95=8C=EB=A6=BC=20=EB=9D=84?= =?UTF-8?q?=EC=9A=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/customer/mypage/detail/index.tsx | 13 +- .../mypage/edit/CustomerMyPageEdit.tsx | 456 ++++++++++-------- 2 files changed, 256 insertions(+), 213 deletions(-) diff --git a/src/pages/customer/mypage/detail/index.tsx b/src/pages/customer/mypage/detail/index.tsx index d8ca30ed..5cb5b3f6 100644 --- a/src/pages/customer/mypage/detail/index.tsx +++ b/src/pages/customer/mypage/detail/index.tsx @@ -7,12 +7,13 @@ import { LeftAlignedText, EndWrapper, } from "./index.styles"; -import { useNavigate } from "react-router-dom"; +import { useLocation, useNavigate } from "react-router-dom"; import { ROUTE } from "../../../../constants/routes"; import { useEffect, useState } from "react"; import { getCustomerProfile } from "../../../../apis/customer/resources/customer"; import { GetCustomerProfileResponse } from "../../../../types/customer/customer"; import { useUserDetails } from "../../../../hooks/useUserDetails"; +import Toast from "../../../../components/toast"; export default function CustomerMyPageDetail() { const navigate = useNavigate(); @@ -21,6 +22,15 @@ export default function CustomerMyPageDetail() { {}, ); + const location = useLocation(); + const [toastMessage, setToastMessage] = useState(null); + useEffect(() => { + // location.state로부터 toastMessage 가져오기 + if (location.state?.toastMessage) { + setToastMessage(location.state.toastMessage); // 메시지를 상태로 저장 + } + }, [location]); + useEffect(() => { const fetchProfile = async () => { if (userId) { @@ -104,6 +114,7 @@ export default function CustomerMyPageDetail() { + {toastMessage && {toastMessage}} ); } diff --git a/src/pages/customer/mypage/edit/CustomerMyPageEdit.tsx b/src/pages/customer/mypage/edit/CustomerMyPageEdit.tsx index 6c3c933f..4bdbcdda 100644 --- a/src/pages/customer/mypage/edit/CustomerMyPageEdit.tsx +++ b/src/pages/customer/mypage/edit/CustomerMyPageEdit.tsx @@ -4,235 +4,267 @@ import { AppBar, CustomInput, CustomButton, GNB } from "../../../../components"; import ProfileImg from "../../../../components/profile-img/ProfileImg"; import { MyPageEditWrapper } from "./CustomerMyPageEdit.styles"; import { ROUTE } from "../../../../constants/routes"; -import { getCustomerProfile, uploadProfileImage, updateCustomerProfile } from "../../../../apis/customer/resources/customer"; -import { GetCustomerProfileResponse, UploadProfileImageResponse, UpdateCustomerProfileResponse } from "../../../../types/customer/customer"; +import { + getCustomerProfile, + uploadProfileImage, + updateCustomerProfile, +} from "../../../../apis/customer/resources/customer"; +import { GetCustomerProfileResponse } from "../../../../types/customer/customer"; import { useUserDetails } from "../../../../hooks/useUserDetails"; import { useLocation } from "../../../../hooks/useLocation"; import Loading from "../../../../components/page/sign-up/Loading"; import { useCheckNickname } from "../../../../apis/customer/hooks/useUser"; export default function CustomerMyPageEdit() { - const navigate = useNavigate(); - const { userId, isLoading } = useUserDetails(); - const { location, error: locationError, locationLoading, fetchLocation } = useLocation(); - const { check } = useCheckNickname(); - const fileInputRef = useRef(null); - - const [profileData, setProfileData] = useState({}); - const [originalNickname, setOriginalNickname] = useState(""); - const [formData, setFormData] = useState({ - nickname: '', - name: '', - address: '', - }); - const [profileImage, setProfileImage] = useState(""); - const [uploadLoading, setUploadLoading] = useState(false); - const [updateLoading, setUpdateLoading] = useState(false); - const [error, setError] = useState(""); - const [success, setSuccess] = useState(""); - const [checkedNickname, setCheckedNickname] = useState(""); - const [isNickNameAvailable, setIsNickNameAvailable] = useState(false); - - useEffect(() => { - if (!isLoading && userId) { - const fetchProfile = async () => { - try { - const data = await getCustomerProfile(userId); - setProfileData(data); - setProfileImage(data.profileImageUrl || ""); - setFormData({ - nickname: data.nickname || '', - name: data.name || '', - address: data.address || '', - }); - setOriginalNickname(data.nickname || ''); - setCheckedNickname(data.nickname || ''); - setIsNickNameAvailable(true); - } catch (error) { - console.error('Failed to fetch profile:', error); - } - }; - fetchProfile(); - } - }, [userId, isLoading]); - - useEffect(() => { - if (location) { - setFormData(prev => ({ - ...prev, - address: location - })); - } - if (locationError) { - setError(locationError); - } - }, [location, locationError]); - - const handleInputChange = (field: string) => (e: React.ChangeEvent) => { - const value = e.target.value; - setFormData(prev => ({ - ...prev, - [field]: value - })); - - if (field === 'nickname') { - if (value === originalNickname) { - setIsNickNameAvailable(true); - setError(""); - setSuccess(""); - setCheckedNickname(value); - } else { - setIsNickNameAvailable(false); - setSuccess(""); - } - } - }; - - const handleImageClick = () => { - fileInputRef.current?.click(); - }; + const navigate = useNavigate(); + const { userId, isLoading } = useUserDetails(); + const { + location, + error: locationError, + locationLoading, + fetchLocation, + } = useLocation(); + const { check } = useCheckNickname(); + const fileInputRef = useRef(null); - const handleImageChange = async (e: React.ChangeEvent) => { - const file = e.target.files?.[0]; - if (!file || !userId) return; + const [profileData, setProfileData] = useState( + {}, + ); + const [originalNickname, setOriginalNickname] = useState(""); + const [formData, setFormData] = useState({ + nickname: "", + name: "", + address: "", + }); + const [profileImage, setProfileImage] = useState(""); + const [uploadLoading, setUploadLoading] = useState(false); + const [updateLoading, setUpdateLoading] = useState(false); + const [error, setError] = useState(""); + const [success, setSuccess] = useState(""); + const [checkedNickname, setCheckedNickname] = useState(""); + const [isNickNameAvailable, setIsNickNameAvailable] = useState(false); + useEffect(() => { + if (!isLoading && userId) { + const fetchProfile = async () => { try { - setUploadLoading(true); - const response = await uploadProfileImage(userId, file); - if (response.uploadedProfileImageUrl) { - setProfileImage(response.uploadedProfileImageUrl); - } + const data = await getCustomerProfile(userId); + setProfileData(data); + setProfileImage(data.profileImageUrl || ""); + setFormData({ + nickname: data.nickname || "", + name: data.name || "", + address: data.address || "", + }); + setOriginalNickname(data.nickname || ""); + setCheckedNickname(data.nickname || ""); + setIsNickNameAvailable(true); } catch (error) { - console.error('Failed to upload image:', error); - setError("이미지 업로드에 실패했습니다."); - } finally { - setUploadLoading(false); + console.error("Failed to fetch profile:", error); } - }; + }; + fetchProfile(); + } + }, [userId, isLoading]); - const handleGetLocation = () => { - setError(""); - fetchLocation(); - }; + useEffect(() => { + if (location) { + setFormData((prev) => ({ + ...prev, + address: location, + })); + } + if (locationError) { + setError(locationError); + } + }, [location, locationError]); - const handleNicknameCheck = async () => { - if (formData.nickname === originalNickname) { - setIsNickNameAvailable(true); - setError(""); - return; - } + const handleInputChange = + (field: string) => (e: React.ChangeEvent) => { + const value = e.target.value; + setFormData((prev) => ({ + ...prev, + [field]: value, + })); - const nicknameRegex = /^[a-zA-Z0-9가-힣]{2,10}$/; - if (!formData.nickname || !nicknameRegex.test(formData.nickname)) { - setError("올바른 닉네임을 입력해주세요 (2~10자)"); - return; - } - - setCheckedNickname(formData.nickname); - const isAvailableNickname = await check(formData.nickname); - - if (!isAvailableNickname) { - setError("이미 사용중인 닉네임입니다."); - setSuccess(""); + if (field === "nickname") { + if (value === originalNickname) { + setIsNickNameAvailable(true); + setError(""); + setSuccess(""); + setCheckedNickname(value); } else { - setIsNickNameAvailable(true); - setError(""); - setSuccess("사용 가능한 닉네임입니다."); + setIsNickNameAvailable(false); + setSuccess(""); } + } }; - const handleSubmit = async () => { - if (!userId) return; + const handleImageClick = () => { + fileInputRef.current?.click(); + }; - try { - setUpdateLoading(true); - const updateData = { - name: formData.name, - nickname: formData.nickname, - address: formData.address, - profileImageUrl: profileImage, - phoneNum: profileData.phoneNumber // 기존 전화번호 유지 - }; - - await updateCustomerProfile(userId, updateData); - navigate(ROUTE.customer.mypage.home); - } catch (error) { - console.error('Failed to update profile:', error); - setError("프로필 수정에 실패했습니다."); - } finally { - setUpdateLoading(false); + const handleImageChange = async (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file || !userId) return; + + try { + setUploadLoading(true); + const response = await uploadProfileImage(userId, file); + if (response.uploadedProfileImageUrl) { + setProfileImage(response.uploadedProfileImageUrl); + } + } catch (error) { + console.error("Failed to upload image:", error); + setError("이미지 업로드에 실패했습니다."); + } finally { + setUploadLoading(false); + } + }; + + const handleGetLocation = () => { + setError(""); + fetchLocation(); + }; + + const handleNicknameCheck = async () => { + if (formData.nickname === originalNickname) { + setIsNickNameAvailable(true); + setError(""); + return; + } + + const nicknameRegex = /^[a-zA-Z0-9가-힣]{2,10}$/; + if (!formData.nickname || !nicknameRegex.test(formData.nickname)) { + setError("올바른 닉네임을 입력해주세요 (2~10자)"); + return; + } + + setCheckedNickname(formData.nickname); + const isAvailableNickname = await check(formData.nickname); + + if (!isAvailableNickname) { + setError("이미 사용중인 닉네임입니다."); + setSuccess(""); + } else { + setIsNickNameAvailable(true); + setError(""); + setSuccess("사용 가능한 닉네임입니다."); + } + }; + + const handleSubmit = async () => { + if (!userId) return; + + try { + setUpdateLoading(true); + const updateData = { + name: formData.name, + nickname: formData.nickname, + address: formData.address, + profileImageUrl: profileImage, + phoneNum: profileData.phoneNumber, // 기존 전화번호 유지 + }; + + await updateCustomerProfile(userId, updateData); + + // 회원 정보 수정 완료 후 MyPage로 이동하면서 Toast 메시지 전달 + navigate(ROUTE.customer.mypage.home, { + state: { toastMessage: "회원 정보 수정이 완료됐어요" }, + }); + } catch (error) { + console.error("Failed to update profile:", error); + setError("프로필 수정에 실패했습니다."); + } finally { + setUpdateLoading(false); + } + }; + return ( + <> + {(locationLoading || uploadLoading || updateLoading) && ( + + )} + + navigate(ROUTE.customer.mypage.home)} + /> + + + + 중복검사 + + } + /> + + + 현재 위치 찾기 + + } + /> + + - {(locationLoading || uploadLoading || updateLoading) && } - - navigate(ROUTE.customer.mypage.home)} /> - - - - 중복검사 - - } - /> - - - 현재 위치 찾기 - - } - /> - - - - ); -} \ No newline at end of file + onLargeButtonClick={handleSubmit} + /> + + ); +} From 6fb8c9d53022434ad3ca3e09153d1b5f820f94a3 Mon Sep 17 00:00:00 2001 From: ZUITOPIA Date: Thu, 19 Dec 2024 04:56:59 +0900 Subject: [PATCH 10/10] =?UTF-8?q?fix:=20=ED=9A=8C=EC=9B=90=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=B0=95=EC=8A=A4=20=ED=81=B4=EB=A6=AD=20=EC=8B=9C=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=88=98=EC=A0=95=ED=95=98=EA=B8=B0=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/customer/mypage/index.tsx | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/pages/customer/mypage/index.tsx b/src/pages/customer/mypage/index.tsx index 5db37430..424df32d 100644 --- a/src/pages/customer/mypage/index.tsx +++ b/src/pages/customer/mypage/index.tsx @@ -79,7 +79,10 @@ export default function CustomerMyPage() { onclick={() => navigate(ROUTE.customer.home)} /> - + navigate(ROUTE.customer.mypage.detail)} + style={{ cursor: "pointer" }} + > 님 - navigate(ROUTE.customer.mypage.detail)} - style={{ cursor: "pointer" }} - > + 내 정보 수정하기