36
37// Main App component
38function App() {
39 const [user, setUser] = useState(null);
40
86
87// Home component
88function Home({ user }) {
89 if (!user) {
90 return <h2>Welcome! Please login or register to use the system.</h2>;
104
105// Login component
106function Login({ setUser }) {
107 const [email, setEmail] = useState('');
108 const [password, setPassword] = useState('');
138
139// Register component
140function Register() {
141 const [email, setEmail] = useState('');
142 const [password, setPassword] = useState('');
175
176// Profile component
177function Profile({ user }) {
178 const [name, setName] = useState(user.name || '');
179 const [phone, setPhone] = useState(user.phone || '');
207
208// Logout component
209function Logout({ setUser }) {
210 const navigate = useNavigate();
211
220
221// Driver Dashboard component
222function DriverDashboard({ user }) {
223 const [vehicles, setVehicles] = useState([]);
224 const [transactions, setTransactions] = useState([]);
271
272// Operator Dashboard component
273function OperatorDashboard({ user }) {
274 const [tollBooths, setTollBooths] = useState([]);
275
307
308// Admin Dashboard component
309function AdminDashboard({ user }) {
310 const [revenueReport, setRevenueReport] = useState(null);
311 const [trafficAnalytics, setTrafficAnalytics] = useState(null);
355
356// Client-side rendering
357function client() {
358 createRoot(document.getElementById("root")).render(<App />);
359}
361
362// Server-side code
363export default async function server(request: Request): Promise<Response> {
364 const { pathname } = new URL(request.url);
365
391}
392
393async function handleApiRequest(request: Request): Promise<Response> {
394 const { pathname } = new URL(request.url);
395 const { sqlite } = await import("https://esm.town/v/stevekrouse/sqlite");
467}
468
469async function handleRegister(request: Request, sqlite, KEY, SCHEMA_VERSION) {
470 if (request.method !== 'POST') {
471 return new Response('Method Not Allowed', { status: 405 });
492}
493
494async function handleLogin(request: Request, sqlite, KEY, SCHEMA_VERSION) {
495 if (request.method !== 'POST') {
496 return new Response('Method Not Allowed', { status: 405 });
520}
521
522function generateJWT(user) {
523 // This is a simplified JWT generation.
524 // In a real application, use a proper JWT library and keep the secret secure.
529}
530
531async function handleProfile(request: Request, sqlite, KEY, SCHEMA_VERSION, jwtDecode) {
532 if (request.method !== 'PUT') {
533 return new Response('Method Not Allowed', { status: 405 });
564}
565
566async function handleVehicles(request: Request, sqlite, KEY, SCHEMA_VERSION, jwtDecode) {
567 const token = request.headers.get('Authorization')?.split(' ')[1];
568 if (!token) {
586}
587
588async function handleTransactions(request: Request, sqlite, KEY, SCHEMA_VERSION, jwtDecode) {
589 const token = request.headers.get('Authorization')?.split(' ')[1];
590 if (!token) {
610}
611
612async function handleTollBooths(request: Request, sqlite, KEY, SCHEMA_VERSION, jwtDecode) {
613 const token = request.headers.get('Authorization')?.split(' ')[1];
614 if (!token) {
637}
638
639async function handleRevenueReport(request: Request, sqlite, KEY, SCHEMA_VERSION, jwtDecode) {
640 const token = request.headers.get('Authorization')?.split(' ')[1];
641 if (!token) {
666}
667
668async function handleTrafficAnalytics(request: Request, sqlite, KEY, SCHEMA_VERSION, jwtDecode) {
669 const token = request.headers.get('Authorization')?.split(' ')[1];
670 if (!token) {