import React, { useState, useEffect } from 'react'; interface Model { id: string; label: string; description: string; size_gb: number; resolution?: string; nsfw: boolean; recommended_nsfw?: boolean; anime?: boolean; downloaded?: boolean; } interface ModelSelectorProps { models: Model[]; selectedModelId: string; onSelect: (modelId: string) => void; contentRating: 'sfw' | 'mature'; showDownloadStatus?: boolean; } type FilterType = 'all' | 'anime' | 'realistic' | 'nsfw' | 'sfw'; /** * Model Selector * * Grid/list of available models with filtering. * Shows NSFW badges and download status. */ export const ModelSelector: React.FC = ({ models, selectedModelId, onSelect, contentRating, showDownloadStatus = true, }) => { const [filter, setFilter] = useState('all'); const [searchQuery, setSearchQuery] = useState(''); // Filter models based on content rating and user filters const filteredModels = models.filter((model) => { // Hide NSFW models in SFW mode if (contentRating === 'sfw' && model.nsfw) { return false; } // Apply user filter if (filter === 'anime' && !model.anime) return false; if (filter === 'nsfw' && !model.nsfw) return false; if (filter === 'sfw' && model.nsfw) return false; // Apply search if (searchQuery) { const q = searchQuery.toLowerCase(); return ( model.label.toLowerCase().includes(q) || model.description.toLowerCase().includes(q) ); } return true; }); return (
{/* Filters */}
setSearchQuery(e.target.value)} />
{(['all', 'anime', 'nsfw', 'sfw'] as FilterType[]).map((f) => ( ))}
{/* Model Grid */}
{filteredModels.map((model) => (
onSelect(model.id)} >
{model.anime ? '\uD83C\uDF38' : '\uD83D\uDDBC\uFE0F'}

{model.label}

{model.description}

{model.size_gb} GB {model.resolution && ( {model.resolution} )}
{model.nsfw ? ( \uD83D\uDD1E NSFW ) : ( \u2713 SFW )} {model.recommended_nsfw && ( \u2B50 Recommended )} {model.anime && ( Anime )}
{showDownloadStatus && (
{model.downloaded ? ( \u2713 Ready ) : ( )}
)}
))} {filteredModels.length === 0 && (

No models match your filters

{contentRating === 'sfw' && filter === 'nsfw' && (

Enable Mature mode to see NSFW models

)}
)}
); };