| import React from "react"; | |
| import { | |
| Collapsible, | |
| CollapsibleContent, | |
| CollapsibleTrigger, | |
| } from "@/components/ui/collapsible"; | |
| import { Button } from "@/components/ui/button"; | |
| import { Checkbox } from "@/components/ui/checkbox"; | |
| import { ChevronDown, ChevronRight } from "lucide-react"; | |
| import { Provider } from "@/App"; | |
| interface Props { | |
| data: Provider[]; | |
| expanded: string[]; | |
| comparisonModels: string[]; | |
| onToggleExpand: (provider: string) => void; | |
| onChangeModel: (value: string, checked: boolean) => void; | |
| } | |
| export const ComparisonSelector: React.FC<Props> = ({ | |
| data, | |
| expanded, | |
| comparisonModels, | |
| onToggleExpand, | |
| onChangeModel, | |
| }) => ( | |
| <div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4"> | |
| {data.map((provider) => ( | |
| <Collapsible | |
| key={provider.provider} | |
| open={expanded.includes(provider.provider)} | |
| onOpenChange={() => onToggleExpand(provider.provider)} | |
| > | |
| <CollapsibleTrigger asChild> | |
| <Button variant="outline" className="w-full justify-between"> | |
| {provider.provider} | |
| {expanded.includes(provider.provider) ? ( | |
| <ChevronDown className="h-4 w-4" /> | |
| ) : ( | |
| <ChevronRight className="h-4 w-4" /> | |
| )} | |
| </Button> | |
| </CollapsibleTrigger> | |
| <CollapsibleContent className="mt-2"> | |
| {provider.models.map((model) => { | |
| const id = `${provider.provider}:${model.name}`; | |
| return ( | |
| <div key={id} className="flex items-center space-x-2 mb-1"> | |
| <Checkbox | |
| id={id} | |
| checked={comparisonModels.includes(id)} | |
| onCheckedChange={(checked) => onChangeModel(id, !!checked)} | |
| /> | |
| <label htmlFor={id} className="text-sm font-medium text-gray-700"> | |
| {model.name} | |
| </label> | |
| </div> | |
| ); | |
| })} | |
| </CollapsibleContent> | |
| </Collapsible> | |
| ))} | |
| </div> | |
| ); | |