mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-08-22 02:07:13 +00:00
feat(wizard): add next-step navigation to jump back to deepest layer
Track maxReachedLayer so clicking Next from an earlier layer jumps directly to the deepest previously visited layer, preserving state. Reset tracking when the user changes their AI engine mode choice.
This commit is contained in:
@@ -109,6 +109,16 @@ export default function WizardPage() {
|
|||||||
const [modelsAdded, setModelsAdded] = useState(false);
|
const [modelsAdded, setModelsAdded] = useState(false);
|
||||||
// Sub-layer within Step 2: 0=main, 1=sub-choice, 2=provider, 3=scan, 4=config
|
// Sub-layer within Step 2: 0=main, 1=sub-choice, 2=provider, 3=scan, 4=config
|
||||||
const [step2Layer, setStep2Layer] = useState(0);
|
const [step2Layer, setStep2Layer] = useState(0);
|
||||||
|
const [maxReachedLayer, setMaxReachedLayer] = useState(0);
|
||||||
|
|
||||||
|
const goToStep2Layer = useCallback(
|
||||||
|
(layer: number) => {
|
||||||
|
setStep2Layer(layer);
|
||||||
|
setMaxReachedLayer((prev) => Math.max(prev, layer));
|
||||||
|
},
|
||||||
|
[],
|
||||||
|
);
|
||||||
|
|
||||||
// Saved provider form data for back navigation
|
// Saved provider form data for back navigation
|
||||||
const [savedProviderForm, setSavedProviderForm] = useState<{
|
const [savedProviderForm, setSavedProviderForm] = useState<{
|
||||||
name?: string;
|
name?: string;
|
||||||
@@ -301,7 +311,7 @@ export default function WizardPage() {
|
|||||||
const handleSelectRunner = useCallback(
|
const handleSelectRunner = useCallback(
|
||||||
(runner: string) => {
|
(runner: string) => {
|
||||||
setSelectedRunner(runner);
|
setSelectedRunner(runner);
|
||||||
setStep2Layer(4);
|
goToStep2Layer(4);
|
||||||
saveProgress({ step: 2, selected_runner: runner });
|
saveProgress({ step: 2, selected_runner: runner });
|
||||||
},
|
},
|
||||||
[saveProgress],
|
[saveProgress],
|
||||||
@@ -310,9 +320,17 @@ export default function WizardPage() {
|
|||||||
const handleAiEngineModeSelect = useCallback(
|
const handleAiEngineModeSelect = useCallback(
|
||||||
(mode: 'orchestrated' | 'llm') => {
|
(mode: 'orchestrated' | 'llm') => {
|
||||||
setAiEngineMode(mode);
|
setAiEngineMode(mode);
|
||||||
setStep2Layer(1);
|
setSelectedRunner(null);
|
||||||
|
setModelSource(null);
|
||||||
|
setProviderCreated(false);
|
||||||
|
setCreatedProviderUuid(null);
|
||||||
|
setModelsAdded(false);
|
||||||
|
setSavedProviderForm({});
|
||||||
|
setSavedSelectedModels(new Set());
|
||||||
|
setMaxReachedLayer(0);
|
||||||
|
goToStep2Layer(1);
|
||||||
},
|
},
|
||||||
[],
|
[goToStep2Layer],
|
||||||
);
|
);
|
||||||
|
|
||||||
// ---- Navigation helpers ----
|
// ---- Navigation helpers ----
|
||||||
@@ -349,12 +367,16 @@ export default function WizardPage() {
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
const goNext = useCallback(() => {
|
const goNext = useCallback(() => {
|
||||||
|
if (currentStep === 2 && step2Layer < maxReachedLayer) {
|
||||||
|
setStep2Layer(maxReachedLayer);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (currentStep < TOTAL_STEPS - 1 && canProceed()) {
|
if (currentStep < TOTAL_STEPS - 1 && canProceed()) {
|
||||||
const nextStep = currentStep + 1;
|
const nextStep = currentStep + 1;
|
||||||
setCurrentStep(nextStep);
|
setCurrentStep(nextStep);
|
||||||
saveProgress({ step: nextStep });
|
saveProgress({ step: nextStep });
|
||||||
}
|
}
|
||||||
}, [currentStep, canProceed, saveProgress]);
|
}, [currentStep, step2Layer, maxReachedLayer, canProceed, saveProgress]);
|
||||||
|
|
||||||
const goPrev = useCallback(() => {
|
const goPrev = useCallback(() => {
|
||||||
if (currentStep === 2 && step2Layer > 0) {
|
if (currentStep === 2 && step2Layer > 0) {
|
||||||
@@ -568,11 +590,11 @@ export default function WizardPage() {
|
|||||||
if (source === 'space') {
|
if (source === 'space') {
|
||||||
handleSpaceAuth();
|
handleSpaceAuth();
|
||||||
} else if (providerCreated && modelsAdded) {
|
} else if (providerCreated && modelsAdded) {
|
||||||
setStep2Layer(4);
|
goToStep2Layer(4);
|
||||||
} else if (providerCreated) {
|
} else if (providerCreated) {
|
||||||
setStep2Layer(3);
|
goToStep2Layer(3);
|
||||||
} else {
|
} else {
|
||||||
setStep2Layer(2);
|
goToStep2Layer(2);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[handleSpaceAuth, providerCreated, modelsAdded],
|
[handleSpaceAuth, providerCreated, modelsAdded],
|
||||||
@@ -750,12 +772,12 @@ export default function WizardPage() {
|
|||||||
onProviderCreated={(uuid) => {
|
onProviderCreated={(uuid) => {
|
||||||
setProviderCreated(true);
|
setProviderCreated(true);
|
||||||
setCreatedProviderUuid(uuid ?? null);
|
setCreatedProviderUuid(uuid ?? null);
|
||||||
setStep2Layer(3);
|
goToStep2Layer(3);
|
||||||
}}
|
}}
|
||||||
onModelsAdded={() => {
|
onModelsAdded={() => {
|
||||||
setModelsAdded(true);
|
setModelsAdded(true);
|
||||||
setSelectedRunner('local-agent');
|
setSelectedRunner('local-agent');
|
||||||
setStep2Layer(4);
|
goToStep2Layer(4);
|
||||||
saveProgress({ step: 2, selected_runner: 'local-agent' });
|
saveProgress({ step: 2, selected_runner: 'local-agent' });
|
||||||
}}
|
}}
|
||||||
onResetModelSource={() => setModelSource(null)}
|
onResetModelSource={() => setModelSource(null)}
|
||||||
|
|||||||
Reference in New Issue
Block a user