import React, { useState, useEffect } from 'react';
import { initializeApp } from 'firebase/app';
import {
getAuth,
signInAnonymously,
signInWithCustomToken,
onAuthStateChanged,
signOut
} from 'firebase/auth';
import {
getFirestore,
collection,
doc,
addDoc,
onSnapshot,
updateDoc,
deleteDoc,
query,
where
} from 'firebase/firestore';
import {
Truck,
BarChart3,
ShieldCheck,
Globe,
Clock,
FileText,
CheckCircle2,
ArrowRight,
Phone,
Mail,
MapPin,
Menu,
X,
LayoutDashboard,
LogOut,
Plus,
Search,
Settings,
User,
Linkedin,
Facebook,
Twitter,
Instagram,
AlertCircle,
Building2,
FileUp,
ChevronRight,
Calendar,
DollarSign,
TrendingUp,
FileBadge,
UserPlus,
HardDrive,
Activity,
ClipboardList,
Filter
} from 'lucide-react';
// --- Firebase Configuration ---
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 : 'forward-dispatch-crm';
const App = () => {
const [currentPage, setCurrentPage] = useState('home');
const [crmTab, setCrmTab] = useState('loads');
const [isMenuOpen, setIsMenuOpen] = useState(false);
const [user, setUser] = useState(null);
const [loads, setLoads] = useState([]);
const [carriers, setCarriers] = useState([]);
const [drivers, setDrivers] = useState([]);
const [selectedCarrier, setSelectedCarrier] = useState(null);
const [selectedLoad, setSelectedLoad] = useState(null);
const [isDispatchModalOpen, setIsDispatchModalOpen] = useState(false);
const [isLoading, setIsLoading] = useState(true);
const [error, setError] = useState(null);
// --- Search and Filters State ---
const [searchQuery, setSearchQuery] = useState("");
const [statusFilter, setStatusFilter] = useState("All");
const [carrierFilter, setCarrierFilter] = useState("All");
// --- Auth Logic ---
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);
setError("Authentication failed. Please refresh.");
}
};
initAuth();
const unsubscribe = onAuthStateChanged(auth, (u) => {
setUser(u);
setIsLoading(false);
});
return () => unsubscribe();
}, []);
// --- Database Sync ---
useEffect(() => {
if (!user) return;
const loadsCol = collection(db, 'artifacts', appId, 'public', 'data', 'loads');
const carriersCol = collection(db, 'artifacts', appId, 'public', 'data', 'carriers');
const driversCol = collection(db, 'artifacts', appId, 'public', 'data', 'drivers');
const unsubLoads = onSnapshot(loadsCol, (snap) => {
setLoads(snap.docs.map(d => ({ id: d.id, ...d.data() })));
}, () => setError("Failed to sync load data."));
const unsubCarriers = onSnapshot(carriersCol, (snap) => {
setCarriers(snap.docs.map(d => ({ id: d.id, ...d.data() })));
}, () => setError("Failed to sync carrier data."));
const unsubDrivers = onSnapshot(driversCol, (snap) => {
setDrivers(snap.docs.map(d => ({ id: d.id, ...d.data() })));
}, () => setError("Failed to sync driver data."));
return () => { unsubLoads(); unsubCarriers(); unsubDrivers(); };
}, [user]);
const navigate = (page) => {
setCurrentPage(page);
setIsMenuOpen(false);
window.scrollTo(0, 0);
};
const handleSignOut = async () => {
await signOut(auth);
navigate('home');
};
// --- CRM Actions ---
const addLoad = async (e) => {
e.preventDefault();
if (!user) return;
const formData = new FormData(e.target);
const newLoad = {
carrierId: formData.get('carrierId'),
origin: formData.get('origin'),
destination: formData.get('destination'),
rate: parseFloat(formData.get('rate')),
status: 'Unassigned',
assignedDriverId: null,
trackingHistory: [{ status: 'Created', timestamp: new Date().toISOString() }],
createdAt: new Date().toISOString(),
dispatcherId: user.uid
};
try {
await addDoc(collection(db, 'artifacts', appId, 'public', 'data', 'loads'), newLoad);
e.target.reset();
setIsDispatchModalOpen(false);
} catch (err) { setError("Failed to add load."); }
};
const assignDriverToLoad = async (loadId, driverId) => {
try {
const loadRef = doc(db, 'artifacts', appId, 'public', 'data', 'loads', loadId);
const driver = drivers.find(d => d.id === driverId);
await updateDoc(loadRef, {
assignedDriverId: driverId,
assignedDriverName: driver.name,
status: 'Assigned',
trackingHistory: [...(selectedLoad.trackingHistory || []), { status: 'Assigned', timestamp: new Date().toISOString() }]
});
setSelectedLoad(prev => ({ ...prev, status: 'Assigned', assignedDriverId: driverId, assignedDriverName: driver.name }));
} catch (err) { setError("Failed to assign driver."); }
};
const updateLoadStatus = async (loadId, newStatus) => {
try {
const loadRef = doc(db, 'artifacts', appId, 'public', 'data', 'loads', loadId);
await updateDoc(loadRef, {
status: newStatus,
trackingHistory: [...(selectedLoad.trackingHistory || []), { status: newStatus, timestamp: new Date().toISOString() }]
});
setSelectedLoad(prev => ({ ...prev, status: newStatus }));
} catch (err) { setError("Failed to update status."); }
};
const addCarrier = async (e) => {
e.preventDefault();
const formData = new FormData(e.target);
const newCarrier = {
companyName: formData.get('name'),
mcNumber: formData.get('mc'),
email: formData.get('email'),
truckCount: formData.get('trucks') || "0",
contractStatus: 'Pending',
createdAt: new Date().toISOString()
};
try {
await addDoc(collection(db, 'artifacts', appId, 'public', 'data', 'carriers'), newCarrier);
e.target.reset();
} catch (err) { setError("Failed to add carrier."); }
};
const addDriver = async (e) => {
e.preventDefault();
const formData = new FormData(e.target);
const newDriver = {
carrierId: selectedCarrier.id,
companyName: selectedCarrier.companyName,
name: formData.get('driverName'),
licenseNumber: formData.get('license'),
licensePlate: formData.get('plate'),
phone: formData.get('phone'),
createdAt: new Date().toISOString()
};
try {
await addDoc(collection(db, 'artifacts', appId, 'public', 'data', 'drivers'), newDriver);
e.target.reset();
} catch (err) { setError("Failed to add driver."); }
};
// --- Filtering Logic ---
const filteredLoads = loads.filter(load => {
const carrier = carriers.find(c => c.id === load.carrierId);
const matchesSearch =
load.origin?.toLowerCase().includes(searchQuery.toLowerCase()) ||
load.destination?.toLowerCase().includes(searchQuery.toLowerCase()) ||
carrier?.companyName?.toLowerCase().includes(searchQuery.toLowerCase()) ||
load.assignedDriverName?.toLowerCase().includes(searchQuery.toLowerCase());
const matchesStatus = statusFilter === "All" || load.status === statusFilter;
const matchesCarrier = carrierFilter === "All" || load.carrierId === carrierFilter;
return matchesSearch && matchesStatus && matchesCarrier;
});
// --- Components ---
const Navbar = () => (
navigate('home')}>
Forward Dispatching
navigate('home')} className={`hover:text-blue-600 ${currentPage === 'home' ? 'text-blue-600' : ''}`}>Home
navigate('services')} className={`hover:text-blue-600 ${currentPage === 'services' ? 'text-blue-600' : ''}`}>Services
navigate('onboarding')} className={`hover:text-blue-600 ${currentPage === 'onboarding' ? 'text-blue-600' : ''}`}>Carrier Setup
{user && !user.isAnonymous ? (
navigate('crm')} className="flex items-center gap-2 bg-slate-900 text-white px-6 py-2 rounded-full hover:bg-slate-800 transition"> CRM Portal
) : (
navigate('login')} className="bg-blue-600 text-white px-6 py-2 rounded-full hover:bg-blue-700 transition">Login
)}
setIsMenuOpen(!isMenuOpen)}>
);
const CRM_Dashboard = () => (
{/* Sidebar */}
CRM Console
{ setCrmTab('loads'); setSelectedCarrier(null); setSelectedLoad(null); }} className={`w-full text-left p-3 rounded-xl flex items-center gap-3 transition ${crmTab === 'loads' ? 'bg-blue-600 text-white' : 'text-slate-400 hover:bg-slate-800'}`}> Active Loads
{ setCrmTab('carriers'); setSelectedCarrier(null); setSelectedLoad(null); }} className={`w-full text-left p-3 rounded-xl flex items-center gap-3 transition ${crmTab === 'carriers' ? 'bg-blue-600 text-white' : 'text-slate-400 hover:bg-slate-800'}`}> Carriers
setCrmTab('invoices')} className={`w-full text-left p-3 rounded-xl flex items-center gap-3 transition ${crmTab === 'invoices' ? 'bg-blue-600 text-white' : 'text-slate-400 hover:bg-slate-800'}`}> Invoices
setCrmTab('analytics')} className={`w-full text-left p-3 rounded-xl flex items-center gap-3 transition ${crmTab === 'analytics' ? 'bg-blue-600 text-white' : 'text-slate-400 hover:bg-slate-800'}`}> Analytics
Sign Out
{error && }
{/* Load Board Content */}
{crmTab === 'loads' && !selectedLoad && (
{/* Filter Bar */}
setSearchQuery(e.target.value)}
/>
setStatusFilter(e.target.value)}
>
All Statuses
Unassigned
Assigned
In Transit
Delivered
setCarrierFilter(e.target.value)}
>
All Carriers
{carriers.map(c => {c.companyName} )}
Filters Active: { (searchQuery || statusFilter !== "All" || carrierFilter !== "All") ? "Yes" : "No" }
Carrier / Driver
Route
Rate
Status
Action
{filteredLoads.length === 0 ? (
No matching loads found.
) : (
filteredLoads.map((load) => {
const carrier = carriers.find(c => c.id === load.carrierId);
return (
setSelectedLoad(load)}>
{carrier?.companyName || "Unknown Carrier"}
{load.assignedDriverName || "No Driver Assigned"}
{load.origin} {load.destination}
${load.rate?.toLocaleString()}
{load.status}
);
})
)}
)}
{/* Dispatch New Load Modal */}
{isDispatchModalOpen && (
setIsDispatchModalOpen(false)}>
New Load Entry
setIsDispatchModalOpen(false)} className="p-2 hover:bg-slate-100 rounded-full transition">
)}
{/* Load Details View (Workflow) */}
{crmTab === 'loads' && selectedLoad && (
setSelectedLoad(null)} className="flex items-center gap-2 text-blue-600 font-bold text-sm mb-4 transition hover:gap-3"> Back to Dashboard
{/* Workflow Status Tracking */}
Load Lifecycle Tracking
{['Unassigned', 'Assigned', 'In Transit', 'Delivered'].map((step, idx) => (
{idx < ['Unassigned', 'Assigned', 'In Transit', 'Delivered'].indexOf(selectedLoad.status) ? : idx + 1}
{step}
))}
Assign Driver
{!selectedLoad.assignedDriverId ? (
{drivers.filter(d => d.carrierId === selectedLoad.carrierId).map(driver => (
assignDriverToLoad(selectedLoad.id, driver.id)}
className="w-full p-4 bg-slate-50 hover:bg-blue-50 hover:border-blue-200 border rounded-2xl flex justify-between items-center transition"
>
{driver.name}
{driver.licensePlate}
))}
{drivers.filter(d => d.carrierId === selectedLoad.carrierId).length === 0 && (
No drivers registered for {carriers.find(c => c.id === selectedLoad.carrierId)?.companyName}
)}
) : (
{selectedLoad.assignedDriverName}
Active Assignment
Phone: {drivers.find(d => d.id === selectedLoad.assignedDriverId)?.phone}
Plate: {drivers.find(d => d.id === selectedLoad.assignedDriverId)?.licensePlate}
updateLoadStatus(selectedLoad.id, 'Unassigned')}
className="mt-6 w-full py-3 bg-white/5 hover:bg-white/10 rounded-xl text-[10px] font-black uppercase transition border border-white/10"
>Reassign Driver
)}
Load Documentation
Rate Confirmation
Wait for Upload
Bill of Lading
Scan Required
{/* Sidebar: Tracking History */}
Live Events
{(selectedLoad.trackingHistory || []).map((log, i) => (
{i !== (selectedLoad.trackingHistory || []).length - 1 &&
}
{log.status}
{new Date(log.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
))}
updateLoadStatus(selectedLoad.id, 'In Transit')} className="w-full py-3 bg-blue-50 text-blue-700 rounded-xl text-xs font-black hover:bg-blue-600 hover:text-white transition uppercase">Set In Transit
updateLoadStatus(selectedLoad.id, 'Delivered')} className="w-full py-3 bg-green-50 text-green-700 rounded-xl text-xs font-black hover:bg-green-600 hover:text-white transition uppercase">Mark Delivered
)}
{/* Carrier Tab Logic */}
{crmTab === 'carriers' && !selectedCarrier && (
{carriers.map(carrier => (
setSelectedCarrier(carrier)} className="bg-white p-6 rounded-[32px] border hover:shadow-lg transition cursor-pointer group">
{carrier.companyName}
MC#{carrier.mcNumber}
{carrier.truckCount || 0} Trucks
))}
)}
{crmTab === 'carriers' && selectedCarrier && (
setSelectedCarrier(null)} className="flex items-center gap-2 text-blue-600 font-bold text-sm"> Back to Directory
{selectedCarrier.companyName}
MC#{selectedCarrier.mcNumber} • {selectedCarrier.email}
{drivers.filter(d => d.carrierId === selectedCarrier.id).map(driver => (
{driver.name}
{driver.phone} • {driver.licensePlate}
))}
)}
{crmTab === 'invoices' && (
Financial History
Invoice # Carrier Amount Status
{loads.map((l, i) => (
INV-00{i+1}
{carriers.find(c => c.id === l.carrierId)?.companyName || "Unknown"}
${(l.rate * 0.1).toFixed(2)}
Pending
))}
)}
{crmTab === 'analytics' && (
{[
{ label: "Total Gross", val: `$${loads.reduce((a, b) => a + (b.rate || 0), 0).toLocaleString()}`, icon:
, color: "text-green-600" },
{ label: "Active Loads", val: loads.length, icon:
, color: "text-blue-600" },
{ label: "Avg. Rate", val: `$${(loads.reduce((a, b) => a + (b.rate || 0), 0) / (loads.length || 1)).toFixed(0)}`, icon:
, color: "text-purple-600" },
{ label: "Partners", val: carriers.length, icon:
, color: "text-amber-600" }
].map((stat, i) => (
{stat.icon}
{stat.val}
{stat.label}
))}
)}
);
const LoginPage = () => (
Dispatcher Login
Access your CRM dashboard
);
const HomePage = () => (
Stop Chasing Loads. Maximize Your RPM.
Premium 24/7 Dispatching & Operations for US Owner-Operators. We handle the paperwork, you handle the miles.
navigate('onboarding')} className="bg-blue-600 hover:bg-blue-700 px-10 py-4 rounded-full text-xl font-bold transition flex items-center justify-center">Get Started
navigate('login')} className="bg-slate-800 border border-slate-700 hover:bg-slate-700 px-10 py-4 rounded-full text-xl font-bold transition">Dispatcher Login
{[
{ title: "High-Pay Lanes", icon:
, desc: "We use DAT & Truckstop data to secure the highest RPM in your preferred lanes." },
{ title: "24/7 Back-Office", icon:
, desc: "From packets to factoring, we handle every piece of paper so you stay hands-off." },
{ title: "No Forced Dispatch", icon:
, desc: "You are the boss. We provide the options, you make the final call on every load." }
].map((item, i) => (
{item.icon}
{item.title}
{item.desc}
))}
);
const ServicesPage = () => (
Our Specializations We don't just move freight; we optimize your business structure.
Reefer Dispatching Precision monitoring for temp-sensitive cargo. We manage cold-chain compliance and reefer-specific fuel surcharges.
Dry Van Power Focus on consistent gross revenue through high-volume lane triangulation and power-only drop-and-hook loads.
);
const Footer = () => (
);
if (isLoading) return Initializing Systems...
;
return (
{currentPage !== 'crm' && }
{currentPage === 'home' && }
{currentPage === 'services' && }
{currentPage === 'onboarding' && }
{currentPage === 'login' && }
{currentPage === 'crm' && }
{currentPage !== 'crm' && }
);
};
export default App;