From 040f0bb76039df09ac37e53db3fb6a6293d23f69 Mon Sep 17 00:00:00 2001 From: mtm1018 Date: Tue, 30 Sep 2025 15:12:56 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[style]=EB=A7=88=EC=9D=B4=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=8A=A4=EC=BC=88=EB=A0=88=ED=86=A4=20ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/mypage/layout.tsx | 14 +++-- .../mypage/my-active/my-comment/loading.tsx | 24 +++++++++ src/app/mypage/my-active/my-comment/page.tsx | 13 +++-- src/app/mypage/my-active/my-like/loading.tsx | 15 ++++++ src/app/mypage/my-active/my-like/page.tsx | 10 +++- src/app/mypage/my-active/my-post/loading.tsx | 15 ++++++ src/app/mypage/my-active/my-post/page.tsx | 10 +++- src/app/mypage/my-alarm/loading.tsx | 24 +++++++++ src/app/mypage/my-alarm/page.tsx | 8 ++- src/app/mypage/my-setting/loading.tsx | 6 +++ src/app/mypage/my-setting/page.tsx | 44 ++++------------ src/app/mypage/mybar/loading.tsx | 24 +++++++++ src/app/mypage/mybar/page.tsx | 7 ++- .../components/postInfo/PostInfo.tsx | 22 -------- src/domains/mypage/main/MyNav.tsx | 44 ++++++++-------- src/domains/mypage/main/MySetting.tsx | 37 ++++++++++++++ src/domains/mypage/main/TabMenu.tsx | 12 +---- .../mypage/skeleton/main/SkeletonLayout.tsx | 13 +++++ .../skeleton/main/SkeletonMyProfile.tsx | 51 +++++++++++++++++++ .../skeleton/main/SkeletonMypageNav.tsx | 29 +++++++++++ .../mypage/skeleton/main/SkeletonSetting.tsx | 32 ++++++++++++ src/domains/recipe/CocktailCard.tsx | 2 + src/domains/recipe/skeleton/SkeletonAlarm.tsx | 26 ++++++++++ .../recipe/skeleton/SkeletonCocktailCard.tsx | 16 ++++++ .../shared/skeleton/SkeletonPostCard.tsx | 35 +++++++++++++ 25 files changed, 432 insertions(+), 101 deletions(-) create mode 100644 src/app/mypage/my-active/my-comment/loading.tsx create mode 100644 src/app/mypage/my-active/my-like/loading.tsx create mode 100644 src/app/mypage/my-active/my-post/loading.tsx create mode 100644 src/app/mypage/my-alarm/loading.tsx create mode 100644 src/app/mypage/my-setting/loading.tsx create mode 100644 src/app/mypage/mybar/loading.tsx delete mode 100644 src/domains/community/components/postInfo/PostInfo.tsx create mode 100644 src/domains/mypage/main/MySetting.tsx create mode 100644 src/domains/mypage/skeleton/main/SkeletonLayout.tsx create mode 100644 src/domains/mypage/skeleton/main/SkeletonMyProfile.tsx create mode 100644 src/domains/mypage/skeleton/main/SkeletonMypageNav.tsx create mode 100644 src/domains/mypage/skeleton/main/SkeletonSetting.tsx create mode 100644 src/domains/recipe/skeleton/SkeletonAlarm.tsx create mode 100644 src/domains/recipe/skeleton/SkeletonCocktailCard.tsx create mode 100644 src/domains/shared/skeleton/SkeletonPostCard.tsx diff --git a/src/app/mypage/layout.tsx b/src/app/mypage/layout.tsx index ea5d1d4..9210987 100644 --- a/src/app/mypage/layout.tsx +++ b/src/app/mypage/layout.tsx @@ -1,13 +1,17 @@ import MyNav from '@/domains/mypage/main/MyNav'; import MyProfile from '@/domains/mypage/main/MyProfile'; +import SkeletonLayout from '@/domains/mypage/skeleton/main/SkeletonLayout'; +import { Suspense } from 'react'; function Layout({ children }: { children: React.ReactNode }) { return ( -
- - -
{children}
-
+ }> +
+ + +
{children}
+
+
); } export default Layout; diff --git a/src/app/mypage/my-active/my-comment/loading.tsx b/src/app/mypage/my-active/my-comment/loading.tsx new file mode 100644 index 0000000..04bd3d4 --- /dev/null +++ b/src/app/mypage/my-active/my-comment/loading.tsx @@ -0,0 +1,24 @@ +function loading() { + return ( + + ); +} +export default loading; diff --git a/src/app/mypage/my-active/my-comment/page.tsx b/src/app/mypage/my-active/my-comment/page.tsx index 92772ec..3d67535 100644 --- a/src/app/mypage/my-active/my-comment/page.tsx +++ b/src/app/mypage/my-active/my-comment/page.tsx @@ -1,9 +1,16 @@ import CommentList from '@/domains/shared/components/comment/CommentList'; +import { Metadata } from 'next'; + +export const metadata: Metadata = { + title: 'SSOUL | 마이페이지', + description: 'SSOUL 서비스에서 나의 활동을 관리할 수 있는 페이지입니다', +}; + function MyComment() { return ( - + <> + + ); } export default MyComment; diff --git a/src/app/mypage/my-active/my-like/loading.tsx b/src/app/mypage/my-active/my-like/loading.tsx new file mode 100644 index 0000000..b1b824c --- /dev/null +++ b/src/app/mypage/my-active/my-like/loading.tsx @@ -0,0 +1,15 @@ +import SkeletonPostCard from '@/domains/shared/skeleton/SkeletonPostCard'; + +function loading() { + return ( + + ); +} + +export default loading; diff --git a/src/app/mypage/my-active/my-like/page.tsx b/src/app/mypage/my-active/my-like/page.tsx index e302dfa..dc8342c 100644 --- a/src/app/mypage/my-active/my-like/page.tsx +++ b/src/app/mypage/my-active/my-like/page.tsx @@ -1,6 +1,12 @@ import PostCard from '@/domains/community/main/PostCard'; +import { Metadata } from 'next'; -function MyPost() { +export const metadata: Metadata = { + title: 'SSOUL | 마이페이지', + description: 'SSOUL 서비스에서 나의 활동을 관리할 수 있는 페이지입니다', +}; + +function page() { return ( ); } -export default MyPost; +export default page; diff --git a/src/app/mypage/my-active/my-post/loading.tsx b/src/app/mypage/my-active/my-post/loading.tsx new file mode 100644 index 0000000..b1b824c --- /dev/null +++ b/src/app/mypage/my-active/my-post/loading.tsx @@ -0,0 +1,15 @@ +import SkeletonPostCard from '@/domains/shared/skeleton/SkeletonPostCard'; + +function loading() { + return ( + + ); +} + +export default loading; diff --git a/src/app/mypage/my-active/my-post/page.tsx b/src/app/mypage/my-active/my-post/page.tsx index 1e96abc..276459b 100644 --- a/src/app/mypage/my-active/my-post/page.tsx +++ b/src/app/mypage/my-active/my-post/page.tsx @@ -1,6 +1,12 @@ import PostCard from '@/domains/community/main/PostCard'; +import { Metadata } from 'next'; -function MyPost() { +export const metadata: Metadata = { + title: 'SSOUL | 마이페이지', + description: 'SSOUL 서비스에서 나의 활동을 관리할 수 있는 페이지입니다', +}; + +function page() { return ( ); } -export default MyPost; +export default page; diff --git a/src/app/mypage/my-alarm/loading.tsx b/src/app/mypage/my-alarm/loading.tsx new file mode 100644 index 0000000..4ad9073 --- /dev/null +++ b/src/app/mypage/my-alarm/loading.tsx @@ -0,0 +1,24 @@ +import SkeletonAlarm from '@/domains/recipe/skeleton/SkeletonAlarm'; + +function loading() { + return ( +
+ + + + + +
+ ); +} +export default loading; + +// function SkeletonAlarmList({ count = 5 }: { count?: number }) { +// return ( +//
+// {Array.from({ length: count }).map((_, i) => ( +// +// ))} +//
+// ); +// } diff --git a/src/app/mypage/my-alarm/page.tsx b/src/app/mypage/my-alarm/page.tsx index a4d4b2c..bcb8998 100644 --- a/src/app/mypage/my-alarm/page.tsx +++ b/src/app/mypage/my-alarm/page.tsx @@ -1,11 +1,17 @@ import Alarm from '@/domains/mypage/components/Alarm'; +import { Metadata } from 'next'; + +export const metadata: Metadata = { + title: 'SSOUL | 마이페이지', + description: 'SSOUL 서비스에서 나의 활동을 관리할 수 있는 페이지입니다', +}; + function MyAlarm() { return (
-
diff --git a/src/app/mypage/my-setting/loading.tsx b/src/app/mypage/my-setting/loading.tsx new file mode 100644 index 0000000..3462efe --- /dev/null +++ b/src/app/mypage/my-setting/loading.tsx @@ -0,0 +1,6 @@ +import SkeletonSetting from '@/domains/mypage/skeleton/main/SkeletonSetting'; + +function loading() { + return ; +} +export default loading; diff --git a/src/app/mypage/my-setting/page.tsx b/src/app/mypage/my-setting/page.tsx index 9adc305..61cd249 100644 --- a/src/app/mypage/my-setting/page.tsx +++ b/src/app/mypage/my-setting/page.tsx @@ -1,38 +1,12 @@ -'use client'; -import TextButton from '@/shared/components/button/TextButton'; -import Button from '@/shared/components/button/Button'; -import ToggleBtn from '@/domains/mypage/components/ToggleBtn'; -import { useState } from 'react'; -import EditNickName from '@/domains/mypage/components/EditNickName'; -import WithdrawModal from '@/domains/mypage/components/WithdrawModal'; +import MySetting from '@/domains/mypage/main/MySetting'; -function MySetting() { - const [isOpen, setIsOpen] = useState(false); - const [isQuit, setIsQuit] = useState(false); +import { Metadata } from 'next'; +export const metadata: Metadata = { + title: 'SSOUL | 마이페이지', + description: 'SSOUL 서비스에서 나의 활동을 관리할 수 있는 페이지입니다', +}; - return ( -
- {isOpen && setIsOpen(!isOpen)} />} - {isQuit && setIsQuit(!isQuit)} />} -
-
-
닉네임 : UserName
- setIsOpen(!isOpen)}>수정하기 -
-
-

알람설정

- -
-
-
- setIsQuit(!isQuit)}>회원탈퇴 - -
- - -
-
-
- ); +function page() { + return ; } -export default MySetting; +export default page; diff --git a/src/app/mypage/mybar/loading.tsx b/src/app/mypage/mybar/loading.tsx new file mode 100644 index 0000000..615114f --- /dev/null +++ b/src/app/mypage/mybar/loading.tsx @@ -0,0 +1,24 @@ +import SkeletonCocktailCard from '@/domains/recipe/skeleton/SkeletonCocktailCard'; + +function loading() { + return ( +
+ + + + + + + + {/* {Array.from({ length: 6 }).map((_, i) => ( + + ))} */} +
+ ); +} +export default loading; diff --git a/src/app/mypage/mybar/page.tsx b/src/app/mypage/mybar/page.tsx index c1c34b7..7101511 100644 --- a/src/app/mypage/mybar/page.tsx +++ b/src/app/mypage/mybar/page.tsx @@ -1,6 +1,11 @@ -'use client'; import CocktailCard from '@/domains/recipe/CocktailCard'; import Img from '@/shared/assets/images/dummy/exampleCocktail.png'; +import { Metadata } from 'next'; + +export const metadata: Metadata = { + title: 'SSOUL | 마이페이지', + description: 'SSOUL 서비스에서 나의 활동을 관리할 수 있는 페이지입니다', +}; function MyBar() { return ( diff --git a/src/domains/community/components/postInfo/PostInfo.tsx b/src/domains/community/components/postInfo/PostInfo.tsx deleted file mode 100644 index 80d7243..0000000 --- a/src/domains/community/components/postInfo/PostInfo.tsx +++ /dev/null @@ -1,22 +0,0 @@ -function PostInfo({ hasUserName = false }: { hasUserName?: boolean }) { - return ( -
    - {hasUserName && ( - <> -
  • 실버븬
  • - - - )} -
  • 3분 전
  • - -
  • 조회 3
  • - -
  • 댓글 3
  • -
- ); -} - -export default PostInfo; diff --git a/src/domains/mypage/main/MyNav.tsx b/src/domains/mypage/main/MyNav.tsx index c764de2..bff0aca 100644 --- a/src/domains/mypage/main/MyNav.tsx +++ b/src/domains/mypage/main/MyNav.tsx @@ -2,11 +2,11 @@ import TabMenu from '@/domains/mypage/main/TabMenu'; import TextButton from '@/shared/components/button/TextButton'; import Link from 'next/link'; - import { useState } from 'react'; import DeleteAllModal from '../components/DeleteAllModal'; +import { usePathname } from 'next/navigation'; -const options = [ +const MAIN_TABMENU = [ { title: '나만의 BAR', href: '/mypage/mybar', @@ -25,7 +25,7 @@ const options = [ }, ]; -const ActiveTab = [ +const SUB_TABMENU = [ { title: '내가 쓴 글', href: '/mypage/my-active/my-post', @@ -41,8 +41,14 @@ const ActiveTab = [ ]; function MyNav() { - const [isClick, setIsClick] = useState(0); - const [activeTab, setActiveTab] = useState(0); + const pathname = usePathname(); + + const currentIndex = MAIN_TABMENU.findIndex((opt) => pathname.startsWith(opt.href)); + const isActive = currentIndex === -1 ? 0 : currentIndex; + + const subIndex = SUB_TABMENU.findIndex((opt) => pathname.startsWith(opt.href)); + const isSubActive = subIndex === -1 ? 0 : subIndex; + const [isDeleteAll, setIsDeleteAll] = useState(false); return ( @@ -56,8 +62,8 @@ function MyNav() { - {options.map((_, i) => ( + {MAIN_TABMENU.map((_, i) => ( ))} - {(isClick == 0 || isClick == 2) && ( + {(isActive == 0 || isActive == 2) && ( setIsDeleteAll(!isDeleteAll)}> 전체삭제 )} - {isClick == 1 && ( + {isActive == 1 && ( )} - {isClick === 1 && - ActiveTab.map((_, i) => ( + {isActive === 1 && + SUB_TABMENU.map((_, i) => ( diff --git a/src/domains/mypage/main/MySetting.tsx b/src/domains/mypage/main/MySetting.tsx new file mode 100644 index 0000000..f50e9ac --- /dev/null +++ b/src/domains/mypage/main/MySetting.tsx @@ -0,0 +1,37 @@ +'use client'; +import EditNickName from '@/domains/mypage/components/EditNickName'; +import ToggleBtn from '@/domains/mypage/components/ToggleBtn'; +import WithdrawModal from '@/domains/mypage/components/WithdrawModal'; +import Button from '@/shared/components/button/Button'; +import TextButton from '@/shared/components/button/TextButton'; +import { useState } from 'react'; + +function MySetting() { + const [isOpen, setIsOpen] = useState(false); + const [isQuit, setIsQuit] = useState(false); + return ( +
+ {isOpen && setIsOpen(!isOpen)} />} + {isQuit && setIsQuit(!isQuit)} />} +
+
+
닉네임 : UserName
+ setIsOpen(!isOpen)}>수정하기 +
+
+

알람설정

+ +
+
+
+ setIsQuit(!isQuit)}>회원탈퇴 + +
+ + +
+
+
+ ); +} +export default MySetting; diff --git a/src/domains/mypage/main/TabMenu.tsx b/src/domains/mypage/main/TabMenu.tsx index 320bbc3..3cc986a 100644 --- a/src/domains/mypage/main/TabMenu.tsx +++ b/src/domains/mypage/main/TabMenu.tsx @@ -1,11 +1,9 @@ import tw from '@/shared/utills/tw'; import { cva } from 'class-variance-authority'; -import { Dispatch, SetStateAction } from 'react'; interface Props { title: string; isClick: number; - setIsClick: Dispatch>; index: number; role: string; type?: 'default' | 'underLine'; @@ -59,17 +57,11 @@ export const TabClass = cva( } ); -function TabMenu({ title, setIsClick, isClick, role, type, index, id, ...rest }: Props) { +function TabMenu({ title, isClick, role, type, index, id, ...rest }: Props) { const isActive = index == isClick; return ( - ); diff --git a/src/domains/mypage/skeleton/main/SkeletonLayout.tsx b/src/domains/mypage/skeleton/main/SkeletonLayout.tsx new file mode 100644 index 0000000..21c4d34 --- /dev/null +++ b/src/domains/mypage/skeleton/main/SkeletonLayout.tsx @@ -0,0 +1,13 @@ +import SkeletonMypageNav from '@/domains/mypage/skeleton/main/SkeletonMypageNav'; +import SkeletonMyProfile from '@/domains/mypage/skeleton/main/SkeletonMyProfile'; + +function SkeletonLayout() { + return ( +
+ + +
+
+ ); +} +export default SkeletonLayout; diff --git a/src/domains/mypage/skeleton/main/SkeletonMyProfile.tsx b/src/domains/mypage/skeleton/main/SkeletonMyProfile.tsx new file mode 100644 index 0000000..ad134e5 --- /dev/null +++ b/src/domains/mypage/skeleton/main/SkeletonMyProfile.tsx @@ -0,0 +1,51 @@ +// domains/mypage/skeleton/SkeletonMyProfile.tsx +function SkeletonMyProfile() { + return ( +
+
+
+ {/* 왼쪽: 프로필 */} +
+ {/* 아바타 + 이름 */} +
+
+
+
+ {/* 통계 리스트 */} +
    + {['좋아요', '글', '댓글', '칵테일 킵'].map((_, i) => ( +
  • +
    + {i < 3 && |} +
  • + ))} +
+
+ + {/* 오른쪽: MyAbv + AbvGraph */} + +
+
+
+ ); +} +export default SkeletonMyProfile; diff --git a/src/domains/mypage/skeleton/main/SkeletonMypageNav.tsx b/src/domains/mypage/skeleton/main/SkeletonMypageNav.tsx new file mode 100644 index 0000000..8d694ad --- /dev/null +++ b/src/domains/mypage/skeleton/main/SkeletonMypageNav.tsx @@ -0,0 +1,29 @@ +function SkeletonMypageNav() { + return ( +
+

+ 마이페이지 탭 메뉴 (로딩 중) +

+ + {/* 메인 탭 메뉴 스켈레톤 */} + + + {/* 전체삭제 버튼 자리 (조건부) */} +
+
+
+
+ ); +} +export default SkeletonMypageNav; diff --git a/src/domains/mypage/skeleton/main/SkeletonSetting.tsx b/src/domains/mypage/skeleton/main/SkeletonSetting.tsx new file mode 100644 index 0000000..b594cce --- /dev/null +++ b/src/domains/mypage/skeleton/main/SkeletonSetting.tsx @@ -0,0 +1,32 @@ +function SkeletonSetting() { + return ( + + ); +} +export default SkeletonSetting; diff --git a/src/domains/recipe/CocktailCard.tsx b/src/domains/recipe/CocktailCard.tsx index 87796a1..65121fa 100644 --- a/src/domains/recipe/CocktailCard.tsx +++ b/src/domains/recipe/CocktailCard.tsx @@ -4,6 +4,8 @@ import Img from '@/shared/assets/images/dummy/exampleCocktail.png'; import Label from '../shared/components/label/Label'; import Keep from '../shared/components/keep/Keep'; import tw from '@/shared/utills/tw'; +import { Suspense } from 'react'; +import SkeletonMyBar from '../mypage/skeleton/pages/SkeletonMyBar'; interface Props { src?: StaticImageData; diff --git a/src/domains/recipe/skeleton/SkeletonAlarm.tsx b/src/domains/recipe/skeleton/SkeletonAlarm.tsx new file mode 100644 index 0000000..1f7f8d6 --- /dev/null +++ b/src/domains/recipe/skeleton/SkeletonAlarm.tsx @@ -0,0 +1,26 @@ +function SkeletonAlarm() { + return ( +