@@ -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'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
478502export 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