import { useEffect, useCallback } from 'react'
import { X } from 'lucide-react'
import { ModelChooserModalProps } from '../types'
import { useModelData } from '../hooks/useModelData'
import { useFiltering } from '../hooks/useFiltering'
import { FilterBar } from './FilterBar'
import { ModelTable } from './ModelTable'
import { LoadingState, ErrorState } from './LoadingState'
export function ModelChooserModal({
isOpen,
onClose,
selectedModel,
onModelChange,
onModelSelect,
apiEndpoint,
fallbackModels,
theme = 'light',
maxHeight = '80vh',
maxWidth,
className,
categorizeByType = false
}: ModelChooserModalProps) {
const {
models,
freeModels,
paidModels,
loading,
error,
refresh
} = useModelData(apiEndpoint, fallbackModels)
const {
filteredModels,
filterState,
sortConfig,
updateFilter,
clearFilters,
setSort,
availableProviders,
filterStats
} = useFiltering(models)
// Handle escape key
useEffect(() => {
const handleEscape = (e: KeyboardEvent) => {
if (e.key === 'Escape') {
onClose()
}
}
if (isOpen) {
document.addEventListener('keydown', handleEscape)
// Prevent body scroll when modal is open
document.body.style.overflow = 'hidden'
}
return () => {
document.removeEventListener('keydown', handleEscape)
document.body.style.overflow = ''
}
}, [isOpen, onClose])
const handleModelSelect = useCallback((modelId: string) => {
// CRITICAL: Pass exact model ID without any modification
onModelChange(modelId)
// Also call the enhanced callback with full model info if provided
if (onModelSelect) {
const model = models.find(m => m.id === modelId)
if (model) {
onModelSelect(model)
}
}
}, [onModelChange, onModelSelect, models])
const handleSelectAndClose = useCallback(() => {
if (selectedModel) {
onClose()
}
}, [selectedModel, onClose])
if (!isOpen) return null
const renderCategorizedModels = () => {
if (!categorizeByType) {
return (