From 664f318573ee824d80e1b259d3e0363b02da2c4e Mon Sep 17 00:00:00 2001 From: 1g2g <87280835+1g2g@users.noreply.github.com> Date: Tue, 28 Nov 2023 01:56:56 +0900 Subject: [PATCH] =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=95=84=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EB=84=88=EB=B9=84=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EB=B0=8F=20=EC=8A=A4=EC=BC=88=EB=A0=88=ED=86=A4=20ui=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(#352)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * design: 프로필 중앙 정렬 제거 * fix: lint error * design: 프로필 모달 layout 설정 * feat: 프로필 페이지 스켈레톤 ui 구현 * feat: 매너 리뷰 페이지 프로필 스켈레톤 ui 적용 * refactor: 코딩 컨벤션 적용 * chore: 프로필 스켈레톤 ui 고도화 * feat: 팔로우 클릭 이벤트 토스트 알림 추가 --- .../MannerScoreReviewPage.style.ts | 4 ++ .../MannerScoreReviewPage.tsx | 18 ++++-- src/pages/ProfilePage/Profile.tsx | 36 +++++++---- src/pages/ProfilePage/ProfilePage.style.ts | 15 ++--- src/pages/ProfilePage/ProfilePageSkeleton.tsx | 11 ++++ src/pages/ProfilePage/ProfileSkeleton.tsx | 59 +++++++++++++++++++ src/pages/ProfilePage/index.ts | 3 + src/routes/router.tsx | 7 ++- 8 files changed, 126 insertions(+), 27 deletions(-) create mode 100644 src/pages/ProfilePage/ProfilePageSkeleton.tsx create mode 100644 src/pages/ProfilePage/ProfileSkeleton.tsx diff --git a/src/pages/MannerScoreReviewPage/MannerScoreReviewPage.style.ts b/src/pages/MannerScoreReviewPage/MannerScoreReviewPage.style.ts index 297c2780..65de6908 100644 --- a/src/pages/MannerScoreReviewPage/MannerScoreReviewPage.style.ts +++ b/src/pages/MannerScoreReviewPage/MannerScoreReviewPage.style.ts @@ -48,3 +48,7 @@ type BoxProps = { export const Box = styled.div` height: ${(props) => props.height}; `; + +export const ProfileWrapper = styled.div` + margin: 0 16px; +`; diff --git a/src/pages/MannerScoreReviewPage/MannerScoreReviewPage.tsx b/src/pages/MannerScoreReviewPage/MannerScoreReviewPage.tsx index 7433de18..2c6195c0 100644 --- a/src/pages/MannerScoreReviewPage/MannerScoreReviewPage.tsx +++ b/src/pages/MannerScoreReviewPage/MannerScoreReviewPage.tsx @@ -1,7 +1,8 @@ -import { useEffect, useState } from 'react'; +import { Suspense, useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; -import { Profile } from '@pages/ProfilePage/Profile'; +import { ProfileSkeleton } from '@pages/ProfilePage'; +import { Profile } from '@pages/ProfilePage'; import { Avatar } from '@components/Avatar'; import { Header } from '@components/Header'; @@ -27,6 +28,7 @@ import { BackwardWrapper, Box, MemberListContainer, + ProfileWrapper, ReviewPageContainer, TextWrapper, } from './MannerScoreReviewPage.style'; @@ -222,9 +224,15 @@ export const MannerScoreReviewPage = () => { setIsOpen(false)}> - + + }> + {isOpen && ( + + )} + + diff --git a/src/pages/ProfilePage/Profile.tsx b/src/pages/ProfilePage/Profile.tsx index daf91ab2..5b6d69a5 100644 --- a/src/pages/ProfilePage/Profile.tsx +++ b/src/pages/ProfilePage/Profile.tsx @@ -1,4 +1,5 @@ import { ReactNode, useState } from 'react'; +import toast from 'react-hot-toast'; import { useNavigate } from 'react-router-dom'; import { Avatar } from '@components/Avatar'; @@ -53,6 +54,7 @@ type NumberedItemProps = { count: number; icon: ReactNode; color?: string; + onClick?: () => void; }; export const Profile = ({ memberId }: { memberId: Member['id'] }) => { @@ -134,7 +136,12 @@ export const Profile = ({ memberId }: { memberId: Member['id'] }) => { color="black" /> - } count={0} /> + } + count={0} + onClick={handleClickFollow} + /> {myId === memberId ? ( { /> ) : ( - console.log('팔로우')} /> + )} @@ -179,11 +186,8 @@ export const Profile = ({ memberId }: { memberId: Member['id'] }) => { : '없음'} - {'없음'} - - {profile.introduction} - + {profile.introduction} setIsModalOpen(false)}> @@ -202,7 +206,7 @@ export const Profile = ({ memberId }: { memberId: Member['id'] }) => { ); }; -const ProfileField = ({ category, children }: ProfileFieldProps) => { +export const ProfileField = ({ category, children }: ProfileFieldProps) => { return ( @@ -217,7 +221,7 @@ const ProfileField = ({ category, children }: ProfileFieldProps) => { const EventButton = ({ text, width, onClick }: EventButtonProps) => ( ); -const NumberedItem = ({ text, count, icon, color }: NumberedItemProps) => { +const NumberedItem = ({ + text, + count, + icon, + color, + onClick, +}: NumberedItemProps) => { return ( - + {text} @@ -244,3 +254,9 @@ const NumberedItem = ({ text, count, icon, color }: NumberedItemProps) => { ); }; + +const handleClickFollow = () => { + toast('차후에 업데이트될 기능입니다!', { + icon: '👏', + }); +}; diff --git a/src/pages/ProfilePage/ProfilePage.style.ts b/src/pages/ProfilePage/ProfilePage.style.ts index e0c54506..96c326bd 100644 --- a/src/pages/ProfilePage/ProfilePage.style.ts +++ b/src/pages/ProfilePage/ProfilePage.style.ts @@ -1,20 +1,16 @@ import styled from '@emotion/styled'; import { Flex } from '@components/shared/Flex'; - -const MAX_WIDTH = '480px'; +import { Text } from '@components/shared/Text'; export const ProfileContainer = styled.div` ${({ theme }) => theme.STYLES.LAYOUT} min-height: 100dvh; display: flex; - justify-content: center; `; export const Main = styled.div` margin: 10px 0; - display: flex; - justify-content: center; width: 100%; `; @@ -40,7 +36,6 @@ export const ItemBox = styled.div<{ border?: string }>` `; export const ProfileFieldContainer = styled.div` - max-width: ${MAX_WIDTH}; width: 100%; `; @@ -52,15 +47,13 @@ export const CrewGroup = styled.div` flex-wrap: wrap; `; -export const Introduce = styled.div` +export const Introduce = styled(Text)` background-color: ${({ theme }) => theme.PALETTE.GRAY_100}; border-radius: 20px; width: 100%; padding: 16px; - display: inline-block; - & > p { - white-space: pre-wrap; - } + white-space: pre-wrap; + word-break: break-all; `; export const PointerFlex = styled(Flex)` diff --git a/src/pages/ProfilePage/ProfilePageSkeleton.tsx b/src/pages/ProfilePage/ProfilePageSkeleton.tsx new file mode 100644 index 00000000..efe6fb16 --- /dev/null +++ b/src/pages/ProfilePage/ProfilePageSkeleton.tsx @@ -0,0 +1,11 @@ +import { Header } from '@components/Header'; + +import { ProfileContainer } from './ProfilePage.style'; +import { ProfileSkeleton } from './ProfileSkeleton'; + +export const ProfilePageSkeleton = () => ( + +
+ + +); diff --git a/src/pages/ProfilePage/ProfileSkeleton.tsx b/src/pages/ProfilePage/ProfileSkeleton.tsx new file mode 100644 index 00000000..e8029c56 --- /dev/null +++ b/src/pages/ProfilePage/ProfileSkeleton.tsx @@ -0,0 +1,59 @@ +import { Skeleton } from '@components/Skeleton'; +import { Flex } from '@components/shared/Flex'; + +import { theme } from '@styles/theme'; + +import { FlexItem, Main } from './ProfilePage.style'; + +export const ProfileSkeleton = () => ( +
+ + + + + + + + + + + + + + + + + + + + {Array(2) + .fill(null) + .map((_, index) => ( + + ))} + + + + + + {Array(3) + .fill(null) + .map((_, index) => ( + + ))} + + + + + + + + +
+); diff --git a/src/pages/ProfilePage/index.ts b/src/pages/ProfilePage/index.ts index 654cb922..8839e170 100644 --- a/src/pages/ProfilePage/index.ts +++ b/src/pages/ProfilePage/index.ts @@ -1 +1,4 @@ export * from './ProfilePage'; +export * from './ProfilePageSkeleton'; +export * from './ProfileSkeleton'; +export * from './Profile'; diff --git a/src/routes/router.tsx b/src/routes/router.tsx index 53f01093..97497bac 100644 --- a/src/routes/router.tsx +++ b/src/routes/router.tsx @@ -6,6 +6,7 @@ import { CrewsDetailPageLoading } from '@pages/CrewsDetailPage'; import { GamesDetailPageLoading } from '@pages/GamesDetailPage'; import { Layout } from '@pages/Layout'; import { MainPageLoading } from '@pages/MainPage'; +import { ProfilePageSkeleton } from '@pages/ProfilePage'; import { CardListPageSkeleton } from '@pages/__components__/CardListPageSkeleton'; import { ManagePageSkeleton } from '@pages/__components__/ManagePageSkeleton'; @@ -176,7 +177,11 @@ export const router = createBrowserRouter([ }, { path: 'profile/:id', - element: , + element: ( + }> + + + ), }, { path: 'profile/update', element:

프로필 수정 페이지

}, {