import React, { useState, useEffect } from 'react'; import { initializeApp } from 'firebase/app'; import { getFirestore, collection, doc, onSnapshot, query, updateDoc, serverTimestamp } from 'firebase/firestore'; import { getAuth, signInAnonymously, onAuthStateChanged, signInWithCustomToken } from 'firebase/auth'; import { Ambulance, Home, Route, UserCircle, Settings, ChevronDown, ChevronLeft, FileText, AlertTriangle, Navigation, Activity, MapPin, ClipboardCheck, X, CheckCircle2, Truck, Stethoscope } from 'lucide-react'; // --- KONFIGURACJA SYSTEMU --- const firebaseConfig = JSON.parse(__firebase_config); const app = initializeApp(firebaseConfig); const auth = getAuth(app); const db = getFirestore(app); const appId = typeof __app_id !== 'undefined' ? __app_id : 'ambulance-os-live-v4'; const STEPS = [ { id: 'ACCEPTED', text: "PRZYJMIJ ZLECENIE", color: "bg-blue-600" }, { id: 'DEPARTED', text: "WYJAZD DO PACJENTA", color: "bg-indigo-600" }, { id: 'ON_SITE', text: "NA MIEJSCU ODBIORU", color: "bg-emerald-600" }, { id: 'PICKED_UP', text: "PACJENT W KARETCE", color: "bg-amber-600" }, { id: 'TRANSPORTING', text: "W DRODZE DO CELU", color: "bg-blue-600" }, { id: 'ARRIVED', text: "NA MIEJSCU DOCELOWYM", color: "bg-emerald-600" }, { id: 'FINISHED', text: "ZAKOŃCZ I ZWOLNIJ ZESPÓŁ", color: "bg-slate-900" } ]; export default function App() { const [user, setUser] = useState(null); const [setup, setSetup] = useState({ team: '', ambulance: '' }); const [isLoggedIn, setIsLoggedIn] = useState(false); const [activeTab, setActiveTab] = useState('home'); const [headerExpanded, setHeaderExpanded] = useState(false); const [orders, setOrders] = useState([]); const [selectedOrder, setSelectedOrder] = useState(null); const [teamStatus, setTeamStatus] = useState('READY'); const [showTtkModal, setShowTtkModal] = useState(false); const [currentTime, setCurrentTime] = useState(new Date().toLocaleTimeString('pl-PL', { hour: '2-digit', minute: '2-digit' })); // Autoryzacja Firebase useEffect(() => { const initAuth = async () => { try { if (typeof __initial_auth_token !== 'undefined' && __initial_auth_token) { await signInWithCustomToken(auth, __initial_auth_token); } else { await signInAnonymously(auth); } } catch (err) { console.error("Auth error:", err); } }; initAuth(); const unsubscribe = onAuthStateChanged(auth, setUser); return () => unsubscribe(); }, []); // Synchronizacja danych useEffect(() => { if (!user || !isLoggedIn) return; const ordersRef = collection(db, 'artifacts', appId, 'public', 'data', 'orders'); const unsubscribe = onSnapshot(query(ordersRef), (snap) => { const data = snap.docs.map(d => ({ id: d.id, ...d.data() })); setOrders(data.filter(o => !o.assignedTeam || o.assignedTeam === setup.team)); }); const timer = setInterval(() => setCurrentTime(new Date().toLocaleTimeString('pl-PL', { hour: '2-digit', minute: '2-digit' })), 1000); return () => { unsubscribe(); clearInterval(timer); }; }, [user, isLoggedIn, setup.team]); const handleLogin = () => { if (setup.team && setup.ambulance) setIsLoggedIn(true); }; const updateStatus = async (orderId, stepIdx) => { if (!user) return; const nextStep = STEPS[stepIdx]; const orderRef = doc(db, 'artifacts', appId, 'public', 'data', 'orders', orderId); const order = orders.find(o => o.id === orderId); const log = { status: nextStep.text, time: currentTime, code: nextStep.id }; await updateDoc(orderRef, { currentStep: stepIdx + 1, logs: [...(order.logs || []), log], lastUpdate: serverTimestamp(), assignedTeam: setup.team }); if (nextStep.id === 'FINISHED') { setSelectedOrder(null); setActiveTab('home'); } }; if (!isLoggedIn) { return (

Ambulance OS

System Operacyjny ZRM

); } return (
{/* NAGŁÓWEK SYSTEMOWY */}
{!headerExpanded ? (

{setup.team}

{setup.ambulance}

{currentTime}
) : (

OPERACYJNY

Zarządzanie Zespołem

)}
{/* OBSZAR TREŚCI */}
{activeTab === 'home' && (
Monitor Live
Incydent
)} {activeTab === 'zlecenia' && (

Zlecenia Aktywne

{orders.length === 0 ? (

Brak zleceń

) : orders.map(order => (
{ setSelectedOrder(order); setActiveTab('details'); }} className="bg-white rounded-3xl p-6 border border-slate-50 relative overflow-hidden active:scale-[0.98] transition-all cursor-pointer shadow-sm">
{order.priority}

{order.patientName}

{order.origin}
{order.destination}
))}
)} {activeTab === 'details' && selectedOrder && (

{selectedOrder.patientName}

{selectedOrder.priority} {selectedOrder.patientAge} LAT

Odbiór

{selectedOrder.origin}

Cel

{selectedOrder.destination}

)}
{/* SMART DOCK */} {/* MODAL TTK */} {showTtkModal && (

Raport Wyposażenia

{['Monitor EKG', 'Butla Tlenowa', 'Zestaw Opatrunkowy', 'Leki systemowe', 'Pojazd (Paliwo/Płyny)', 'Łączność'].map((item, idx) => ( ))}
)}
); }