Skip to content

Commit 56cd34f

Browse files
committed
fix(app): align create display step mapping
1 parent 0df0526 commit 56cd34f

3 files changed

Lines changed: 51 additions & 9 deletions

File tree

packages/app/src/docker-git/menu-create-shared.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,16 @@ export const createInitialFlowView = (buffer = ""): CreateModeFlowView => ({
634634
values: {}
635635
})
636636

637+
const resolveDisplayFlowStep = (view: CreateFlowView): number => {
638+
const displaySteps = resolveCreateDisplaySteps()
639+
if (isDisplayModeFlowView(view)) {
640+
return clampCreateSettingsStep(view.step, displaySteps.length - 1)
641+
}
642+
const flowStep = resolveCreateFlowSteps(view.values)[view.step]
643+
const displayStep = flowStep === undefined ? -1 : displaySteps.indexOf(flowStep)
644+
return clampCreateSettingsStep(displayStep === -1 ? view.step : displayStep, displaySteps.length - 1)
645+
}
646+
637647
/**
638648
* Converts a parsed repo Create snapshot into browser display-settings mode.
639649
*
@@ -646,7 +656,7 @@ export const createInitialFlowView = (buffer = ""): CreateModeFlowView => ({
646656
*/
647657
export const createDisplayFlowView = (view: CreateFlowView): DisplayModeFlowView => ({
648658
mode: "display",
649-
step: clampCreateSettingsStep(view.step, resolveCreateDisplaySteps().length - 1),
659+
step: resolveDisplayFlowStep(view),
650660
buffer: view.buffer,
651661
inputError: null,
652662
values: view.values

packages/app/tests/docker-git/create-flow-render.test.ts

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
type CreateFlowView,
99
createInitialFlowView,
1010
createSettingsHint,
11+
type CreateModeFlowView,
1112
type DisplayModeFlowView,
1213
renderCreateStepLabel,
1314
resolveCreateDisplaySteps,
@@ -20,6 +21,7 @@ import { UiProvider } from "../../src/ui/primitives.js"
2021
import { CreatePanel } from "../../src/web/panel-create-select.js"
2122
import {
2223
createFeatureRepoDisplaySettingsView,
24+
createFeatureRepoSettingsView,
2325
createFlowViewAtStep,
2426
featureCreateRepoUrl
2527
} from "./create-flow-test-helpers.js"
@@ -70,7 +72,9 @@ const createSettingsViewAtStep = (
7072
buffer: string
7173
): CreateFlowView => createFlowViewAtStep(createSettingsView(), stepName, buffer)
7274

73-
const renderTerminalCreate = (createView: CreateFlowView): string => {
75+
const createTerminalSettingsView = (): CreateModeFlowView => createFeatureRepoSettingsView(createContext)
76+
77+
const renderTerminalCreate = (createView: CreateModeFlowView): string => {
7478
const defaults = resolveCreateInputs(createContext, createView.values)
7579
const steps = resolveCreateFlowSteps(createView.values)
7680
const step = steps[createView.step] ?? "repoUrl"
@@ -208,7 +212,7 @@ describe("Create flow rendering", () => {
208212

209213
it("renders terminal Create hints with the same repo/settings split", () => {
210214
const repoHtml = renderTerminalCreate(createInitialFlowView(featureCreateRepoUrl))
211-
const settingsHtml = renderTerminalCreate(createSettingsView())
215+
const settingsHtml = renderTerminalCreate(createTerminalSettingsView())
212216

213217
expect(repoHtml).not.toContain("Enter = next, Esc = cancel.")
214218
expect(repoHtml).not.toContain("Shift+Enter")
@@ -218,27 +222,37 @@ describe("Create flow rendering", () => {
218222

219223
it("preserves hint visibility invariants for every Create step", () => {
220224
const settingsView = createSettingsView()
221-
const lastStep = resolveCreateFlowSteps(settingsView.values).length - 1
225+
const lastDisplayStep = resolveCreateDisplaySteps(settingsView.values).length - 1
222226

223227
fc.assert(
224-
fc.property(fc.integer({ min: 0, max: lastStep }), (step) => {
228+
fc.property(fc.integer({ min: 0, max: lastDisplayStep }), (step) => {
225229
const view = step === 0 ? createInitialFlowView(featureCreateRepoUrl) : { ...settingsView, step }
226230
const isSettings = step > 0
227231
const panelHtml = renderCreatePanel(view)
228232
const compactPanelHtml = renderCreatePanel(view, { compact: true })
229-
const terminalHtml = renderTerminalCreate(view)
230233

231234
expect(panelHtml.includes(createSettingsHint)).toBe(isSettings)
232235
expect(compactPanelHtml.includes(createSettingsHint)).toBe(isSettings)
233-
expect(terminalHtml.includes(createSettingsHint)).toBe(isSettings)
234236
expect(panelHtml.includes(webCreateSettingsChoiceHint)).toBe(isSettings)
235237
expect(compactPanelHtml.includes(webCreateSettingsChoiceHint)).toBe(isSettings)
236-
expect(terminalHtml).not.toContain(webCreateSettingsChoiceHint)
237238
expect(panelHtml).not.toContain("Enter = next, Esc = cancel.")
238239
expect(compactPanelHtml).not.toContain("Enter = next, Esc = cancel.")
239-
expect(terminalHtml).not.toContain("Enter = next, Esc = cancel.")
240240
expect(panelHtml).not.toContain("Shift+Enter")
241241
expect(compactPanelHtml).not.toContain("Shift+Enter")
242+
})
243+
)
244+
245+
const terminalSettingsView = createTerminalSettingsView()
246+
const lastTerminalStep = resolveCreateFlowSteps(terminalSettingsView.values).length - 1
247+
248+
fc.assert(
249+
fc.property(fc.integer({ min: 0, max: lastTerminalStep }), (step) => {
250+
const view = step === 0 ? createInitialFlowView(featureCreateRepoUrl) : { ...terminalSettingsView, step }
251+
const terminalHtml = renderTerminalCreate(view)
252+
253+
expect(terminalHtml.includes(createSettingsHint)).toBe(step > 0)
254+
expect(terminalHtml).not.toContain(webCreateSettingsChoiceHint)
255+
expect(terminalHtml).not.toContain("Enter = next, Esc = cancel.")
242256
expect(terminalHtml).not.toContain("Shift+Enter")
243257
})
244258
)

packages/app/tests/docker-git/menu-create-shared.test.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { describe, expect, it } from "vitest"
33

44
import {
55
advanceCreateFlow,
6+
createDisplayFlowView,
67
createInitialFlowView,
78
moveCreateSettingsStep,
89
resolveCreateDisplaySteps,
@@ -168,6 +169,23 @@ describe("menu-create-shared", () => {
168169
)
169170
})
170171

172+
it("maps create-mode steps to the matching display row when opening browser Settings", () => {
173+
const createView = {
174+
...createFeatureRepoSettingsView(cwd),
175+
step: 1,
176+
values: {
177+
...createFeatureRepoSettingsView(cwd).values,
178+
cpuLimit: "40%"
179+
}
180+
}
181+
const displayView = createDisplayFlowView(createView)
182+
183+
expect(resolveCreateFlowSteps(createView.values)[createView.step]).toBe("ramLimit")
184+
expect(resolveCreateDisplaySteps()[displayView.step]).toBe("ramLimit")
185+
expect(displayView.buffer).toBe(createView.buffer)
186+
expect(displayView.values).toEqual(createView.values)
187+
})
188+
171189
it("does not navigate settings from the repo URL step", () => {
172190
expect(moveCreateSettingsStep(createInitialFlowView("https://github.com/org/repo"), "down")).toBeNull()
173191
})

0 commit comments

Comments
 (0)