'use client' import { useState, useEffect } from 'react'; import { FilamentTableV2 } from '../src/components/FilamentTableV2'; import { SaleCountdown } from '../src/components/SaleCountdown'; import ColorRequestModal from '../src/components/ColorRequestModal'; import { Filament } from '../src/types/filament'; import { filamentService } from '../src/services/api'; import { trackEvent } from '../src/components/MatomoAnalytics'; export default function Home() { const [filaments, setFilaments] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [darkMode, setDarkMode] = useState(false); const [mounted, setMounted] = useState(false); const [resetKey, setResetKey] = useState(0); const [showColorRequestModal, setShowColorRequestModal] = useState(false); // Removed V1/V2 toggle - now only using V2 // Initialize dark mode from localStorage after mounting useEffect(() => { setMounted(true); const saved = localStorage.getItem('darkMode'); if (saved) { setDarkMode(JSON.parse(saved)); } }, []); // Update dark mode 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]); const fetchFilaments = async () => { try { setLoading(true); setError(null); const filamentsData = await filamentService.getAll(); setFilaments(filamentsData); } catch (err: any) { console.error('API Error:', err); // More descriptive error messages if (err.code === 'ERR_NETWORK') { setError('Network Error - Unable to connect to API'); } else if (err.response) { setError(`Server error: ${err.response.status} - ${err.response.statusText}`); } else if (err.request) { setError('No response from server - check if API is running'); } else { setError(err.message || 'Greška pri učitavanju filamenata'); } } finally { setLoading(false); } }; useEffect(() => { fetchFilaments(); // Auto-refresh data every 30 seconds to stay in sync const interval = setInterval(() => { fetchFilaments(); }, 30000); // Also refresh when window regains focus const handleFocus = () => { fetchFilaments(); }; window.addEventListener('focus', handleFocus); return () => { clearInterval(interval); window.removeEventListener('focus', handleFocus); }; }, []); const handleLogoClick = () => { setResetKey(prev => prev + 1); window.scrollTo({ top: 0, behavior: 'smooth' }); }; return (
Kupovina po gramu dostupna Popust za 5+ komada
{mounted ? ( ) : (
)}
{/* Logo centered above content */}
{/* Action Buttons */}
trackEvent('External Link', 'Kupujem Prodajem', 'Homepage')} className="inline-flex items-center gap-2 px-6 py-3 bg-gradient-to-r from-green-500 to-green-600 hover:from-green-600 hover:to-green-700 text-white font-semibold rounded-lg shadow-lg hover:shadow-xl transition-all duration-200 transform hover:scale-105" > Kupi na Kupujem Prodajem trackEvent('Contact', 'Phone Call', 'Homepage')} className="inline-flex items-center gap-2 px-6 py-3 bg-gradient-to-r from-blue-500 to-blue-600 hover:from-blue-600 hover:to-blue-700 text-white font-semibold rounded-lg shadow-lg hover:shadow-xl transition-all duration-200 transform hover:scale-105" > Pozovi +381 67 710 2845
f.sale_active === true)} maxSalePercentage={Math.max(...filaments.filter(f => f.sale_active === true).map(f => f.sale_percentage || 0), 0)} saleEndDate={(() => { const activeSales = filaments.filter(f => f.sale_active === true && f.sale_end_date); if (activeSales.length === 0) return null; const latestSale = activeSales.reduce((latest, current) => { if (!latest.sale_end_date) return current; if (!current.sale_end_date) return latest; return new Date(current.sale_end_date) > new Date(latest.sale_end_date) ? current : latest; }).sale_end_date; return latestSale; })()} />
{/* Color Request Modal */} setShowColorRequestModal(false)} />
); }