@@ -61,7 +61,6 @@ import {
6161 getComposerDraftSnapshot ,
6262 updateComposerDraftSettings ,
6363 scheduleUnusedComposerAttachmentCleanup ,
64- waitForComposerDraftsLoaded ,
6564} from "../../state/use-composer-drafts" ;
6665import { useEnvironmentServerConfig , useProjects } from "../../state/entities" ;
6766import { useProjectClone } from "../../state/projectClones" ;
@@ -223,10 +222,6 @@ export function NewTaskDraftScreen(props: {
223222 }
224223 } ;
225224 const deleteProject = useAtomCommand ( projectEnvironment . delete , { reportFailure : false } ) ;
226- const selectedProjectRef = useRef ( selectedProject ) ;
227- useEffect ( ( ) => {
228- selectedProjectRef . current = selectedProject ;
229- } , [ selectedProject ] ) ;
230225 const removeClonedProject = async ( ) => {
231226 if ( ! selectedProject ) return ;
232227 const removed = selectedProject ;
@@ -242,8 +237,7 @@ export function NewTaskDraftScreen(props: {
242237 ) ;
243238 return ;
244239 }
245- const current = selectedProjectRef . current ;
246- if ( current ?. id === removed . id && current . environmentId === removed . environmentId ) {
240+ if ( flow . getSelectedProjectKey ( ) === scopedProjectKey ( removed . environmentId , removed . id ) ) {
247241 navigation . dispatch ( StackActions . replace ( "Home" ) ) ;
248242 }
249243 } ;
@@ -280,8 +274,12 @@ export function NewTaskDraftScreen(props: {
280274 project . id === props . initialProjectRef ?. projectId ,
281275 ) ,
282276 ) ;
277+ // A route naming a draft that is gone, or whose project is gone, also
278+ // returns to the picker.
279+ const isRouteDraftMissing =
280+ props . draftId !== undefined && flow . missingRouteDraftId === props . draftId ;
283281 const isProjectPickerReturnActive =
284- isReturningToProjectPicker && ! requestedInitialProjectAvailable ;
282+ ( isReturningToProjectPicker && ! requestedInitialProjectAvailable ) || isRouteDraftMissing ;
285283 const isIncomingShareAwaitingServerConfig = Boolean (
286284 incomingShare ?. attachments . some ( ( attachment ) => attachment . type === "file" ) &&
287285 selectedEnvironmentServerConfig === null ,
@@ -373,12 +371,11 @@ export function NewTaskDraftScreen(props: {
373371 isIncomingShareUnavailable ;
374372 const appliedInitialProjectKeyRef = useRef < string | null > ( null ) ;
375373 useEffect ( ( ) => {
376- if ( ! isReturningToProjectPicker ) {
377- return ;
378- }
379- if ( requestedInitialProjectAvailable ) {
374+ if ( isReturningToProjectPicker && requestedInitialProjectAvailable ) {
380375 // oxlint-disable-next-line react/set-state-in-effect -- Ends the return-to-picker flow once the requested project arrives from the catalog.
381376 setIsReturningToProjectPicker ( false ) ;
377+ }
378+ if ( ! isProjectPickerReturnActive ) {
382379 return ;
383380 }
384381 // Wait for usePreventRemove to disable before replacing, or the transfer guard swallows the fallback.
@@ -389,41 +386,12 @@ export function NewTaskDraftScreen(props: {
389386 } ) ;
390387 return ( ) => cancelAnimationFrame ( frame ) ;
391388 } , [
389+ isProjectPickerReturnActive ,
392390 isReturningToProjectPicker ,
393391 navigation ,
394392 props . incomingShareId ,
395393 requestedInitialProjectAvailable ,
396394 ] ) ;
397- const { openDraft } = flow ;
398- // Cold launches load drafts and projects separately; wait for hydration and retry while shells load.
399- const attemptedDraftIdRef = useRef < string | null > ( null ) ;
400- useEffect ( ( ) => {
401- if ( ! props . draftId ) {
402- return ;
403- }
404- const draftId = props . draftId ;
405- if ( attemptedDraftIdRef . current === draftId ) {
406- return ;
407- }
408- let cancelled = false ;
409- void waitForComposerDraftsLoaded ( ) . then ( ( ) => {
410- if ( cancelled || attemptedDraftIdRef . current === draftId ) {
411- return ;
412- }
413- if ( openDraft ( draftId ) ) {
414- attemptedDraftIdRef . current = draftId ;
415- return ;
416- }
417- if ( getComposerDraftSnapshot ( draftId ) . project !== undefined && projects . length === 0 ) {
418- return ;
419- }
420- attemptedDraftIdRef . current = draftId ;
421- navigation . dispatch ( CommonActions . navigate ( "NewTaskProject" ) ) ;
422- } ) ;
423- return ( ) => {
424- cancelled = true ;
425- } ;
426- } , [ navigation , openDraft , projects , props . draftId ] ) ;
427395
428396 const lastInitialProjectRefRef = useRef ( props . initialProjectRef ) ;
429397 const initialPickerRef = useRef < "open" | "dismissed" | null > ( null ) ;
0 commit comments