diff --git a/packages/app/src/web/actions-projects.ts b/packages/app/src/web/actions-projects.ts index c69bd0f9..ef07025d 100644 --- a/packages/app/src/web/actions-projects.ts +++ b/packages/app/src/web/actions-projects.ts @@ -254,10 +254,19 @@ export const connectProjectById = ( }) } +const applyProjectConfirmMessage = (label: string): string => + `Apply docker-git config to ${label}? This restarts the container and ends active SSH sessions and in-container browsers.` + export const applyProjectById = ( projectId: string, context: BrowserActionContext ) => { + const label = context.selectedProjectId === projectId + ? projectActionLabel(context) + : projectId + if (!confirmAction(applyProjectConfirmMessage(label))) { + return + } context.setSelectedProjectId(projectId) withBusy({ context, diff --git a/packages/app/tests/docker-git/actions-projects.test.ts b/packages/app/tests/docker-git/actions-projects.test.ts index 5511c5e4..9f37aa5b 100644 --- a/packages/app/tests/docker-git/actions-projects.test.ts +++ b/packages/app/tests/docker-git/actions-projects.test.ts @@ -240,8 +240,13 @@ describe("web project actions", () => { it.effect("applies a selected project through the project apply endpoint", () => Effect.gen(function*(_) { + const confirmMock = vi.fn(() => true) + vi.stubGlobal("confirm", confirmMock) applyProjectMock.mockImplementation(() => Effect.succeed(project)) - const { context, reloadDashboard, setMessage } = makeBrowserActionContext() + const { context, reloadDashboard, setMessage } = makeBrowserActionContext({ + selectedProjectId: "project-1", + selectedProjectName: "octocat/hello-world" + }) applyProjectById("project-1", context) @@ -249,12 +254,36 @@ describe("web project actions", () => { expect(applyProjectMock).toHaveBeenCalledWith("project-1") })) + expect(confirmMock).toHaveBeenCalledWith( + "Apply docker-git config to octocat/hello-world? " + + "This restarts the container and ends active SSH sessions and in-container browsers." + ) expect(context.setSelectedProjectId).toHaveBeenCalledWith("project-1") expect(context.setSelectedProject).toHaveBeenCalledWith(project) expect(reloadDashboard).toHaveBeenCalledTimes(1) expect(setMessage).toHaveBeenLastCalledWith("Applied octocat/hello-world.") })) + it("does not apply a project when the user declines confirmation", () => { + const confirmMock = vi.fn(() => false) + vi.stubGlobal("confirm", confirmMock) + applyProjectMock.mockImplementation(() => Effect.succeed(project)) + const { context, reloadDashboard } = makeBrowserActionContext({ + selectedProjectId: "project-1", + selectedProjectName: "octocat/hello-world" + }) + + applyProjectById("project-1", context) + + expect(confirmMock).toHaveBeenCalledWith( + "Apply docker-git config to octocat/hello-world? " + + "This restarts the container and ends active SSH sessions and in-container browsers." + ) + expect(applyProjectMock).not.toHaveBeenCalled() + expect(context.setSelectedProjectId).not.toHaveBeenCalled() + expect(reloadDashboard).not.toHaveBeenCalled() + }) + it.effect("confirms and applies all projects", () => Effect.gen(function*(_) { const confirmMock = vi.fn(() => true)