## Skeleton za List View ```jsx // src/components/common/UniversalList.jsx import { h } from 'preact'; import { useEffect, useState } from 'preact/hooks'; import { useStore } from '@nanostores/preact'; import { getBaseUrl } from '../lib/nav'; import LoadingSpinner from './LoadingSpinner.jsx'; export default function UniversalList({ store, setter, fetchMethod, limit, baseName, children }) { const [loading, setLoading] = useState(true); const list = useStore(store); // Ako je baseName poslan, dohvati URL, inače ostavi undefined const baseUrl = baseName ? getBaseUrl(baseName) : undefined; useEffect(() => { async function fetchData() { if (list.length > 0) { setLoading(false); return; } try { setLoading(true); const data = await fetchMethod(); setter(data || []); } catch (error) { console.error("Greška pri dohvatu:", error); setter([]); } finally { setTimeout(() => setLoading(false), 1000); } } fetchData(); }, []); if (loading) return ; const displayList = limit ? list.slice(0, limit) : list; return (
{/* children funkcija sada prima item i opcionalni baseUrl */} {displayList.map(item => children(item, baseUrl))}
); } ``` ## Loading komponenta ```jsx // src/components/common/LoadingSpinner.jsx import { h } from 'preact'; export default function LoadingSpinner({ text = "Učitavanje podataka..." }) { return (
{text}
); } ``` ## Komponenta FleetStrojeviLista.jsx koristi Skeleton ```jsx /// src/components/fleet/FleetStrojeviLista.jsx import { h } from 'preact'; import UniversalList from '../common/UniversalList.jsx'; import { strojevi, setStrojevi } from '../stores/fleetStore'; import { getStrojevi } from '../lib/api'; export default function FleetStrojeviLista({ limit = 10 }) { return ( {(s, baseUrl) => (

{s.naziv}

{s.tip_human_readable}
  • Marka/Model: {s.marka} {s.model_stroja}
  • Serijski br: {s.serijski_broj}
  • Vlasnik: {s.vlasnik_naziv}
  • Radni sati: {s.radni_sati} h
  • {s.registracija &&
  • Reg: {s.registracija}
  • }
Pregled detalja
)}
); } ```