import React, { useState, useEffect } from 'react'; import axios from 'axios'; import { toast } from 'sonner'; import { useTranslation } from 'react-i18next'; import { Plus, RefreshCw, Search, X, Filter } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { ItemCard } from '@/components/dashboard/ItemCard'; import { ItemModal } from '@/components/dashboard/ItemModal'; import { DeleteConfirmationModal } from '@/components/dashboard/DeleteConfirmationModal'; import { PriceHistoryModal } from '@/components/dashboard/PriceHistoryModal'; const API_URL = '/api'; export default function Dashboard() { const { t } = useTranslation(); const [items, setItems] = useState([]); const [searchTerm, setSearchTerm] = useState(''); const [selectedCategory, setSelectedCategory] = useState('all'); const [categories, setCategories] = useState([]); const [showAddModal, setShowAddModal] = useState(false); const [editingItem, setEditingItem] = useState(null); const [itemToDelete, setItemToDelete] = useState(null); const [historyItem, setHistoryItem] = useState(null); const [zoomedImage, setZoomedImage] = useState(null); const refreshItems = async () => { try { const response = await axios.get(`${API_URL}/items`); const sortedItems = response.data.sort((a, b) => a.id - b.id); setItems(sortedItems); } catch (error) { console.error('Error fetching items:', error); toast.error(t('toast.fetchError')); } }; const loadCategories = async () => { try { const response = await axios.get(`${API_URL}/items/categories/list`); setCategories(response.data); } catch (error) { console.error('Error fetching categories:', error); } }; useEffect(() => { refreshItems(); loadCategories(); const interval = setInterval(refreshItems, 10000); return () => clearInterval(interval); }, []); const handleCheck = async (id) => { try { toast.info(t('toast.refreshStarted')); await axios.post(`${API_URL}/items/${id}/check`); toast.success(t('toast.refreshComplete')); refreshItems(); } catch (error) { console.error('Error triggering check:', error); toast.error(t('toast.refreshError')); } }; const handleRefreshAll = async () => { try { toast.info(t('toast.refreshStarted')); setItems(prevItems => prevItems.map(item => ({ ...item, is_refreshing: true }))); await axios.post(`${API_URL}/jobs/refresh-all`); toast.success(t('toast.refreshComplete')); } catch (error) { console.error('Error triggering refresh all:', error); toast.error(t('toast.refreshError')); refreshItems(); } }; const handleDelete = async () => { if (!itemToDelete) return; try { await axios.delete(`${API_URL}/items/${itemToDelete.id}`); toast.success(t('toast.itemDeleted')); refreshItems(); setItemToDelete(null); } catch (error) { console.error('Error deleting item:', error); toast.error(t('toast.itemError')); } }; const handleCategoryUpdate = async (itemId, category) => { try { await axios.patch(`${API_URL}/items/${itemId}/category?category=${encodeURIComponent(category || '')}`); toast.success('Catégorie mise à jour'); refreshItems(); loadCategories(); } catch (error) { console.error('Error updating category:', error); toast.error('Erreur lors de la mise à jour'); } }; const filteredItems = items.filter(item => { const term = searchTerm.toLowerCase(); const matchesSearch = ( item.name.toLowerCase().includes(term) || item.url.toLowerCase().includes(term) || (item.tags && item.tags.toLowerCase().includes(term)) || (item.description && item.description.toLowerCase().includes(term)) ); const matchesCategory = selectedCategory === 'all' || (selectedCategory === 'uncategorized' && !item.category) || item.category === selectedCategory; return matchesSearch && matchesCategory; }); return (

{t('dashboard.title')}

{t('dashboard.description')}

setSearchTerm(e.target.value)} />
{filteredItems.map(item => ( ))}
setShowAddModal(false)} onSaved={refreshItems} /> setEditingItem(null)} onSaved={refreshItems} /> setItemToDelete(null)} onConfirm={handleDelete} /> setHistoryItem(null)} /> {/* Image Zoom Modal */} {zoomedImage && (
setZoomedImage(null)} >
Zoomed screenshot
)}
); }