@@ -81,10 +81,12 @@ import {
8181 resumeMobileEffectivePathsGrant ,
8282} from '../effectivePaths/effectivePathsMobileGrantFlow'
8383import {
84+ beginEpMobileResumeRun ,
85+ claimEpMobileResume ,
8486 consumeEpMobilePickerError ,
85- peekEpMobileResume ,
87+ finishEpMobileResumeRun ,
8688} from '../effectivePaths/effectivePathsMobileGrantSession'
87- import { mobilePickerRedirectPreferred , redirectToMobilePickerAuth } from '../effectivePaths/googleDrivePickerMobile'
89+ import { mobilePickerRedirectPreferred } from '../effectivePaths/googleDrivePickerMobile'
8890import {
8991 getCachedGoogleSheetsAccessToken ,
9092 googleSheetsOAuthConfigured ,
@@ -248,7 +250,6 @@ export function EffectivePathsSyncDialog({
248250 const [ workbookAccess , setWorkbookAccess ] = useState < LinkedWorkbookAccess [ ] | null > ( null )
249251 const [ loadingSheets , setLoadingSheets ] = useState ( false )
250252 const [ pickerUiHidden , setPickerUiHidden ] = useState ( false )
251- const mobileResumeStartedRef = useRef ( false )
252253 const [ loadProgress , setLoadProgress ] = useState < EffectivePathsLoadProgress | null > ( null )
253254 const [ syncProgress , setSyncProgress ] = useState < {
254255 direction : 'import' | 'export'
@@ -632,44 +633,27 @@ export function EffectivePathsSyncDialog({
632633 const deniedIds = collectDeniedLinkedSpreadsheetIds ( result . workbookAccess )
633634 if ( deniedIds . length > 0 ) {
634635 const linkedNames = linkedWorkbookNamesFromGateway ( result )
635- if ( mobilePickerRedirectPreferred ( ) ) {
636- await redirectToMobilePickerAuth ( {
637- phase : 'linked_workbooks' ,
638- masterSpreadsheetId : parsedMaster . spreadsheetId ,
639- masterSheetGid : parsedMaster . sheetGid ,
640- spreadsheetIds : collectSpreadsheetIdsFromGateway ( result , parsedMaster . spreadsheetId ) ,
641- multiselect : true ,
642- requireMasterSpreadsheetId : parsedMaster . spreadsheetId ,
643- titles : {
644- ...pickerTitles ,
645- linkedWorkbooks :
636+ if ( ! mobilePickerRedirectPreferred ( ) ) {
637+ const retryGrant = await grantEffectivePathsSpreadsheetsAccess (
638+ token ,
639+ collectSpreadsheetIdsFromGateway ( result , parsedMaster . spreadsheetId ) ,
640+ {
641+ title :
646642 linkedNames . length > 0
647643 ? `${ t ( 'ep_picker_linked_workbooks_title' ) } (${ linkedNames . join ( ', ' ) } )`
648644 : t ( 'ep_picker_linked_workbooks_title' ) ,
645+ multiselect : true ,
646+ requireMasterSpreadsheetId : parsedMaster . spreadsheetId ,
647+ onPickerUiActive : setPickerUiHidden ,
649648 } ,
650- } )
651- return
652- }
653-
654- const retryGrant = await grantEffectivePathsSpreadsheetsAccess (
655- token ,
656- collectSpreadsheetIdsFromGateway ( result , parsedMaster . spreadsheetId ) ,
657- {
658- title :
659- linkedNames . length > 0
660- ? `${ t ( 'ep_picker_linked_workbooks_title' ) } (${ linkedNames . join ( ', ' ) } )`
661- : t ( 'ep_picker_linked_workbooks_title' ) ,
662- multiselect : true ,
663- requireMasterSpreadsheetId : parsedMaster . spreadsheetId ,
664- onPickerUiActive : setPickerUiHidden ,
665- } ,
666- )
667- if ( ! retryGrant . ok ) {
668- reportMobilePickerError ( retryGrant . reason )
669- } else {
670- result = await listWorkbooks ( )
671- if ( result . ok ) {
672- cacheLinkedSpreadsheetIdsFromGateway ( parsedMaster . spreadsheetId , result )
649+ )
650+ if ( ! retryGrant . ok ) {
651+ reportMobilePickerError ( retryGrant . reason )
652+ } else {
653+ result = await listWorkbooks ( )
654+ if ( result . ok ) {
655+ cacheLinkedSpreadsheetIdsFromGateway ( parsedMaster . spreadsheetId , result )
656+ }
673657 }
674658 }
675659 }
@@ -730,23 +714,25 @@ export function EffectivePathsSyncDialog({
730714 )
731715 }
732716 } ,
733- [ formatExportError , parsedMaster , pickerTitles , reportMobilePickerError , showNotice , t ] ,
717+ [ formatExportError , parsedMaster , reportMobilePickerError , showNotice , t ] ,
734718 )
735719
736720 useEffect ( ( ) => {
737- if ( ! open || mobileResumeStartedRef . current ) return
721+ if ( ! open ) return
738722
739723 const mobileError = consumeEpMobilePickerError ( )
740724 if ( mobileError ) {
741725 queueMicrotask ( ( ) => reportMobilePickerError ( mobileError ) )
742726 return
743727 }
744728
745- if ( ! peekEpMobileResume ( ) ) return
746- mobileResumeStartedRef . current = true
729+ const resume = claimEpMobileResume ( )
730+ if ( ! resume ) return
731+ if ( ! beginEpMobileResumeRun ( ) ) return
747732
748733 void ( async ( ) => {
749734 setLoadingSheets ( true )
735+ setPickerUiHidden ( false )
750736 resetEffectivePathsWorkbookLoadState ( {
751737 setWorkbooks,
752738 setIdsTabTitle,
@@ -773,11 +759,11 @@ export function EffectivePathsSyncDialog({
773759 setLoadProgress ( null )
774760 setNotice ( null )
775761 try {
776- const accessResult = await resumeMobileEffectivePathsGrant ( )
762+ const accessResult = await resumeMobileEffectivePathsGrant ( resume )
777763 if ( ! accessResult . ok ) {
778764 if ( accessResult . reason === 'gateway_failed' ) {
779765 showNotice ( formatExportError ( accessResult . error , accessResult . message ) , 'error' )
780- } else if ( accessResult . reason !== 'mobile_resume_missing' ) {
766+ } else {
781767 reportMobilePickerError ( accessResult . reason )
782768 }
783769 return
@@ -796,16 +782,12 @@ export function EffectivePathsSyncDialog({
796782 } finally {
797783 setLoadingSheets ( false )
798784 setLoadProgress ( null )
785+ setPickerUiHidden ( false )
786+ finishEpMobileResumeRun ( true )
799787 }
800788 } ) ( )
801789 } , [ formatExportError , loadLinkedWorkbooks , open , reportMobilePickerError , showNotice , t ] )
802790
803- useEffect ( ( ) => {
804- if ( ! open ) {
805- mobileResumeStartedRef . current = false
806- }
807- } , [ open ] )
808-
809791 const handleLoadSheets = useCallback ( async ( ) => {
810792 if ( ! parsedMaster ) {
811793 showNotice (
0 commit comments