Synchronous Fields Reset for Set Logging, Tests fixed
Some checks are pending
Copilot Setup Steps / copilot-setup-steps (push) Waiting to run
Some checks are pending
Copilot Setup Steps / copilot-setup-steps (push) Waiting to run
This commit is contained in:
@@ -140,6 +140,8 @@ export const useTracker = (props: any) => { // Props ignored/removed
|
|||||||
const updateSelection = async () => {
|
const updateSelection = async () => {
|
||||||
if (selectedExercise) {
|
if (selectedExercise) {
|
||||||
setSearchQuery(selectedExercise.name);
|
setSearchQuery(selectedExercise.name);
|
||||||
|
// Reset form synchronously to clear previous exercise data immediately
|
||||||
|
form.resetForm();
|
||||||
await form.updateFormFromLastSet(selectedExercise.id, selectedExercise.type, selectedExercise.bodyWeightPercentage);
|
await form.updateFormFromLastSet(selectedExercise.id, selectedExercise.type, selectedExercise.bodyWeightPercentage);
|
||||||
} else {
|
} else {
|
||||||
setSearchQuery('');
|
setSearchQuery('');
|
||||||
|
|||||||
@@ -41,22 +41,32 @@ export const useWorkoutForm = ({ userId, onSetAdded, onUpdateSet }: UseWorkoutFo
|
|||||||
setBwPercentage(bodyWeightPercentage ? bodyWeightPercentage.toString() : '100');
|
setBwPercentage(bodyWeightPercentage ? bodyWeightPercentage.toString() : '100');
|
||||||
|
|
||||||
const set = await getLastSetForExercise(userId, exerciseId);
|
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) {
|
if (set) {
|
||||||
setWeight(set.weight?.toString() || '');
|
setWeight(prev => prev === '' ? (set.weight?.toString() || '') : prev);
|
||||||
setReps(set.reps?.toString() || '');
|
setReps(prev => prev === '' ? (set.reps?.toString() || '') : prev);
|
||||||
setDuration(set.durationSeconds?.toString() || '');
|
setDuration(prev => prev === '' ? (set.durationSeconds?.toString() || '') : prev);
|
||||||
setDistance(set.distanceMeters?.toString() || '');
|
setDistance(prev => prev === '' ? (set.distanceMeters?.toString() || '') : prev);
|
||||||
setHeight(set.height?.toString() || '');
|
setHeight(prev => prev === '' ? (set.height?.toString() || '') : prev);
|
||||||
} else {
|
|
||||||
resetForm();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear irrelevant fields
|
// 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('');
|
if (exerciseType !== ExerciseType.STRENGTH && exerciseType !== ExerciseType.BODYWEIGHT) {
|
||||||
if (exerciseType !== ExerciseType.STRENGTH && exerciseType !== ExerciseType.BODYWEIGHT && exerciseType !== ExerciseType.PLYOMETRIC) setReps('');
|
setWeight(prev => (set && set.weight?.toString() === prev) || prev === '' ? '' : prev);
|
||||||
if (exerciseType !== ExerciseType.CARDIO && exerciseType !== ExerciseType.STATIC) setDuration('');
|
}
|
||||||
if (exerciseType !== ExerciseType.CARDIO && exerciseType !== ExerciseType.LONG_JUMP) setDistance('');
|
if (exerciseType !== ExerciseType.STRENGTH && exerciseType !== ExerciseType.BODYWEIGHT && exerciseType !== ExerciseType.PLYOMETRIC) {
|
||||||
if (exerciseType !== ExerciseType.HIGH_JUMP) setHeight('');
|
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) => {
|
const prepareSetData = (selectedExercise: ExerciseDef, isSporadic: boolean = false) => {
|
||||||
|
|||||||
@@ -132,8 +132,8 @@ const translations = {
|
|||||||
my_plans: 'My Plans',
|
my_plans: 'My Plans',
|
||||||
no_plans_yet: 'No workout plans yet.',
|
no_plans_yet: 'No workout plans yet.',
|
||||||
ask_ai_to_create: 'Ask your AI coach to create one',
|
ask_ai_to_create: 'Ask your AI coach to create one',
|
||||||
create_manually: 'Manually',
|
create_manually: 'Create Plan Manually',
|
||||||
create_with_ai: 'With AI',
|
create_with_ai: 'Create Plan with AI',
|
||||||
ai_plan_prompt_title: 'Create Plan with AI',
|
ai_plan_prompt_title: 'Create Plan with AI',
|
||||||
ai_plan_prompt_placeholder: 'Any specific requirements? (optional)',
|
ai_plan_prompt_placeholder: 'Any specific requirements? (optional)',
|
||||||
generate: 'Generate',
|
generate: 'Generate',
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ test.describe('II. Workout Management', () => {
|
|||||||
|
|
||||||
await page.getByRole('button', { name: 'Plans' }).first().click();
|
await page.getByRole('button', { name: 'Plans' }).first().click();
|
||||||
await page.getByRole('button', { name: 'Create Plan' }).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 expect(page.getByLabel(/Name/i)).toBeVisible({ timeout: 10000 });
|
||||||
|
|
||||||
await page.getByLabel(`Name`).fill('My New Strength Plan');
|
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
|
// VERIFY: Should not appear in Plans Add Exercise selector
|
||||||
await page.getByRole('button', { name: 'Plans' }).first().click();
|
await page.getByRole('button', { name: 'Plans' }).first().click();
|
||||||
await page.getByRole('button', { name: 'Create Plan' }).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 page.getByRole('button', { name: 'Add Exercise' }).click();
|
||||||
await expect(page.getByRole('button', { name: 'Archive Me' })).not.toBeVisible();
|
await expect(page.getByRole('button', { name: 'Archive Me' })).not.toBeVisible();
|
||||||
// Close sidesheet - use more robust selector and wait for stability
|
// Close sidesheet - use more robust selector and wait for stability
|
||||||
|
|||||||
@@ -13,20 +13,28 @@ test.describe('Seed', () => {
|
|||||||
await page.getByLabel('Password').fill(user.password);
|
await page.getByLabel('Password').fill(user.password);
|
||||||
await page.getByRole('button', { name: 'Login' }).click();
|
await page.getByRole('button', { name: 'Login' }).click();
|
||||||
|
|
||||||
// 4. Handle First Time Password Change if it appears
|
// 4. Handle transitions (Change Password, Account Setup)
|
||||||
// Wait for either dashboard or change password screen
|
const dashboard = page.getByText(/Free Workout|Свободная тренировка/i).first();
|
||||||
try {
|
const changePass = page.getByRole('heading', { name: /Change Password|Смена пароля/i });
|
||||||
await expect(page.getByRole('heading', { name: /Change Password/i }).or(page.getByText('Free Workout'))).toBeVisible({ timeout: 5000 });
|
const initAcc = page.getByRole('heading', { name: /Setup Your Account|Настройка аккаунта/i });
|
||||||
|
|
||||||
if (await page.getByRole('heading', { name: /Change Password/i }).isVisible()) {
|
try {
|
||||||
await page.getByLabel('New Password').fill('StrongNewPass123!');
|
await expect(dashboard.or(changePass).or(initAcc)).toBeVisible({ timeout: 10000 });
|
||||||
await page.getByRole('button', { name: /Save|Change/i }).click();
|
|
||||||
|
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) {
|
} catch (e) {
|
||||||
console.log('Timeout waiting for login transition');
|
console.log('Transition handling timeout or already reached dashboard');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5. Ensure we are at Dashboard
|
// 5. Ensure we are at Dashboard
|
||||||
await expect(page.getByText('Free Workout')).toBeVisible();
|
await expect(dashboard).toBeVisible();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user