| @@ -10,19 +10,23 @@ | ||
| 10 | 10 | // Persisting these would rehydrate a canvas the page can no longer show. |
| 11 | 11 | export const useCanvasStore = create((set) => ({ |
| 12 | 12 | steps: [], |
| 13 | 13 | activeStep: 0, |
| 14 | + // A step opens for good, so this is a high-water mark rather than a position. | |
| 15 | + reached: 0, | |
| 14 | 16 | values: {}, |
| 15 | - startSession: (steps) => set({ steps, activeStep: 0, values: seed(steps) }), | |
| 16 | - endSession: () => set({ steps: [], activeStep: 0, values: {} }), | |
| 17 | + startSession: (steps) => | |
| 18 | + set({ steps, activeStep: 0, reached: 0, values: seed(steps) }), | |
| 19 | + endSession: () => set({ steps: [], activeStep: 0, reached: 0, values: {} }), | |
| 17 | 20 | setValue: (name, value) => |
| 18 | 21 | set(({ values }) => ({ values: { ...values, [name]: value } })), |
| 19 | 22 | writeValues: (written) => |
| 20 | 23 | set(({ values }) => ({ values: { ...values, ...written } })), |
| 21 | 24 | goToStep: (index) => |
| 22 | - set(({ steps }) => ({ | |
| 23 | - activeStep: Math.min(Math.max(index, 0), steps.length - 1), | |
| 24 | - })), | |
| 25 | + set(({ steps, reached }) => { | |
| 26 | + const activeStep = Math.min(Math.max(index, 0), steps.length - 1); | |
| 27 | + return { activeStep, reached: Math.max(reached, activeStep) }; | |
| 28 | + }), | |
| 25 | 29 | })); |
| 26 | 30 | |
| 27 | 31 | // Sending every step lets the agent write where the user cannot see. |
| 28 | 32 | export const activeCanvasStep = () => { |