11import React , { useState , useEffect } from "react" ;
22import { useRouter } from "next/router" ;
3+ import SkeletonUser from "@/shared/skeletonUser" ;
34import Image from "next/image" ;
4- import SkeletonUser from "../../shared/skeletonUser" ;
5- import { MemberType , UserType } from "../../types/users" ;
5+ import { MemberType , UserType } from "@/types/users" ;
66import { getMembers } from "@/api/members" ;
77import { getUserInfo } from "@/api/user" ;
88import { getDashboardById } from "@/api/dashboards" ;
99import { TEAM_ID } from "@/constants/team" ;
10- import RandomProfile from ".. /table/member/RandomProfile" ;
11- import InviteDashboard from ".. /modal/InviteDashboard" ;
10+ import RandomProfile from "@/components /table/member/RandomProfile" ;
11+ import InviteDashboard from "@/components /modal/InviteDashboard" ;
1212
1313interface HeaderDashboardProps {
1414 variant ?: "mydashboard" | "dashboard" | "mypage" ;
@@ -27,7 +27,11 @@ const HeaderDashboard: React.FC<HeaderDashboardProps> = ({
2727 const router = useRouter ( ) ;
2828 const [ user , setUser ] = useState < UserType | null > ( null ) ;
2929 const [ members , setMembers ] = useState < MemberType [ ] > ( [ ] ) ;
30- const [ dashboardTitle , setDashboardTitle ] = useState ( ) ;
30+ const [ dashboard , setDashboard ] = useState < {
31+ title : string ;
32+ createdByMe : boolean ;
33+ } | null > ( null ) ;
34+ const [ errorMessage , setErrorMessage ] = useState ( "" ) ;
3135 const [ isLoading , setIsLoading ] = useState ( true ) ;
3236
3337 const [ isModalOpen , setIsModalOpen ] = useState ( false ) ;
@@ -45,7 +49,8 @@ const HeaderDashboard: React.FC<HeaderDashboardProps> = ({
4549 const user = await getUserInfo ( { teamId : TEAM_ID } ) ;
4650 setUser ( user ) ;
4751 } catch ( error ) {
48- console . log ( "유저 정보 불러오기 실패" , error ) ;
52+ console . error ( "유저 정보 불러오기 실패" , error ) ;
53+ setErrorMessage ( "유저 정보를 불러오지 못했습니다." ) ;
4954 } finally {
5055 setIsLoading ( false ) ;
5156 }
@@ -62,6 +67,7 @@ const HeaderDashboard: React.FC<HeaderDashboardProps> = ({
6267 setMembers ( members ) ;
6368 } catch ( error ) {
6469 console . error ( "멤버 불러오기 실패:" , error ) ;
70+ setErrorMessage ( "멤버 정보를 불러오지 못했습니다." ) ;
6571 } finally {
6672 setIsLoading ( false ) ;
6773 }
@@ -73,46 +79,66 @@ const HeaderDashboard: React.FC<HeaderDashboardProps> = ({
7379
7480 /*대시보드 이름 api 호출*/
7581 useEffect ( ( ) => {
76- const fetchDashboardTitle = async ( ) => {
82+ const fetchDashboard = async ( ) => {
7783 if ( variant === "dashboard" && dashboardId ) {
7884 try {
79- const dashboard = await getDashboardById ( {
85+ const dashboardData = await getDashboardById ( {
8086 teamId : TEAM_ID ,
8187 dashboardId : Number ( dashboardId ) ,
8288 } ) ;
83- setDashboardTitle ( dashboard . title ) ;
89+ setDashboard ( dashboardData ) ;
8490 } catch ( error ) {
85- console . error ( "대시보드 타이틀 불러오기 실패" , error ) ;
91+ console . error ( "대시보드 정보 불러오기 실패" , error ) ;
92+ setErrorMessage ( "대시보드를 불러오지 못했습니다." ) ;
93+ } finally {
94+ setIsLoading ( false ) ;
8695 }
8796 }
8897 } ;
89- fetchDashboardTitle ( ) ;
98+ fetchDashboard ( ) ;
9099 } , [ variant , dashboardId ] ) ;
91100
92- const title =
93- variant === "mypage"
94- ? " 계정 관리"
95- : variant === "dashboard" && dashboardTitle
96- ? dashboardTitle
97- : "내 대시보드" ;
101+ /*헤더 종류에 따라 다른 제목 표시*/
102+ const title = ( ( ) => {
103+ if ( variant === "mypage" ) return " 계정 관리";
104+ if ( variant === "dashboard" && dashboard ?. title ) return dashboard . title ;
105+ return "내 대시보드" ;
106+ } ) ( ) ;
98107
99108 return (
100109 < header className = "w-full h-[60px] md:h-[70px] flex items-center justify-center bg-white border-b-[1px] border-b-[#D9D9D9]" >
101110 < div className = "w-full flex items-center justify-between pl-[4vw]" >
102- < div className = "flex items-center gap-[8px]" >
103- < p
104- className = { `text-base text-black3 font-bold md:text-xl
105- ${ variant === "mydashboard" ? "block" : "hidden lg:block" } ` }
106- >
107- { title }
111+ { errorMessage && (
112+ < p className = "text-sm text-[var(--color-red)] px-4 py-2" >
113+ { errorMessage }
108114 </ p >
115+ ) }
116+ < div className = "flex items-center gap-[8px]" >
117+ < p className = "text-base text-black3 font-bold md:text-xl" > { title } </ p >
118+ { dashboard ?. createdByMe && (
119+ < Image
120+ src = "/svgs/crown.svg"
121+ alt = "왕관 아이콘"
122+ width = { 22 }
123+ height = { 22 }
124+ className = "inline-block"
125+ unoptimized
126+ priority
127+ />
128+ ) }
109129 </ div >
110130
111131 < div className = "flex items-center" >
112132 { /*관리 / 초대하기 버튼*/ }
113133 < div className = "flex gap-[6px] md:gap-[16px] pr-[40px]" >
114134 < button
115- onClick = { ( ) => router . push ( `/dashboard/${ dashboardId } /edit` ) }
135+ onClick = { ( ) => {
136+ if ( dashboardId ) {
137+ router . push ( `/dashboard/${ dashboardId } /edit` ) ;
138+ } else {
139+ router . push ( "mydashboard" ) ;
140+ }
141+ } }
116142 className = "flex items-center justify-center w-[49px] h-[30px] md:w-[85px] md:h-[36px] lg:w-[88px] lg:h-[40px] rounded-[8px] border border-[#D9D9D9] gap-[10px] cursor-pointer"
117143 >
118144 < Image
0 commit comments