 0b95ca36f1
			
		
	
	0b95ca36f1
	
	
	
		
			
			- Set up Next.js project structure - Added UI components and styling - Configured package dependencies - Added feature documentation 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			78 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| "use client";
 | |
| 
 | |
| import { Input } from '@/components/ui/input';
 | |
| import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
 | |
| import { Search } from 'lucide-react';
 | |
| import { StatsOverview } from '@/lib/types';
 | |
| 
 | |
| interface AccountFiltersProps {
 | |
|   filters: {
 | |
|     platform: string;
 | |
|     status: string[];
 | |
|     ownerId: string;
 | |
|     search: string;
 | |
|   };
 | |
|   stats: StatsOverview | null;
 | |
|   onFilterChange: (key: string, value: any) => void;
 | |
| }
 | |
| 
 | |
| export function AccountFilters({ filters, stats, onFilterChange }: AccountFiltersProps) {
 | |
|   return (
 | |
|     <div className="flex flex-wrap gap-4">
 | |
|       <div className="flex items-center space-x-2">
 | |
|         <Search className="h-4 w-4" />
 | |
|         <Input
 | |
|           placeholder="搜索账户..."
 | |
|           value={filters.search}
 | |
|           onChange={(e) => onFilterChange('search', e.target.value)}
 | |
|           className="w-[200px]"
 | |
|         />
 | |
|       </div>
 | |
|       
 | |
|       <Select 
 | |
|         value={filters.platform || 'all'} 
 | |
|         onValueChange={(value) => onFilterChange('platform', value === 'all' ? '' : value)}
 | |
|       >
 | |
|         <SelectTrigger className="w-[150px]">
 | |
|           <SelectValue placeholder="选择平台" />
 | |
|         </SelectTrigger>
 | |
|         <SelectContent>
 | |
|           <SelectItem value="all">所有平台</SelectItem>
 | |
|           {stats && Object.keys(stats.platformSummary).map(platform => (
 | |
|             <SelectItem key={platform} value={platform}>{platform}</SelectItem>
 | |
|           ))}
 | |
|         </SelectContent>
 | |
|       </Select>
 | |
|       
 | |
|       <Select 
 | |
|         value={filters.ownerId || 'all'} 
 | |
|         onValueChange={(value) => onFilterChange('ownerId', value === 'all' ? '' : value)}
 | |
|       >
 | |
|         <SelectTrigger className="w-[150px]">
 | |
|           <SelectValue placeholder="选择所有者" />
 | |
|         </SelectTrigger>
 | |
|         <SelectContent>
 | |
|           <SelectItem value="all">所有所有者</SelectItem>
 | |
|           {stats && Object.keys(stats.ownerSummary).map(owner => (
 | |
|             <SelectItem key={owner} value={owner}>{owner}</SelectItem>
 | |
|           ))}
 | |
|         </SelectContent>
 | |
|       </Select>
 | |
|       
 | |
|       <Select 
 | |
|         value={filters.status.length > 0 ? filters.status[0] : 'all'} 
 | |
|         onValueChange={(value) => onFilterChange('status', value === 'all' ? [] : [value])}
 | |
|       >
 | |
|         <SelectTrigger className="w-[150px]">
 | |
|           <SelectValue placeholder="选择状态" />
 | |
|         </SelectTrigger>
 | |
|         <SelectContent>
 | |
|           <SelectItem value="all">所有状态</SelectItem>
 | |
|           <SelectItem value="available">可用</SelectItem>
 | |
|           <SelectItem value="locked">已锁定</SelectItem>
 | |
|           <SelectItem value="banned">已封禁</SelectItem>
 | |
|         </SelectContent>
 | |
|       </Select>
 | |
|     </div>
 | |
|   );
 | |
| } |