Skip to content

Commit 5ffb6a7

Browse files
committed
better unsupported browser
1 parent bd1468b commit 5ffb6a7

File tree

3 files changed

+59
-40
lines changed

3 files changed

+59
-40
lines changed

deploy-preview.sh

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/bin/bash
2+
set -e
3+
4+
BRANCH="${1:-$(git branch --show-current)}"
5+
6+
bun run build
7+
bunx wrangler pages deploy dist --project-name=connect --branch="$BRANCH"
8+
9+
echo ""
10+
echo "Preview URL: https://${BRANCH}.connect-d5y.pages.dev"

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
77
<meta
88
name="description"
9-
content="Update your comma device to the latest software"
9+
content="Restore your comma device to a fresh factory state"
1010
/>
1111
<title>flash.comma.ai</title>
1212
</head>

src/app/Flash.jsx

Lines changed: 48 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,16 @@ const errors = {
9797
icon: exclamation,
9898
},
9999
[ErrorCode.REQUIREMENTS_NOT_MET]: {
100-
status: 'Requirements not met',
101-
description: 'Your system does not meet the requirements to flash your device. Make sure to use a browser which ' +
102-
'supports WebUSB and is up to date.',
100+
status: 'Unsupported Browser',
101+
description: (
102+
<>
103+
This browser doesn&apos;t support WebUSB. Please use a compatible browser like{' '}
104+
<a href="https://www.google.com/chrome/" target="_blank" rel="noopener noreferrer" className="text-blue-500 hover:underline font-semibold">
105+
Google Chrome
106+
</a>.
107+
</>
108+
),
109+
hideRetry: true,
103110
},
104111
[ErrorCode.STORAGE_SPACE]: {
105112
description: 'Your system does not have enough space available to download AGNOS. Your browser may be restricting' +
@@ -472,8 +479,25 @@ function DevicePicker({ onSelect }) {
472479
)
473480
}
474481

475-
// Fixed wizard steps - always show the same steps regardless of platform/device
476-
const WIZARD_STEPS = ['Device', 'Setup', 'Flash']
482+
// Build wizard steps dynamically based on platform and device
483+
function getWizardSteps(selectedDevice) {
484+
const steps = ['Device']
485+
if (isWindows) steps.push('Driver')
486+
steps.push('Connect')
487+
if (isLinux && selectedDevice === DeviceType.COMMA_3) steps.push('Unbind')
488+
steps.push('Flash')
489+
return steps
490+
}
491+
492+
// Map screen names to step names
493+
const screenToStep = {
494+
device: 'Device',
495+
zadig: 'Driver',
496+
connect: 'Connect',
497+
unbind: 'Unbind',
498+
webusb: 'Flash',
499+
flash: 'Flash',
500+
}
477501

