/** * @license * SPDX-License-Identifier: Apache-2.0 */ import React, { useState, useEffect } from 'react'; import { Building2, Store, Bike, Check, Copy, Plus, ArrowRight, ArrowLeft, ShieldAlert, Loader2, Mail, Phone, FileText, MapPin, Clock, Navigation } from 'lucide-react'; import { useFiestaCreateTenant, useFiestaCreateLocation, useFiestaCreateUser, useFiestaRiderShifts, useFiestaTenantLocations, useFiestaAllTenants } from '../services/fiestaQueries'; import { FIESTA_TENANT_ID, str as fstr, num as fnum } from '../services/fiestaApi'; export default function AdminConsole({ activeTab: propActiveTab, showHeader = true, onBack, tenantId }: { activeTab?: 'tenant' | 'store' | 'rider', showHeader?: boolean, onBack?: () => void, tenantId?: number }) { const [activeTab, setActiveTab] = useState<'tenant' | 'store' | 'rider'>(propActiveTab || 'tenant'); useEffect(() => { if (propActiveTab) { setActiveTab(propActiveTab); } }, [propActiveTab]); // Mutations & Queries const createTenantMut = useFiestaCreateTenant(); const createLocationMut = useFiestaCreateLocation(); const createUserMut = useFiestaCreateUser(); const shiftsQ = useFiestaRiderShifts(); const tenantsQ = useFiestaAllTenants({ pagesize: 100 }); // ---------------------------------------------------- // Form State: Tenant Onboarding // ---------------------------------------------------- const TENANT_FORM_INITIAL = { tenantname: '', companyname: '', primarycontact: '', primaryemail: '', address: '', suburb: '', city: 'Coimbatore', state: 'Tamil Nadu', postcode: '', // Primary outlet — created in the same call as the tenant, so a fresh // tenant is never left without a location to actually operate from. locationname: '', // 1 Food & Dining, 2 Grocery & Daily, 3 Pharmacy, 4 Retail — the same // categories categoryName() in fiestaMappers.ts already displays. categoryid: 2, applocationid: 1, }; const [tenantForm, setTenantForm] = useState(TENANT_FORM_INITIAL); const [tenantSuccess, setTenantSuccess] = useState(null); // ---------------------------------------------------- // Form State: Store Onboarding // ---------------------------------------------------- const [storeForm, setStoreForm] = useState({ tenantid: tenantId || FIESTA_TENANT_ID, locationname: '', address: '', suburb: '', city: 'Coimbatore', state: 'Tamil Nadu', postcode: '', contactno: '', email: '', opentime: '06:00:00', closetime: '22:00:00', deliverymins: 45, deliveryradius: 5000, // in meters }); useEffect(() => { if (tenantId) { setStoreForm(prev => ({ ...prev, tenantid: tenantId })); } }, [tenantId]); const [storeSuccess, setStoreSuccess] = useState(null); const currentTenantObj = (tenantsQ.data || []).find((t) => Number(t.tenantid) === Number(storeForm.tenantid)); const tenantNameDisplay = currentTenantObj ? `${fstr(currentTenantObj.tenantname)} (#${fstr(currentTenantObj.tenantid)})` : `Tenant #${storeForm.tenantid}`; // ---------------------------------------------------- // Form State: Rider Onboarding // ---------------------------------------------------- const [riderForm, setRiderForm] = useState({ firstname: '', lastname: '', email: '', contactno: '', password: 'Rider@123', locationid: 0, shiftid: 0, vehiclename: '', vehiclemodel: '', licensenumber: '', }); const [riderSuccess, setRiderSuccess] = useState(null); const [copiedSql, setCopiedSql] = useState(false); const handleCopySql = () => { if (!riderSuccess?.sql) return; navigator.clipboard.writeText(riderSuccess.sql); setCopiedSql(true); setTimeout(() => setCopiedSql(false), 2000); }; // ---------------------------------------------------- // Submissions // ---------------------------------------------------- const handleTenantSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!tenantForm.tenantname || !tenantForm.companyname || !tenantForm.primarycontact || !tenantForm.primaryemail || !tenantForm.locationname) { alert('Kindly fill in all required fields.'); return; } try { const res = await createTenantMut.mutateAsync({ ...tenantForm, approved: 1, status: 'Active', // Reuses the tenant's own address for its primary location — a // freshly onboarded single-location merchant's outlet address is // the same as their registered one. tenantlocations: { locationname: tenantForm.locationname, email: tenantForm.primaryemail, contactno: tenantForm.primarycontact, address: tenantForm.address, suburb: tenantForm.suburb, city: tenantForm.city, state: tenantForm.state, postcode: tenantForm.postcode, applocationid: tenantForm.applocationid, }, }); setTenantSuccess(res); alert('Tenant Onboarded successfully!'); } catch (err: any) { alert(err.message || 'Failed to onboard tenant.'); } }; const handleStoreSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!storeForm.locationname) { alert('Location Name is required.'); return; } try { const res = await createLocationMut.mutateAsync({ ...storeForm, status: 'Active', moduleid: 2, applocationid: 1, partnerid: 1, roleid: 4, }); setStoreSuccess(res); alert('Store Location created successfully!'); } catch (err: any) { alert(err.message || 'Failed to create store location.'); } }; const handleRiderSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!riderForm.firstname || !riderForm.email || !riderForm.contactno || !riderForm.locationid) { alert('Please fill out the Rider personal details and assign a store.'); return; } try { // Create base user with roleid = 3 and configid = 6 (Rider config) const res = await createUserMut.mutateAsync({ firstname: riderForm.firstname, lastname: riderForm.lastname, email: riderForm.email, contactno: riderForm.contactno, password: riderForm.password, roleid: 3, configid: 6, tenantid: FIESTA_TENANT_ID, locationid: Number(riderForm.locationid), applocationid: 1, status: 'active', }); const newUserId = res.userid || Math.floor(Math.random() * 9000) + 1000; const vehicleName = riderForm.vehiclename || 'Standard delivery bike'; const licenseNum = riderForm.licensenumber || 'TN-37-XX-XXXX'; const vehicleModel = riderForm.vehiclemodel || 'Electric Scooter'; const shiftId = Number(riderForm.shiftid) || 0; // Generate the SQL script needed to make the rider fully operational in the DB const sqlScript = `-- ---------------------------------------------------- -- Administrative SQL Script for Rider Activation -- User ID: #${newUserId} (${riderForm.firstname}) -- ---------------------------------------------------- -- 1. Insert Vehicle & License Settings into 'ridersettings' INSERT INTO ridersettings (userid, vehiclename, vehicleinfo, licensenumber, shiftid) VALUES (${newUserId}, '${vehicleName}', '${vehicleModel}', '${licenseNum}', ${shiftId}); -- 2. Add Rider to Availability Pool & set On-Duty in 'app_userpools' INSERT INTO app_userpools (userid, onduty, status, lastupdate) VALUES (${newUserId}, 1, 'Active', NOW()); `; setRiderSuccess({ user: res, sql: sqlScript, userid: newUserId, }); alert('Rider User created in app_users! SQL Script generated below.'); } catch (err: any) { alert(err.message || 'Failed to create rider user.'); } }; // Retrieve active locations to assign riders / stores const locationsQ = useFiestaTenantLocations(FIESTA_TENANT_ID); const locations = locationsQ.data || []; if (!showHeader) { return (
{/* TAB 1: Tenant Onboarding */} {activeTab === 'tenant' && (

Provision New Merchant Tenant

Onboard a new merchant group. This registers their enterprise, defaults the order serialization, and spawns the primary Administrator account.

{tenantSuccess ? (

Onboarding Complete!

Tenant {tenantForm.tenantname} has been provisioned. An administrator account has been dispatched with credentials tied to {tenantForm.primaryemail}.

) : (
setTenantForm({ ...tenantForm, tenantname: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
setTenantForm({ ...tenantForm, companyname: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
setTenantForm({ ...tenantForm, primarycontact: e.target.value.replace(/\D/g, '') })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
setTenantForm({ ...tenantForm, primaryemail: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
setTenantForm({ ...tenantForm, locationname: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
setTenantForm({ ...tenantForm, address: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setTenantForm({ ...tenantForm, suburb: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setTenantForm({ ...tenantForm, city: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setTenantForm({ ...tenantForm, state: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setTenantForm({ ...tenantForm, postcode: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
)}
)} {/* TAB 2: Store Onboarding */} {activeTab === 'store' && (

Add Store Outlet Location

Commission a new store branch/hub under a tenant. This sets up store parameters, delivery thresholds, and spawns a placeholder branch manager account.

{storeSuccess ? (

Store Branch Active!

Store {storeForm.locationname} has been initialized. A default placeholder manager user has been spawned in inactive mode (requires password setup).

{onBack && ( )}
) : (
{/* SECTION 1: Identity & Primary Contact */}

Owner & Identity

setStoreForm({ ...storeForm, locationname: e.target.value })} className="pl-10 pr-4 py-2.5 w-full border border-slate-200 rounded-xl bg-slate-50/40 hover:bg-slate-100/60 focus:bg-white outline-none focus:ring-4 focus:ring-purple-100 focus:border-purple-600 transition-all font-semibold text-xs text-slate-800 shadow-sm" required />
setStoreForm({ ...storeForm, email: e.target.value })} className="pl-10 pr-4 py-2.5 w-full border border-slate-200 rounded-xl bg-slate-50/40 hover:bg-slate-100/60 focus:bg-white outline-none focus:ring-4 focus:ring-purple-100 focus:border-purple-600 transition-all font-semibold text-xs text-slate-800 shadow-sm" />
setStoreForm({ ...storeForm, contactno: e.target.value.replace(/\D/g, '') })} className="pl-10 pr-4 py-2.5 w-full border border-slate-200 rounded-xl bg-slate-50/40 hover:bg-slate-100/60 focus:bg-white outline-none focus:ring-4 focus:ring-purple-100 focus:border-purple-600 transition-all font-semibold text-xs text-slate-800 shadow-sm" />
{/* SECTION 2: Location & Address */}

Location & Address Details

setStoreForm({ ...storeForm, address: e.target.value })} className="pl-10 pr-4 py-2.5 w-full border border-slate-200 rounded-xl bg-slate-50/40 hover:bg-slate-100/60 focus:bg-white outline-none focus:ring-4 focus:ring-purple-100 focus:border-purple-600 transition-all font-semibold text-xs text-slate-800 shadow-sm" />
setStoreForm({ ...storeForm, suburb: e.target.value })} className="px-4 py-2.5 w-full border border-slate-200 rounded-xl bg-slate-50/40 hover:bg-slate-100/60 focus:bg-white outline-none focus:ring-4 focus:ring-purple-100 focus:border-purple-600 transition-all font-semibold text-xs text-slate-800 shadow-sm" />
setStoreForm({ ...storeForm, city: e.target.value })} className="px-4 py-2.5 w-full border border-slate-200 rounded-xl bg-slate-50/40 hover:bg-slate-100/60 focus:bg-white outline-none focus:ring-4 focus:ring-purple-100 focus:border-purple-600 transition-all font-semibold text-xs text-slate-800 shadow-sm" />
setStoreForm({ ...storeForm, state: e.target.value })} className="px-4 py-2.5 w-full border border-slate-200 rounded-xl bg-slate-50/40 hover:bg-slate-100/60 focus:bg-white outline-none focus:ring-4 focus:ring-purple-100 focus:border-purple-600 transition-all font-semibold text-xs text-slate-800 shadow-sm" />
setStoreForm({ ...storeForm, postcode: e.target.value })} className="px-4 py-2.5 w-full border border-slate-200 rounded-xl bg-slate-50/40 hover:bg-slate-100/60 focus:bg-white outline-none focus:ring-4 focus:ring-purple-100 focus:border-purple-600 transition-all font-semibold text-xs text-slate-800 shadow-sm" />
{/* SECTION 3: Operations & Logistics */}

Logistics & Operational Hours

setStoreForm({ ...storeForm, opentime: e.target.value })} className="pl-10 pr-4 py-2.5 w-full border border-slate-200 rounded-xl bg-slate-50/40 focus:bg-white outline-none focus:ring-4 focus:ring-purple-100 focus:border-purple-600 transition-all font-semibold text-xs text-slate-800 shadow-sm" />
setStoreForm({ ...storeForm, closetime: e.target.value })} className="pl-10 pr-4 py-2.5 w-full border border-slate-200 rounded-xl bg-slate-50/40 focus:bg-white outline-none focus:ring-4 focus:ring-purple-100 focus:border-purple-600 transition-all font-semibold text-xs text-slate-800 shadow-sm" />
setStoreForm({ ...storeForm, deliveryradius: Number(e.target.value) })} className="pl-10 pr-4 py-2.5 w-full border border-slate-200 rounded-xl bg-slate-50/40 focus:bg-white outline-none focus:ring-4 focus:ring-purple-100 focus:border-purple-600 transition-all font-semibold text-xs text-slate-800 shadow-sm" />
setStoreForm({ ...storeForm, deliverymins: Number(e.target.value) })} className="pl-10 pr-4 py-2.5 w-full border border-slate-200 rounded-xl bg-slate-50/40 focus:bg-white outline-none focus:ring-4 focus:ring-purple-100 focus:border-purple-600 transition-all font-semibold text-xs text-slate-800 shadow-sm" />
{/* FORM ACTIONS */}
{onBack && ( )}
)}
)} {/* TAB 3: Rider Onboarding */} {activeTab === 'rider' && (

Onboard Delivery Rider

Onboarding riders is a multi-table database transaction. We register the user profile in app_users, and dynamically generate SQL configuration queries to inject vehicle, shift, and availability settings.

{riderSuccess ? (

Base Account Registered successfully!

Rider user created in app_users with ID: #{riderSuccess.userid}.

{/* SQL generated panel */}
Administrative SQL Synchronization script
                    {riderSuccess.sql}
                  
Immediate Action Required: Please share this SQL script with the Database Administrator (DBA) or run it against the Postgres instance to complete vehicle assignments, shifts, and active pool configuration.
) : (
{/* Account personal details */}

1. Base Profile Details

setRiderForm({ ...riderForm, firstname: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
setRiderForm({ ...riderForm, lastname: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setRiderForm({ ...riderForm, email: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
setRiderForm({ ...riderForm, contactno: e.target.value.replace(/\D/g, '') })} className="w-full border border-slate-250 rounded-xl p-3 bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
{/* Vehicle, Shift & Hub configurations */}

2. Fleet & Shift configuration

setRiderForm({ ...riderForm, vehiclename: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setRiderForm({ ...riderForm, vehiclemodel: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setRiderForm({ ...riderForm, licensenumber: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
)}
)}
); } return (
{/* Tabs Layout */}
{/* Navigation Tabs */}
{/* Form Panel */}
{/* TAB 1: Tenant Onboarding */} {activeTab === 'tenant' && (

Provision New Merchant Tenant

Onboard a new merchant group. This registers their enterprise, defaults the order serialization, and spawns the primary Administrator account.

{tenantSuccess ? (

Onboarding Complete!

Tenant {tenantForm.tenantname} has been provisioned. An administrator account has been dispatched with credentials tied to {tenantForm.primaryemail}.

) : (
setTenantForm({ ...tenantForm, tenantname: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
setTenantForm({ ...tenantForm, companyname: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
setTenantForm({ ...tenantForm, primarycontact: e.target.value.replace(/\D/g, '') })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
setTenantForm({ ...tenantForm, primaryemail: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
setTenantForm({ ...tenantForm, locationname: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
setTenantForm({ ...tenantForm, address: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setTenantForm({ ...tenantForm, suburb: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setTenantForm({ ...tenantForm, city: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setTenantForm({ ...tenantForm, state: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setTenantForm({ ...tenantForm, postcode: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
)}
)} {/* TAB 2: Store Onboarding */} {activeTab === 'store' && (

Add Store Outlet Location

Commission a new store branch/hub under a tenant. This sets up store parameters, delivery thresholds, and spawns an placeholder branch manager account.

{storeSuccess ? (

Store Branch Active!

Store {storeForm.locationname} has been initialized. A default placeholder manager user has been spawned in inactive mode (requires password setup).

{onBack && ( )}
) : (
setStoreForm({ ...storeForm, locationname: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
setStoreForm({ ...storeForm, email: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setStoreForm({ ...storeForm, contactno: e.target.value.replace(/\D/g, '') })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setStoreForm({ ...storeForm, address: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setStoreForm({ ...storeForm, suburb: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setStoreForm({ ...storeForm, city: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setStoreForm({ ...storeForm, state: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setStoreForm({ ...storeForm, postcode: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 hover:bg-slate-100 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setStoreForm({ ...storeForm, opentime: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setStoreForm({ ...storeForm, closetime: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setStoreForm({ ...storeForm, deliveryradius: Number(e.target.value) })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setStoreForm({ ...storeForm, deliverymins: Number(e.target.value) })} className="w-full border border-slate-250 rounded-xl p-3 bg-slate-50/40 focus:bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
{onBack && ( )}
)}
)} {/* TAB 3: Rider Onboarding */} {activeTab === 'rider' && (

Onboard Delivery Rider

Onboarding riders is a multi-table database transaction. We register the user profile in app_users, and dynamically generate SQL configuration queries to inject vehicle, shift, and availability settings.

{riderSuccess ? (

Base Account Registered successfully!

Rider user created in app_users with ID: #{riderSuccess.userid}.

{/* SQL generated panel */}
Administrative SQL Synchronization script
                      {riderSuccess.sql}
                    
Immediate Action Required: Please share this SQL script with the Database Administrator (DBA) or run it against the Postgres instance to complete vehicle assignments, shifts, and active pool configuration.
) : (
{/* Account personal details */}

1. Base Profile Details

setRiderForm({ ...riderForm, firstname: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
setRiderForm({ ...riderForm, lastname: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setRiderForm({ ...riderForm, email: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
setRiderForm({ ...riderForm, contactno: e.target.value.replace(/\D/g, '') })} className="w-full border border-slate-250 rounded-xl p-3 bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" required />
{/* Vehicle, Shift & Hub configurations */}

2. Fleet & Shift configuration

setRiderForm({ ...riderForm, vehiclename: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setRiderForm({ ...riderForm, vehiclemodel: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
setRiderForm({ ...riderForm, licensenumber: e.target.value })} className="w-full border border-slate-250 rounded-xl p-3 bg-white outline-none focus:border-purple-500 transition-all font-semibold text-xs text-slate-800" />
)}
)}
); }