From e8231816bad882cfb617dcf2f19666f463aba0b2 Mon Sep 17 00:00:00 2001 From: sooy Date: Thu, 11 Jul 2024 10:24:48 +0900 Subject: [PATCH 1/9] =?UTF-8?q?refac:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EA=B0=92=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apis/axiosinstance.ts | 2 +- src/pages/Register.tsx | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/apis/axiosinstance.ts b/src/apis/axiosinstance.ts index a040008..84b7f74 100644 --- a/src/apis/axiosinstance.ts +++ b/src/apis/axiosinstance.ts @@ -1,7 +1,7 @@ import axios, { AxiosResponse, AxiosError } from 'axios'; const axiosInstance = axios.create({ - baseURL: 'https://flexrate.online', + baseURL: import.meta.env.VITE_APP_BASE_URL, headers: { 'Content-Type': 'application/json', }, diff --git a/src/pages/Register.tsx b/src/pages/Register.tsx index daad153..dc6bf6d 100644 --- a/src/pages/Register.tsx +++ b/src/pages/Register.tsx @@ -69,16 +69,16 @@ const Register = () => { const submitRegister = () => { const tmp = { - account: registerValue.accout, + username: registerValue.accout, password: registerValue.password, - name: registerValue.name, - email: registerValue.email, - birth: formatDateToString(birthValue), + nickname: registerValue.name, + // email: registerValue.email, + birth: formatDateToString(birthValue).replace(/-/g, ''), gender: registerValue.gender, - nationality: registerValue.nationality, - phonenumber: registerValue.phonenumber, + // nationality: registerValue.nationality, + // phonenumber: registerValue.phonenumber, }; - console.log(tmp); + //서버통신 axiosInstance .post('/register', tmp) @@ -169,7 +169,7 @@ const Register = () => { /> -
  • + {/*
  • { value={registerValue.email} onChange={handleinput} > -
  • + */} - */}

    이미 계정이 있다면?

    From 56c0435fd1a2f2b5c16d25222dffa15c78ee7dc3 Mon Sep 17 00:00:00 2001 From: sooy Date: Thu, 11 Jul 2024 20:35:59 +0900 Subject: [PATCH 2/9] =?UTF-8?q?fix:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20end=20?= =?UTF-8?q?point=20=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Login.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx index f49d8d8..235dbcf 100644 --- a/src/pages/Login.tsx +++ b/src/pages/Login.tsx @@ -133,7 +133,7 @@ const Login = () => { console.log(tmp); //로그인 api 호출 await axiosInstance - .post('/login', tmp) + .post('/users/login', tmp) .then((res) => { console.log(res); console.log(res.data.token); From 55c86542067e2bcb4990cf482f2b2ebe158431c2 Mon Sep 17 00:00:00 2001 From: sooy Date: Thu, 11 Jul 2024 20:45:35 +0900 Subject: [PATCH 3/9] =?UTF-8?q?refac:=20=EB=8C=80=EC=8B=9C=EB=B3=B4?= =?UTF-8?q?=EB=93=9C=20header=20=EB=A6=AC=ED=8C=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/DashboardComs/DashHeader.tsx | 35 +++++++++++++-------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/components/DashboardComs/DashHeader.tsx b/src/components/DashboardComs/DashHeader.tsx index c063507..2ec7c23 100644 --- a/src/components/DashboardComs/DashHeader.tsx +++ b/src/components/DashboardComs/DashHeader.tsx @@ -63,6 +63,15 @@ const Title = styled.div<{ $borderColor: string }>` border-left: 2px solid ${(props) => props.$borderColor}; padding-left: 8px; `; + +const StSubTitle = styled.p` + color: #8e9cb0; + font-family: Pretendard; + font-size: 10px; + font-style: normal; + font-weight: 600; + line-height: normal; +`; const Bold = styled.span` color: black; font-size: 16px; @@ -109,32 +118,32 @@ const DashHeader = () => {
    Flexrate 신용대출 - - {`${data.loan_request / 10000}만원`} - - - {`${data.loan_repay_term * 12}개월`} -
    + + 입력하신 금융 정보를 모두 고려하여 추천된 대출상품이에요. +
    - 다음 달 대출금 상환 날짜 + 나의 대출 금리
    - 2024년 1월 19일 - - D-31일 남았어요 - + {12}%
    + + 입력하신 금융 정보를 모두 고려하여 추천된 대출 금리예요. +
    - 금리 갱신 회차 + 나의 대출 가능 한도
    - {data.changes.length}회차 + {300}만원
    + + 입력하신 금융 정보를 기반으로 산출된 대출 한도예요. +
    {isVisible && } From d4fd8854d8df69f064c83e9e4c45240e1a7b1bd1 Mon Sep 17 00:00:00 2001 From: sooy Date: Thu, 11 Jul 2024 21:15:23 +0900 Subject: [PATCH 4/9] =?UTF-8?q?refac:=20=EB=8C=80=EC=8B=9C=EB=B3=B4?= =?UTF-8?q?=EB=93=9C=20=EA=B8=88=EC=9C=B5=EC=A0=95=EB=B3=B4=201=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/GlobalStyle.ts | 10 + src/components/DashboardComs/FlipCard.tsx | 274 +++++++--------------- src/pages/Dashboard.tsx | 4 +- 3 files changed, 93 insertions(+), 195 deletions(-) diff --git a/src/GlobalStyle.ts b/src/GlobalStyle.ts index 028be77..3dfcc94 100644 --- a/src/GlobalStyle.ts +++ b/src/GlobalStyle.ts @@ -6,6 +6,14 @@ import PretendardExtraBold from './assets/fonts/Pretendard/Pretendard-ExtraBold. const GlobalStyle = createGlobalStyle` + html { + font-size: 62.5%; + } + + *{ + box-sizing: border-box; + } + @font-face { font-family: 'Pretendard'; font-weight: 200; @@ -44,6 +52,8 @@ const GlobalStyle = createGlobalStyle` body { font-family: 'Pretendard','SUIT',serif; + + } `; diff --git a/src/components/DashboardComs/FlipCard.tsx b/src/components/DashboardComs/FlipCard.tsx index be0150a..efbb360 100644 --- a/src/components/DashboardComs/FlipCard.tsx +++ b/src/components/DashboardComs/FlipCard.tsx @@ -9,8 +9,56 @@ import Tooltip3 from '../CoachMarksComs/Tooltip3'; import { LoanInfo } from '@/state/LoanInfo'; import { output } from '@/state/output'; import { userInfo } from '@/state/userInfo'; +import { SubTitle } from '@/styles/MypageStyle'; -const CardContainer = styled.div<{ $isFlipped: boolean; $isVisible: boolean }>` +const FlipCard: React.FC = () => { + const Info = useRecoilValue(LoanInfo); + const outputValue = useRecoilValue(output); + const score = Math.floor(outputValue.Score); + + const [coachMark, setCoachMark] = useRecoilState(CoachMarkStage); + const data = useRecoilValue(userInfo); + + // stage 값에 접근 + const { stage, mode } = coachMark; + + // stage 값을 업데이트하는 함수 + const updateStage = (newStage: number) => { + setCoachMark({ ...coachMark, stage: newStage }); + }; + + let isVisible = mode && stage === 2; + const [isFlipped, setIsFlipped] = useState(false); + + const handleClick = () => { + setIsFlipped(!isFlipped); + }; + + return ( + + + 1:1 맞춤 금리 + + + 60만 건의 데이터에 기반해 + + 합리적인 대출 상품을 제안해요. + + + 약 60만 건의 실제 금융 가명 정보를 활용한 빅데이터 + 분석 모델로, 개인의 연소득, 주거형태, 고용형태, 입사년도 + 나이, 성별 등 다양한 요소를 종합적으로 고려하여 + 개인 맞춤형 대출 상품을 제안드려요. + + + {isVisible && } + + ); +}; + +export default FlipCard; + +const CardContainer = styled.div<{ $isVisible: boolean }>` width: 100%; height: 100%; box-sizing: border-box; @@ -37,215 +85,55 @@ const CardContainer = styled.div<{ $isFlipped: boolean; $isVisible: boolean }>` } `; -const CardFlipper = styled.div<{ $isFlipped: boolean }>` - width: 100%; - height: 100%; - position: relative; - transition: transform 0.6s; - transform-style: preserve-3d; - transform: ${({ $isFlipped }) => - $isFlipped ? 'rotateY(180deg)' : 'rotateY(0deg)'}; -`; - const CardFace = styled.div` position: absolute; width: 100%; height: 100%; backface-visibility: hidden; - display: flex; - align-items: center; - justify-content: center; - font-size: 24px; color: white; `; -const CardFront = styled(CardFace)` +const CardBack = styled(CardFace)` + background-color: #fefcf2; display: flex; flex-direction: column; - gap: 0.85em; - color: black; - & > div { - /* border: 1px solid #d9d9d9; */ - outline: 1px solid var(--Gray3, #d9d9d9); - border-radius: 8px; - width: 99%; - height: 45.5%; - display: flex; - flex-direction: column; - } -`; -const Wrapper = styled.div` - width: 90%; - padding: 22px 21px; - & > h1 { - color: #595959; - font-family: Pretendard; - font-size: 13px; - font-weight: 700; - line-height: 16px; - } - & > div { - width: 95%; - display: flex; - justify-content: space-between; - margin-top: 0.2em; - margin-bottom: 0.5em; - & > span { - display: flex; - align-items: center; - gap: 0.2em; - & > h2 { - font-family: SUIT; - font-size: 28px; - font-weight: 700; - line-height: 35px; - } - & > h3 { - font-family: SUIT; - font-size: 13px; - font-weight: 600; - line-height: 16px; - margin-top: 0.8em; - } - & > h4 { - font-family: Pretendard; - font-size: 12px; - font-weight: 600; - line-height: 14px; - color: #8c8c8c; - margin-top: 0.9em; - } - & > h5 { - font-family: SUIT; - font-size: 14px; - font-weight: 700; - line-height: 17px; - color: #51b13a; - margin-top: 0.8em; - } - & > h6 { - font-family: Pretendard; - font-size: 10px; - font-weight: 600; - line-height: 12px; - color: #bfbfbf; - margin-top: 1.1em; - } - & > img { - width: 0.7em; - height: 0.7em; - margin-top: 0.4em; - } - } - } -`; -const RateBox = styled.span` - display: flex; - align-items: center; justify-content: center; - width: 87%; - padding: 0.5em 1em; + padding: 2.7rem 2.4rem; +`; + +const StTitle = styled.p` + color: var(--Black, #262626); font-family: Pretendard; font-size: 10px; + font-style: normal; font-weight: 700; - line-height: 12px; - text-align: center; - color: #414141; - border: none; - border-radius: 5px; - background-color: #f4f4f4; -`; -const ScoreBox = styled(RateBox)` - color: #51b13a; - background-color: #e3f5ee; - color: #397356; - & > div { - color: #63c393; - } + line-height: normal; `; -const CardBack = styled(CardFace)` - background-color: #e8f7f7; - background-image: url(${flip1}); - background-size: contain; - background-repeat: no-repeat; - transform: rotateY(180deg); +const StLayout = styled.div` + display: flex; + flex-direction: column; + margin: 0.8rem 0 1.8rem; `; -const FlipCard: React.FC = () => { - const Info = useRecoilValue(LoanInfo); - const outputValue = useRecoilValue(output); - const score = Math.floor(outputValue.Score); - - const [coachMark, setCoachMark] = useRecoilState(CoachMarkStage); - const data = useRecoilValue(userInfo); - - // stage 값에 접근 - const { stage, mode } = coachMark; - - // stage 값을 업데이트하는 함수 - const updateStage = (newStage: number) => { - setCoachMark({ ...coachMark, stage: newStage }); - }; - - let isVisible = mode && stage === 2; - const [isFlipped, setIsFlipped] = useState(false); - - const handleClick = () => { - setIsFlipped(!isFlipped); - }; +const StStrong = styled.span` + color: #77645e; +`; - return ( - - - -
    - -

    나의 대출 금리

    -
    - -

    {data.loan_initial}

    -

    %

    -

    이번 분기 기준

    -
    - - -
    %
    -
    전달 대비
    -
    -
    - - 💵 연봉이 오르면 금리가 저렴해진다? -
    -
    -
    - -

    나의 신용 평가 점수

    -
    - -

    {data.newCreditScore}

    -

    -
    - -
    상위 68%
    -
    -
    - - NICE 신용평가점수보다 약{' '} -
    {data.newCreditScore - data.creditScore}점
    차이나요! -
    -
    -
    -
    - -
    - {isVisible && } -
    - ); -}; +const StP1 = styled.p` + color: var(--Black, #262626); + font-family: Pretendard; + font-size: 16px; + font-style: normal; + font-weight: 700; + line-height: normal; +`; -export default FlipCard; +const StP = styled.p` + color: #8d96a1; + font-family: Pretendard; + font-size: 11px; + font-style: normal; + font-weight: 600; + line-height: normal; +`; diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index 483c163..4434c92 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -110,10 +110,10 @@ const Dashboard = () => { {/*알림*/}
    + {/*금융지식 1*/}
    - {/*대출금리,신용평가 점수*/}
    - +
    {/*이번달 대출금*/}
    From 33d08408efd680061f32649136f1038232a08df3 Mon Sep 17 00:00:00 2001 From: sooy Date: Thu, 11 Jul 2024 21:20:48 +0900 Subject: [PATCH 5/9] =?UTF-8?q?fix:=20rem=20=EC=84=A4=EC=A0=95=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/DashboardComs/FlipCard.tsx | 1 + src/components/MainSidebar.tsx | 3 ++- src/pages/Dashboard.tsx | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/DashboardComs/FlipCard.tsx b/src/components/DashboardComs/FlipCard.tsx index efbb360..dcbc6e6 100644 --- a/src/components/DashboardComs/FlipCard.tsx +++ b/src/components/DashboardComs/FlipCard.tsx @@ -113,6 +113,7 @@ const StTitle = styled.p` const StLayout = styled.div` display: flex; flex-direction: column; + gap: 0.5rem; margin: 0.8rem 0 1.8rem; `; diff --git a/src/components/MainSidebar.tsx b/src/components/MainSidebar.tsx index 529ae1a..35d373f 100644 --- a/src/components/MainSidebar.tsx +++ b/src/components/MainSidebar.tsx @@ -122,7 +122,8 @@ const Sidebar = styled.aside` left: 0px; border-right: 1px solid var(--Gray3, #d9d9d9); background: #f9fafc; - width: 11.5rem; + max-width: 22rem; + width: 20%; height: 100%; display: flex; flex-direction: column; diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index 4434c92..f4a054d 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -131,7 +131,7 @@ const Dashboard = () => { }; const Wrapper = styled.div<{ $isNarrowScreen: boolean; $isVisible: boolean }>` - margin-left: ${(props) => (props.$isNarrowScreen ? '15rem' : '0')}; + margin-left: ${(props) => (props.$isNarrowScreen ? '22rem' : '0')}; width: 100%; height: 100%; box-sizing: border-box; @@ -151,7 +151,7 @@ const Wrapper = styled.div<{ $isNarrowScreen: boolean; $isVisible: boolean }>` const MainDashBoard = styled.span<{ $isNarrowScreen: boolean }>` position: absolute; - width: ${(props) => (props.$isNarrowScreen ? 'calc(100% - 18rem)' : '100%')}; + width: ${(props) => (props.$isNarrowScreen ? 'calc(100% - 25rem)' : '100%')}; height: calc(100% - 110px); margin: 1.5rem 1rem; `; From 90cb2e53b061052666f3bc1bf38f6af5bb88db58 Mon Sep 17 00:00:00 2001 From: sooy Date: Sat, 13 Jul 2024 03:03:00 +0900 Subject: [PATCH 6/9] =?UTF-8?q?feat:=20=EA=B8=88=EB=A6=AC=20=EB=B2=94?= =?UTF-8?q?=EC=9C=84/=EC=97=85=EC=A7=91=EC=A2=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/GlobalStyle.ts | 5 + src/assets/svgs/0_index.ts | 2 + src/assets/svgs/GraphMock.svg | 3 + src/components/DashboardComs/DashHeader.tsx | 10 -- src/components/DashboardComs/FlipCard.tsx | 1 + src/components/DashboardComs/LoanTobepaid.tsx | 165 +++++++++++++----- src/pages/Dashboard.tsx | 6 +- 7 files changed, 131 insertions(+), 61 deletions(-) create mode 100644 src/assets/svgs/GraphMock.svg diff --git a/src/GlobalStyle.ts b/src/GlobalStyle.ts index 3dfcc94..6ab33c6 100644 --- a/src/GlobalStyle.ts +++ b/src/GlobalStyle.ts @@ -14,6 +14,11 @@ const GlobalStyle = createGlobalStyle` box-sizing: border-box; } + ul,ol,li{ + padding: 0; + list-style: none; + } + @font-face { font-family: 'Pretendard'; font-weight: 200; diff --git a/src/assets/svgs/0_index.ts b/src/assets/svgs/0_index.ts index 4300be6..ca32c30 100644 --- a/src/assets/svgs/0_index.ts +++ b/src/assets/svgs/0_index.ts @@ -4,6 +4,7 @@ import GreenCheckIcon from './GreenCheckIcon.svg?react'; import CircleCheckIcon from './CircleCheckIcon.svg?react'; import CircleCheckColor from './CircleCheckColor.svg?react'; import EditIcon from './EditIcon.svg?react'; +import GraphMonk from './GraphMock.svg?react'; export { HiddenIcon, @@ -12,4 +13,5 @@ export { CircleCheckIcon, CircleCheckColor, EditIcon, + GraphMonk, }; diff --git a/src/assets/svgs/GraphMock.svg b/src/assets/svgs/GraphMock.svg new file mode 100644 index 0000000..7bb9bcb --- /dev/null +++ b/src/assets/svgs/GraphMock.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/DashboardComs/DashHeader.tsx b/src/components/DashboardComs/DashHeader.tsx index 2ec7c23..387c9a6 100644 --- a/src/components/DashboardComs/DashHeader.tsx +++ b/src/components/DashboardComs/DashHeader.tsx @@ -81,16 +81,6 @@ const Bold = styled.span` const BoldGreen = styled(Bold)` color: #63c393; `; -const Box = styled.span<{ $backgroundColor: string }>` - //color background color prop으로 - font-size: 10px; - font-weight: 700; - line-height: 12px; - border-radius: 5px; - background-color: ${(props) => props.$backgroundColor}; - color: ${(props) => props.color}; - padding: 3px 5px; -`; const DashHeader = () => { const [coachMark, setCoachMark] = useRecoilState(CoachMarkStage); diff --git a/src/components/DashboardComs/FlipCard.tsx b/src/components/DashboardComs/FlipCard.tsx index dcbc6e6..7b3def9 100644 --- a/src/components/DashboardComs/FlipCard.tsx +++ b/src/components/DashboardComs/FlipCard.tsx @@ -99,6 +99,7 @@ const CardBack = styled(CardFace)` flex-direction: column; justify-content: center; padding: 2.7rem 2.4rem; + border-radius: 10px; `; const StTitle = styled.p` diff --git a/src/components/DashboardComs/LoanTobepaid.tsx b/src/components/DashboardComs/LoanTobepaid.tsx index 35f5c42..3841acb 100644 --- a/src/components/DashboardComs/LoanTobepaid.tsx +++ b/src/components/DashboardComs/LoanTobepaid.tsx @@ -9,6 +9,8 @@ import { LoanInfo } from '@/state/LoanInfo'; import { output } from '@/state/output'; import Tooltip4 from '../CoachMarksComs/Tooltip4'; import { userInfo } from '@/state/userInfo'; +import { SubTitle } from '@/styles/MypageStyle'; +import { GraphMonk } from '@/assets/svgs/0_index'; const LoanTobepaid = () => { const [coachMark, setCoachMark] = useRecoilState(CoachMarkStage); @@ -39,36 +41,48 @@ const LoanTobepaid = () => { return ( <> - 나의 이번 달 대출금 - - - {paidtoAmount.toLocaleString()} - - - - - - -
    - - -
    + + 나의 대출 변동 금리 범위 + + 기준 · 사용자 입력 데이터 기반 ML모델 예측 + +
    + {`8 ~ 12`} + % +
    + +
    + + 내 또래의 업직종 구성 + 기준 · 나이대별 직종 + + + 1 + 서비스업 + 25.2% + + + 2 + 서비스업 + 25.2% + + + 3 + 서비스업 + 25.2% + + + 4 + 서비스업 + 25.2% + + + 5 + 서비스업 + 25.2% + + + {isVisible && }
    @@ -84,12 +98,11 @@ const Dash = { box-sizing: border-box; border-radius: 8px; /* border: 1px solid var(--Gray3, #d9d9d9); */ - outline: 1px solid var(--Gray3, #d9d9d9); + /* outline: 1px solid var(--Gray3, #d9d9d9); */ outline-offset: -1px; /* 내부로 2px 만큼 옮김 */ - padding: 22px; + /* padding: 22px; */ display: flex; - flex-direction: column; - gap: 0.5rem; + gap: 1.5rem; z-index: ${({ $isVisible }) => ($isVisible ? '10' : '1')}; //코치마크 @@ -111,14 +124,32 @@ const Dash = { display: flex; } `, + Container: styled.div` + position: relative; + outline: 1px solid var(--Gray3, #d9d9d9); + width: 100%; + height: 100%; + border-radius: 10px; + padding: 2.8rem 2.5rem; + gap: 0.8rem; + `, Title: styled.p` - color: var(--Gray8, #595959); + color: #4f5561; font-family: Pretendard; - font-size: 0.8rem; + font-size: 1.3rem; font-style: normal; font-weight: 700; line-height: normal; `, + SubTitle: styled.p` + color: var(--Gray5, #a6a6a6); + font-family: Pretendard; + font-size: 11px; + font-style: normal; + font-weight: 600; + line-height: normal; + margin: 0.8rem 0 1.5rem; + `, LoanPrice: styled.div` display: flex; align-items: flex-end; @@ -133,21 +164,59 @@ const Dash = { }; const Big = styled.span` - color: var(--Black, #262626); + color: #21272d; font-family: SUIT; - font-size: 32px; + font-size: 30px; font-style: normal; - font-weight: 700; + font-weight: 800; line-height: normal; - &::after { - content: '원'; - color: var(--Black, #262626); - font-family: Pretendard; - font-size: 15px; - font-style: normal; - font-weight: 600; - line-height: normal; - } +`; + +const StyleUL = styled.ul` + display: flex; + flex-direction: column; + gap: 1rem; +`; + +const StyleLi = styled.li` + display: flex; + gap: 1.6rem; +`; + +const ListStyle = styled.span` + color: var(--Gray7, #737373); + font-family: SUIT; + font-size: 12px; + font-style: normal; + font-weight: 800; + line-height: normal; + padding-right: 0.2rem; +`; + +const ListContent = styled.span` + color: #21272d; + font-family: Pretendard; + font-size: 12px; + font-style: normal; + font-weight: 600; + line-height: normal; +`; + +const Box = styled.span<{ $backgroundColor: string }>` + //color background color prop으로 + font-size: 10px; + font-weight: 700; + line-height: 12px; + border-radius: 5px; + background-color: ${(props) => props.$backgroundColor}; + color: #d96c87; + padding: 3px 5px; +`; + +const STGraphMonk = styled(GraphMonk)` + position: absolute; + bottom: 5.4rem; + right: 3.2rem; `; export default LoanTobepaid; diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index f4a054d..b791ddb 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -102,20 +102,20 @@ const Dashboard = () => {
    + {/*대출상품, 상환날짜, 납부 회차*/}
    - {/*대출상품, 상환날짜, 납부 회차*/}
    + {/*알림*/}
    - {/*알림*/}
    {/*금융지식 1*/}
    + {/*금리 범위 / 업직종*/}
    - {/*이번달 대출금*/}
    From 661146be7d27efeeca2d3832906ec3525b004403 Mon Sep 17 00:00:00 2001 From: sooy Date: Sat, 13 Jul 2024 04:31:28 +0900 Subject: [PATCH 7/9] =?UTF-8?q?feat:=20=ED=95=98=EB=8B=A8=20=EB=91=90?= =?UTF-8?q?=EA=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/DashboardComs/LoanHistory.tsx | 316 ++++++++---------- src/components/DashboardComs/RateChange.tsx | 193 ++++------- .../DashboardComs/TransverseGraph.tsx | 84 ++--- src/pages/Dashboard.tsx | 4 +- 4 files changed, 247 insertions(+), 350 deletions(-) diff --git a/src/components/DashboardComs/LoanHistory.tsx b/src/components/DashboardComs/LoanHistory.tsx index 88af3dc..4205c01 100644 --- a/src/components/DashboardComs/LoanHistory.tsx +++ b/src/components/DashboardComs/LoanHistory.tsx @@ -1,15 +1,96 @@ -import React from 'react'; -import { styled } from 'styled-components'; +import React, { useEffect, useState } from 'react'; +import styled from 'styled-components'; +import '../../styles/CustomTooltip.css'; import { useRecoilState, useRecoilValue } from 'recoil'; import { CoachMarkStage } from '@/state/CoachMarkStage'; -import { LoanInfo } from '@/state/LoanInfo'; -import Tooltip6 from '../CoachMarksComs/Tooltip6'; +import Tooltip5 from '../CoachMarksComs/Tooltip5'; import { userInfo } from '@/state/userInfo'; -import customLocaleString from '@/utils/customLocaleString'; +import TransverseGraph from './TransverseGraph'; +import { SubTitle } from '@/styles/MypageStyle'; + +const Container = styled.div<{ $isVisible: boolean }>` + width: 100%; + height: 100%; + box-sizing: border-box; + /* border: 1px solid #d9d9d9; */ + outline: 1px solid var(--Gray3, #d9d9d9); + outline-offset: -1px; + border-radius: 8px; + display: flex; + flex-direction: column; + gap: 2rem; + position: relative; + padding: 2.8rem; + + z-index: ${({ $isVisible }) => ($isVisible ? '10' : '1')}; + //코치마크 + + &::before { + content: ''; + position: absolute; + top: -5px; + right: -5px; + bottom: -5px; + left: -5px; /* 테두리 바깥쪽 영역 */ + z-index: ${({ $isVisible }) => + $isVisible ? '-1' : '0'}; /* div 뒤에 배치 */ + background-color: #fff; + border-radius: 10px; + display: ${({ $isVisible }) => ($isVisible ? 'block' : 'none')}; + } +`; +const Wrapper = styled.div` + display: flex; + flex-direction: column; + & > p { + font-size: 13px; + font-weight: 700; + line-height: 16px; + letter-spacing: 0em; + color: #595959; + padding-bottom: 0.75em; + } +`; +const Num = styled.span` + color: #21272d; + font-size: 3rem; + font-style: normal; + font-weight: 550; + line-height: normal; +`; +const Per = styled.span` + color: #8c8c8c; + font-size: 13px; + font-weight: 400; + line-height: 16px; + margin-right: 0.4em; +`; +const Text = styled.span` + font-family: Pretendard; + font-size: 12px; + font-weight: 600; + line-height: 14px; + color: #8c8c8c; + margin-right: 5em; +`; +const Chart = styled.div` + width: 100%; +`; + +interface ChartFunctionParams { + series: number[][]; + seriesIndex: number; + dataPointIndex: number; + w: { + globals: { + labels: string[]; + }; + // ...w에 대한 추가적인 타입 정의 + }; +} const LoanHistory = () => { const [coachMark, setCoachMark] = useRecoilState(CoachMarkStage); - const isloan = useRecoilValue(userInfo); const data = useRecoilValue(userInfo); // stage 값에 접근 @@ -20,181 +101,68 @@ const LoanHistory = () => { setCoachMark({ ...coachMark, stage: newStage }); }; - let isVisible = mode && stage === 5; + let isVisible = mode && stage === 4; + const changes = data.changes; + const lineData = changes.map((item) => item.change_loan_initial); + return ( - - 나의 대출 히스토리 - - - 대출시작일 - 2023년 12월 19일 - - - 금리 변경 횟수 - 0회 - - - 상환 횟수 - 0회 - - - 연체 횟수 - 0회 - - - - - - - - -

    상환 기록이 없습니다

    -
    -
    - {isVisible && } -
    + + +

    또래의 대출 금리 범위와 나의 금리 범위 위치

    +
    + {`0 ~ 21`} + % + 20대 여자 + {`8 ~ 12`} + % + 나의 범위 +
    +
    + + + + + 내 상품의 금리 범위 + + + + 대출 상품을 가입한 20대 여자의 평균 금리 범위 + + + {isVisible && } +
    ); }; -const Dash = { - Wrapper: styled.div<{ $isVisible: boolean }>` - position: relative; - width: 100%; - height: 100%; - box-sizing: border-box; - border-radius: 8px; - /* border: 1px solid var(--Gray3, #d9d9d9); */ - outline: 1px solid var(--Gray3, #d9d9d9); - outline-offset: -1px; - display: flex; - flex-direction: column; - gap: 0.5rem; - transition: 0.5s; /* 변화가 있을 때 시간차 주기*/ - z-index: ${({ $isVisible }) => ($isVisible ? '10' : '1')}; - //코치마크 - - &::before { - content: ''; - position: absolute; - top: -5px; - right: -5px; - bottom: -5px; - left: -5px; /* 테두리 바깥쪽 영역 */ - z-index: ${({ $isVisible }) => - $isVisible ? '-1' : 'none'}; /* div 뒤에 배치 */ - background-color: #fff; - border-radius: 10px; - display: ${({ $isVisible }) => ($isVisible ? 'block' : 'none')}; - } - - &:hover { - transform: translateY(-2px); /*위로 5px이동*/ - box-shadow: 5px 5px 5px 0 #d9d9d9; - } - `, - Title: styled.p` - margin: 22px 22px 0 22px; - color: var(--Gray8, #595959); - font-family: Pretendard; - font-size: 0.8rem; - font-style: normal; - font-weight: 700; - line-height: normal; - `, - Cate: styled.div` - margin: 0 22px 0 22px; - display: flex; - justify-content: space-between; - & > span { - flex: 1; - display: flex; - flex-direction: column; - gap: 8px; - } - & > span:not(:nth-child(1)) { - border-left: 1px solid #bfbfbf; - padding-left: 1rem; - } - `, - Label: styled.p` - color: var(--Gray6, #8c8c8c); - font-family: Pretendard; - font-size: 12px; - font-style: normal; - font-weight: 600; - line-height: normal; - `, - Content: styled.p` - color: #000; - font-family: SUIT; - font-size: 15px; - font-weight: 800; - overflow-wrap: break-word; - `, - ScrollBoard: styled.div` - position: absolute; - bottom: 0px; - display: flex; - width: calc(100% - 22px); - gap: 0.5rem; - padding: 0.5rem 0 1rem 22px; - overflow-x: scroll; - overflow-y: hidden; - white-space: nowrap; - &::-webkit-scrollbar { - height: 7px; - } - - /* 막대기 */ - &::-webkit-scrollbar-thumb { - border-radius: 20px; - background-color: #a6a6a6; - border: 5px solid transparent; - } - - /* 백그라운드 */ - &::-webkit-scrollbar-track { - background: #f1f1f1; - background-size: cover; - } - - /*스크롤바 커스텀 끝*/ - `, -}; -const BoardItem = styled.div` - min-width: 150px; - height: 7rem; - border-radius: 10px; - border: 1px solid var(--Gray3, #d9d9d9); - background: #f9fafb; +export default LoanHistory; +const StLabelWrapper = styled.div` display: flex; flex-direction: column; - justify-content: center; - align-items: center; gap: 1rem; - & > p { - color: var(--Gray9, #414141); - font-family: Pretendard; - font-size: 12px; - font-weight: 600; - } `; -export default LoanHistory; +const StLabelContainer = styled.div` + display: flex; + gap: 1rem; +`; + +const StCircle = styled.div` + width: 10px; + height: 10px; + border-radius: 50px; + background-color: #5bc569; +`; + +const StLabel = styled.p` + color: #87898d; + font-family: Pretendard; + font-size: 11px; + font-style: normal; + font-weight: 500; + line-height: normal; +`; + +const StbasicCircle = styled(StCircle)` + background-color: #f6f7f8; +`; diff --git a/src/components/DashboardComs/RateChange.tsx b/src/components/DashboardComs/RateChange.tsx index 561abd6..0fc3138 100644 --- a/src/components/DashboardComs/RateChange.tsx +++ b/src/components/DashboardComs/RateChange.tsx @@ -1,13 +1,12 @@ import React, { useEffect, useState } from 'react'; -import ApexCharts from 'apexcharts'; import styled from 'styled-components'; import '../../styles/CustomTooltip.css'; -import up from '../../assets/imgs/up.png'; -import down from '../../assets/imgs/down.png'; import { useRecoilState, useRecoilValue } from 'recoil'; import { CoachMarkStage } from '@/state/CoachMarkStage'; import Tooltip5 from '../CoachMarksComs/Tooltip5'; import { userInfo } from '@/state/userInfo'; +import TransverseGraph from './TransverseGraph'; +import { SubTitle } from '@/styles/MypageStyle'; const Container = styled.div<{ $isVisible: boolean }>` width: 100%; @@ -19,7 +18,9 @@ const Container = styled.div<{ $isVisible: boolean }>` border-radius: 8px; display: flex; flex-direction: column; + gap: 2rem; position: relative; + padding: 2.8rem; z-index: ${({ $isVisible }) => ($isVisible ? '10' : '1')}; //코치마크 @@ -39,7 +40,8 @@ const Container = styled.div<{ $isVisible: boolean }>` } `; const Wrapper = styled.div` - padding: 1.5em 2em 0 2em; + display: flex; + flex-direction: column; & > p { font-size: 13px; font-weight: 700; @@ -50,16 +52,16 @@ const Wrapper = styled.div` } `; const Num = styled.span` - font-family: SUIT; - font-size: 28px; - font-weight: 700; - line-height: 35px; - margin-right: 0.2em; + color: #21272d; + font-size: 3rem; + font-style: normal; + font-weight: 550; + line-height: normal; `; const Per = styled.span` - font-family: SUIT; + color: #8c8c8c; font-size: 13px; - font-weight: 600; + font-weight: 400; line-height: 16px; margin-right: 0.4em; `; @@ -102,140 +104,65 @@ const RateChange = () => { let isVisible = mode && stage === 4; const changes = data.changes; const lineData = changes.map((item) => item.change_loan_initial); - const blockData = lineData.map((item) => item * 1.25); - const duration = changes.map((item) => item.change_insert_time); - - const options = { - colors: ['#FBEAB2', '#80D2D0'], - series: [ - { - name: '', - type: 'column', - data: blockData, - }, - { - name: '', - type: 'line', - data: lineData, - }, - ], - chart: { - height: 185, - type: 'line', - toolbar: { - show: false, - }, - }, - plotOptions: { - bar: { - columnWidth: '65%', - }, - }, - tooltip: { - custom: function ({ - series, - seriesIndex, - dataPointIndex, - w, - }: ChartFunctionParams) { - let idx = parseInt(w.globals.labels[dataPointIndex]) - 1; - let rate = series[seriesIndex][dataPointIndex] / 1.25; // 해당 월의 금리 - let previousRate = series[seriesIndex][dataPointIndex - 1] || 0; // 전달의 금리 - let rateChange = rate - previousRate; // 금리 변동폭 - const startDate = duration[idx]; - const endDate = duration[idx]; - - // 양수 또는 음수에 따른 아이콘 결정 - const changeIcon = - rateChange >= 0 - ? `upIcon` // 양수일 때의 아이콘 - : `downIcon`; // 음수일 때의 아이콘 - - //사용자 정의 툴팁 내용 - return ` -
    -
    - ${rate} - % -
    ${startDate} - ${endDate}
    - 이전 달 대비 - ${changeIcon} ${rateChange}% -
    -
    - `; - }, - }, - stroke: { - width: [0, 2.5], - }, - dataLabels: { - enabled: false, - }, - labels: duration, - xaxis: { - tooltip: { - enabled: false, // X축 툴팁 비활성화 - }, - type: 'category', - categories: duration, - labels: { - show: false, // X축 라벨을 숨깁니다. - }, - }, - yaxis: [ - { - labels: { - show: false, // Y축 라벨을 숨깁니다. - }, - min: 0, // 선 그래프의 Y축 최소값 - max: 20, // 선 그래프의 Y축 최대값 - }, - { - labels: { - show: false, // Y축 라벨을 숨깁니다. - }, - min: 0, // 선 그래프의 Y축 최소값 - max: 20, // 선 그래프의 Y축 최대값 - }, - ], - - legend: { - show: false, // 범례를 숨깁니다. - }, - grid: { - show: false, // 그리드 자체는 보임 - padding: { - left: 0, // 왼쪽 패딩을 0으로 설정 - right: 25, // 오른쪽 패딩을 0으로 설정 (필요한 경우) - }, - }, - }; - - useEffect(() => { - const chart = new ApexCharts(document.querySelector('#chart'), options); - chart.render(); - return () => { - chart.destroy(); - }; - }, []); return ( -

    나의 대출 금리 변화

    +

    또래의 대출 금리 범위와 나의 금리 범위 위치

    - {data.loan_initial} + {`0 ~ 21`} % - 역대 최저 금리 - {data.loan_initial} + 20대 여자 + {`8 ~ 12`} % - 역대 최고 금리 + 나의 범위
    - + + + + + 내 상품의 금리 범위 + + + + 대출 상품을 가입한 20대 여자의 평균 금리 범위 + + {isVisible && }
    ); }; export default RateChange; + +const StLabelWrapper = styled.div` + display: flex; + flex-direction: column; + gap: 1rem; +`; + +const StLabelContainer = styled.div` + display: flex; + gap: 1rem; +`; + +const StCircle = styled.div` + width: 10px; + height: 10px; + border-radius: 50px; + background-color: #5bc569; +`; + +const StLabel = styled.p` + color: #87898d; + font-family: Pretendard; + font-size: 11px; + font-style: normal; + font-weight: 500; + line-height: normal; +`; + +const StbasicCircle = styled(StCircle)` + background-color: #f6f7f8; +`; diff --git a/src/components/DashboardComs/TransverseGraph.tsx b/src/components/DashboardComs/TransverseGraph.tsx index d359577..8dabebb 100644 --- a/src/components/DashboardComs/TransverseGraph.tsx +++ b/src/components/DashboardComs/TransverseGraph.tsx @@ -1,4 +1,3 @@ -// TransverseGraph.tsx import React, { useRef, useEffect } from 'react'; import * as d3 from 'd3'; import { styled } from 'styled-components'; @@ -7,31 +6,33 @@ type BarChartProps = { value: number; min: number; max: number; -}; // 데이터 타입 정의 +}; -/** 가로막대차트 구현 */ const TransverseGraph: React.FC = ({ value, min, max }) => { const ref = useRef(null); useEffect(() => { - if (ref.current && value) { + if (ref.current && value !== undefined) { const svg = d3.select(ref.current); // 기존 내용을 지우고 새로운 그래프를 그릴 수 있도록 준비합니다. svg.selectAll('*').remove(); - // x축 스케일을 설정합니다. value의 최댓값으로 도메인을 설정합니다. const rate = value; + const width = ref.current.clientWidth; + const start = (8 / 21) * width; // 8% 위치 + const end = (12 / 21) * width; // 12% 위치 + const barWidth = end - start; + const gradient = svg .append('defs') .append('linearGradient') .attr('id', 'gradient') .attr('x1', '0%') - .attr('x2', `100%`) + .attr('x2', '100%') .attr('y1', '0%') .attr('y2', '0%'); - // 그라데이션 색상 정의 gradient .append('stop') .attr('offset', '0%') @@ -49,52 +50,53 @@ const TransverseGraph: React.FC = ({ value, min, max }) => { svg .append('rect') - .attr('width', `100%`) // 배경 막대의 전체 너비 - .attr('height', '12px') // 막대와 동일한 높이 - .attr('fill', '#EEF9F5') // 배경 막대의 색상 - .attr('rx', '8px') // 둥근 모서리를 위한 x축 반경 - .attr('ry', '8px'); // 둥근 모서리를 위한 y축 반경 + .attr('x', 0) + .attr('y', 12) + .attr('width', `100%`) + .attr('height', '12px') + .attr('fill', '#EEF9F5') + .attr('rx', '8px') + .attr('ry', '8px'); - // SVG에 막대를 추가합니다. svg .append('rect') - .attr('height', '12px') // 막대의 높이 - .attr('fill', 'url(#gradient)') // 막대의 색상 - .attr('rx', '8px') // 둥근 모서리를 위한 x축 반경 - .attr('ry', '8px') // 둥근 모서리를 위한 y축 반경 - .attr('width', 0) // 애니메이션 시작을 위해 초기 너비를 0으로 설정합니다. + .attr('x', start) + .attr('y', 12) + .attr('height', '12px') + .attr('fill', 'url(#gradient)') + .attr('rx', start === 0 ? '8px' : '0') // 시작 부분이 아닌 경우 둥근 모서리를 제거 + .attr('ry', start === 0 ? '8px' : '0') + .attr('width', 0) .transition() .duration(1500) - .attr('width', `${rate}%`); // 애니메이션을 통해 최종 너비로 변경합니다. + .attr('width', barWidth); - // 막대에 텍스트를 추가합니다. + // 양 끝에 구분선 추가 svg - .append('text') - .attr('x', 0) // 텍스트의 x 위치 - .attr('y', 25) // 텍스트의 y 위치 - .text(`0%`) - .attr('font-size', '8px') - .attr('fill', '#BFBFBF'); - svg - .append('text') - .attr('x', '95%') - .attr('y', 25) // 텍스트의 y 위치 - .text(`${max + 5}%`) - .attr('font-size', '8px') - .attr('fill', '#BFBFBF'); + .append('line') + .attr('x1', start) + .attr('y1', -50) // 막대 위로 5px + .attr('x2', start) + .attr('y2', 50) // 막대 아래로 5px + .attr('stroke', '#BFBFBF') + .attr('stroke-width', 1) + .attr('stroke-dasharray', '4 2'); // 점선 + svg - .append('text') - .attr('x', `${rate}%`) - .attr('y', 25) // 텍스트의 y 위치 - .text(`${value}%`) - .attr('font-size', '8px') - .attr('fill', '#51b13a'); + .append('line') + .attr('x1', end) + .attr('y1', -50) // 막대 위로 5px + .attr('x2', end) + .attr('y2', 50) // 막대 아래로 5px + .attr('stroke', '#BFBFBF') + .attr('stroke-width', 1) + .attr('stroke-dasharray', '4 2'); // 점선 } }, [value]); return ( -
    {value}%
    + {/*
    {value}%
    */}
    ); @@ -128,7 +130,7 @@ const Wrapper = styled.div` const Svg = styled.svg` width: 100%; - height: 2rem; + height: 40px; `; export default TransverseGraph; diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index b791ddb..df82ada 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -118,12 +118,12 @@ const Dashboard = () => {
    + {/*또래 금리 범위 위치*/}
    - {/*금리변화*/}
    + {/*유사 소득층*/}
    - {/*대출 히스토리*/} From 27aadce271bfb3d9a785e3e8e35c05cdd3756e10 Mon Sep 17 00:00:00 2001 From: sooy Date: Sat, 13 Jul 2024 04:35:25 +0900 Subject: [PATCH 8/9] =?UTF-8?q?feat:=20=EB=AC=B8=EA=B5=AC=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/components/DashboardComs/LoanHistory.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/DashboardComs/LoanHistory.tsx b/src/components/DashboardComs/LoanHistory.tsx index 4205c01..5843aef 100644 --- a/src/components/DashboardComs/LoanHistory.tsx +++ b/src/components/DashboardComs/LoanHistory.tsx @@ -108,7 +108,7 @@ const LoanHistory = () => { return ( -

    또래의 대출 금리 범위와 나의 금리 범위 위치

    +

    유사 소득층의 대출 금리 범위와 나의 금리 범위 위치

    {`0 ~ 21`} % @@ -126,7 +126,7 @@ const LoanHistory = () => { - 대출 상품을 가입한 20대 여자의 평균 금리 범위 + 대출 상품을 가입한 유사 소득층의 평균 금리 범위 {isVisible && } From 47256204e2f601e9b06d81abc26de1047a622c70 Mon Sep 17 00:00:00 2001 From: sooy Date: Thu, 18 Jul 2024 01:34:15 +0900 Subject: [PATCH 9/9] =?UTF-8?q?refac:=20=EB=8C=80=EC=8B=9C=EB=B3=B4?= =?UTF-8?q?=EB=93=9C,=20=EC=82=AC=EC=9D=B4=EB=93=9C=EB=B0=94=20ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/imgs/flexrateExplain.png | Bin 0 -> 10793 bytes src/assets/imgs/notification.png | Bin 55958 -> 0 bytes src/components/CoachMarksComs/Tooltip2.tsx | 7 +-- src/components/DashboardComs/LoanHistory.tsx | 6 +- src/components/DashboardComs/Notification.tsx | 52 ++++++++++++++++-- src/components/MainSidebar.tsx | 28 +++------- src/pages/Dashboard.tsx | 19 +++++-- 7 files changed, 74 insertions(+), 38 deletions(-) create mode 100644 src/assets/imgs/flexrateExplain.png delete mode 100644 src/assets/imgs/notification.png diff --git a/src/assets/imgs/flexrateExplain.png b/src/assets/imgs/flexrateExplain.png new file mode 100644 index 0000000000000000000000000000000000000000..22145b9b2a4dfdb114dfd5fb8f53bc171b0f6811 GIT binary patch literal 10793 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 t`Xw0$n { return ( -
    나의 대출 내역을 바탕으로
    +
    입력한 정보를 바탕으로 산출된
    - 대출금 상환 및 납입 정보를 - 알려드려요! + 맞춤형 대출 상품 이에요!
    @@ -99,7 +98,7 @@ const TooltipContainer = styled.span` padding: 20px; position: absolute; z-index: 20; - bottom: -10rem; + bottom: -15rem; left: 20rem; &::after { diff --git a/src/components/DashboardComs/LoanHistory.tsx b/src/components/DashboardComs/LoanHistory.tsx index 5843aef..7dda3d4 100644 --- a/src/components/DashboardComs/LoanHistory.tsx +++ b/src/components/DashboardComs/LoanHistory.tsx @@ -3,10 +3,10 @@ import styled from 'styled-components'; import '../../styles/CustomTooltip.css'; import { useRecoilState, useRecoilValue } from 'recoil'; import { CoachMarkStage } from '@/state/CoachMarkStage'; -import Tooltip5 from '../CoachMarksComs/Tooltip5'; import { userInfo } from '@/state/userInfo'; import TransverseGraph from './TransverseGraph'; import { SubTitle } from '@/styles/MypageStyle'; +import Tooltip6 from '../CoachMarksComs/Tooltip6'; const Container = styled.div<{ $isVisible: boolean }>` width: 100%; @@ -101,7 +101,7 @@ const LoanHistory = () => { setCoachMark({ ...coachMark, stage: newStage }); }; - let isVisible = mode && stage === 4; + let isVisible = mode && stage === 5; const changes = data.changes; const lineData = changes.map((item) => item.change_loan_initial); @@ -129,7 +129,7 @@ const LoanHistory = () => { 대출 상품을 가입한 유사 소득층의 평균 금리 범위 - {isVisible && } + {isVisible && } ); }; diff --git a/src/components/DashboardComs/Notification.tsx b/src/components/DashboardComs/Notification.tsx index 6f3002f..0ffae66 100644 --- a/src/components/DashboardComs/Notification.tsx +++ b/src/components/DashboardComs/Notification.tsx @@ -1,11 +1,23 @@ import React from 'react'; -import NotificationImg from '../../assets/imgs/notification.png'; +import flexrateExplain from '../../assets/imgs/flexrateExplain.png'; import { styled } from 'styled-components'; const Notification = () => { return ( - + 정교한 분석 +
    + 또래와의 배교를 통해 + + 더 똑똑한 금융 결정을 도와드려요 + +
    + + Flex Rate는 내 또래의 직장 유형과 금융 상품 선택 현황을 분석한 맞춤형 + 통계 프로그램을 제공해요. 이를 통해 자신의 금융 상황을 또래와 비교하여 + 더 나은 의사 결정을 도와드리고 있어요. + + 이모지
    ); }; @@ -16,17 +28,45 @@ const Dash = { height: 100%; box-sizing: border-box; border-radius: 8px; - border: 1px solid var(--Gray3, #d9d9d9); padding: 22px; display: flex; flex-direction: column; - gap: 0.5rem; + justify-content: center; + gap: 0.8rem; + background-color: #e8f7f7; - & > img { + & img { width: 100%; - object-fit: fill; } `, + TopText: styled.p` + color: var(--Black, #262626); + font-family: Pretendard; + font-size: 1rem; + font-weight: 700; + `, + MainWrapper: styled.div` + display: flex; + flex-direction: column; + `, + MainText: styled.p` + color: var(--Black, #262626); + font-family: Pretendard; + font-size: 1.7rem; + font-weight: 700; + `, + ExplainText: styled.p` + color: #8d96a1; + font-family: Pretendard; + font-size: 1.2rem; + font-weight: 500; + line-height: 1.8rem; + margin: 2rem 0 4.8rem; + `, }; +const ColorText = styled.span` + color: #1fa3a3; +`; + export default Notification; diff --git a/src/components/MainSidebar.tsx b/src/components/MainSidebar.tsx index 35d373f..6cc7b05 100644 --- a/src/components/MainSidebar.tsx +++ b/src/components/MainSidebar.tsx @@ -66,29 +66,16 @@ const MainSidebar = () => {

    {username} 님, 반가워요!

    -

    likelion2023

    +

    FLEXRATE

    - -
    대시보드
    -
      -
    • - 내 대출 관리하기 -
    • -
    • 내 소비 관리하기
    • -
    -
    분석
      -
    • { - e.preventDefault(); - nav('/editinfo'); - }} - > - 내 신용정보 수정 +
    • + FLEXRATE 대출 상품
    • +
    • 대출 승인 현황
    @@ -106,9 +93,9 @@ const MainSidebar = () => { -
    설명
    +
    이용약관
      -
    • 설명보기
    • +
    • 개인 정보 이용 약관
    @@ -122,7 +109,7 @@ const Sidebar = styled.aside` left: 0px; border-right: 1px solid var(--Gray3, #d9d9d9); background: #f9fafc; - max-width: 22rem; + max-width: 24rem; width: 20%; height: 100%; display: flex; @@ -181,6 +168,7 @@ const List = styled.div` display: flex; flex-direction: column; gap: 20px; + padding-left: 1rem; .list { padding: 0; diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index df82ada..0789aae 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -98,7 +98,7 @@ const Dashboard = () => { {isNarrowScreen ? : <>} -
    + 2024년 7월 24일
    @@ -106,7 +106,7 @@ const Dashboard = () => {
    - {/*알림*/} + {/*FLEXRATE 타당성*/}
    @@ -131,7 +131,7 @@ const Dashboard = () => { }; const Wrapper = styled.div<{ $isNarrowScreen: boolean; $isVisible: boolean }>` - margin-left: ${(props) => (props.$isNarrowScreen ? '22rem' : '0')}; + margin-left: ${(props) => (props.$isNarrowScreen ? '25rem' : '0')}; width: 100%; height: 100%; box-sizing: border-box; @@ -151,8 +151,9 @@ const Wrapper = styled.div<{ $isNarrowScreen: boolean; $isVisible: boolean }>` const MainDashBoard = styled.span<{ $isNarrowScreen: boolean }>` position: absolute; - width: ${(props) => (props.$isNarrowScreen ? 'calc(100% - 25rem)' : '100%')}; - height: calc(100% - 110px); + width: ${(props) => (props.$isNarrowScreen ? 'calc(100% - 28rem)' : '100%')}; + min-height: 65rem; + height: calc(100% - 16rem); margin: 1.5rem 1rem; `; @@ -183,4 +184,12 @@ const GridContainer = styled.div` } /* 4~5행, 3~4열 */ `; +const StDate = styled.p` + color: var(--Gray8, #595959); + font-family: Pretendard; + font-size: 1.3rem; + font-weight: 600; + margin: 1.6rem 0 1.8rem; +`; + export default Dashboard;