@cuemath/leap 2.9.7-akm-2 → 2.9.7-gg1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/features/circle-games/hooks/use-circle-sounds/use-circle-sounds.js +74 -104
- package/dist/features/circle-games/hooks/use-circle-sounds/use-circle-sounds.js.map +1 -1
- package/dist/features/worksheet/worksheet/hooks/use-create-imperative-handle.js +96 -78
- package/dist/features/worksheet/worksheet/hooks/use-create-imperative-handle.js.map +1 -1
- package/dist/features/worksheet/worksheet/worksheet-question/learnosity-question.js +79 -47
- package/dist/features/worksheet/worksheet/worksheet-question/learnosity-question.js.map +1 -1
- package/dist/features/worksheet/worksheet/worksheet-question/worksheet-question.js +150 -147
- package/dist/features/worksheet/worksheet/worksheet-question/worksheet-question.js.map +1 -1
- package/dist/features/worksheet/worksheet/worksheet-types.js.map +1 -1
- package/dist/features/worksheet/worksheet/worksheet.js +325 -300
- package/dist/features/worksheet/worksheet/worksheet.js.map +1 -1
- package/dist/index.d.ts +13 -0
- package/package.json +1 -1
@@ -1,118 +1,88 @@
|
|
1
|
-
import { useCallback as
|
2
|
-
import { CircleSoundKeyMapper as A, SWIPE_SOUND_ORDER as
|
3
|
-
import { CircleSoundKey as
|
4
|
-
let
|
5
|
-
const
|
6
|
-
[
|
7
|
-
[
|
8
|
-
[
|
9
|
-
[
|
10
|
-
[
|
11
|
-
[
|
12
|
-
[
|
13
|
-
[
|
14
|
-
[
|
15
|
-
[
|
16
|
-
[
|
17
|
-
[
|
18
|
-
[
|
19
|
-
[
|
20
|
-
[
|
21
|
-
[
|
22
|
-
[
|
23
|
-
[
|
24
|
-
[
|
25
|
-
[
|
26
|
-
[
|
27
|
-
[
|
28
|
-
[
|
29
|
-
}, I = {},
|
30
|
-
const
|
31
|
-
if (!
|
32
|
-
const
|
33
|
-
|
1
|
+
import { useCallback as a } from "react";
|
2
|
+
import { CircleSoundKeyMapper as A, SWIPE_SOUND_ORDER as i } from "./constants.js";
|
3
|
+
import { CircleSoundKey as l } from "./use-circle-sounds-enums.js";
|
4
|
+
let C = 0;
|
5
|
+
const r = {
|
6
|
+
[l.BACKGROUND]: null,
|
7
|
+
[l.BACKGROUND_RUSHHOUR]: null,
|
8
|
+
[l.TUTORIAL]: null,
|
9
|
+
[l.SWIPE_01]: null,
|
10
|
+
[l.SWIPE_02]: null,
|
11
|
+
[l.SWIPE_03]: null,
|
12
|
+
[l.SWIPE_04]: null,
|
13
|
+
[l.SWIPE_DOWN]: null,
|
14
|
+
[l.TOGGLE]: null,
|
15
|
+
[l.POINTS_AWARDED]: null,
|
16
|
+
[l.POINTS_ADDED]: null,
|
17
|
+
[l.GAME_CARD_CLICK]: null,
|
18
|
+
[l.CLOCK_IN]: null,
|
19
|
+
[l.CLOCK_OUT]: null,
|
20
|
+
[l.ACCURACY_IN]: null,
|
21
|
+
[l.ACCURACY_OUT]: null,
|
22
|
+
[l.STREAK_IN]: null,
|
23
|
+
[l.STREAK_OUT]: null,
|
24
|
+
[l.ACCURACY_INTRO]: null,
|
25
|
+
[l.ACCURACY_TARGET]: null,
|
26
|
+
[l.TIME_INTRO]: null,
|
27
|
+
[l.TIME_TARGET]: null,
|
28
|
+
[l.METER_FILL]: null
|
29
|
+
}, I = {}, O = () => {
|
30
|
+
const e = a((n) => {
|
31
|
+
if (!r[n]) {
|
32
|
+
const t = new Audio(A[n]);
|
33
|
+
r[n] = t;
|
34
34
|
}
|
35
|
-
}, []),
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
}) : document.visibilityState === "visible" && (f.current.forEach((e) => {
|
40
|
-
const l = o[e];
|
41
|
-
l == null || l.play();
|
42
|
-
}), f.current.clear());
|
43
|
-
}, []);
|
44
|
-
T(() => {
|
45
|
-
document.addEventListener("visibilitychange", v);
|
46
|
-
const e = p.current;
|
47
|
-
return () => {
|
48
|
-
document.removeEventListener("visibilitychange", v);
|
49
|
-
for (const l of Object.values(e))
|
50
|
-
l != null && clearInterval(l);
|
51
|
-
};
|
52
|
-
}, [v]);
|
53
|
-
const S = c(() => {
|
54
|
-
var l;
|
55
|
-
E.forEach((u) => {
|
56
|
-
s(u);
|
35
|
+
}, []), p = a(() => {
|
36
|
+
var t;
|
37
|
+
i.forEach((o) => {
|
38
|
+
e(o);
|
57
39
|
});
|
58
|
-
const
|
59
|
-
|
60
|
-
}, [
|
61
|
-
var
|
62
|
-
return
|
63
|
-
}, [
|
64
|
-
(
|
65
|
-
|
66
|
-
const
|
67
|
-
if (!
|
68
|
-
if (
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
const a = t.play();
|
73
|
-
I[e] = a;
|
40
|
+
const n = i[C] || l.SWIPE_01;
|
41
|
+
C < i.length - 1 ? C++ : C = 0, (t = r[n]) == null || t.play();
|
42
|
+
}, [e]), _ = a(() => {
|
43
|
+
var t;
|
44
|
+
return e(l.TOGGLE), (t = r[l.TOGGLE]) == null ? void 0 : t.play();
|
45
|
+
}, [e]), E = a(
|
46
|
+
(n, t = !0, o = !1) => {
|
47
|
+
e(n);
|
48
|
+
const u = r[n];
|
49
|
+
if (!u) return;
|
50
|
+
if (u.loop = o, t) {
|
51
|
+
u.volume = 1;
|
52
|
+
const s = u.play();
|
53
|
+
I[n] = s;
|
74
54
|
return;
|
75
55
|
}
|
76
|
-
|
77
|
-
const
|
78
|
-
I[
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
}
|
84
|
-
const a = t.volume || 0;
|
85
|
-
a < 1 ? t.volume = Math.min(a + 0.1, 1) : clearInterval(i);
|
86
|
-
}, 100);
|
87
|
-
return p.current[e] = i, t;
|
56
|
+
u.volume = 0;
|
57
|
+
const c = u.play();
|
58
|
+
return I[n] = c, setInterval(() => {
|
59
|
+
if (!u) return;
|
60
|
+
const s = 0;
|
61
|
+
u.volume = s + 0.1;
|
62
|
+
}, 100), u;
|
88
63
|
},
|
89
|
-
[
|
90
|
-
),
|
91
|
-
var
|
92
|
-
const
|
93
|
-
I[
|
94
|
-
if (
|
95
|
-
|
96
|
-
u.pause();
|
64
|
+
[e]
|
65
|
+
), S = a((n, t = !0) => {
|
66
|
+
var u;
|
67
|
+
const o = r[n];
|
68
|
+
I[n] !== void 0 && ((u = I[n]) == null || u.then(() => {
|
69
|
+
if (t) {
|
70
|
+
o == null || o.pause();
|
97
71
|
return;
|
98
72
|
}
|
99
|
-
const
|
100
|
-
if (!
|
101
|
-
|
102
|
-
|
103
|
-
}
|
104
|
-
const i = u.volume || 0;
|
105
|
-
i - 0.1 <= 0 ? (u.volume = 0, u.pause(), clearInterval(r)) : u.volume = i - 0.1;
|
73
|
+
const c = setInterval(() => {
|
74
|
+
if (!o) return;
|
75
|
+
const s = o.volume || 0;
|
76
|
+
s - 0.1 <= 0 ? (o.volume = 0, o.pause(), clearInterval(c)) : o.volume = s - 0.1;
|
106
77
|
}, 100);
|
107
|
-
|
108
|
-
|
109
|
-
console.log("sound not playing", r);
|
78
|
+
}).catch((c) => {
|
79
|
+
console.log("sound not playing", c);
|
110
80
|
}));
|
111
81
|
}, []);
|
112
|
-
return { playSwipSound:
|
82
|
+
return { playSwipSound: p, play: E, stop: S, playButtonSound: _ };
|
113
83
|
};
|
114
84
|
export {
|
115
|
-
|
116
|
-
|
85
|
+
r as soundMapper,
|
86
|
+
O as useCircleSounds
|
117
87
|
};
|
118
88
|
//# sourceMappingURL=use-circle-sounds.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"use-circle-sounds.js","sources":["../../../../../src/features/circle-games/hooks/use-circle-sounds/use-circle-sounds.ts"],"sourcesContent":["import
|
1
|
+
{"version":3,"file":"use-circle-sounds.js","sources":["../../../../../src/features/circle-games/hooks/use-circle-sounds/use-circle-sounds.ts"],"sourcesContent":["import { useCallback } from 'react';\n\nimport { CircleSoundKeyMapper, SWIPE_SOUND_ORDER } from './constants';\nimport { CircleSoundKey } from './use-circle-sounds-enums';\n\nlet swipeSoundIndex = 0;\n\nexport const soundMapper: Record<keyof typeof CircleSoundKeyMapper, null | HTMLAudioElement> = {\n [CircleSoundKey.BACKGROUND]: null,\n [CircleSoundKey.BACKGROUND_RUSHHOUR]: null,\n [CircleSoundKey.TUTORIAL]: null,\n [CircleSoundKey.SWIPE_01]: null,\n [CircleSoundKey.SWIPE_02]: null,\n [CircleSoundKey.SWIPE_03]: null,\n [CircleSoundKey.SWIPE_04]: null,\n [CircleSoundKey.SWIPE_DOWN]: null,\n [CircleSoundKey.TOGGLE]: null,\n [CircleSoundKey.POINTS_AWARDED]: null,\n [CircleSoundKey.POINTS_ADDED]: null,\n [CircleSoundKey.GAME_CARD_CLICK]: null,\n [CircleSoundKey.CLOCK_IN]: null,\n [CircleSoundKey.CLOCK_OUT]: null,\n [CircleSoundKey.ACCURACY_IN]: null,\n [CircleSoundKey.ACCURACY_OUT]: null,\n [CircleSoundKey.STREAK_IN]: null,\n [CircleSoundKey.STREAK_OUT]: null,\n [CircleSoundKey.ACCURACY_INTRO]: null,\n [CircleSoundKey.ACCURACY_TARGET]: null,\n [CircleSoundKey.TIME_INTRO]: null,\n [CircleSoundKey.TIME_TARGET]: null,\n [CircleSoundKey.METER_FILL]: null,\n};\n\nconst soundInstancePromise: Partial<Record<keyof typeof CircleSoundKeyMapper, Promise<void>>> = {};\n\nexport const useCircleSounds = () => {\n const loadSound = useCallback((key: CircleSoundKey) => {\n if (!soundMapper[key]) {\n const loadedSound = new Audio(CircleSoundKeyMapper[key]);\n\n soundMapper[key] = loadedSound;\n }\n }, []);\n\n const playSwipSound = useCallback(() => {\n SWIPE_SOUND_ORDER.forEach(key => {\n loadSound(key);\n });\n\n const key = SWIPE_SOUND_ORDER[swipeSoundIndex] || CircleSoundKey.SWIPE_01;\n\n if (swipeSoundIndex < SWIPE_SOUND_ORDER.length - 1) {\n swipeSoundIndex++;\n } else {\n swipeSoundIndex = 0;\n }\n soundMapper[key]?.play();\n }, [loadSound]);\n\n const playButtonSound = useCallback(() => {\n loadSound(CircleSoundKey.TOGGLE);\n const sound = soundMapper[CircleSoundKey.TOGGLE]?.play();\n\n return sound;\n }, [loadSound]);\n\n const play = useCallback(\n (key: CircleSoundKey, immediately: boolean = true, loop = false) => {\n loadSound(key);\n const soundInstance = soundMapper[key];\n\n if (!soundInstance) return;\n\n soundInstance.loop = loop;\n if (immediately) {\n soundInstance.volume = 1;\n const promise = soundInstance.play();\n\n soundInstancePromise[key] = promise;\n\n return;\n }\n\n soundInstance.volume = 0;\n const promise = soundInstance.play();\n\n soundInstancePromise[key] = promise;\n\n const intervalId = setInterval(() => {\n if (!soundInstance) return;\n\n const vol = 0;\n\n if (vol < 1) {\n soundInstance.volume = vol + 0.1;\n } else {\n clearInterval(intervalId);\n }\n }, 100);\n\n return soundInstance;\n },\n [loadSound],\n );\n\n const stop = useCallback((key: CircleSoundKey, immediately: boolean = true) => {\n const soundInstance = soundMapper[key];\n\n // check if the sound is playing as the play() return a promise\n if (soundInstancePromise[key] !== undefined) {\n soundInstancePromise[key]\n ?.then(() => {\n if (immediately) {\n soundInstance?.pause();\n\n return;\n }\n\n const intervalId = setInterval(() => {\n if (!soundInstance) return;\n\n const vol = soundInstance.volume || 0;\n\n if (vol - 0.1 <= 0) {\n soundInstance.volume = 0;\n soundInstance.pause();\n clearInterval(intervalId);\n } else {\n soundInstance.volume = vol - 0.1;\n }\n }, 100);\n })\n .catch(err => {\n // eslint-disable-next-line no-console\n console.log('sound not playing', err);\n });\n }\n }, []);\n\n return { playSwipSound, play, stop, playButtonSound };\n};\n"],"names":["swipeSoundIndex","soundMapper","CircleSoundKey","soundInstancePromise","useCircleSounds","loadSound","useCallback","key","loadedSound","CircleSoundKeyMapper","playSwipSound","SWIPE_SOUND_ORDER","_a","playButtonSound","play","immediately","loop","soundInstance","promise","vol","stop","intervalId","err"],"mappings":"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"}
|
@@ -1,63 +1,63 @@
|
|
1
|
-
import { useCallback as
|
2
|
-
import
|
3
|
-
import { TEACHER_VALIDATION_AUDIO_LIST as
|
4
|
-
import { getQuestionMetadata as
|
5
|
-
import { QUESTIONS_RATING as
|
6
|
-
const
|
7
|
-
behavior:
|
8
|
-
questions:
|
9
|
-
setResponses:
|
10
|
-
onResponseChange:
|
11
|
-
onBulkResponsesChange:
|
12
|
-
getTimeSpentOnQuestion:
|
1
|
+
import { useCallback as D, useImperativeHandle as K } from "react";
|
2
|
+
import X from "../../../hooks/use-audio-player.js";
|
3
|
+
import { TEACHER_VALIDATION_AUDIO_LIST as Y } from "../constants.js";
|
4
|
+
import { getQuestionMetadata as Q, isConceptIntroWidget as Z } from "../worksheet-helpers.js";
|
5
|
+
import { QUESTIONS_RATING as v, QUESTION_TAGS as x } from "../worksheet-types.js";
|
6
|
+
const h = (F, {
|
7
|
+
behavior: J,
|
8
|
+
questions: r,
|
9
|
+
setResponses: S,
|
10
|
+
onResponseChange: L,
|
11
|
+
onBulkResponsesChange: d,
|
12
|
+
getTimeSpentOnQuestion: W
|
13
13
|
}) => {
|
14
|
-
const { navigationMode:
|
15
|
-
(_, a,
|
16
|
-
|
17
|
-
const c =
|
18
|
-
|
19
|
-
var
|
20
|
-
const m =
|
21
|
-
...
|
14
|
+
const { navigationMode: w } = J, M = X(Y), H = D(
|
15
|
+
(_, a, T) => {
|
16
|
+
M("VALIDATE");
|
17
|
+
const c = W(_);
|
18
|
+
S((t) => {
|
19
|
+
var $, j;
|
20
|
+
const m = r.findIndex((E) => E.response_id === _), i = r[m], f = {
|
21
|
+
...Q(r, _),
|
22
22
|
...t[_],
|
23
23
|
validatedByTeacher: !0,
|
24
|
-
rating: a ?
|
24
|
+
rating: a ? v[a] : void 0,
|
25
25
|
timeSpent: c
|
26
26
|
};
|
27
|
-
if (
|
28
|
-
if ((
|
27
|
+
if (w === "ADAPTIVE") {
|
28
|
+
if (($ = t[_]) != null && $.validatedByTeacher)
|
29
29
|
return t;
|
30
|
-
const E =
|
30
|
+
const E = i.item_tags_map[x.TRIAL_TOPIC], O = i.item_tags_map[x.QUESTION_CODE], y = O && O.length < 3 ? `${O}${a}` : "Q", I = r.findIndex((A, U) => U <= m ? !1 : y !== "Q" ? A.item_tags_map[x.TRIAL_TOPIC] === E && A.item_tags_map[x.QUESTION_CODE] === y : A.item_tags_map[x.TRIAL_TOPIC] !== E), N = {
|
31
31
|
[_]: f,
|
32
|
-
...
|
33
|
-
(
|
34
|
-
...
|
32
|
+
...r.reduce(
|
33
|
+
(A, U, z) => (z <= m || I > -1 && z >= I || (A[U.response_id] = {
|
34
|
+
...Q(r, U.response_id),
|
35
35
|
...t[U.response_id],
|
36
36
|
assignStatus: "skipped"
|
37
|
-
}),
|
37
|
+
}), A),
|
38
38
|
{}
|
39
39
|
)
|
40
|
-
},
|
41
|
-
return
|
40
|
+
}, P = (j = r[I]) == null ? void 0 : j.response_id;
|
41
|
+
return P ? d == null || d({
|
42
42
|
...N,
|
43
|
-
[
|
44
|
-
...t[
|
45
|
-
...
|
43
|
+
[P]: {
|
44
|
+
...t[P],
|
45
|
+
...Q(r, P),
|
46
46
|
assignStatus: void 0
|
47
47
|
}
|
48
|
-
}) :
|
48
|
+
}) : d == null || d(N), {
|
49
49
|
...t,
|
50
50
|
...N
|
51
51
|
};
|
52
52
|
}
|
53
|
-
if (
|
54
|
-
const { item_reference: E } =
|
53
|
+
if (T) {
|
54
|
+
const { item_reference: E } = i, O = {
|
55
55
|
[_]: f,
|
56
|
-
...
|
56
|
+
...r.reduce(
|
57
57
|
(y, I) => {
|
58
58
|
var N;
|
59
|
-
return I.response_id !==
|
60
|
-
...
|
59
|
+
return I.response_id !== i.response_id && I.item_reference === E && !((N = t[I.response_id]) != null && N.validatedByTeacher) && (y[I.response_id] = {
|
60
|
+
...Q(r, I.response_id),
|
61
61
|
...t[I.response_id],
|
62
62
|
assignStatus: "skipped"
|
63
63
|
}), y;
|
@@ -65,7 +65,7 @@ const u = (z, {
|
|
65
65
|
{}
|
66
66
|
)
|
67
67
|
};
|
68
|
-
return
|
68
|
+
return d == null || d({
|
69
69
|
...t,
|
70
70
|
...O
|
71
71
|
}), {
|
@@ -73,13 +73,13 @@ const u = (z, {
|
|
73
73
|
...O
|
74
74
|
};
|
75
75
|
}
|
76
|
-
return
|
76
|
+
return w === "CURRENT" && i.item_number === 0 ? d == null || d({
|
77
77
|
...t,
|
78
78
|
[_]: f
|
79
|
-
}) :
|
79
|
+
}) : L == null || L({
|
80
80
|
responseId: _,
|
81
81
|
response: f,
|
82
|
-
question:
|
82
|
+
question: i,
|
83
83
|
isNewAttempt: !1
|
84
84
|
}), {
|
85
85
|
...t,
|
@@ -88,79 +88,97 @@ const u = (z, {
|
|
88
88
|
});
|
89
89
|
},
|
90
90
|
[
|
91
|
+
W,
|
91
92
|
w,
|
92
|
-
L,
|
93
|
-
i,
|
94
|
-
P,
|
95
|
-
H,
|
96
93
|
d,
|
97
|
-
|
94
|
+
L,
|
95
|
+
M,
|
96
|
+
r,
|
97
|
+
S
|
98
98
|
]
|
99
|
-
),
|
99
|
+
), V = D(
|
100
100
|
(_) => {
|
101
|
-
|
102
|
-
const
|
101
|
+
S((a) => {
|
102
|
+
const T = r.filter(
|
103
103
|
(t) => {
|
104
104
|
var m;
|
105
105
|
return _.startsWith("advanced-") ? (m = t.item_type) == null ? void 0 : m.startsWith("advanced-") : t.item_type === _;
|
106
106
|
}
|
107
107
|
), c = {};
|
108
|
-
return
|
108
|
+
return T.length > 0 ? (T.forEach((t) => {
|
109
109
|
c[t.response_id] = {
|
110
|
-
...
|
110
|
+
...Q(r, t.response_id),
|
111
111
|
...a[t.response_id],
|
112
112
|
assignStatus: "assigned"
|
113
113
|
};
|
114
|
-
}),
|
114
|
+
}), d == null || d(c), {
|
115
115
|
...a,
|
116
116
|
...c
|
117
117
|
}) : a;
|
118
118
|
});
|
119
119
|
},
|
120
|
-
[
|
121
|
-
),
|
120
|
+
[d, r, S]
|
121
|
+
), b = D(
|
122
122
|
(_) => {
|
123
|
-
|
124
|
-
const
|
123
|
+
S((a) => {
|
124
|
+
const T = r.filter(
|
125
125
|
(m) => {
|
126
|
-
var
|
127
|
-
return _.startsWith("advanced-") ? (
|
126
|
+
var i;
|
127
|
+
return _.startsWith("advanced-") ? (i = m.item_type) == null ? void 0 : i.startsWith("advanced-") : m.item_type === _;
|
128
128
|
}
|
129
129
|
), c = {}, t = [];
|
130
|
-
return
|
131
|
-
const f = a[
|
132
|
-
f != null && f.validatedByTeacher ? t.push(
|
133
|
-
...
|
130
|
+
return T.length > 0 ? (T.forEach((i) => {
|
131
|
+
const f = a[i.response_id];
|
132
|
+
f != null && f.validatedByTeacher ? t.push(i) : c[i.response_id] = {
|
133
|
+
...Q(r, i.response_id),
|
134
134
|
...f,
|
135
135
|
assignStatus: "skipped"
|
136
136
|
};
|
137
137
|
}), t.some(
|
138
|
-
({ instructor_stimulus:
|
139
|
-
) || t.forEach((
|
140
|
-
c[
|
141
|
-
...
|
142
|
-
...a[
|
138
|
+
({ instructor_stimulus: i }) => !(i === "SystemIntro" || Z(i))
|
139
|
+
) || t.forEach((i) => {
|
140
|
+
c[i.response_id] = {
|
141
|
+
...Q(r, i.response_id),
|
142
|
+
...a[i.response_id],
|
143
143
|
assignStatus: "skipped"
|
144
144
|
};
|
145
|
-
}),
|
145
|
+
}), d == null || d(c), {
|
146
146
|
...a,
|
147
147
|
...c
|
148
148
|
}) : a;
|
149
149
|
});
|
150
150
|
},
|
151
|
-
[
|
151
|
+
[d, r, S]
|
152
|
+
), G = D(
|
153
|
+
(_, a, T) => {
|
154
|
+
const c = a === "SIMULATION" ? "simState" : void 0;
|
155
|
+
c && S((t) => {
|
156
|
+
if (!r.find((f) => f.response_id === _)) return t;
|
157
|
+
const i = {
|
158
|
+
...Q(r, _),
|
159
|
+
...t[_],
|
160
|
+
[c]: T
|
161
|
+
};
|
162
|
+
return {
|
163
|
+
...t,
|
164
|
+
[_]: i
|
165
|
+
};
|
166
|
+
});
|
167
|
+
},
|
168
|
+
[r, S]
|
152
169
|
);
|
153
|
-
|
154
|
-
|
170
|
+
K(
|
171
|
+
F,
|
155
172
|
() => ({
|
156
|
-
validateQuestion:
|
157
|
-
assignOptionalItems:
|
158
|
-
skipOptionalItems:
|
173
|
+
validateQuestion: H,
|
174
|
+
assignOptionalItems: V,
|
175
|
+
skipOptionalItems: b,
|
176
|
+
updateMediaState: G
|
159
177
|
}),
|
160
|
-
[b, G,
|
178
|
+
[V, b, G, H]
|
161
179
|
);
|
162
180
|
};
|
163
181
|
export {
|
164
|
-
|
182
|
+
h as default
|
165
183
|
};
|
166
184
|
//# sourceMappingURL=use-create-imperative-handle.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"use-create-imperative-handle.js","sources":["../../../../../src/features/worksheet/worksheet/hooks/use-create-imperative-handle.ts"],"sourcesContent":["import type { Dispatch, ForwardedRef, SetStateAction } from 'react';\n\nimport { useCallback, useImperativeHandle } from 'react';\n\nimport useAudioPlayer from '../../../hooks/use-audio-player';\nimport { TEACHER_VALIDATION_AUDIO_LIST } from '../constants';\nimport { getQuestionMetadata, isConceptIntroWidget } from '../worksheet-helpers';\nimport {\n QUESTION_TAGS,\n QUESTIONS_RATING,\n type IWorksheetBehavior,\n type IWorksheetProps,\n type IWorksheetQuestion,\n type IWorksheetRef,\n type IWorksheetResponse,\n} from '../worksheet-types';\n\ninterface IUseCreateImperativeHandle {\n (\n ref: ForwardedRef<IWorksheetRef>,\n options: {\n behavior: IWorksheetBehavior;\n questions: IWorksheetQuestion[];\n setResponses: Dispatch<SetStateAction<Record<string, IWorksheetResponse>>>;\n onResponseChange: IWorksheetProps['onResponseChange'];\n onBulkResponsesChange: IWorksheetProps['onBulkResponsesChange'];\n getTimeSpentOnQuestion: (questionId: string) => number;\n },\n ): void;\n}\n\nconst useCreateImperativeHandle: IUseCreateImperativeHandle = (\n ref,\n {\n behavior,\n questions,\n setResponses,\n onResponseChange,\n onBulkResponsesChange,\n getTimeSpentOnQuestion,\n },\n) => {\n const { navigationMode } = behavior;\n const playNotifSound = useAudioPlayer(TEACHER_VALIDATION_AUDIO_LIST);\n const validateQuestion = useCallback<IWorksheetRef['validateQuestion']>(\n (questionId, rating, skipRemainingQuestions) => {\n playNotifSound('VALIDATE');\n const timeSpentOnQuestion = getTimeSpentOnQuestion(questionId);\n\n setResponses(prevResponses => {\n const questionIndex = questions.findIndex(q => q.response_id === questionId);\n const question = questions[questionIndex]!;\n\n const newResponse = {\n ...getQuestionMetadata(questions, questionId),\n ...prevResponses[questionId],\n validatedByTeacher: true,\n rating: rating ? QUESTIONS_RATING[rating] : undefined,\n timeSpent: timeSpentOnQuestion,\n };\n\n if (navigationMode === 'ADAPTIVE') {\n if (prevResponses[questionId]?.validatedByTeacher) {\n return prevResponses;\n }\n\n const topicName = question.item_tags_map[QUESTION_TAGS.TRIAL_TOPIC];\n const questionCode = question.item_tags_map[QUESTION_TAGS.QUESTION_CODE];\n const nextQuestionCode =\n questionCode && questionCode.length < 3 ? `${questionCode}${rating}` : 'Q';\n const nextQuestionIndex = questions.findIndex((q, qIndex) => {\n if (qIndex <= questionIndex) return false;\n\n if (nextQuestionCode !== 'Q') {\n return (\n q.item_tags_map[QUESTION_TAGS.TRIAL_TOPIC] === topicName &&\n q.item_tags_map[QUESTION_TAGS.QUESTION_CODE] === nextQuestionCode\n );\n }\n\n return q.item_tags_map[QUESTION_TAGS.TRIAL_TOPIC] !== topicName;\n });\n\n const newResponses = {\n [questionId]: newResponse,\n ...questions.reduce(\n (acc, q, qIndex) => {\n if (qIndex <= questionIndex) return acc;\n\n if (nextQuestionIndex > -1 && qIndex >= nextQuestionIndex) return acc;\n\n acc[q.response_id] = {\n ...getQuestionMetadata(questions, q.response_id),\n ...prevResponses[q.response_id],\n assignStatus: 'skipped',\n };\n\n return acc;\n },\n {} as Record<string, IWorksheetResponse>,\n ),\n };\n const nextQuestionResponseId = questions[nextQuestionIndex]?.response_id;\n\n if (nextQuestionResponseId) {\n onBulkResponsesChange?.({\n ...newResponses,\n [nextQuestionResponseId]: {\n ...prevResponses[nextQuestionResponseId],\n ...getQuestionMetadata(questions, nextQuestionResponseId),\n assignStatus: undefined,\n },\n });\n } else {\n onBulkResponsesChange?.(newResponses);\n }\n\n return {\n ...prevResponses,\n ...newResponses,\n };\n }\n\n if (skipRemainingQuestions) {\n const { item_reference } = question;\n const newResponses = {\n [questionId]: newResponse,\n ...questions.reduce(\n (acc, q) => {\n if (\n q.response_id !== question.response_id &&\n q.item_reference === item_reference &&\n !prevResponses[q.response_id]?.validatedByTeacher\n ) {\n acc[q.response_id] = {\n ...getQuestionMetadata(questions, q.response_id),\n ...prevResponses[q.response_id],\n assignStatus: 'skipped',\n };\n }\n\n return acc;\n },\n {} as Record<string, IWorksheetResponse>,\n ),\n };\n\n onBulkResponsesChange?.({\n ...prevResponses,\n ...newResponses,\n });\n\n return {\n ...prevResponses,\n ...newResponses,\n };\n }\n\n if (navigationMode === 'CURRENT' && question.item_number === 0) {\n onBulkResponsesChange?.({\n ...prevResponses,\n [questionId]: newResponse,\n });\n } else {\n onResponseChange?.({\n responseId: questionId,\n response: newResponse,\n question,\n isNewAttempt: false,\n });\n }\n\n return {\n ...prevResponses,\n [questionId]: newResponse,\n };\n });\n },\n [\n getTimeSpentOnQuestion,\n navigationMode,\n onBulkResponsesChange,\n onResponseChange,\n playNotifSound,\n questions,\n setResponses,\n ],\n );\n\n const assignOptionalItems = useCallback<IWorksheetRef['assignOptionalItems']>(\n itemType => {\n setResponses(prevResponses => {\n const optionalQuestions = questions.filter(q =>\n itemType.startsWith('advanced-')\n ? q.item_type?.startsWith('advanced-')\n : q.item_type === itemType,\n );\n const assignedResponses: Record<string, IWorksheetResponse> = {};\n\n if (optionalQuestions.length > 0) {\n optionalQuestions.forEach(question => {\n assignedResponses[question.response_id] = {\n ...getQuestionMetadata(questions, question.response_id),\n ...prevResponses[question.response_id],\n assignStatus: 'assigned',\n };\n });\n\n onBulkResponsesChange?.(assignedResponses);\n\n return {\n ...prevResponses,\n ...assignedResponses,\n };\n }\n\n return prevResponses;\n });\n },\n [onBulkResponsesChange, questions, setResponses],\n );\n\n const skipOptionalItems = useCallback<IWorksheetRef['skipOptionalItems']>(\n itemType => {\n setResponses(prevResponses => {\n const optionalQuestions = questions.filter(q =>\n itemType.startsWith('advanced-')\n ? q.item_type?.startsWith('advanced-')\n : q.item_type === itemType,\n );\n const skippedResponses: Record<string, IWorksheetResponse> = {};\n const unskippedQuestions: IWorksheetQuestion[] = [];\n\n if (optionalQuestions.length > 0) {\n optionalQuestions.forEach(question => {\n const prevResponse = prevResponses[question.response_id];\n\n if (!prevResponse?.validatedByTeacher) {\n skippedResponses[question.response_id] = {\n ...getQuestionMetadata(questions, question.response_id),\n ...prevResponse,\n assignStatus: 'skipped',\n };\n } else {\n unskippedQuestions.push(question);\n }\n });\n\n const nonIntroUnskippedQuestionsPresent = unskippedQuestions.some(\n ({ instructor_stimulus }) =>\n !(instructor_stimulus === 'SystemIntro' || isConceptIntroWidget(instructor_stimulus)),\n );\n\n if (!nonIntroUnskippedQuestionsPresent) {\n unskippedQuestions.forEach(question => {\n skippedResponses[question.response_id] = {\n ...getQuestionMetadata(questions, question.response_id),\n ...prevResponses[question.response_id],\n assignStatus: 'skipped',\n };\n });\n }\n\n onBulkResponsesChange?.(skippedResponses);\n\n return {\n ...prevResponses,\n ...skippedResponses,\n };\n }\n\n return prevResponses;\n });\n },\n [onBulkResponsesChange, questions, setResponses],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n validateQuestion,\n assignOptionalItems,\n skipOptionalItems,\n }),\n [assignOptionalItems, skipOptionalItems, validateQuestion],\n );\n};\n\nexport default useCreateImperativeHandle;\n"],"names":["useCreateImperativeHandle","ref","behavior","questions","setResponses","onResponseChange","onBulkResponsesChange","getTimeSpentOnQuestion","navigationMode","playNotifSound","useAudioPlayer","TEACHER_VALIDATION_AUDIO_LIST","validateQuestion","useCallback","questionId","rating","skipRemainingQuestions","timeSpentOnQuestion","prevResponses","questionIndex","q","question","newResponse","getQuestionMetadata","QUESTIONS_RATING","_a","topicName","QUESTION_TAGS","questionCode","nextQuestionCode","nextQuestionIndex","qIndex","newResponses","acc","nextQuestionResponseId","_b","item_reference","assignOptionalItems","itemType","optionalQuestions","assignedResponses","skipOptionalItems","skippedResponses","unskippedQuestions","prevResponse","instructor_stimulus","isConceptIntroWidget","useImperativeHandle"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"use-create-imperative-handle.js","sources":["../../../../../src/features/worksheet/worksheet/hooks/use-create-imperative-handle.ts"],"sourcesContent":["import type { Dispatch, ForwardedRef, SetStateAction } from 'react';\n\nimport { useCallback, useImperativeHandle } from 'react';\n\nimport useAudioPlayer from '../../../hooks/use-audio-player';\nimport { TEACHER_VALIDATION_AUDIO_LIST } from '../constants';\nimport { getQuestionMetadata, isConceptIntroWidget } from '../worksheet-helpers';\nimport {\n QUESTION_TAGS,\n QUESTIONS_RATING,\n type IWorksheetBehavior,\n type IWorksheetProps,\n type IWorksheetQuestion,\n type IWorksheetRef,\n type IWorksheetResponse,\n} from '../worksheet-types';\n\ninterface IUseCreateImperativeHandle {\n (\n ref: ForwardedRef<IWorksheetRef>,\n options: {\n behavior: IWorksheetBehavior;\n questions: IWorksheetQuestion[];\n setResponses: Dispatch<SetStateAction<Record<string, IWorksheetResponse>>>;\n onResponseChange: IWorksheetProps['onResponseChange'];\n onBulkResponsesChange: IWorksheetProps['onBulkResponsesChange'];\n getTimeSpentOnQuestion: (questionId: string) => number;\n },\n ): void;\n}\n\nconst useCreateImperativeHandle: IUseCreateImperativeHandle = (\n ref,\n {\n behavior,\n questions,\n setResponses,\n onResponseChange,\n onBulkResponsesChange,\n getTimeSpentOnQuestion,\n },\n) => {\n const { navigationMode } = behavior;\n const playNotifSound = useAudioPlayer(TEACHER_VALIDATION_AUDIO_LIST);\n const validateQuestion = useCallback<IWorksheetRef['validateQuestion']>(\n (questionId, rating, skipRemainingQuestions) => {\n playNotifSound('VALIDATE');\n const timeSpentOnQuestion = getTimeSpentOnQuestion(questionId);\n\n setResponses(prevResponses => {\n const questionIndex = questions.findIndex(q => q.response_id === questionId);\n const question = questions[questionIndex]!;\n\n const newResponse = {\n ...getQuestionMetadata(questions, questionId),\n ...prevResponses[questionId],\n validatedByTeacher: true,\n rating: rating ? QUESTIONS_RATING[rating] : undefined,\n timeSpent: timeSpentOnQuestion,\n };\n\n if (navigationMode === 'ADAPTIVE') {\n if (prevResponses[questionId]?.validatedByTeacher) {\n return prevResponses;\n }\n\n const topicName = question.item_tags_map[QUESTION_TAGS.TRIAL_TOPIC];\n const questionCode = question.item_tags_map[QUESTION_TAGS.QUESTION_CODE];\n const nextQuestionCode =\n questionCode && questionCode.length < 3 ? `${questionCode}${rating}` : 'Q';\n const nextQuestionIndex = questions.findIndex((q, qIndex) => {\n if (qIndex <= questionIndex) return false;\n\n if (nextQuestionCode !== 'Q') {\n return (\n q.item_tags_map[QUESTION_TAGS.TRIAL_TOPIC] === topicName &&\n q.item_tags_map[QUESTION_TAGS.QUESTION_CODE] === nextQuestionCode\n );\n }\n\n return q.item_tags_map[QUESTION_TAGS.TRIAL_TOPIC] !== topicName;\n });\n\n const newResponses = {\n [questionId]: newResponse,\n ...questions.reduce(\n (acc, q, qIndex) => {\n if (qIndex <= questionIndex) return acc;\n\n if (nextQuestionIndex > -1 && qIndex >= nextQuestionIndex) return acc;\n\n acc[q.response_id] = {\n ...getQuestionMetadata(questions, q.response_id),\n ...prevResponses[q.response_id],\n assignStatus: 'skipped',\n };\n\n return acc;\n },\n {} as Record<string, IWorksheetResponse>,\n ),\n };\n const nextQuestionResponseId = questions[nextQuestionIndex]?.response_id;\n\n if (nextQuestionResponseId) {\n onBulkResponsesChange?.({\n ...newResponses,\n [nextQuestionResponseId]: {\n ...prevResponses[nextQuestionResponseId],\n ...getQuestionMetadata(questions, nextQuestionResponseId),\n assignStatus: undefined,\n },\n });\n } else {\n onBulkResponsesChange?.(newResponses);\n }\n\n return {\n ...prevResponses,\n ...newResponses,\n };\n }\n\n if (skipRemainingQuestions) {\n const { item_reference } = question;\n const newResponses = {\n [questionId]: newResponse,\n ...questions.reduce(\n (acc, q) => {\n if (\n q.response_id !== question.response_id &&\n q.item_reference === item_reference &&\n !prevResponses[q.response_id]?.validatedByTeacher\n ) {\n acc[q.response_id] = {\n ...getQuestionMetadata(questions, q.response_id),\n ...prevResponses[q.response_id],\n assignStatus: 'skipped',\n };\n }\n\n return acc;\n },\n {} as Record<string, IWorksheetResponse>,\n ),\n };\n\n onBulkResponsesChange?.({\n ...prevResponses,\n ...newResponses,\n });\n\n return {\n ...prevResponses,\n ...newResponses,\n };\n }\n\n if (navigationMode === 'CURRENT' && question.item_number === 0) {\n onBulkResponsesChange?.({\n ...prevResponses,\n [questionId]: newResponse,\n });\n } else {\n onResponseChange?.({\n responseId: questionId,\n response: newResponse,\n question,\n isNewAttempt: false,\n });\n }\n\n return {\n ...prevResponses,\n [questionId]: newResponse,\n };\n });\n },\n [\n getTimeSpentOnQuestion,\n navigationMode,\n onBulkResponsesChange,\n onResponseChange,\n playNotifSound,\n questions,\n setResponses,\n ],\n );\n\n const assignOptionalItems = useCallback<IWorksheetRef['assignOptionalItems']>(\n itemType => {\n setResponses(prevResponses => {\n const optionalQuestions = questions.filter(q =>\n itemType.startsWith('advanced-')\n ? q.item_type?.startsWith('advanced-')\n : q.item_type === itemType,\n );\n const assignedResponses: Record<string, IWorksheetResponse> = {};\n\n if (optionalQuestions.length > 0) {\n optionalQuestions.forEach(question => {\n assignedResponses[question.response_id] = {\n ...getQuestionMetadata(questions, question.response_id),\n ...prevResponses[question.response_id],\n assignStatus: 'assigned',\n };\n });\n\n onBulkResponsesChange?.(assignedResponses);\n\n return {\n ...prevResponses,\n ...assignedResponses,\n };\n }\n\n return prevResponses;\n });\n },\n [onBulkResponsesChange, questions, setResponses],\n );\n\n const skipOptionalItems = useCallback<IWorksheetRef['skipOptionalItems']>(\n itemType => {\n setResponses(prevResponses => {\n const optionalQuestions = questions.filter(q =>\n itemType.startsWith('advanced-')\n ? q.item_type?.startsWith('advanced-')\n : q.item_type === itemType,\n );\n const skippedResponses: Record<string, IWorksheetResponse> = {};\n const unskippedQuestions: IWorksheetQuestion[] = [];\n\n if (optionalQuestions.length > 0) {\n optionalQuestions.forEach(question => {\n const prevResponse = prevResponses[question.response_id];\n\n if (!prevResponse?.validatedByTeacher) {\n skippedResponses[question.response_id] = {\n ...getQuestionMetadata(questions, question.response_id),\n ...prevResponse,\n assignStatus: 'skipped',\n };\n } else {\n unskippedQuestions.push(question);\n }\n });\n\n const nonIntroUnskippedQuestionsPresent = unskippedQuestions.some(\n ({ instructor_stimulus }) =>\n !(instructor_stimulus === 'SystemIntro' || isConceptIntroWidget(instructor_stimulus)),\n );\n\n if (!nonIntroUnskippedQuestionsPresent) {\n unskippedQuestions.forEach(question => {\n skippedResponses[question.response_id] = {\n ...getQuestionMetadata(questions, question.response_id),\n ...prevResponses[question.response_id],\n assignStatus: 'skipped',\n };\n });\n }\n\n onBulkResponsesChange?.(skippedResponses);\n\n return {\n ...prevResponses,\n ...skippedResponses,\n };\n }\n\n return prevResponses;\n });\n },\n [onBulkResponsesChange, questions, setResponses],\n );\n\n const updateMediaState = useCallback<IWorksheetRef['updateMediaState']>(\n (responseId, mediaType, mediaState) => {\n const key = mediaType === 'SIMULATION' ? 'simState' : undefined;\n\n if (!key) return;\n\n setResponses(prevResponses => {\n const question = questions.find(q => q.response_id === responseId);\n\n if (!question) return prevResponses;\n\n const newResponse = {\n ...getQuestionMetadata(questions, responseId),\n ...prevResponses[responseId],\n [key]: mediaState,\n };\n\n return {\n ...prevResponses,\n [responseId]: newResponse,\n };\n });\n },\n [questions, setResponses],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n validateQuestion,\n assignOptionalItems,\n skipOptionalItems,\n updateMediaState,\n }),\n [assignOptionalItems, skipOptionalItems, updateMediaState, validateQuestion],\n );\n};\n\nexport default useCreateImperativeHandle;\n"],"names":["useCreateImperativeHandle","ref","behavior","questions","setResponses","onResponseChange","onBulkResponsesChange","getTimeSpentOnQuestion","navigationMode","playNotifSound","useAudioPlayer","TEACHER_VALIDATION_AUDIO_LIST","validateQuestion","useCallback","questionId","rating","skipRemainingQuestions","timeSpentOnQuestion","prevResponses","questionIndex","q","question","newResponse","getQuestionMetadata","QUESTIONS_RATING","_a","topicName","QUESTION_TAGS","questionCode","nextQuestionCode","nextQuestionIndex","qIndex","newResponses","acc","nextQuestionResponseId","_b","item_reference","assignOptionalItems","itemType","optionalQuestions","assignedResponses","skipOptionalItems","skippedResponses","unskippedQuestions","prevResponse","instructor_stimulus","isConceptIntroWidget","updateMediaState","responseId","mediaType","mediaState","key","useImperativeHandle"],"mappings":"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"}
|