@@ -27,7 +27,7 @@ function NavItem({ icon, label, active = false }: NavItemProps) {
2727 active && "bg-primary text-primary-foreground" ,
2828 ) }
2929 >
30- < div className = "h-4 w-4 flex- shrink-0" > { icon } </ div >
30+ < div className = "h-4 w-4 shrink-0" > { icon } </ div >
3131 < span className = "whitespace-nowrap" > { label } </ span >
3232 </ Button >
3333 ) ;
@@ -45,7 +45,7 @@ function UserMenu() {
4545 >
4646 < AppAvatar src = { user ?. avatar } name = { user ?. name } className = "h-4 w-4" />
4747 < span className = "whitespace-nowrap" > { user ?. name } </ span >
48- < ChevronDown className = "h-4 w-4 flex- shrink-0" />
48+ < ChevronDown className = "h-4 w-4 shrink-0" />
4949 </ Button >
5050 </ DropdownMenuTrigger >
5151
@@ -86,14 +86,11 @@ export default function AppNavbar({ path }: { path: string }) {
8686 ` }
8787 >
8888 { navItems . map ( ( item ) => (
89- < Link href = { item . pathPrefix } key = { item . label } >
90- < NavItem
91- key = { item . label }
92- icon = { item . icon }
93- label = { item . label }
94- active = { navItemLabel === item . label }
95- />
96- </ Link >
89+ < NavItemLink
90+ key = { item . label }
91+ item = { item }
92+ active = { navItemLabel === item . label }
93+ />
9794 ) ) }
9895 </ div >
9996 </ div >
@@ -136,18 +133,12 @@ export default function AppNavbar({ path }: { path: string }) {
136133 < div className = "flex flex-col space-y-1 px-6 py-4" >
137134 { /* Mobile Navigation Items */ }
138135 { navItems . map ( ( item ) => (
139- < Link
140- href = { item . pathPrefix }
136+ < NavItemLink
141137 key = { item . label }
138+ item = { item }
139+ active = { navItemLabel === item . label }
142140 onClick = { ( ) => setIsMobileMenuOpen ( false ) }
143- >
144- < NavItem
145- key = { item . label }
146- icon = { item . icon }
147- label = { item . label }
148- active = { navItemLabel === item . label }
149- />
150- </ Link >
141+ />
151142 ) ) }
152143
153144 { /* Mobile User Menu */ }
@@ -164,12 +155,21 @@ export default function AppNavbar({ path }: { path: string }) {
164155 ) ;
165156}
166157
167- interface NavItem {
158+ interface BaseNavItem {
168159 icon : React . ReactNode ;
169160 label : string ;
161+ }
162+
163+ interface InternalNavItem extends BaseNavItem {
170164 pathPrefix : string ;
171165}
172166
167+ interface ExternalNavItem extends BaseNavItem {
168+ externalLink : string ;
169+ }
170+
171+ type NavItem = InternalNavItem | ExternalNavItem ;
172+
173173const navItems : NavItem [ ] = [
174174 {
175175 icon : < BarChart3 className = "h-full w-full" /> ,
@@ -181,24 +181,48 @@ const navItems: NavItem[] = [
181181 label : "挑戰題目" ,
182182 pathPrefix : "/challenges" ,
183183 } ,
184- {
185- icon : < MessageSquare className = "h-full w-full" /> ,
186- label : "經驗分享" ,
187- pathPrefix : "/comments" ,
188- } ,
189184 {
190185 icon : < BookOpen className = "h-full w-full" /> ,
191186 label : "補充資料" ,
192187 pathPrefix : "/materials" ,
193188 } ,
189+ {
190+ icon : < MessageSquare className = "h-full w-full" /> ,
191+ label : "意見分享" ,
192+ externalLink : "https://community.dbplay.app/discord" ,
193+ } ,
194194] ;
195195
196196function getActiveNavItemLabel ( path : string ) : string | null {
197197 for ( const item of navItems ) {
198- if ( path . startsWith ( item . pathPrefix ) ) {
198+ if ( "pathPrefix" in item && path . startsWith ( item . pathPrefix ) ) {
199199 return item . label ;
200200 }
201201 }
202202
203203 return null ;
204204}
205+
206+ function NavItemLink ( { item, active, onClick } : { item : NavItem ; active ?: boolean ; onClick ?: ( ) => void } ) {
207+ if ( "pathPrefix" in item ) {
208+ return (
209+ < Link href = { item . pathPrefix } onClick = { onClick } >
210+ < NavItem
211+ icon = { item . icon }
212+ label = { item . label }
213+ active = { active }
214+ />
215+ </ Link >
216+ ) ;
217+ }
218+
219+ return (
220+ < a href = { item . externalLink } target = "_blank" rel = "noopener noreferrer" onClick = { onClick } >
221+ < NavItem
222+ icon = { item . icon }
223+ label = { item . label }
224+ active = { active }
225+ />
226+ </ a >
227+ ) ;
228+ }
0 commit comments