478502
export default function Flash() {
479503
const [step, setStep] = useState(StepCode.INITIALIZING)
@@ -483,15 +507,14 @@ export default function Flash() {
483507
const [connected, setConnected] = useState(false)
484508
const [serial, setSerial] = useState(null)
485509
const [selectedDevice, setSelectedDevice] = useState(null)
486-
const [wizardStep, setWizardStep] = useState(-1) // -1 = landing
487-
const [wizardScreen, setWizardScreen] = useState('landing') // 'landing', 'device', 'zadig', 'connect', 'unbind', 'flash'
510+
const [wizardScreen, setWizardScreen] = useState('landing') // 'landing', 'device', 'zadig', 'connect', 'unbind', 'webusb', 'flash'
488511

489512
const qdlManager = useRef(null)
490513
const imageManager = useImageManager()
491514

492-
// Determine which optional setup screens are needed
493-
const needsZadig = isWindows
494-
const needsUnbind = isLinux && selectedDevice === DeviceType.COMMA_3
515+
// Build steps based on current platform and selected device
516+
const wizardSteps = getWizardSteps(selectedDevice)
517+
const wizardStep = screenToStep[wizardScreen] ? wizardSteps.indexOf(screenToStep[wizardScreen]) : -1
495518

496519
useEffect(() => {
497520
if (!imageManager.current) return
@@ -525,22 +548,15 @@ export default function Flash() {
525548
}
526549
}, [connected, wizardScreen])
527550

528-
// Wizard step indices (fixed)
529-
const STEP_DEVICE = 0
530-
const STEP_SETUP = 1
531-
const STEP_FLASH = 2
532-
533551
// Handle user clicking start on landing page
534552
const handleStart = () => {
535553
setStep(StepCode.DEVICE_PICKER)
536554
setWizardScreen('device')
537-
setWizardStep(STEP_DEVICE)
538555
}
539556

540557
// Handle device selection
541558
const handleDeviceSelect = (deviceType) => {
542559
setSelectedDevice(deviceType)
543-
setWizardStep(STEP_SETUP)
544560
if (isWindows) {
545561
setWizardScreen('zadig')
546562
} else {
@@ -559,17 +575,13 @@ export default function Flash() {
559575
if (isLinux && selectedDevice === DeviceType.COMMA_3) {
560576
setWizardScreen('unbind')
561577
} else {
562-
// Go to WebUSB connection screen
563578
setWizardScreen('webusb')
564-
setWizardStep(STEP_FLASH)
565579
}
566580
}
567581

568582
// Handle linux unbind done
569583
const handleUnbindDone = () => {
570-
// Go to WebUSB connection screen
571584
setWizardScreen('webusb')
572-
setWizardStep(STEP_FLASH)
573585
}
574586

575587
// Handle WebUSB connect button
@@ -579,20 +591,17 @@ export default function Flash() {
579591

580592
// Handle going back in wizard
581593
const handleWizardBack = (toStep) => {
582-
const stepName = WIZARD_STEPS[toStep]
594+
const stepName = wizardSteps[toStep]
583595
if (stepName === 'Device') {
584596
setStep(StepCode.DEVICE_PICKER)
585597
setWizardScreen('device')
586-
setWizardStep(STEP_DEVICE)
587598
setSelectedDevice(null)
588-
} else if (stepName === 'Setup') {
589-
// Go back to the appropriate setup screen based on platform
590-
setWizardStep(STEP_SETUP)
591-
if (isWindows) {
592-
setWizardScreen('zadig')
593-
} else {
594-
setWizardScreen('connect')
595-
}
599+
} else if (stepName === 'Driver') {
600+
setWizardScreen('zadig')
601+
} else if (stepName === 'Connect') {
602+
setWizardScreen('connect')
603+
} else if (stepName === 'Unbind') {
604+
setWizardScreen('unbind')
596605
}
597606
}
598607

@@ -613,7 +622,7 @@ export default function Flash() {
613622
if (wizardScreen === 'device' && !error) {
614623
return (
615624
<div className="relative h-full">
616-
<Stepper steps={WIZARD_STEPS} currentStep={wizardStep} onStepClick={handleWizardBack} />
625+
<Stepper steps={wizardSteps} currentStep={wizardStep} onStepClick={handleWizardBack} />
617626
<DevicePicker onSelect={handleDeviceSelect} />
618627
</div>
619628
)
@@ -623,7 +632,7 @@ export default function Flash() {
623632
if (wizardScreen === 'zadig' && !error) {
624633
return (
625634
<div className="relative h-full">
626-
<Stepper steps={WIZARD_STEPS} currentStep={wizardStep} onStepClick={handleWizardBack} />
635+
<Stepper steps={wizardSteps} currentStep={wizardStep} onStepClick={handleWizardBack} />
627636
<WindowsZadig deviceType={selectedDevice} onNext={handleZadigDone} />
628637
</div>
629638
)
@@ -633,7 +642,7 @@ export default function Flash() {
633642
if (wizardScreen === 'connect' && !error) {
634643
return (
635644
<div className="relative h-full">
636-
<Stepper steps={WIZARD_STEPS} currentStep={wizardStep} onStepClick={handleWizardBack} />
645+
<Stepper steps={wizardSteps} currentStep={wizardStep} onStepClick={handleWizardBack} />
637646
<ConnectInstructions deviceType={selectedDevice} onNext={handleConnectNext} />
638647
</div>
639648
)
@@ -643,7 +652,7 @@ export default function Flash() {
643652
if (wizardScreen === 'unbind' && !error) {
644653
return (
645654
<div className="relative h-full">
646-
<Stepper steps={WIZARD_STEPS} currentStep={wizardStep} onStepClick={handleWizardBack} />
655+
<Stepper steps={wizardSteps} currentStep={wizardStep} onStepClick={handleWizardBack} />
647656
<LinuxUnbind onNext={handleUnbindDone} />
648657
</div>
649658
)
@@ -653,7 +662,7 @@ export default function Flash() {
653662
if (wizardScreen === 'webusb' && !error) {
654663
return (
655664
<div className="relative h-full">
656-
<Stepper steps={WIZARD_STEPS} currentStep={wizardStep} onStepClick={handleWizardBack} />
665+
<Stepper steps={wizardSteps} currentStep={wizardStep} onStepClick={handleWizardBack} />
657666
<WebUSBConnect onConnect={handleWebUSBConnect} />
658667
</div>
659668
)
@@ -663,7 +672,7 @@ export default function Flash() {
663672
if (error) {
664673
Object.assign(uiState, errors[ErrorCode.UNKNOWN], errors[error])
665674
}
666-
let { status, description, bgColor = 'bg-gray-400', icon = bolt, iconStyle = 'invert' } = uiState
675+
let { status, description, bgColor = 'bg-gray-400', icon = bolt, iconStyle = 'invert', hideRetry = false } = uiState
667676

668677
// Add qcserial hint for Linux + comma 3/3X only
669678
if (error === ErrorCode.LOST_CONNECTION && isLinux && selectedDevice === DeviceType.COMMA_3) {
@@ -696,7 +705,7 @@ export default function Flash() {
696705
<div id="flash" className="wizard-screen relative flex flex-col gap-8 justify-center items-center h-full">
697706
{wizardStep >= 0 && (
698707
<Stepper
699-
steps={WIZARD_STEPS}
708+
steps={wizardSteps}
700709
currentStep={wizardStep}
701710
onStepClick={canGoBack ? handleWizardBack : () => {}}
702711
/>
@@ -715,7 +724,7 @@ export default function Flash() {
715724
</div>
716725
<span className="text-3xl dark:text-white font-mono font-light">{title}</span>
717726
<span className="text-xl dark:text-white px-8 max-w-xl text-center">{description}</span>
718-
{error !== ErrorCode.NONE && (
727+
{error !== ErrorCode.NONE && !hideRetry && (
719728
<button
720729
className="px-4 py-2 rounded-md bg-gray-200 hover:bg-gray-300 dark:bg-gray-700 dark:hover:bg-gray-600 text-gray-800 dark:text-gray-200 transition-colors"
721730
onClick={handleRetry}

0 commit comments

Comments
 (0)