import React, { useState, useEffect } from 'react'; import { doc, getDoc, setDoc } from 'firebase/firestore'; import { db, handleFirestoreError, OperationType } from '../firebase'; import { useAuth } from '../components/AuthContext'; import { AppSettings, DEFAULT_SETTINGS } from '../types'; import { Save, Plus, Trash2, Settings as SettingsIcon, Download, Upload } from 'lucide-react'; export default function Settings() { const { user } = useAuth(); const [settings, setSettings] = useState(DEFAULT_SETTINGS); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [message, setMessage] = useState<{ type: 'success' | 'error', text: string } | null>(null); useEffect(() => { if (!user) return; const fetchSettings = async () => { try { const docRef = doc(db, 'settings', user.uid); const docSnap = await getDoc(docRef); if (docSnap.exists()) { setSettings(docSnap.data() as AppSettings); } } catch (err) { handleFirestoreError(err, OperationType.GET, `settings/${user.uid}`); } finally { setLoading(false); } }; fetchSettings(); }, [user]); const handleSave = async () => { if (!user) return; setSaving(true); setMessage(null); try { // Filter out empty categories const cleanedSettings = { ...settings, categories: settings.categories.filter(c => c.trim() !== '') }; if (cleanedSettings.categories.length === 0) { cleanedSettings.categories = ['Général']; // Fallback } await setDoc(doc(db, 'settings', user.uid), cleanedSettings); setSettings(cleanedSettings); setMessage({ type: 'success', text: 'Paramètres enregistrés avec succès.' }); } catch (err) { handleFirestoreError(err, OperationType.WRITE, `settings/${user.uid}`); setMessage({ type: 'error', text: 'Erreur lors de l\'enregistrement des paramètres.' }); } finally { setSaving(false); } }; const handleCategoryChange = (index: number, value: string) => { const newCategories = [...settings.categories]; newCategories[index] = value; setSettings({ ...settings, categories: newCategories }); }; const addCategory = () => { if (settings.categories.length >= 20) return; setSettings({ ...settings, categories: [...settings.categories, 'Nouvelle catégorie'] }); }; const removeCategory = (index: number) => { if (settings.categories.length <= 1) return; const newCategories = settings.categories.filter((_, i) => i !== index); setSettings({ ...settings, categories: newCategories }); }; const handleExport = () => { const dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(settings, null, 2)); const downloadAnchorNode = document.createElement('a'); downloadAnchorNode.setAttribute("href", dataStr); downloadAnchorNode.setAttribute("download", "settings.json"); document.body.appendChild(downloadAnchorNode); downloadAnchorNode.click(); downloadAnchorNode.remove(); }; const handleImport = (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (!file) return; const reader = new FileReader(); reader.onload = (e) => { try { const content = e.target?.result as string; const parsed = JSON.parse(content); if (parsed && typeof parsed === 'object') { const newSettings = { ...DEFAULT_SETTINGS, ...parsed }; setSettings(newSettings); setMessage({ type: 'success', text: 'Configuration importée avec succès. N\'oubliez pas d\'enregistrer.' }); } else { throw new Error('Format invalide'); } } catch (err) { console.error(err); setMessage({ type: 'error', text: 'Erreur lors de l\'importation du fichier JSON.' }); } }; reader.readAsText(file); event.target.value = ''; }; if (loading) { return (
); } return (

Paramètres de génération

{message && (
{message.text}
)}
setSettings({ ...settings, theme: e.target.value })} />

Le sujet principal pour la recherche d'actualités (ex: Intelligence Artificielle, Cybersécurité, etc.).

setSettings({ ...settings, maxAgeDays: parseInt(e.target.value) || 7 })} />
setSettings({ ...settings, maxItemsPerCategory: parseInt(e.target.value) || 4 })} />