'use client' import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { colorService } from '../../../src/services/api'; import '../../../src/styles/select.css'; interface Color { id: string; name: string; hex: string; createdAt?: string; updatedAt?: string; } export default function ColorsManagement() { const router = useRouter(); const [colors, setColors] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [editingColor, setEditingColor] = useState(null); const [showAddForm, setShowAddForm] = useState(false); const [darkMode, setDarkMode] = useState(false); const [mounted, setMounted] = useState(false); const [searchTerm, setSearchTerm] = useState(''); // Initialize dark mode - default to true for admin useEffect(() => { setMounted(true); const saved = localStorage.getItem('darkMode'); if (saved !== null) { setDarkMode(JSON.parse(saved)); } else { // Default to dark mode for admin setDarkMode(true); } }, []); useEffect(() => { if (!mounted) return; localStorage.setItem('darkMode', JSON.stringify(darkMode)); if (darkMode) { document.documentElement.classList.add('dark'); } else { document.documentElement.classList.remove('dark'); } }, [darkMode, mounted]); // Check authentication useEffect(() => { const token = localStorage.getItem('authToken'); const expiry = localStorage.getItem('tokenExpiry'); if (!token || !expiry || Date.now() > parseInt(expiry)) { router.push('/upadaj'); } }, [router]); // Fetch colors const fetchColors = async () => { try { setLoading(true); const colors = await colorService.getAll(); setColors(colors.sort((a: Color, b: Color) => a.name.localeCompare(b.name))); } catch (err) { setError('Greška pri učitavanju boja'); console.error('Fetch error:', err); } finally { setLoading(false); } }; useEffect(() => { fetchColors(); }, []); const handleSave = async (color: Partial) => { try { if (color.id) { await colorService.update(color.id, { name: color.name!, hex: color.hex! }); } else { await colorService.create({ name: color.name!, hex: color.hex! }); } setEditingColor(null); setShowAddForm(false); fetchColors(); } catch (err) { setError('Greška pri čuvanju boje'); console.error('Save error:', err); } }; const handleDelete = async (id: string) => { if (!confirm('Da li ste sigurni da želite obrisati ovu boju?')) { return; } try { await colorService.delete(id); fetchColors(); } catch (err) { setError('Greška pri brisanju boje'); console.error('Delete error:', err); } }; const handleLogout = () => { localStorage.removeItem('authToken'); localStorage.removeItem('tokenExpiry'); router.push('/upadaj'); }; if (loading) { return
Učitavanje...
; } return (
{/* Sidebar */} {/* Main Content */}

Upravljanje bojama

{!showAddForm && !editingColor && ( )} {mounted && ( )}
{error && (
{error}
)} {/* Add Form (stays at top) */} {showAddForm && ( { setShowAddForm(false); }} /> )} {/* Search Bar */}
setSearchTerm(e.target.value)} className="w-full px-4 py-2 pl-10 pr-4 text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:border-blue-500" />
{/* Colors Table */}
{colors .filter(color => color.name.toLowerCase().includes(searchTerm.toLowerCase()) || color.hex.toLowerCase().includes(searchTerm.toLowerCase()) ) .map((color) => ( ))}
Boja Naziv Hex kod Akcije
{color.name} {color.hex}
{/* Edit Modal */} {editingColor && (

Izmeni boju

{ handleSave(color); setEditingColor(null); }} onCancel={() => setEditingColor(null)} isModal={true} />
)}
); } // Color Form Component function ColorForm({ color, onSave, onCancel, isModal = false }: { color: Partial, onSave: (color: Partial) => void, onCancel: () => void, isModal?: boolean }) { const [formData, setFormData] = useState({ name: color.name || '', hex: color.hex || '#000000', }); const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData({ ...formData, [name]: value }); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); onSave({ ...color, ...formData }); }; return (
{!isModal && (

{color.id ? 'Izmeni boju' : 'Dodaj novu boju'}

)}
); }