'use client' import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import axios from 'axios'; import { Filament } from '../../../src/types/filament'; interface FilamentWithId extends Filament { id: string; createdAt?: string; updatedAt?: string; } export default function AdminDashboard() { const router = useRouter(); const [filaments, setFilaments] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [editingFilament, setEditingFilament] = useState(null); const [showAddForm, setShowAddForm] = useState(false); // Check authentication useEffect(() => { const token = localStorage.getItem('authToken'); const expiry = localStorage.getItem('tokenExpiry'); if (!token || !expiry || Date.now() > parseInt(expiry)) { router.push('/admin'); } }, [router]); // Fetch filaments const fetchFilaments = async () => { try { setLoading(true); const response = await axios.get(`${process.env.NEXT_PUBLIC_API_URL}/filaments`); setFilaments(response.data); } catch (err) { setError('Greška pri učitavanju filamenata'); console.error('Fetch error:', err); } finally { setLoading(false); } }; useEffect(() => { fetchFilaments(); }, []); const getAuthHeaders = () => ({ headers: { Authorization: `Bearer ${localStorage.getItem('authToken')}` } }); const handleDelete = async (id: string) => { if (!confirm('Da li ste sigurni da želite obrisati ovaj filament?')) return; try { await axios.delete(`${process.env.NEXT_PUBLIC_API_URL}/filaments/${id}`, getAuthHeaders()); await fetchFilaments(); } catch (err) { alert('Greška pri brisanju filamenta'); console.error('Delete error:', err); } }; const handleSave = async (filament: Partial) => { try { if (filament.id) { // Update existing await axios.put( `${process.env.NEXT_PUBLIC_API_URL}/filaments/${filament.id}`, filament, getAuthHeaders() ); } else { // Create new await axios.post( `${process.env.NEXT_PUBLIC_API_URL}/filaments`, filament, getAuthHeaders() ); } setEditingFilament(null); setShowAddForm(false); await fetchFilaments(); } catch (err) { alert('Greška pri čuvanju filamenta'); console.error('Save error:', err); } }; const handleLogout = () => { localStorage.removeItem('authToken'); localStorage.removeItem('tokenExpiry'); router.push('/admin'); }; if (loading) { return (
); } return (

Admin Dashboard

{error && (
{error}
)} {/* Add/Edit Form */} {(showAddForm || editingFilament) && ( { setEditingFilament(null); setShowAddForm(false); }} /> )} {/* Filaments Table */}
{filaments.map((filament) => ( ))}
Brand Tip Finish Boja Refill Vakum Otvoreno Količina Cena Akcije
{filament.brand} {filament.tip} {filament.finish} {filament.boja} {filament.refill} {filament.vakum} {filament.otvoreno} {filament.kolicina} {filament.cena}
); } // Filament Form Component function FilamentForm({ filament, onSave, onCancel }: { filament: Partial, onSave: (filament: Partial) => void, onCancel: () => void }) { const [formData, setFormData] = useState({ brand: filament.brand || '', tip: filament.tip || '', finish: filament.finish || '', boja: filament.boja || '', refill: filament.refill || '', vakum: filament.vakum || '', otvoreno: filament.otvoreno || '', kolicina: filament.kolicina || '', cena: filament.cena || '', }); const handleChange = (e: React.ChangeEvent) => { setFormData({ ...formData, [e.target.name]: e.target.value }); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); onSave({ ...filament, ...formData }); }; return (

{filament.id ? 'Izmeni filament' : 'Dodaj novi filament'}

); }