Synchronous Fields Reset for Set Logging, Tests fixed
Some checks are pending
Copilot Setup Steps / copilot-setup-steps (push) Waiting to run

This commit is contained in:
AG
2025-12-20 15:37:47 +02:00
parent af5c855c21
commit 77789d31ca
5 changed files with 47 additions and 27 deletions

View File

@@ -140,6 +140,8 @@ export const useTracker = (props: any) => { // Props ignored/removed
const updateSelection = async () => {
if (selectedExercise) {
setSearchQuery(selectedExercise.name);
// Reset form synchronously to clear previous exercise data immediately
form.resetForm();
await form.updateFormFromLastSet(selectedExercise.id, selectedExercise.type, selectedExercise.bodyWeightPercentage);
} else {
setSearchQuery('');

View File

@@ -41,22 +41,32 @@ export const useWorkoutForm = ({ userId, onSetAdded, onUpdateSet }: UseWorkoutFo
setBwPercentage(bodyWeightPercentage ? bodyWeightPercentage.toString() : '100');
const set = await getLastSetForExercise(userId, exerciseId);
// Use functional updates to only set values if the user hasn't typed anything yet (value is empty string)
if (set) {
setWeight(set.weight?.toString() || '');
setReps(set.reps?.toString() || '');
setDuration(set.durationSeconds?.toString() || '');
setDistance(set.distanceMeters?.toString() || '');
setHeight(set.height?.toString() || '');
} else {
resetForm();
setWeight(prev => prev === '' ? (set.weight?.toString() || '') : prev);
setReps(prev => prev === '' ? (set.reps?.toString() || '') : prev);
setDuration(prev => prev === '' ? (set.durationSeconds?.toString() || '') : prev);
setDistance(prev => prev === '' ? (set.distanceMeters?.toString() || '') : prev);
setHeight(prev => prev === '' ? (set.height?.toString() || '') : prev);
}
// Clear irrelevant fields
if (exerciseType !== ExerciseType.STRENGTH && exerciseType !== ExerciseType.BODYWEIGHT) setWeight('');
if (exerciseType !== ExerciseType.STRENGTH && exerciseType !== ExerciseType.BODYWEIGHT && exerciseType !== ExerciseType.PLYOMETRIC) setReps('');
if (exerciseType !== ExerciseType.CARDIO && exerciseType !== ExerciseType.STATIC) setDuration('');
if (exerciseType !== ExerciseType.CARDIO && exerciseType !== ExerciseType.LONG_JUMP) setDistance('');
if (exerciseType !== ExerciseType.HIGH_JUMP) setHeight('');
// Clear irrelevant fields based on exercise type - this is safe as it clears fields that shouldn't be there
if (exerciseType !== ExerciseType.STRENGTH && exerciseType !== ExerciseType.BODYWEIGHT) {
setWeight(prev => (set && set.weight?.toString() === prev) || prev === '' ? '' : prev);
}
if (exerciseType !== ExerciseType.STRENGTH && exerciseType !== ExerciseType.BODYWEIGHT && exerciseType !== ExerciseType.PLYOMETRIC) {
setReps(prev => (set && set.reps?.toString() === prev) || prev === '' ? '' : prev);
}
if (exerciseType !== ExerciseType.CARDIO && exerciseType !== ExerciseType.STATIC) {
setDuration(prev => (set && set.durationSeconds?.toString() === prev) || prev === '' ? '' : prev);
}
if (exerciseType !== ExerciseType.CARDIO && exerciseType !== ExerciseType.LONG_JUMP) {
setDistance(prev => (set && set.distanceMeters?.toString() === prev) || prev === '' ? '' : prev);
}
if (exerciseType !== ExerciseType.HIGH_JUMP) {
setHeight(prev => (set && set.height?.toString() === prev) || prev === '' ? '' : prev);
}
};
const prepareSetData = (selectedExercise: ExerciseDef, isSporadic: boolean = false) => {

View File

@@ -132,8 +132,8 @@ const translations = {
my_plans: 'My Plans',
no_plans_yet: 'No workout plans yet.',
ask_ai_to_create: 'Ask your AI coach to create one',
create_manually: 'Manually',
create_with_ai: 'With AI',
create_manually: 'Create Plan Manually',
create_with_ai: 'Create Plan with AI',
ai_plan_prompt_title: 'Create Plan with AI',
ai_plan_prompt_placeholder: 'Any specific requirements? (optional)',
generate: 'Generate',

View File

@@ -50,7 +50,7 @@ test.describe('II. Workout Management', () => {
await page.getByRole('button', { name: 'Plans' }).first().click();
await page.getByRole('button', { name: 'Create Plan' }).click();
await page.getByRole('button', { name: 'Manually' }).click();
await page.getByRole('button', { name: 'Create Plan Manually' }).click();
await expect(page.getByLabel(/Name/i)).toBeVisible({ timeout: 10000 });
await page.getByLabel(`Name`).fill('My New Strength Plan');
@@ -502,7 +502,7 @@ test.describe('II. Workout Management', () => {
// VERIFY: Should not appear in Plans Add Exercise selector
await page.getByRole('button', { name: 'Plans' }).first().click();
await page.getByRole('button', { name: 'Create Plan' }).click();
await page.getByRole('button', { name: 'Manually' }).click();
await page.getByRole('button', { name: 'Create Plan Manually' }).click();
await page.getByRole('button', { name: 'Add Exercise' }).click();
await expect(page.getByRole('button', { name: 'Archive Me' })).not.toBeVisible();
// Close sidesheet - use more robust selector and wait for stability

View File

@@ -13,20 +13,28 @@ test.describe('Seed', () => {
await page.getByLabel('Password').fill(user.password);
await page.getByRole('button', { name: 'Login' }).click();
// 4. Handle First Time Password Change if it appears
// Wait for either dashboard or change password screen
try {
await expect(page.getByRole('heading', { name: /Change Password/i }).or(page.getByText('Free Workout'))).toBeVisible({ timeout: 5000 });
// 4. Handle transitions (Change Password, Account Setup)
const dashboard = page.getByText(/Free Workout|Свободная тренировка/i).first();
const changePass = page.getByRole('heading', { name: /Change Password|Смена пароля/i });
const initAcc = page.getByRole('heading', { name: /Setup Your Account|Настройка аккаунта/i });
if (await page.getByRole('heading', { name: /Change Password/i }).isVisible()) {
await page.getByLabel('New Password').fill('StrongNewPass123!');
await page.getByRole('button', { name: /Save|Change/i }).click();
try {
await expect(dashboard.or(changePass).or(initAcc)).toBeVisible({ timeout: 10000 });
if (await changePass.isVisible()) {
await page.getByLabel(/New Password|Новый пароль/i).fill('StrongNewPass123!');
await page.getByRole('button', { name: /Save|Change|Сохранить/i }).click();
await expect(dashboard.or(initAcc)).toBeVisible({ timeout: 10000 });
}
if (await initAcc.isVisible()) {
await page.getByRole('button', { name: /Get Started|Начать работу/i }).click();
}
} catch (e) {
console.log('Timeout waiting for login transition');
console.log('Transition handling timeout or already reached dashboard');
}
// 5. Ensure we are at Dashboard
await expect(page.getByText('Free Workout')).toBeVisible();
await expect(dashboard).toBeVisible();
});
});