• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

wger-project / react / 25445884823

06 May 2026 03:49PM UTC coverage: 78.09% (+1.2%) from 76.913%
25445884823

push

github

rolandgeider
Refactor mutation and debounce logic

2224 of 3138 branches covered (70.87%)

Branch coverage included in aggregate %.

10 of 12 new or added lines in 2 files covered. (83.33%)

109 existing lines in 13 files now uncovered.

4833 of 5899 relevant lines covered (81.93%)

31.64 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

85.19
/src/components/Exercises/forms/Variation.tsx
1
import React, { useState } from "react";
2
import { VariationSelect } from "@/components/Exercises/forms/VariationSelect";
3
import { useEditExerciseQuery } from "@/components/Exercises/queries";
4
import { useProfileQuery } from "@/components/User";
5

6
export function EditExerciseVariation(props: { exerciseId: number, initial: string | null }) {
7
    const [selectedVariationId, setSelectedVariationId] = useState<string | null>(props.initial);
10✔
8
    const [selectedNewVariationExerciseId, setSelectedNewVariationExerciseId] = useState<number | null>(null);
10✔
9
    const profileQuery = useProfileQuery();
10✔
10
    const editMutation = useEditExerciseQuery();
10✔
11

12
    const handleChangeVariationId = async (id: string | null) => {
10✔
13
        setSelectedVariationId(id);
2✔
14
        setSelectedNewVariationExerciseId(null);
2✔
15

16
        await editMutation.mutateAsync({
2✔
17
            id: props.exerciseId,
18
            data: {
19
                // eslint-disable-next-line camelcase
20
                variation_group: id,
21
                // eslint-disable-next-line camelcase
22
                license_author: profileQuery.data!.username
23
            },
24
        });
25
    };
26

27
    const handleChangeNewVariationExerciseId = async (id: number | null) => {
10✔
28
        const previousVariationId = selectedVariationId;
2✔
29
        setSelectedNewVariationExerciseId(id);
2✔
30
        setSelectedVariationId(null);
2✔
31

32
        if (id !== null) {
2!
33
            // Generate a new variation group UUID and assign both exercises to it
34
            const variationGroup = crypto.randomUUID();
2✔
35
            try {
2✔
36
                await editMutation.mutateAsync({
2✔
37
                    id: props.exerciseId,
38
                    data: {
39
                        // eslint-disable-next-line camelcase
40
                        variation_group: variationGroup,
41
                        // eslint-disable-next-line camelcase
42
                        license_author: profileQuery.data!.username
43
                    },
44
                });
45
                await editMutation.mutateAsync({
2✔
46
                    id,
47
                    data: {
48
                        // eslint-disable-next-line camelcase
49
                        variation_group: variationGroup,
50
                        // eslint-disable-next-line camelcase
51
                        license_author: profileQuery.data!.username
52
                    },
53
                });
54
                setSelectedVariationId(variationGroup);
1✔
55
                setSelectedNewVariationExerciseId(null);
1✔
56
            } catch {
57
                // Rollback on failure
58
                setSelectedVariationId(previousVariationId);
1✔
59
                setSelectedNewVariationExerciseId(null);
1✔
60
            }
61
        } else {
UNCOV
62
            try {
×
UNCOV
63
                await editMutation.mutateAsync({
×
64
                    id: props.exerciseId,
65
                    data: {
66
                        // eslint-disable-next-line camelcase
67
                        variation_group: null,
68
                        // eslint-disable-next-line camelcase
69
                        license_author: profileQuery.data!.username
70
                    },
71
                });
72
            } catch {
UNCOV
73
                setSelectedVariationId(previousVariationId);
×
74
            }
75
        }
76
    };
77

78
    return (
10✔
79
        <VariationSelect
80
            exerciseId={props.exerciseId}
81
            selectedVariationId={selectedVariationId}
82
            selectedNewVariationExerciseId={selectedNewVariationExerciseId}
83
            onChangeVariationId={handleChangeVariationId}
84
            onChangeNewVariationExerciseId={handleChangeNewVariationExerciseId}
85
        />
86
    );
87
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc