Add interactive routine wizard, slider controls, value persistence, and timer pause
All checks were successful
Deploy to VPS / deploy (push) Successful in 24s

- Interactive routine generation wizard with AI refinement loop (generate-draft,
  refine, save-draft endpoints + RoutineWizard modal component)
- Replace +/- stepper buttons with slider controls for reps/weight during workout
- Persist user-modified reps/weight across sets of the same exercise
- Add pause/resume by tapping timer dials, with back-button confirmation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Carlos Escalante
2026-03-20 22:29:06 -06:00
parent d7c1f8f677
commit 11e086166c
10 changed files with 613 additions and 130 deletions

View File

@@ -1,5 +1,5 @@
import client from './client';
import type { KettlebellSession, KettlebellSetLog } from '../types/kettlebell';
import type { KettlebellSession, KettlebellSetLog, DraftSession } from '../types/kettlebell';
export interface GenerateSessionRequest {
focus: string;
@@ -7,6 +7,18 @@ export interface GenerateSessionRequest {
available_weights: number[];
}
export interface RefineRequest {
draft: DraftSession;
feedback: string;
focus: string;
duration_minutes: number;
available_weights: number[];
}
export interface SaveDraftRequest {
draft: DraftSession;
}
export interface LogSetRequest {
exercise_order: number;
set_number: number;
@@ -49,3 +61,12 @@ export const abandonSession = (id: number) =>
export const deleteSession = (id: number) =>
client.delete(`/kettlebell/${id}`);
export const generateDraft = (data: GenerateSessionRequest) =>
client.post<DraftSession>('/kettlebell/generate-draft', data).then(r => r.data);
export const refineDraft = (data: RefineRequest) =>
client.post<DraftSession>('/kettlebell/refine', data).then(r => r.data);
export const saveDraft = (data: SaveDraftRequest) =>
client.post<KettlebellSession>('/kettlebell/save-draft', data).then(r => r.data);