返回 AiToEarn
SettingsEntry.tsx
1 /**
2 * SettingsEntry - 设置入口组件
3 */
4
5 'use client'
6
7 import type { SidebarCommonProps } from '../../types'
8 import { Settings } from 'lucide-react'
9 import { useTransClient } from '@/app/i18n/client'
10 import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'
11 import { cn } from '@/utils/className'
12
13 interface SettingsEntryProps extends SidebarCommonProps {
14 onClick: () => void
15 hasUnreadOpsTicket?: boolean
16 }
17
18 export function SettingsEntry({ collapsed, onClick, hasUnreadOpsTicket }: SettingsEntryProps) {
19 const { t } = useTransClient('common')
20
21 return (
22 <TooltipProvider>
23 <Tooltip>
24 <TooltipTrigger asChild>
25 <button
26 onClick={onClick}
27 className={cn(
28 'flex cursor-pointer items-center rounded-lg border-none bg-transparent text-muted-foreground transition-colors hover:bg-accent hover:text-foreground',
29 collapsed ? 'h-9 w-9 justify-center' : 'gap-2 px-3 py-2',
30 )}
31 >
32 <span className="relative flex items-center justify-center">
33 <Settings size={18} />
34 {hasUnreadOpsTicket && (
35 <span className="absolute -right-1 -top-1 h-2 w-2 rounded-full bg-destructive" data-testid="sidebar-settings-ticket-unread-dot" />
36 )}
37 </span>
38 {!collapsed && <span className="text-sm">{t('settings')}</span>}
39 </button>
40 </TooltipTrigger>
41 {collapsed && (
42 <TooltipContent side="right">
43 <p>{t('settings')}</p>
44 </TooltipContent>
45 )}
46 </Tooltip>
47 </TooltipProvider>
48 )
49 }
50
50 lines Plain Text