'use client'; import { useState, useEffect, useMemo } from 'react'; import { Library, Calendar, Hash, MessageSquare, Save, Trash2, Loader2, CheckCircle2, AlertCircle, ArrowRight, Info, Search, Plus, Sparkles, Zap } from 'lucide-react'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; import { cn } from '@/lib/utils'; import { useUser } from '@/app/dashboard/useUser'; import { useI18n, formatDate } from '@/lib/i18n'; import { useGlossaries } from './useGlossaries'; import type { GlossaryListItem } from './types'; import { ProUpgradePrompt } from './ProUpgradePrompt'; import { useToast } from '@/components/ui/toast'; import { SUPPORTED_LANGUAGES } from './types'; import { useTranslationStore } from '@/lib/store'; // ── Chips de suggestions pour les consignes de contexte ───────────────────── // Prompt bodies stay in French (LLM content); labels translate with the UI. const CONTEXT_SUGGESTIONS: { labelKey: string; value: string }[] = [ { labelKey: 'glossaries.suggestion.formal', value: 'Utilise toujours un ton formel et professionnel dans tes traductions.' }, { labelKey: 'glossaries.suggestion.proprietary', value: 'Ne traduis pas les noms propres, marques et noms de personnes.' }, { labelKey: 'glossaries.suggestion.numbers', value: 'Garde tous les chiffres, pourcentages et montants tels quels sans les modifier.' }, { labelKey: 'glossaries.suggestion.placeholders', value: 'Ne traduis pas les variables entre accolades comme {nom}, {date}, {montant}.' }, { labelKey: 'glossaries.suggestion.technical', value: 'Conserve les termes techniques en langue originale et ne les traduis pas.' }, { labelKey: 'glossaries.suggestion.concise', value: 'Préfère des formulations courtes et directes. Évite les périphrases.' }, ]; export default function GlossariesPage() { const { t, locale } = useI18n(); const router = useRouter(); const { data: user, isLoading: isLoadingUser } = useUser(); const { glossaries, isLoading: isLoadingGlossaries } = useGlossaries(); const { toast } = useToast(); const { settings, updateSettings } = useTranslationStore(); const [systemPrompt, setSystemPrompt] = useState(settings.systemPrompt); const [isSavingPrompt, setIsSavingPrompt] = useState(false); const [promptSaved, setPromptSaved] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const [activeTab, setActiveTab] = useState<'glossaries' | 'context'>('glossaries'); // Same tier logic as the sidebar: business/enterprise are Pro-grade plans. const isPro = ['pro', 'business', 'enterprise'].includes(user?.tier ?? ''); const isLoading = isLoadingUser || isLoadingGlossaries; const currentTargetLang = settings.defaultTargetLanguage; const currentTargetInfo = SUPPORTED_LANGUAGES.find(l => l.code === currentTargetLang); const promptHasUnsavedChanges = systemPrompt !== settings.systemPrompt; const promptIsActive = !!settings.systemPrompt?.trim(); useEffect(() => { setSystemPrompt(settings.systemPrompt); setPromptSaved(false); }, [settings.systemPrompt]); const handleSavePrompt = async () => { setIsSavingPrompt(true); try { updateSettings({ systemPrompt }); await new Promise(resolve => setTimeout(resolve, 300)); setPromptSaved(true); toast({ title: t('context.saved'), description: t('context.savedDesc') }); setTimeout(() => setPromptSaved(false), 3000); } finally { setIsSavingPrompt(false); } }; const handleClearPrompt = () => { updateSettings({ systemPrompt: '' }); setSystemPrompt(''); }; const handleAddSuggestion = (value: string) => { const current = systemPrompt.trim(); const newPrompt = current ? `${current}\n${value}` : value; setSystemPrompt(newPrompt); }; const filteredGlossaries = useMemo(() => { if (!searchQuery.trim()) return glossaries; const q = searchQuery.toLowerCase(); return glossaries.filter((g) => g.name.toLowerCase().includes(q)); }, [glossaries, searchQuery]); if (isLoading) { return (

{t('glossaries.loading')}

); } if (!isPro) { return ; } return (
{/* ── Header ────────────────────────────────────────────────── */}
{t('glossaries.yourGlossaries') || 'Vos Glossaires'}

{t('glossaries.titleBase')} {t('glossaries.titleAccent')}

{t('glossaries.description') || 'Gérez vos glossaires et instructions de contexte pour des traductions plus précises.'}

{/* Bouton principal — unique point d'entrée pour créer */} {t('glossaries.new')}
{/* ── Bandeau informatif ────────────────────────────────────── */}

{t('glossaries.info.title')}{' '} {t('glossaries.info.body')}

{t('glossaries.info.cta')}
{/* ── Onglets ───────────────────────────────────────────────── */}
{activeTab === 'context' ? ( /* ── Onglet Consignes de Contexte ─────────────────────── */
{/* En-tête section */}

{t('glossaries.context.title')}

{t('glossaries.context.desc')}

{/* Badge d'état */} {promptHasUnsavedChanges ? ( {t('glossaries.context.unsaved')} ) : promptIsActive ? ( {t('glossaries.context.active')} ) : ( {t('glossaries.context.inactive')} )}
{/* Chips de suggestions rapides */}
{t('glossaries.context.suggestions')}
{CONTEXT_SUGGESTIONS.map((s) => ( ))}
{/* Zone de texte */}