// src/components/dashboard/ServiceContextSelector.jsx // // Persistentni selektor "Servisni kontekst" — odabir kupca + dizalice. // Stanje se čuva u localStorage i u serviceContextStore (reaktivno). // // USAGE: // ...} /> import { useStore } from '@nanostores/preact'; import { useEffect, useState } from 'preact/hooks'; import { $clients, fetchClients } from '../../stores/clientStore'; import { $cranes } from '../../stores/fleetDashboardStore'; import { $accessToken } from '../../stores/authStore'; import ServiceRecordCreateButton from '../fleet/ServiceRecordCreateButton'; import { $selectedClientId, $selectedVehicleId, hydrateServiceContext, setSelectedClient, setSelectedVehicle, clearServiceContext, } from '../../stores/serviceContextStore'; export default function ServiceContextSelector({ onNewServiceRecord }) { const clients = useStore($clients); const cranes = useStore($cranes); const accessToken = useStore($accessToken); const selectedClientId = useStore($selectedClientId); const selectedVehicleId = useStore($selectedVehicleId); const [editMode, setEditMode] = useState(false); const [hasMounted, setHasMounted] = useState(false); useEffect(() => { setHasMounted(true); hydrateServiceContext(); }, []); useEffect(() => { if (!accessToken) return; if (clients.length > 0) return; fetchClients(); }, [accessToken, clients.length]); const fallbackClients = Array.from( new Map( cranes .filter((item) => item?.client && item?.client_name) .map((item) => [String(item.client), { id: item.client, name: item.client_name }]) ).values() ); const availableClients = clients.length > 0 ? clients : fallbackClients; const clientCranes = cranes.filter((item) => String(item.client) === String(selectedClientId)); const selectedClient = availableClients.find((c) => String(c.id) === String(selectedClientId)); const selectedCrane = cranes.find((item) => String(item.id) === String(selectedVehicleId)); const showSelector = editMode || !selectedClientId; const selectedCraneLabel = (() => { if (!selectedCrane) return ''; const serial = String(selectedCrane.crane_serial_number || '').trim(); if (serial) { return `SN ${serial} ${selectedCrane.make || ''} ${selectedCrane.model || ''}`.trim(); } return `${selectedCrane.registration_number || '-'} ${selectedCrane.make || ''} ${selectedCrane.model || ''}`.trim(); })(); function handleClientChange(e) { setSelectedClient(e.target.value); } function handleVehicleChange(e) { setSelectedVehicle(e.target.value); } function handleClearSelection() { clearServiceContext(); setEditMode(false); } if (!hasMounted) return null; return (
{showSelector ? (
Servisni kontekst: {selectedClientId && ( )} {selectedClientId && selectedVehicleId && ( )} {editMode && ( )}
) : (
Servisni kontekst: {selectedClient?.name ?? '…'} {selectedCrane && ( <> / {selectedCraneLabel} )} {selectedVehicleId && onNewServiceRecord && ( { onNewServiceRecord({ craneId: selectedVehicleId, clientId: selectedClientId }); }} /> )}
)}
); }