'use client'; import { useState, useMemo } from 'react'; import { UserPreferences, Tag } from '@/lib/types'; import { useTags } from '@/hooks/useTags'; import { Header } from '@/components/ui/Header'; import { Card, CardContent, CardHeader } from '@/components/ui/Card'; import { Button } from '@/components/ui/Button'; import { Input } from '@/components/ui/Input'; import { TagForm } from '@/components/forms/TagForm'; import { UserPreferencesProvider } from '@/contexts/UserPreferencesContext'; import Link from 'next/link'; interface GeneralSettingsPageClientProps { initialPreferences: UserPreferences; initialTags: Tag[]; } export function GeneralSettingsPageClient({ initialPreferences, initialTags }: GeneralSettingsPageClientProps) { const { tags, refreshTags, deleteTag } = useTags(initialTags as (Tag & { usage: number })[]); const [searchQuery, setSearchQuery] = useState(''); const [showOnlyUnused, setShowOnlyUnused] = useState(false); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const [editingTag, setEditingTag] = useState(null); const [deletingTagId, setDeletingTagId] = useState(null); // Filtrer et trier les tags const filteredTags = useMemo(() => { let filtered = tags; // Filtrer par recherche if (searchQuery.trim()) { const query = searchQuery.toLowerCase(); filtered = filtered.filter(tag => tag.name.toLowerCase().includes(query) ); } // Filtrer pour afficher seulement les non utilisés if (showOnlyUnused) { filtered = filtered.filter(tag => { const usage = (tag as Tag & { usage?: number }).usage || 0; return usage === 0; }); } const sorted = filtered.sort((a, b) => { const usageA = (a as Tag & { usage?: number }).usage || 0; const usageB = (b as Tag & { usage?: number }).usage || 0; if (usageB !== usageA) return usageB - usageA; return a.name.localeCompare(b.name); }); // Limiter à 12 tags si pas de recherche ni filtre, sinon afficher tous les résultats const hasFilters = searchQuery.trim() || showOnlyUnused; return hasFilters ? sorted : sorted.slice(0, 12); }, [tags, searchQuery, showOnlyUnused]); const handleEditTag = (tag: Tag) => { setEditingTag(tag); }; const handleDeleteTag = async (tag: Tag) => { if (!confirm(`Êtes-vous sûr de vouloir supprimer le tag "${tag.name}" ?`)) { return; } setDeletingTagId(tag.id); try { await deleteTag(tag.id); await refreshTags(); } catch (error) { console.error('Erreur lors de la suppression:', error); } finally { setDeletingTagId(null); } }; return (
{/* Breadcrumb */}
Paramètres / Général
{/* Page Header */}

⚙️ Paramètres généraux

Configuration des préférences de l'interface et du comportement général

{/* Gestion des tags */}

🏷️ Gestion des tags

Créer et organiser les étiquettes pour vos tâches

{/* Stats des tags */}
{tags.length}
Tags créés
{tags.reduce((sum, tag) => sum + ((tag as Tag & { usage?: number }).usage || 0), 0)}
Utilisations
{tags.filter(tag => (tag as Tag & { usage?: number }).usage && (tag as Tag & { usage?: number }).usage! > 0).length}
Actifs
{/* Recherche et filtres */}
setSearchQuery(e.target.value)} className="w-full" /> {/* Filtres rapides */}
{(searchQuery || showOnlyUnused) && ( )}
{/* Liste des tags en grid */} {filteredTags.length === 0 ? (
{searchQuery && showOnlyUnused ? 'Aucun tag non utilisé trouvé avec cette recherche' : searchQuery ? 'Aucun tag trouvé pour cette recherche' : showOnlyUnused ? '🎉 Aucun tag non utilisé ! Tous vos tags sont actifs.' : 'Aucun tag créé'} {!searchQuery && !showOnlyUnused && (
)}
) : (
{/* Grid des tags */}
{filteredTags.map((tag) => { const usage = (tag as Tag & { usage?: number }).usage || 0; const isUnused = usage === 0; return (
{/* Header du tag */}
{tag.name} {tag.isPinned && ( 📌 )}
{/* Actions */}
{/* Stats et warning */}
{usage} utilisation{usage !== 1 ? 's' : ''} {isUnused && ( ⚠️ Non utilisé )}
{('createdAt' in tag && (tag as Tag & { createdAt: Date }).createdAt) && (
Créé le {new Date((tag as Tag & { createdAt: Date }).createdAt).toLocaleDateString('fr-FR')}
)}
); })}
{/* Message si plus de tags */} {tags.length > 12 && !searchQuery && !showOnlyUnused && (
Et {tags.length - 12} autres tags... (utilisez la recherche ou les filtres pour les voir)
)}
)} {/* Note développement futur */}

🚧 Interface de configuration en développement

Les contrôles interactifs pour modifier les autres préférences seront disponibles dans une prochaine version. Pour l'instant, les préférences sont modifiables via les boutons de l'interface principale.

{/* Modals pour les tags */} {isCreateModalOpen && ( setIsCreateModalOpen(false)} onSuccess={async () => { setIsCreateModalOpen(false); await refreshTags(); }} /> )} {editingTag && ( setEditingTag(null)} onSuccess={async () => { setEditingTag(null); await refreshTags(); }} /> )} ); }