@@ -10,15 +10,16 @@ import type { LaunchedProject, LaunchedProjectId } from '$/providers/container'
1010import * as authProvider from '$/providers/react'
1111import {
1212 useAddLaunchedProject ,
13+ useAddOpeningProject ,
1314 useContainerData ,
1415 useRemoveLaunchedProject ,
16+ useRemoveOpeningProject ,
1517 useUpdateLaunchedProjects ,
1618} from '$/providers/react/container'
1719
1820import { useCanRunProjects } from '#/hooks/backendHooks'
1921import { useUploadFileMutation } from '#/hooks/backendUploadFilesHooks'
2022import { useToastAndLog } from '#/hooks/toastAndLogHooks'
21- import { useAddOpeningProject , useRemoveOpeningProject } from '#/providers/ProjectsProvider/hooks'
2223import type Backend from '#/services/Backend'
2324import * as backendModule from '#/services/Backend'
2425import { useBackends } from '$/providers/react'
@@ -206,7 +207,7 @@ createGetProjectDetailsQuery.getQueryKey = (id: LaunchedProjectId) => ['project'
206207
207208const OPEN_PROJECT_MUTATION_KEY = [ 'openProject' ] as const
208209
209- /** A mutation to open a project. */
210+ /** A mutation to open a project in backend . */
210211export function useOpenProjectMutation ( ) {
211212 const client = reactQuery . useQueryClient ( )
212213 const session = authProvider . useFullUserSession ( )
@@ -225,8 +226,9 @@ export function useOpenProjectMutation() {
225226 hybrid,
226227 inBackground = false ,
227228 suppressHybridProjectOpen : _ = false ,
229+ ensoPath,
228230 } : LaunchedProject & { inBackground ?: boolean ; suppressHybridProjectOpen ?: boolean } ) => {
229- addOpeningProject ( hybrid ?. cloudProjectId ?? id )
231+ addOpeningProject ( hybrid ?. cloudProjectId ?? id , ensoPath )
230232 const backend = type === backendModule . BackendType . remote ? remoteBackend : localBackend
231233
232234 invariant ( backend != null , 'Backend is null' )
@@ -460,7 +462,7 @@ function useOpenProject() {
460462 const queryKey = createGetProjectDetailsQuery . getQueryKey ( project . id )
461463 client . setQueryData ( queryKey , { state : { type : backendModule . ProjectState . openInProgress } } )
462464
463- addOpeningProject ( project . hybrid ?. cloudProjectId ?? project . id )
465+ addOpeningProject ( project . hybrid ?. cloudProjectId ?? project . id , project . ensoPath )
464466
465467 if ( ! enableMultitabs ) {
466468 // Since multiple tabs cannot be opened at the same time, the opened projects need to be closed first.
@@ -516,7 +518,7 @@ function useOpenHybridProject() {
516518
517519 try {
518520 invariant ( localBackend != null , 'Local Backend is null' )
519- addOpeningProject ( asset . id )
521+ addOpeningProject ( asset . id , asset . ensoPath )
520522 const projectSessionId = await remoteBackend . setHybridOpenInProgress ( asset . id , asset . title )
521523 const localProject = await remoteBackend . downloadProject ( asset . id )
522524 const cloudProjectDirectoryPath = backendModule . EnsoPath (
@@ -537,7 +539,6 @@ function useOpenHybridProject() {
537539 }
538540 }
539541
540- removeOpeningProject ( asset . id )
541542 invariant ( project , 'Downloaded cloud project does not exist in Local Backend.' )
542543 launchedProject = {
543544 id : project . id ,
@@ -555,12 +556,13 @@ function useOpenHybridProject() {
555556 }
556557 await openProject ( launchedProject )
557558 } catch ( error ) {
558- removeOpeningProject ( asset . id )
559559 toastAndLog ( 'openProjectError' , error , asset . title )
560560 await Promise . allSettled ( [
561561 closeProject ( { ...asset , type : backendModule . BackendType . remote } ) ,
562562 ...( launchedProject ? [ closeProject ( launchedProject ) ] : [ ] ) ,
563563 ] )
564+ } finally {
565+ removeOpeningProject ( asset . id )
564566 }
565567 } ,
566568 )
@@ -667,6 +669,7 @@ export function useCloseAllProjects() {
667669 const closeProject = useCloseProject ( )
668670 const containerData = useContainerData ( )
669671 const removeLaunchedProject = useRemoveLaunchedProject ( )
672+ const removeOpeningProject = useRemoveOpeningProject ( )
670673 const { remoteBackend, localBackend } = useBackends ( )
671674 const ensureQueryData = useEnsureQueryData ( )
672675
@@ -675,21 +678,25 @@ export function useCloseAllProjects() {
675678
676679 await Promise . all (
677680 launchedProjects . map ( async ( project ) => {
678- const backend =
679- project . type === backendModule . BackendType . remote || project . hybrid != null ?
680- remoteBackend
681- : localBackend
682- invariant ( backend != null , 'Backend must not be async null' )
683- const projectDetails = await ensureQueryData (
684- createGetProjectDetailsQuery ( {
685- assetId : project . hybrid != null ? project . hybrid . cloudProjectId : project . id ,
686- backend,
687- } ) ,
688- )
689- if ( backendModule . IS_OPENING_OR_OPENED [ projectDetails . state . type ] ) {
690- await closeProject ( project )
681+ if ( project . state === 'launched' ) {
682+ const backend =
683+ project . type === backendModule . BackendType . remote || project . hybrid != null ?
684+ remoteBackend
685+ : localBackend
686+ invariant ( backend != null , 'Backend must not be async null' )
687+ const projectDetails = await ensureQueryData (
688+ createGetProjectDetailsQuery ( {
689+ assetId : project . hybrid != null ? project . hybrid . cloudProjectId : project . id ,
690+ backend,
691+ } ) ,
692+ )
693+ if ( backendModule . IS_OPENING_OR_OPENED [ projectDetails . state . type ] ) {
694+ await closeProject ( project )
695+ } else {
696+ removeLaunchedProject ( project . id )
697+ }
691698 } else {
692- removeLaunchedProject ( project . id )
699+ removeOpeningProject ( project . id )
693700 }
694701 } ) ,
695702 )
0 commit comments