Unified · Split
| @@ -338,12 +338,12 @@ describe("rightPanelStore", () => { · 337 unmodified lines | |||
| 338 | }); | 338 | }); |
| 339 | }); | 339 | }); |
| 340 | 340 | ||
| 341 | it("closing the final terminal pane removes its surface but keeps the panel open", () => { | 341 | it("closing the final terminal pane removes its surface and closes the panel", () => { |
| 342 | useRightPanelStore.getState().openTerminal(refA, "term-1"); | 342 | useRightPanelStore.getState().openTerminal(refA, "term-1"); |
| 343 | useRightPanelStore.getState().closeTerminal(refA, "terminal:term-1", "term-1"); | 343 | useRightPanelStore.getState().closeTerminal(refA, "terminal:term-1", "term-1"); |
| 344 | 344 | ||
| 345 | expect(selectThreadRightPanelState(useRightPanelStore.getState().byThreadKey, refA)).toEqual({ | 345 | expect(selectThreadRightPanelState(useRightPanelStore.getState().byThreadKey, refA)).toEqual({ |
| 346 | isOpen: true, | 346 | isOpen: false, |
| 347 | activeSurfaceId: null, | 347 | activeSurfaceId: null, |
| 348 | surfaces: [], | 348 | surfaces: [], |
| 349 | }); | 349 | }); |
| @@ -359,12 +359,12 @@ describe("rightPanelStore", () => { · 9 unmodified lines | |||
| 359 | ); | 359 | ); |
| 360 | }); | 360 | }); |
| 361 | 361 | ||
| 362 | it("closing the final surface leaves the panel open and empty", () => { | 362 | it("closing the final surface closes the panel", () => { |
| 363 | useRightPanelStore.getState().openTerminal(refA, "term-1"); | 363 | useRightPanelStore.getState().openTerminal(refA, "term-1"); |
| 364 | useRightPanelStore.getState().closeSurface(refA, "terminal:term-1"); | 364 | useRightPanelStore.getState().closeSurface(refA, "terminal:term-1"); |
| 365 | 365 | ||
| 366 | expect(selectThreadRightPanelState(useRightPanelStore.getState().byThreadKey, refA)).toEqual({ | 366 | expect(selectThreadRightPanelState(useRightPanelStore.getState().byThreadKey, refA)).toEqual({ |
| 367 | isOpen: true, | 367 | isOpen: false, |
| 368 | activeSurfaceId: null, | 368 | activeSurfaceId: null, |
| 369 | surfaces: [], | 369 | surfaces: [], |
| 370 | }); | 370 | }); |
| @@ -406,14 +406,14 @@ describe("rightPanelStore", () => { · 35 unmodified lines | |||
| 406 | }); | 406 | }); |
| 407 | }); | 407 | }); |
| 408 | 408 | ||
| 409 | it("closing all surfaces leaves the panel open and empty", () => { | 409 | it("closing all surfaces closes the panel", () => { |
| 410 | useRightPanelStore.getState().openBrowser(refA, "tab-a"); | 410 | useRightPanelStore.getState().openBrowser(refA, "tab-a"); |
| 411 | useRightPanelStore.getState().openFile(refA, "src/index.ts"); | 411 | useRightPanelStore.getState().openFile(refA, "src/index.ts"); |
| 412 | 412 | ||
| 413 | useRightPanelStore.getState().closeAllSurfaces(refA); | 413 | useRightPanelStore.getState().closeAllSurfaces(refA); |
| 414 | 414 | ||
| 415 | expect(selectThreadRightPanelState(useRightPanelStore.getState().byThreadKey, refA)).toEqual({ | 415 | expect(selectThreadRightPanelState(useRightPanelStore.getState().byThreadKey, refA)).toEqual({ |
| 416 | isOpen: true, | 416 | isOpen: false, |
| 417 | activeSurfaceId: null, | 417 | activeSurfaceId: null, |
| 418 | surfaces: [], | 418 | surfaces: [], |
| 419 | }); | 419 | }); |
| @@ -340,6 +340,7 @@ export const useRightPanelStore = create<RightPanelStoreState>()( · 339 unmodified lines | |||
| 340 | const fallback = surfaces[Math.min(index, surfaces.length - 1)] ?? null; | 340 | const fallback = surfaces[Math.min(index, surfaces.length - 1)] ?? null; |
| 341 | return { | 341 | return { |
| 342 | ...current, | 342 | ...current, |
| 343 | isOpen: surfaces.length > 0 && current.isOpen, | ||
| 343 | surfaces, | 344 | surfaces, |
| 344 | activeSurfaceId: | 345 | activeSurfaceId: |
| 345 | current.activeSurfaceId === surfaceId | 346 | current.activeSurfaceId === surfaceId |
| @@ -378,9 +379,16 @@ export const useRightPanelStore = create<RightPanelStoreState>()( · 32 unmodified lines | |||
| 378 | const index = current.surfaces.findIndex((surface) => surface.id === surfaceId); | 379 | const index = current.surfaces.findIndex((surface) => surface.id === surfaceId); |
| 379 | if (index < 0) return current; | 380 | if (index < 0) return current; |
| 380 | const surfaces = current.surfaces.filter((surface) => surface.id !== surfaceId); | 381 | const surfaces = current.surfaces.filter((surface) => surface.id !== surfaceId); |
| 381 | if (current.activeSurfaceId !== surfaceId) return { ...current, surfaces }; | 382 | if (current.activeSurfaceId !== surfaceId) { |
| 383 | return { ...current, isOpen: surfaces.length > 0 && current.isOpen, surfaces }; | ||
| 384 | } | ||
| 382 | const fallback = surfaces[Math.min(index, surfaces.length - 1)] ?? null; | 385 | const fallback = surfaces[Math.min(index, surfaces.length - 1)] ?? null; |
| 383 | return { ...current, surfaces, activeSurfaceId: fallback?.id ?? null }; | 386 | return { |
| 387 | ...current, | ||
| 388 | isOpen: surfaces.length > 0 && current.isOpen, | ||
| 389 | surfaces, | ||
| 390 | activeSurfaceId: fallback?.id ?? null, | ||
| 391 | }; | ||
| 384 | }), | 392 | }), |
| 385 | })), | 393 | })), |
| 386 | closeOtherSurfaces: (ref, surfaceId) => | 394 | closeOtherSurfaces: (ref, surfaceId) => |
| @@ -417,7 +425,7 @@ export const useRightPanelStore = create<RightPanelStoreState>()( · 30 unmodified lines | |||
| 417 | byThreadKey: updateThread(state.byThreadKey, scopedThreadKey(ref), (current) => | 425 | byThreadKey: updateThread(state.byThreadKey, scopedThreadKey(ref), (current) => |
| 418 | current.surfaces.length === 0 | 426 | current.surfaces.length === 0 |
| 419 | ? current | 427 | ? current |
| 420 | : { ...current, isOpen: true, surfaces: [], activeSurfaceId: null }, | 428 | : { ...current, isOpen: false, surfaces: [], activeSurfaceId: null }, |
| 421 | ), | 429 | ), |
| 422 | })), | 430 | })), |
| 423 | reconcileBrowserSurfaces: (ref, tabIds) => | 431 | reconcileBrowserSurfaces: (ref, tabIds) => |