'use client'; import { useState, useEffect } from 'react'; import { Loader2, CheckCircle2, Lock, Sparkles } from 'lucide-react'; import { cn } from '@/lib/utils'; import { useI18n } from '@/lib/i18n'; import type { Provider, AvailableProvider } from './types'; interface ProviderSelectorProps { provider: Provider | null; onProviderChange: (provider: Provider) => void; availableProviders: AvailableProvider[]; isLoadingProviders: boolean; isPro: boolean; } interface CardTheme { badge: string; subBadge: string; accentClass: string; glowClass: string; descriptionOverride: string; } const LLM_THEMES: Record = { deepseek: { badge: 'Essentielle', subBadge: 'Technique & Éco', accentClass: 'border-cyan-500/30 text-cyan-600 dark:text-cyan-400 bg-cyan-500/5', glowClass: 'from-cyan-500/10 dark:from-cyan-500/5 to-transparent', descriptionOverride: 'Traduction ultra-précise et économique, idéale pour les documents techniques et le code.' }, openai: { badge: 'Premium', subBadge: 'Haute Fidélité', accentClass: 'border-emerald-500/30 text-emerald-600 dark:text-emerald-400 bg-emerald-500/5', glowClass: 'from-emerald-500/10 dark:from-emerald-500/5 to-transparent', descriptionOverride: 'Le standard mondial de l\'IA. Cohérence textuelle maximale et respect strict du style.' }, minimax: { badge: 'Avancée', subBadge: 'Performance', accentClass: 'border-indigo-500/30 text-indigo-600 dark:text-indigo-400 bg-indigo-500/5', glowClass: 'from-indigo-500/10 dark:from-indigo-500/5 to-transparent', descriptionOverride: 'Vitesse d\'exécution incroyable et excellente compréhension des structures complexes.' }, openrouter: { badge: 'Express', subBadge: 'Multi-Modèles', accentClass: 'border-purple-500/30 text-purple-600 dark:text-purple-400 bg-purple-500/5', glowClass: 'from-purple-500/10 dark:from-purple-500/5 to-transparent', descriptionOverride: 'Accès unifié aux meilleurs modèles open-source optimisés pour la traduction.' }, openrouter_premium: { badge: 'Ultra', subBadge: 'Maximum Context', accentClass: 'border-rose-500/30 text-rose-600 dark:text-rose-400 bg-rose-500/5', glowClass: 'from-rose-500/10 dark:from-rose-500/5 to-transparent', descriptionOverride: 'Traduction assistée par les modèles de pointe (GPT-4o, Claude 3.5 Sonnet) pour documents longs.' }, zai: { badge: 'Spécialisée', subBadge: 'Finance & Droit', accentClass: 'border-amber-500/30 text-amber-600 dark:text-amber-400 bg-amber-500/5', glowClass: 'from-amber-500/10 dark:from-amber-500/5 to-transparent', descriptionOverride: 'Modèle affiné pour les terminologies métiers exigeantes (juridique, finance).' } }; const DEFAULT_LLM_THEME: CardTheme = { badge: 'Moderne', subBadge: 'Raisonnement IA', accentClass: 'border-brand-accent/30 text-brand-accent bg-brand-accent/5', glowClass: 'from-brand-accent/10 to-transparent', descriptionOverride: 'Traduction par grand modèle linguistique (LLM) avec analyse sémantique avancée.' }; const CLASSIC_THEMES: Record = { google: { labelOverride: 'Google Traduction', descriptionOverride: 'Traduction ultra-rapide couvrant plus de 130 langues. Recommandé pour les flux généraux.' }, deepl: { labelOverride: 'DeepL Pro', descriptionOverride: 'Traduction haute précision réputée pour sa fluidité et ses formulations naturelles.' }, google_cloud: { labelOverride: 'Google Cloud API', descriptionOverride: 'Moteur cloud professionnel optimisé pour le traitement de gros volumes de documents.' } }; export function ProviderSelector({ provider, onProviderChange, availableProviders, isLoadingProviders, isPro, }: ProviderSelectorProps) { const { t } = useI18n(); const [activeTab, setActiveTab] = useState<'classic' | 'llm'>('classic'); // Filter providers const classicProviders = availableProviders.filter((p) => p.mode === 'classic'); const llmProviders = availableProviders.filter((p) => p.mode === 'llm'); // Initialize and synchronize activeTab based on current provider useEffect(() => { if (provider) { const selected = availableProviders.find((p) => p.id === provider); if (selected) { setActiveTab(selected.mode); } } }, [provider, availableProviders]); if (isLoadingProviders) { return (
{t('dashboard.translate.provider.loading') || 'Chargement des moteurs...'}
); } if (availableProviders.length === 0) { return (

{t('dashboard.translate.provider.noneConfigured') || 'Aucun fournisseur configuré'}

); } const renderClassicCard = (p: AvailableProvider) => { const isSelected = provider === p.id; const meta = CLASSIC_THEMES[p.id]; const label = meta?.labelOverride || p.label; return ( ); }; const renderLlmCard = (p: AvailableProvider, locked: boolean) => { const isSelected = provider === p.id; const theme = LLM_THEMES[p.id] || DEFAULT_LLM_THEME; const displayLabel = p.model || p.label.replace(/^Traduction\s+IA\s+/i, ''); return ( ); }; return (
{/* Title */}
{/* Tabs Container */}
{/* Active Tab List */}
{activeTab === 'classic' ? ( classicProviders.length > 0 ? (
{classicProviders.map((p) => renderClassicCard(p))}
) : (

Aucun traducteur standard disponible.

) ) : ( llmProviders.length > 0 ? (
{llmProviders.map((p) => renderLlmCard(p, !isPro))}
) : (

Aucun modèle IA configuré.

) )} {/* Dynamic Contextual Help Area */} {provider && (
{activeTab === 'classic' ? ( (() => { const activeP = classicProviders.find(p => p.id === provider); const meta = activeP ? CLASSIC_THEMES[activeP.id] : null; return activeP ? (

{meta?.labelOverride || activeP.label} : {meta?.descriptionOverride || activeP.description}

) : null; })() ) : ( (() => { const activeP = llmProviders.find(p => p.id === provider); const theme = activeP ? (LLM_THEMES[activeP.id] || DEFAULT_LLM_THEME) : null; return activeP && theme ? (

{activeP.label} : {theme.descriptionOverride} ({activeP.model || 'default'})

) : null; })() )}
)}
{/* Pro upgrade banner when llm is active and user is not pro */} {!isPro && activeTab === 'llm' && (
{t('dashboard.translate.provider.llmDivider') || 'Intelligence Artificielle Active'}

Débloquez la traduction contextuelle haut de gamme pour vos documents entiers.

{t('dashboard.translate.provider.upgrade') || 'Passer Pro'}
)}
); }