5.5 KiB
5.5 KiB
User Menu Component
The UserMenu component provides a comprehensive user account interface in the sidebar footer, based on the NavUser pattern from shadcn-vue. It offers role-based features, account management, and quick access to user-specific functionality.
Features
1. User Profile Display
- Avatar: Shows user avatar with fallback to generated initials
- Name & Role: Displays full name and user role
- Email: Shows user email in dropdown header
- Consistent Branding: Generated avatars with consistent colors
2. Role-Based Menu Items
- Developer: API Keys management
- Admin/Coordinator: Team Management, System Settings
- All Users: Profile, Preferences, Notifications
3. Account Management
- Profile Settings: Navigate to user profile page
- Preferences: Access user preferences and settings
- Notifications: Toggle notification settings
- Logout: Secure logout with redirect to login page
4. Help & Support
- Help Documentation: Access to help and support resources
- Keyboard Shortcuts: Quick reference for keyboard shortcuts
- Interactive Shortcuts: Shows common shortcuts in alert dialog
Implementation
Component Structure
UserMenu.vue
├── DropdownMenu (shadcn-vue)
├── Avatar (with fallback)
├── Role-based menu items
└── Account actions
User Data Integration
- Uses
useAuthStore()for user information - Reactive user display name and initials
- Dynamic avatar generation with fallbacks
Navigation Integration
- Uses Vue Router for seamless navigation
- Handles logout flow with proper cleanup
- Maintains user context across routes
Menu Structure
Header Section
- User avatar (generated or uploaded)
- Full name and email
- Role badge (capitalized)
Role-Specific Features
// Developer
- API Keys management
// Admin/Coordinator
- Team Management
- System Settings (Admin only)
Standard User Options
- Profile management
- User preferences
- Notification settings
Help & Support
- Help documentation
- Keyboard shortcuts reference
- Support resources
Account Actions
- Secure logout with confirmation
Avatar System
Avatar Sources (Priority Order)
- User Upload:
user.avatar_urlif available - Generated Avatar: Dicebear API with initials
- Fallback: Initials in colored circle
Avatar Generation
// Consistent avatar based on user email
const seed = user.value?.email || userDisplayName.value
const avatarUrl = `https://api.dicebear.com/7.x/initials/svg?seed=${seed}&backgroundColor=3b82f6&textColor=ffffff`
Fallback Initials
- First letter of first name + first letter of last name
- Uppercase formatting
- Consistent color scheme
Responsive Behavior
Desktop
- Dropdown opens to the right of trigger
- Full menu with all options
- Hover states and smooth transitions
Mobile
- Dropdown opens below trigger
- Touch-optimized spacing
- Simplified layout for smaller screens
Role-Based Access Control
Permission Levels
// Admin: Full access
- Team Management
- System Settings
- All user features
// Coordinator: Management access
- Team Management
- Standard user features
// Developer: API access
- API Keys management
- Standard user features
// Artist/Director: Standard access
- Profile and preferences only
Dynamic Menu Items
Menu items are conditionally rendered based on user role:
<DropdownMenuItem v-if="user?.role === 'developer'">
API Keys
</DropdownMenuItem>
Keyboard Shortcuts
Supported Shortcuts
⌘/Ctrl + B- Toggle sidebar⌘/Ctrl + K- Quick search⌘/Ctrl + ,- Open preferences⌘/Ctrl + /- Show help
Shortcuts Display
- Interactive dialog showing available shortcuts
- Platform-specific key combinations
- Context-sensitive shortcuts
Integration Points
Authentication Store
- Reactive user data from
useAuthStore() - Logout functionality with proper cleanup
- Role-based permission checking
Router Integration
- Seamless navigation to user pages
- Proper route handling for different user types
- Logout redirect to login page
Sidebar Integration
- Consistent with sidebar collapse behavior
- Proper positioning and spacing
- Mobile-responsive dropdown positioning
Customization
Adding Menu Items
<DropdownMenuItem @click="customAction">
<CustomIcon class="size-4" />
Custom Action
</DropdownMenuItem>
Role-Based Features
const showCustomFeature = computed(() => {
return user.value?.role === 'custom_role'
})
Avatar Customization
// Custom avatar service
const userAvatar = computed(() => {
return user.value?.avatar_url || generateCustomAvatar(user.value)
})
Accessibility
Features
- Keyboard Navigation: Full keyboard support
- Screen Readers: Proper ARIA labels
- Focus Management: Logical tab order
- High Contrast: Theme-aware colors
ARIA Labels
- Avatar has descriptive alt text
- Menu items have proper roles
- Dropdown has correct accessibility attributes
Security Considerations
Logout Process
- Clears authentication tokens
- Redirects to login page
- Handles logout errors gracefully
Role Verification
- Server-side role validation
- Client-side UI adaptation
- Secure route protection
The UserMenu component provides a professional, role-aware user interface that adapts to different user types while maintaining consistency with the overall application design.