feat(frontier-upgrades): add Live Hardware Mic Web Speech API, Modifier -59 NCCI guardrails, Waiting Room Queue 1-click import, Digital Radiograph Posture DICOM analyzer, and Executive Collections Pulse Bar

This commit is contained in:
2026-09-07 16:47:34 -07:00
parent 75645f69c5
commit 18ceab33f8
6 changed files with 761 additions and 34 deletions
+164
View File
@@ -94,6 +94,21 @@ export default function Home() {
const [packages, setPackages] = useState<PrePaidPackage[]>(INITIAL_PACKAGES);
const [waitlist, setWaitlist] = useState<WaitlistEntry[]>(INITIAL_WAITLIST);
const [isWaitlistOpen, setIsWaitlistOpen] = useState(false);
const [pendingIntakes, setPendingIntakes] = useState<any[]>([
{
id: 'intake-waiting-1',
patientName: 'Jessica Morales',
phone: '(555) 302-9912',
dob: '1991-08-14',
email: 'jess.morales@example.com',
chiefComplaint: 'Cervical Spine (Neck), Left Trapezius / Shoulder pain (Sharp / Stabbing)',
vasScore: 6,
painAreas: ['Cervical Spine (Neck)', 'Left Trapezius / Shoulder'],
submittedAt: 'Just now (Mobile Check-in)',
providerName: 'Dr. Marcus Vance',
service: 'Initial Chiropractic Exam & Adjustment',
},
]);
// Polish state: Command Palette, Toasts & Audio
const [isCommandPaletteOpen, setIsCommandPaletteOpen] = useState(false);
@@ -259,9 +274,103 @@ export default function Home() {
...newAptData,
};
setAppointments((prev) => [newApt, ...prev]);
const newIntakeItem = {
id: `intake-${Date.now()}`,
patientName: newAptData.patientName || 'New Patient',
phone: newAptData.patientPhone || '(555) 000-0000',
chiefComplaint: newAptData.notes || newAptData.serviceType || 'Chief complaint documented during check-in',
vasScore: 5,
painAreas: ['Spine / Core'],
submittedAt: 'Just now (Mobile Check-in)',
providerName: newAptData.providerName || activeProvider.name,
service: newAptData.serviceType || 'Consultation',
};
setPendingIntakes((prev) => [newIntakeItem, ...prev]);
addToast('success', 'Intake & Booking Confirmed', `${newApt.patientName} scheduled for ${newApt.time}`);
};
const handleStartEncounterFromIntake = (intake: any) => {
clinicalAudio.playSuccess();
const nameParts = (intake.patientName || 'Jessica Morales').trim().split(' ');
const firstName = nameParts[0] || 'Jessica';
const lastName = nameParts.slice(1).join(' ') || 'Morales';
const newPatient: Patient = {
id: `pat-intake-${Date.now()}`,
tenantId: activeTenant.id,
firstName,
lastName,
email: intake.email || `${firstName.toLowerCase()}.${lastName.toLowerCase()}@example.com`,
phone: intake.phone || '(555) 302-9912',
dob: intake.dob || '1991-08-14',
gender: 'Female',
address: '284 Monterey Hwy, San Jose, CA 95112',
insuranceName: 'Blue Shield PPO',
insuranceId: 'BSP-99214',
status: 'active',
chiefComplaint: intake.chiefComplaint,
daysSinceLastVisit: 0,
lastVisitDate: new Date().toISOString().substring(0, 10),
vitals: {
bloodPressure: '118/76',
heartRate: 74,
temperature: '98.6°F',
oxygenSat: 99,
painLevel: intake.vasScore || 6,
bmi: '22.8',
allergies: ['None reported'],
contraindications: ['None reported'],
},
carePlan: {
title: 'Cervical Stabilization & Postural Restoration',
totalVisits: 12,
completedVisits: 0,
frequency: '3x / week for 4 weeks',
targetCondition: 'Cervicalgia & Upper Crossed Syndrome',
startDate: new Date().toISOString().substring(0, 10),
status: 'on_track',
},
};
setPatients((prev) => [newPatient, ...prev]);
setActivePatient(newPatient);
const newNote: SoapNote = {
id: `soap-intake-${Date.now()}`,
tenantId: activeTenant.id,
patientId: newPatient.id,
patientName: `${firstName} ${lastName}`,
providerId: activeProvider.id,
providerName: activeProvider.name,
date: new Date().toISOString().substring(0, 10),
status: 'draft',
discipline: 'chiropractic',
vasScore: intake.vasScore || 6,
subjective: `Patient completed digital intake in waiting room. Reports: "${intake.chiefComplaint}". Patient notes sudden sharp exacerbation rated ${intake.vasScore || 6}/10 pain after prolonged desk work. Desires manual alignment and therapeutic decompression.`,
objective: 'Cervical inspection demonstrates antalgic head tilt and guarded rotation. Motion palpation identifies acute subluxations at C1 (Right Lateral Mass) and C5 (Posterior Right). Paraspinal tenderness and hypertonicity in upper trapezius.',
assessment: 'Acute cervical segmental dysfunction (M99.01) with cervicogenic spasm. Patient suitable for manual chiropractic manipulation.',
plan: '1. Diversified adjustment delivered to C1 (Atlas) and C5.\n2. Suboccipital myofascial release (15 min).\n3. Ergonomic posture home stretches prescribed.\n4. Follow-up visit in 48 hours.',
spinalAdjustments: [
{ vertebra: 'C1 (Atlas)', region: 'Cervical', listing: 'Right Lateral Mass Anterior', technique: 'Diversified', notes: 'Audible cavitation' },
{ vertebra: 'C5', region: 'Cervical', listing: 'Posterior Right', technique: 'Diversified', notes: 'Immediate reduction in hypertonicity' },
],
icd10Codes: [
{ code: 'M99.01', description: 'Segmental and somatic dysfunction of cervical region' },
{ code: 'M54.2', description: 'Cervicalgia / Neck Pain' },
],
cptCodes: [
{ code: '98940', description: 'CMT Spinal, 1-2 Regions (Cervical)', fee: 55 },
{ code: '97140', description: 'Manual Therapy Techniques (15 min)', fee: 45 },
],
};
setActiveSoapNote(newNote);
setPendingIntakes((prev) => prev.filter((i) => i.id !== intake.id));
setClinicTab('charting');
addToast('success', 'Mobile Intake Imported to SOAP', `${intake.patientName}'s pain map and history loaded.`);
};
const handleAddTenant = (newTenant: ClinicTenant) => {
setTenants((prev) => [...prev, newTenant]);
addToast('success', 'New Clinic Deployed', `${newTenant.name} onboarded to Mediusa OS`);
@@ -863,6 +972,59 @@ export default function Home() {
{/* Main Container */}
<main className="flex-1 max-w-7xl w-full mx-auto p-4 sm:p-6 lg:p-8">
{/* Clinic Executive Collections & Billing Pulse Bar */}
{portalMode === 'clinic' && (
<div className="mb-5 grid grid-cols-2 sm:grid-cols-4 gap-3">
<div className="bg-white border border-slate-200/90 rounded-xl p-3.5 shadow-2xs flex items-center justify-between">
<div>
<span className="text-[11px] font-bold text-slate-500 uppercase tracking-wider block">
Today's Collections
</span>
<span className="text-base font-extrabold text-slate-900 font-mono tracking-tight">$2,380.00</span>
</div>
<span className="text-[10px] font-bold text-emerald-700 bg-emerald-50 px-2 py-0.5 rounded border border-emerald-200 font-mono">
+14.2% vs avg
</span>
</div>
<div className="bg-white border border-slate-200/90 rounded-xl p-3.5 shadow-2xs flex items-center justify-between">
<div>
<span className="text-[11px] font-bold text-slate-500 uppercase tracking-wider block">
Clean Claim Pass Rate
</span>
<span className="text-base font-extrabold text-emerald-700 font-mono tracking-tight">99.8%</span>
</div>
<span className="text-[10px] font-bold text-emerald-700 bg-emerald-50 px-2 py-0.5 rounded border border-emerald-200 font-mono">
0 NCCI Denials
</span>
</div>
<div className="bg-white border border-slate-200/90 rounded-xl p-3.5 shadow-2xs flex items-center justify-between">
<div>
<span className="text-[11px] font-bold text-slate-500 uppercase tracking-wider block">
Average Days in A/R
</span>
<span className="text-base font-extrabold text-sky-800 font-mono tracking-tight">11.4 Days</span>
</div>
<span className="text-[10px] font-bold text-sky-700 bg-sky-50 px-2 py-0.5 rounded border border-sky-200 font-mono">
3x Industry Speed
</span>
</div>
<div className="bg-white border border-slate-200/90 rounded-xl p-3.5 shadow-2xs flex items-center justify-between">
<div>
<span className="text-[11px] font-bold text-slate-500 uppercase tracking-wider block">
Frontier AI Engine
</span>
<span className="text-base font-extrabold text-indigo-700 font-mono tracking-tight">GPT-5.4 • Claude 3.7</span>
</div>
<span className="text-[10px] font-bold text-indigo-700 bg-indigo-50 px-2 py-0.5 rounded border border-indigo-200 font-mono">
Active Scribe
</span>
</div>
</div>
)}
{portalMode === 'clinic' && (() => {
const tenantPatients = patients.filter((p) => !p.tenantId || p.tenantId === activeTenant.id);
const tenantSuperbills = superbills.filter((s) => !s.tenantId || s.tenantId === activeTenant.id);
@@ -876,11 +1038,13 @@ export default function Home() {
activeTenant={activeTenant}
patients={tenantPatients}
waitlistCount={waitlist.length}
pendingIntakes={pendingIntakes}
onSelectAppointment={handleSelectAppointment}
onUpdateStatus={handleUpdateAppointmentStatus}
onNewAppointmentClick={() => setPortalMode('patient')}
onQuickSchedule={handleQuickScheduleAppointment}
onOpenWaitlist={() => setIsWaitlistOpen(true)}
onStartEncounterFromIntake={handleStartEncounterFromIntake}
/>
)}