11<script setup lang="ts">
22import type { AllClubs } from ' @@/types/api/user/all_clubs'
3+ import type { getRoleResponse } from ' ~~/utils/user-roles'
34import { useClerk , useUser } from ' vue-clerk'
5+ import { isAdmin } from ' ~~/utils/user-roles'
46
57const { user } = useUser ()
68const config = useRuntimeConfig ()
9+ const route = useRoute ()
710
811const clerk = useClerk ()
912
@@ -14,10 +17,17 @@ function signOutHandler() {
1417const isPresidentOrVicePresident = ref (false )
1518useState (' isEnspireLoading' ).value = true
1619
17- const { data : clubs, suspense } = useQuery <AllClubs >({
20+ const { data : clubs, suspense : __s1 } = useQuery <AllClubs >({
1821 queryKey: [' /api/user/all_clubs' ],
1922})
20- await suspense ()
23+ await __s1 ()
24+
25+ const isUserAdmin = ref (false )
26+ const { data : roleData, suspense : __s2 } = useQuery <getRoleResponse >({
27+ queryKey: [' /api/user/check-role' ],
28+ })
29+ await __s2 ()
30+ isUserAdmin .value = isAdmin (roleData .value )
2131
2232if (clubs .value ) {
2333 useState (' isEnspireLoading' ).value = false
@@ -102,6 +112,13 @@ const sidebarData = ref({
102112 ]
103113 : []),
104114 ],
115+ admin: [
116+ {
117+ name: ' 社团文件' ,
118+ url: ' /admin/manage-files' ,
119+ icon: ' lucide:lock-keyhole' ,
120+ },
121+ ],
105122})
106123 </script >
107124
@@ -171,7 +188,7 @@ const sidebarData = ref({
171188 v-for =" item in sidebarData.school"
172189 :key =" item.name"
173190 class =" rounded"
174- :class =" { 'bg-foreground/10': $ route.path === item.url }"
191+ :class =" { 'bg-foreground/10': route.path === item.url }"
175192 >
176193 <SidebarMenuButton as-child >
177194 <NuxtLink :href =" item.url" >
@@ -206,7 +223,7 @@ const sidebarData = ref({
206223 :key =" subItem.title"
207224 class =" flex items-center"
208225 >
209- <div v-if =" $ route.path === subItem.url" class =" border-text mr-2 h-4 w-1 border-l-2 border-foreground rounded -ml-3" />
226+ <div v-if =" route.path === subItem.url" class =" border-text mr-2 h-4 w-1 border-l-2 border-foreground rounded -ml-3" />
210227 <SidebarMenuSubButton as-child >
211228 <NuxtLink :href =" subItem.url" >
212229 <span >{{ subItem.title }}</span >
@@ -219,6 +236,24 @@ const sidebarData = ref({
219236 </Collapsible >
220237 </SidebarMenu >
221238 </SidebarGroup >
239+ <SidebarGroup v-if =" isUserAdmin" class =" group-data-[collapsible=icon]:hidden" >
240+ <SidebarGroupLabel >管理</SidebarGroupLabel >
241+ <SidebarMenu >
242+ <SidebarMenuItem
243+ v-for =" item in sidebarData.admin"
244+ :key =" item.name"
245+ class =" rounded"
246+ :class =" { 'bg-foreground/10': route.path === item.url }"
247+ >
248+ <SidebarMenuButton as-child >
249+ <NuxtLink :href =" item.url" >
250+ <Icon :name =" item.icon" size =" 1.1em" />
251+ <span >{{ item.name }}</span >
252+ </NuxtLink >
253+ </SidebarMenuButton >
254+ </SidebarMenuItem >
255+ </SidebarMenu >
256+ </SidebarGroup >
222257 </SidebarContent >
223258 <SidebarFooter >
224259 <SidebarMenu >
0 commit comments