@nualang/nualang-ui-components 0.1.1313 → 0.1.1315
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/Assignments/AssignmentCardsList/AssignmentCardsList.js +36 -15
- package/dist/Assignments/CreateAssignmentDialog/CreateAssignmentDialog.js +13 -6
- package/dist/Cards/FeedbackCard/FeedbackCard.js +10 -5
- package/dist/Dialogs/GroupedFeedbackDialog/GroupedFeedbackDialog.js +6 -2
- package/dist/Dialogs/RecordingDialog/RecordingDialog.js +65 -15
- package/dist/Forms/Settings/Settings.js +4 -4
- package/dist/Live/Game/Game.js +5 -5
- package/dist/Live/LiveRoleplay/LiveStory/LiveStory.js +1 -1
- package/dist/Misc/ExerciseBottomBar/ExerciseBottomBar.js +2 -1
- package/dist/Screens/Classrooms/ViewClassroom/ViewClassroom.js +5 -3
- package/dist/Screens/Courses/ViewCourse/ViewCourse.js +1 -1
- package/dist/Tables/MeetingPrompstList/MeetingPromptsList.js +5 -2
- package/dist/hooks/useExerciseState.js +1 -28
- package/dist/hooks/useRecognition.js +2 -1
- package/package.json +1 -1
|
@@ -6,6 +6,8 @@ import Refresh from "@mui/icons-material/Refresh";
|
|
|
6
6
|
import TeacherCreate from "../../img/teacher-create-2.svg";
|
|
7
7
|
import Add from "@mui/icons-material/Add";
|
|
8
8
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
|
+
const VISIBILITY_LEAD_MINUTES = 5; // how many minutes before scheduleDate it becomes visible to students
|
|
10
|
+
|
|
9
11
|
const AssignmentCardsList = ({
|
|
10
12
|
t = text => text,
|
|
11
13
|
assignments = [],
|
|
@@ -31,8 +33,7 @@ const AssignmentCardsList = ({
|
|
|
31
33
|
isChallengeModeStudent
|
|
32
34
|
}) => {
|
|
33
35
|
const [lastClickedExerciseId, setLastClickedExerciseId] = useState(null);
|
|
34
|
-
const [filter, setFilter] = useState("all");
|
|
35
|
-
|
|
36
|
+
const [filter, setFilter] = useState("all");
|
|
36
37
|
useEffect(() => {
|
|
37
38
|
const stored = localStorage.getItem("lastClickedExercise");
|
|
38
39
|
if (stored) {
|
|
@@ -47,20 +48,27 @@ const AssignmentCardsList = ({
|
|
|
47
48
|
}
|
|
48
49
|
}, []);
|
|
49
50
|
const now = new Date();
|
|
50
|
-
const
|
|
51
|
+
const safeAssignments = Array.isArray(assignments) ? assignments : [];
|
|
52
|
+
const filteredAssignments = safeAssignments.filter(assignment => {
|
|
51
53
|
if (!isCreator) {
|
|
52
54
|
if (Array.isArray(assignment.assignedStudents) && !assignment.assignedStudents.includes(memberId)) {
|
|
53
55
|
return false;
|
|
54
56
|
}
|
|
55
|
-
if (assignment.scheduleDate
|
|
56
|
-
|
|
57
|
+
if (assignment.scheduleDate) {
|
|
58
|
+
const scheduleDateObj = new Date(assignment.scheduleDate);
|
|
59
|
+
const visibleFrom = new Date(scheduleDateObj.getTime() - VISIBILITY_LEAD_MINUTES * 60 * 1000);
|
|
60
|
+
if (visibleFrom > now) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
57
63
|
}
|
|
58
64
|
}
|
|
59
65
|
return true;
|
|
60
66
|
}).filter(assignment => {
|
|
61
67
|
if (filter === "all") return true;
|
|
62
68
|
if (filter === "scheduled") {
|
|
63
|
-
|
|
69
|
+
if (!assignment.scheduleDate) return false;
|
|
70
|
+
const scheduleDateObj = new Date(assignment.scheduleDate);
|
|
71
|
+
return scheduleDateObj > now;
|
|
64
72
|
}
|
|
65
73
|
if (filter === "pastDue") {
|
|
66
74
|
return assignment.dueDate && new Date(assignment.dueDate) < now;
|
|
@@ -71,12 +79,12 @@ const AssignmentCardsList = ({
|
|
|
71
79
|
return true;
|
|
72
80
|
}).sort((a, b) => {
|
|
73
81
|
if (filter === "dueNext") {
|
|
74
|
-
return new Date(a.dueDate) - new Date(b.dueDate);
|
|
82
|
+
return new Date(a.dueDate || 0) - new Date(b.dueDate || 0);
|
|
75
83
|
}
|
|
76
84
|
if (filter === "scheduled") {
|
|
77
|
-
return new Date(a.scheduleDate) - new Date(b.scheduleDate);
|
|
85
|
+
return new Date(a.scheduleDate || 0) - new Date(b.scheduleDate || 0);
|
|
78
86
|
}
|
|
79
|
-
return new Date(b.createdAt) - new Date(a.createdAt);
|
|
87
|
+
return new Date(b.createdAt || 0) - new Date(a.createdAt || 0);
|
|
80
88
|
});
|
|
81
89
|
if (isLoadingAssignments) {
|
|
82
90
|
return /*#__PURE__*/_jsxs(Box, {
|
|
@@ -150,7 +158,7 @@ const AssignmentCardsList = ({
|
|
|
150
158
|
}, idx))]
|
|
151
159
|
});
|
|
152
160
|
}
|
|
153
|
-
if (!
|
|
161
|
+
if (!safeAssignments.length || filteredAssignments.length === 0) {
|
|
154
162
|
return /*#__PURE__*/_jsx(Box, {
|
|
155
163
|
mb: 1,
|
|
156
164
|
children: /*#__PURE__*/_jsxs(Box, {
|
|
@@ -290,9 +298,6 @@ const AssignmentCardsList = ({
|
|
|
290
298
|
onClick: refreshAssignments,
|
|
291
299
|
"aria-label": "refresh",
|
|
292
300
|
size: "large",
|
|
293
|
-
sx: {
|
|
294
|
-
size: "large"
|
|
295
|
-
},
|
|
296
301
|
children: /*#__PURE__*/_jsx(Refresh, {
|
|
297
302
|
fontSize: "inherit"
|
|
298
303
|
})
|
|
@@ -325,8 +330,24 @@ AssignmentCardsList.propTypes = {
|
|
|
325
330
|
t: PropTypes.func,
|
|
326
331
|
assignments: PropTypes.array,
|
|
327
332
|
isCreator: PropTypes.bool,
|
|
328
|
-
|
|
333
|
+
handleCreateAssignment: PropTypes.func,
|
|
334
|
+
getCourses: PropTypes.func,
|
|
335
|
+
getCourseSections: PropTypes.func,
|
|
336
|
+
getRoleplays: PropTypes.func,
|
|
337
|
+
deleteAssignment: PropTypes.func,
|
|
338
|
+
handleEditAssignment: PropTypes.func,
|
|
339
|
+
refreshAssignments: PropTypes.func,
|
|
340
|
+
username: PropTypes.string,
|
|
341
|
+
preferred_username: PropTypes.string,
|
|
342
|
+
progressHelpers: PropTypes.object,
|
|
343
|
+
fetchMemberCourseCompletions: PropTypes.func,
|
|
344
|
+
memberId: PropTypes.string,
|
|
345
|
+
handleViewProgress: PropTypes.func,
|
|
346
|
+
lastAssignmentFetch: PropTypes.any,
|
|
347
|
+
assignmentMembersById: PropTypes.object,
|
|
329
348
|
isLoadingAssignments: PropTypes.bool,
|
|
330
|
-
|
|
349
|
+
members: PropTypes.array,
|
|
350
|
+
courses: PropTypes.array,
|
|
351
|
+
isChallengeModeStudent: PropTypes.bool
|
|
331
352
|
};
|
|
332
353
|
export default AssignmentCardsList;
|
|
@@ -62,7 +62,7 @@ export default function CreateAssignmentDialog({
|
|
|
62
62
|
const [submittedExercises, setSubmittedExercises] = useState(initialData.exercises ? initialData.exercises : []);
|
|
63
63
|
const [members, setMembers] = useState([]);
|
|
64
64
|
const [assignment, setAssignment] = useState({
|
|
65
|
-
classroomId: classroom
|
|
65
|
+
classroomId: classroom && classroom.length > 0 ? [classroom] : [],
|
|
66
66
|
assignedStudents,
|
|
67
67
|
title: initialData.title ? initialData.title : undefined,
|
|
68
68
|
instructions: initialData.instructions ? initialData.instructions : t("default_assignment_instructions"),
|
|
@@ -174,7 +174,12 @@ export default function CreateAssignmentDialog({
|
|
|
174
174
|
let filteredCourses = selectedCourses.filter(course => submittedExercises.some(exercise => exercise.courseSectionTopicId?.split("|")[0] === course.courseId));
|
|
175
175
|
setAssignment(prev => ({
|
|
176
176
|
...prev,
|
|
177
|
-
courses: filteredCourses
|
|
177
|
+
courses: filteredCourses.map(course => ({
|
|
178
|
+
courseId: course.courseId,
|
|
179
|
+
courseName: course.courseName,
|
|
180
|
+
description: course.description,
|
|
181
|
+
picture: course.picture
|
|
182
|
+
}))
|
|
178
183
|
}));
|
|
179
184
|
const selectedTopicIds = new Set(submittedExercises.map(ex => ex.courseSectionTopicId));
|
|
180
185
|
const topicNames = Array.from(new Set(filteredCourses.flatMap(course => course.sections?.flatMap(section => section.topics?.flatMap(topic => {
|
|
@@ -212,10 +217,12 @@ export default function CreateAssignmentDialog({
|
|
|
212
217
|
}));
|
|
213
218
|
}, [members]);
|
|
214
219
|
useEffect(() => {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
220
|
+
if (classroom && classroom.length > 0 && !assignment.classroomId?.includes(classroom)) {
|
|
221
|
+
setAssignment(prev => ({
|
|
222
|
+
...prev,
|
|
223
|
+
classroomId: [classroom]
|
|
224
|
+
}));
|
|
225
|
+
}
|
|
219
226
|
}, [classroom]);
|
|
220
227
|
const [isSelectExerciseOpen, setIsSelectExerciseOpen] = useState(false);
|
|
221
228
|
const handleCloseSelectExercise = () => {
|
|
@@ -25,7 +25,12 @@ export default function FeedbackCard({
|
|
|
25
25
|
setSelectedRecording = () => {},
|
|
26
26
|
s3Url = "",
|
|
27
27
|
conversation = {},
|
|
28
|
-
existingFeedback = {}
|
|
28
|
+
existingFeedback = {},
|
|
29
|
+
playerRef = {
|
|
30
|
+
current: null
|
|
31
|
+
},
|
|
32
|
+
goToTimestamp = () => {},
|
|
33
|
+
startTimes = {}
|
|
29
34
|
}) {
|
|
30
35
|
const [isRecordingDialogOpen, setIsRecordingDialogOpen] = useState(false);
|
|
31
36
|
const [hasBeenEdited, setHasBeenEdited] = useState(false);
|
|
@@ -381,11 +386,11 @@ export default function FeedbackCard({
|
|
|
381
386
|
attendeesData: attendeesInThisDiscussion,
|
|
382
387
|
conversation: conversation,
|
|
383
388
|
s3Url: s3Url,
|
|
384
|
-
playerRef:
|
|
385
|
-
current: null
|
|
386
|
-
},
|
|
389
|
+
playerRef: playerRef,
|
|
387
390
|
aiGrade: aiGrade,
|
|
388
|
-
hasBadLanguage: discussionData?.hasBadLanguage || false
|
|
391
|
+
hasBadLanguage: discussionData?.hasBadLanguage || false,
|
|
392
|
+
goToTimestamp: goToTimestamp,
|
|
393
|
+
videoStartTime: startTimes[0]
|
|
389
394
|
}), /*#__PURE__*/_jsx(PDFViewer, {
|
|
390
395
|
open: openPDF,
|
|
391
396
|
handleClose: handleClosePDF,
|
|
@@ -26,7 +26,9 @@ export default function GroupFeedbackDialog({
|
|
|
26
26
|
handleCreateFeedback = () => {},
|
|
27
27
|
onFeedbackSubmitted = () => {},
|
|
28
28
|
editBackgroundImages,
|
|
29
|
-
editMeetingImages
|
|
29
|
+
editMeetingImages,
|
|
30
|
+
goToTimestamp = () => {},
|
|
31
|
+
startTimes = {}
|
|
30
32
|
}) {
|
|
31
33
|
const discussionsInGroup = scheduleListData.filter(item => item.groupedId === groupedId);
|
|
32
34
|
const submissionsForGroup = submissionsTableData.filter(item => item.groupedId === groupedId);
|
|
@@ -290,7 +292,9 @@ export default function GroupFeedbackDialog({
|
|
|
290
292
|
selectedRecording: selectedRecording,
|
|
291
293
|
s3Url: s3Url,
|
|
292
294
|
playerRef: playerRef,
|
|
293
|
-
conversation: conversation
|
|
295
|
+
conversation: conversation,
|
|
296
|
+
goToTimestamp: goToTimestamp,
|
|
297
|
+
startTimes: startTimes
|
|
294
298
|
}, discussion.meetingId || discussion.meetingID || index);
|
|
295
299
|
})]
|
|
296
300
|
})
|
|
@@ -10,12 +10,32 @@ import { red } from "@mui/material/colors";
|
|
|
10
10
|
import { useMediaQuery } from "@mui/material";
|
|
11
11
|
import { useTheme } from "@mui/material/styles";
|
|
12
12
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
13
|
+
const dateDifferenceInSeconds = (date1, date2) => {
|
|
14
|
+
const d1 = new Date(date1);
|
|
15
|
+
const d2 = new Date(date2);
|
|
16
|
+
return Math.abs((d2 - d1) / 1000);
|
|
17
|
+
};
|
|
18
|
+
const formatTimestamp = (timestamp, videoStartTime) => {
|
|
19
|
+
if (!timestamp && timestamp !== 0) return "00:00";
|
|
20
|
+
if (!videoStartTime) return "00:00";
|
|
21
|
+
let numberString = timestamp.toString();
|
|
22
|
+
numberString = numberString.substring(0, 10);
|
|
23
|
+
const formattedTime = Number(numberString);
|
|
24
|
+
const dateObj = new Date(formattedTime * 1000);
|
|
25
|
+
const isoString = dateObj.toISOString();
|
|
26
|
+
const seconds = dateDifferenceInSeconds(videoStartTime, isoString);
|
|
27
|
+
if (isNaN(seconds) || seconds < 0) return "00:00";
|
|
28
|
+
const mins = Math.floor(seconds / 60);
|
|
29
|
+
const secs = Math.floor(seconds % 60);
|
|
30
|
+
return `${mins.toString().padStart(2, "0")}:${secs.toString().padStart(2, "0")}`;
|
|
31
|
+
};
|
|
13
32
|
function TranscriptViewer({
|
|
14
33
|
conversation = {},
|
|
15
34
|
goToTimestamp = () => {},
|
|
16
35
|
attendeesData,
|
|
17
36
|
t = text => text,
|
|
18
|
-
loading = false
|
|
37
|
+
loading = false,
|
|
38
|
+
videoStartTime = null
|
|
19
39
|
}) {
|
|
20
40
|
return /*#__PURE__*/_jsx(Box, {
|
|
21
41
|
sx: {
|
|
@@ -69,40 +89,66 @@ function TranscriptViewer({
|
|
|
69
89
|
sx: theme => ({
|
|
70
90
|
display: "flex",
|
|
71
91
|
flexDirection: "column",
|
|
72
|
-
mb: 1,
|
|
92
|
+
mb: 1.5,
|
|
73
93
|
cursor: "pointer",
|
|
74
|
-
p: 1,
|
|
75
|
-
borderRadius:
|
|
94
|
+
p: 1.5,
|
|
95
|
+
borderRadius: 2,
|
|
96
|
+
transition: "all 0.2s ease-in-out",
|
|
97
|
+
border: "1px solid transparent",
|
|
76
98
|
"&:hover": {
|
|
77
|
-
backgroundColor: theme.palette.mode === "dark" ? theme.palette.primary.
|
|
99
|
+
backgroundColor: theme.palette.mode === "dark" ? theme.palette.primary.dark : theme.palette.primary.light + "15",
|
|
100
|
+
border: `1px solid ${theme.palette.primary.main}`,
|
|
101
|
+
transform: "translateX(4px)"
|
|
78
102
|
}
|
|
79
103
|
}),
|
|
80
104
|
children: [/*#__PURE__*/_jsxs(Box, {
|
|
81
105
|
sx: {
|
|
82
106
|
display: "flex",
|
|
83
107
|
alignItems: "center",
|
|
84
|
-
mb: 0.5
|
|
108
|
+
mb: 0.5,
|
|
109
|
+
gap: 1
|
|
85
110
|
},
|
|
86
111
|
children: [/*#__PURE__*/_jsx(Avatar, {
|
|
87
112
|
alt: sentence?.username,
|
|
88
113
|
src: userImage,
|
|
89
114
|
sx: {
|
|
90
|
-
width:
|
|
91
|
-
height:
|
|
92
|
-
mr: 1
|
|
115
|
+
width: 28,
|
|
116
|
+
height: 28
|
|
93
117
|
}
|
|
94
118
|
}), sentence?.user && /*#__PURE__*/_jsx(Typography, {
|
|
95
119
|
variant: "subtitle2",
|
|
96
120
|
fontWeight: "bold",
|
|
97
121
|
sx: {
|
|
98
|
-
whiteSpace: "nowrap"
|
|
122
|
+
whiteSpace: "nowrap",
|
|
123
|
+
flex: 1
|
|
99
124
|
},
|
|
100
125
|
children: sentence.user
|
|
126
|
+
}), (sentence.start_time !== undefined || sentence.end_time !== undefined) && videoStartTime && /*#__PURE__*/_jsx(Box, {
|
|
127
|
+
sx: {
|
|
128
|
+
display: "flex",
|
|
129
|
+
alignItems: "center",
|
|
130
|
+
gap: 0.5,
|
|
131
|
+
px: 1,
|
|
132
|
+
py: 0.25,
|
|
133
|
+
backgroundColor: theme => theme.palette.mode === "dark" ? "rgba(255, 255, 255, 0.08)" : "rgba(0, 0, 0, 0.06)",
|
|
134
|
+
borderRadius: 1
|
|
135
|
+
},
|
|
136
|
+
children: /*#__PURE__*/_jsx(Typography, {
|
|
137
|
+
variant: "caption",
|
|
138
|
+
sx: {
|
|
139
|
+
fontFamily: "monospace",
|
|
140
|
+
fontWeight: 500,
|
|
141
|
+
color: "text.secondary"
|
|
142
|
+
},
|
|
143
|
+
children: formatTimestamp(sentence.start_time, videoStartTime)
|
|
144
|
+
})
|
|
101
145
|
})]
|
|
102
146
|
}), /*#__PURE__*/_jsx(Typography, {
|
|
103
147
|
variant: "body2",
|
|
104
148
|
sx: {
|
|
105
|
-
ml: 4
|
|
149
|
+
ml: 4.5,
|
|
150
|
+
lineHeight: 1.6,
|
|
151
|
+
color: "text.primary"
|
|
106
152
|
},
|
|
107
153
|
children: sentence.text
|
|
108
154
|
})]
|
|
@@ -117,7 +163,8 @@ TranscriptViewer.propTypes = {
|
|
|
117
163
|
conversation: PropTypes.object,
|
|
118
164
|
goToTimestamp: PropTypes.func,
|
|
119
165
|
t: PropTypes.func,
|
|
120
|
-
loading: PropTypes.bool
|
|
166
|
+
loading: PropTypes.bool,
|
|
167
|
+
videoStartTime: PropTypes.string
|
|
121
168
|
};
|
|
122
169
|
export default function RecordingDialog({
|
|
123
170
|
open,
|
|
@@ -129,7 +176,8 @@ export default function RecordingDialog({
|
|
|
129
176
|
playerRef,
|
|
130
177
|
conversation,
|
|
131
178
|
attendeesData,
|
|
132
|
-
hasBadLanguage
|
|
179
|
+
hasBadLanguage,
|
|
180
|
+
videoStartTime
|
|
133
181
|
}) {
|
|
134
182
|
const theme = useTheme();
|
|
135
183
|
const isSmallScreen = useMediaQuery(theme.breakpoints.down("sm"));
|
|
@@ -227,7 +275,8 @@ export default function RecordingDialog({
|
|
|
227
275
|
attendeesData: attendeesData,
|
|
228
276
|
conversation: conversation,
|
|
229
277
|
goToTimestamp: goToTimestamp,
|
|
230
|
-
loading: loading
|
|
278
|
+
loading: loading,
|
|
279
|
+
videoStartTime: videoStartTime
|
|
231
280
|
})
|
|
232
281
|
})]
|
|
233
282
|
})
|
|
@@ -254,5 +303,6 @@ RecordingDialog.propTypes = {
|
|
|
254
303
|
s3Url: PropTypes.string,
|
|
255
304
|
playerRef: PropTypes.object,
|
|
256
305
|
conversation: PropTypes.array,
|
|
257
|
-
handleCreateFeedback: PropTypes.func
|
|
306
|
+
handleCreateFeedback: PropTypes.func,
|
|
307
|
+
videoStartTime: PropTypes.string
|
|
258
308
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import Box from "@mui/material/Box";
|
|
2
2
|
import ResponsiveTabs from "../../Navigation/ResponsiveTabs/ResponsiveTabs";
|
|
3
|
-
import General from "./Tabs/General";
|
|
4
|
-
import Display from "./Tabs/Display";
|
|
5
|
-
import Subscription from "./Tabs/Subscription";
|
|
6
|
-
import EmailNotifications from "./Tabs/EmailNotifications";
|
|
3
|
+
import General from "./Tabs/General/General";
|
|
4
|
+
import Display from "./Tabs/Display/Display";
|
|
5
|
+
import Subscription from "./Tabs/Subscription/Subscription";
|
|
6
|
+
import EmailNotifications from "./Tabs/EmailNotifications/EmailNotifications";
|
|
7
7
|
import { checkIsGeneratedEmail } from "../../utils";
|
|
8
8
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
9
9
|
export default function Settings({
|
package/dist/Live/Game/Game.js
CHANGED
|
@@ -12,12 +12,12 @@ import Joyride, { STATUS } from "react-joyride";
|
|
|
12
12
|
import ExerciseProgressBar from "../../Misc/ExerciseProgressBar/ExerciseProgressBar";
|
|
13
13
|
import VoiceSpeedSelector from "../../Misc/VoiceSpeed/VoiceSpeed";
|
|
14
14
|
import Leaderboard from "../../Lists/Leaderboard/Leaderboard";
|
|
15
|
-
import WaitingRoom from "../WaitingRoom";
|
|
16
|
-
import LiveListener from "../LiveListener";
|
|
15
|
+
import WaitingRoom from "../WaitingRoom/WaitingRoom";
|
|
16
|
+
import LiveListener from "../LiveListener/LiveListener";
|
|
17
17
|
import LiveTranslator from "../LiveTranslator/LiveTranslator";
|
|
18
|
-
import LiveStory from "../LiveRoleplay/LiveStory";
|
|
19
|
-
import HowToJoin from "../HowToJoin";
|
|
20
|
-
import GameMembers from "../GameMembers";
|
|
18
|
+
import LiveStory from "../LiveRoleplay/LiveStory/LiveStory";
|
|
19
|
+
import HowToJoin from "../HowToJoin/HowToJoin";
|
|
20
|
+
import GameMembers from "../GameMembers/GameMembers";
|
|
21
21
|
import GameSettings from "../GameSettings/GameSettings";
|
|
22
22
|
import FinalScoreDrawer from "../Misc/FinalScoreDrawer/FinalScoreDrawer";
|
|
23
23
|
import RewardEarned from "../../Dialogs/RewardEarned/RewardEarned";
|
|
@@ -5,7 +5,7 @@ import Chat from "../../../Chat/Chat";
|
|
|
5
5
|
import BeforeElements from "../../../Exercises/Roleplay/Games/BeforeElements";
|
|
6
6
|
import AnswerResult from "../../../Misc/AnswerResult/AnswerResult";
|
|
7
7
|
import GameControls from "../../GameControls/GameControls";
|
|
8
|
-
import GameQuestionResults from "../../GameQuestionResults";
|
|
8
|
+
import GameQuestionResults from "../../GameQuestionResults/GameQuestionResults";
|
|
9
9
|
import StudentAnswerDrawer from "../../Misc/StudentAnswerDrawer/StudentAnswerDrawer";
|
|
10
10
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
11
11
|
const useStyles = makeStyles()(theme => ({
|
|
@@ -9,7 +9,8 @@ const useStyles = makeStyles()(theme => ({
|
|
|
9
9
|
borderTop: `2px solid ${theme.palette.grey[300]}`,
|
|
10
10
|
width: "100%",
|
|
11
11
|
position: "sticky",
|
|
12
|
-
bottom: 0
|
|
12
|
+
bottom: 0,
|
|
13
|
+
backgroundColor: theme.palette.mode === 'dark' ? "#525252" : "white"
|
|
13
14
|
}
|
|
14
15
|
}));
|
|
15
16
|
function ExerciseBottomBar({
|
|
@@ -538,7 +538,8 @@ function Classroom({
|
|
|
538
538
|
hasBadLanguage,
|
|
539
539
|
handleArchiveSubmissions,
|
|
540
540
|
isVideoChatEnabled,
|
|
541
|
-
isVideoChatEnabledInSettings
|
|
541
|
+
isVideoChatEnabledInSettings,
|
|
542
|
+
startTimes
|
|
542
543
|
} = vchatProps;
|
|
543
544
|
const isSmallScreen = useMediaQuery("(max-width:410px)");
|
|
544
545
|
const {
|
|
@@ -1041,7 +1042,8 @@ function Classroom({
|
|
|
1041
1042
|
setSelectedRecording: setSelectedRecording,
|
|
1042
1043
|
meetingRecsData: meetingRecsData,
|
|
1043
1044
|
hasBadLanguage: hasBadLanguage,
|
|
1044
|
-
handleArchiveSubmissions: handleArchiveSubmissions
|
|
1045
|
+
handleArchiveSubmissions: handleArchiveSubmissions,
|
|
1046
|
+
startTimes: startTimes
|
|
1045
1047
|
})
|
|
1046
1048
|
})
|
|
1047
1049
|
}), !isCreator && discussions?.length > 0 && /*#__PURE__*/_jsx(Box, {
|
|
@@ -1248,7 +1250,7 @@ function Classroom({
|
|
|
1248
1250
|
}
|
|
1249
1251
|
}
|
|
1250
1252
|
return 0;
|
|
1251
|
-
}, [isCreator
|
|
1253
|
+
}, [isCreator, tabs?.length]); // only recompute if isCreator or tabs change
|
|
1252
1254
|
|
|
1253
1255
|
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
1254
1256
|
children: [/*#__PURE__*/_jsxs("div", {
|
|
@@ -176,7 +176,7 @@ function OverflowMenu({
|
|
|
176
176
|
}), /*#__PURE__*/_jsx(Typography, {
|
|
177
177
|
children: t("leave_course")
|
|
178
178
|
})]
|
|
179
|
-
}), isCreator &&
|
|
179
|
+
}), isCreator && /*#__PURE__*/_jsxs(MenuItem, {
|
|
180
180
|
onClick: subscription.isPaidUser ? () => {
|
|
181
181
|
handleOpenInviteDialog();
|
|
182
182
|
handleClose();
|
|
@@ -36,7 +36,8 @@ const MeetingPromptsList = withStyles(({
|
|
|
36
36
|
setSelectedRecording,
|
|
37
37
|
selectedRecording,
|
|
38
38
|
getMeeting,
|
|
39
|
-
getRecordings
|
|
39
|
+
getRecordings,
|
|
40
|
+
startTimes = {}
|
|
40
41
|
}) => {
|
|
41
42
|
const [selectedGroup, setSelectedGroup] = useState({});
|
|
42
43
|
const [isDialogOpen, setDialogOpen] = useState(false);
|
|
@@ -392,7 +393,9 @@ const MeetingPromptsList = withStyles(({
|
|
|
392
393
|
handleCreateFeedback: handleCreateFeedback,
|
|
393
394
|
onFeedbackSubmitted: getRecordings,
|
|
394
395
|
editBackgroundImages: editBackgroundImages[0],
|
|
395
|
-
editMeetingImages: editMeetingImages[0]
|
|
396
|
+
editMeetingImages: editMeetingImages[0],
|
|
397
|
+
goToTimestamp: goToTimestamp,
|
|
398
|
+
startTimes: startTimes
|
|
396
399
|
}), /*#__PURE__*/_jsx(Dialog, {
|
|
397
400
|
role: "dialog",
|
|
398
401
|
open: isRecordingDialogOpen,
|
|
@@ -64,9 +64,7 @@ export default function useExerciseState({
|
|
|
64
64
|
classroomId,
|
|
65
65
|
i18nLanguage,
|
|
66
66
|
isDynamicResponsesEnabled,
|
|
67
|
-
aiChatbotConversationHistory
|
|
68
|
-
isUserInternal,
|
|
69
|
-
handleStudentMisuse
|
|
67
|
+
aiChatbotConversationHistory
|
|
70
68
|
}) {
|
|
71
69
|
const navigate = useNavigate();
|
|
72
70
|
const [questions, setQuestions] = useState([]);
|
|
@@ -1669,28 +1667,6 @@ export default function useExerciseState({
|
|
|
1669
1667
|
exerciseCompletion.description = description;
|
|
1670
1668
|
const formattedBotMessages = await formatBotMessages(botMessages);
|
|
1671
1669
|
exerciseCompletion.messages = formattedBotMessages;
|
|
1672
|
-
const containsStudentInappropriate = formattedBotMessages.some(msg => msg?.studentInappropriate === true);
|
|
1673
|
-
const exerciseLink = `${window.location.origin}/courses/${courseId}/${sectionId}/${topicId}/activity/bot?botId=${botId}`;
|
|
1674
|
-
if (containsStudentInappropriate) {
|
|
1675
|
-
const responseFromMisuse = await handleStudentMisuse({
|
|
1676
|
-
params: {
|
|
1677
|
-
exerciseLink,
|
|
1678
|
-
exerciseName,
|
|
1679
|
-
problemDescription: "Student has been acting inapprpriately within your exercise"
|
|
1680
|
-
},
|
|
1681
|
-
botId: bot.botId,
|
|
1682
|
-
startTime,
|
|
1683
|
-
courseId,
|
|
1684
|
-
sectionId,
|
|
1685
|
-
topicId,
|
|
1686
|
-
exerciseLink
|
|
1687
|
-
});
|
|
1688
|
-
if (responseFromMisuse && responseFromMisuse.error) {
|
|
1689
|
-
openSnackbar(responseFromMisuse.error, "error");
|
|
1690
|
-
} else {
|
|
1691
|
-
openSnackbar(t("student_misuse_reported"), "info");
|
|
1692
|
-
}
|
|
1693
|
-
}
|
|
1694
1670
|
} else if (exerciseName === "roleplay") {
|
|
1695
1671
|
const {
|
|
1696
1672
|
picture,
|
|
@@ -1698,9 +1674,6 @@ export default function useExerciseState({
|
|
|
1698
1674
|
description,
|
|
1699
1675
|
roleplayId
|
|
1700
1676
|
} = roleplay;
|
|
1701
|
-
// temp disabled unanswered questions because was seeing answered questions appeaing in this array
|
|
1702
|
-
// script.slice(roleplayMessages.length);
|
|
1703
|
-
// const unansweredQuestions = script.filter(scriptLine => scriptLine.question && scriptLine.answers);
|
|
1704
1677
|
exerciseCompletion.gameId = gameId;
|
|
1705
1678
|
exerciseCompletion.selectedActor = isActorOne ? 1 : 2;
|
|
1706
1679
|
exerciseCompletion.actor1 = roleplay.actor1;
|
|
@@ -159,7 +159,8 @@ export default function useRecognition(props = {}) {
|
|
|
159
159
|
speechContexts: gcloudParams.speechContexts,
|
|
160
160
|
maxAlternatives: gcloudParams.maxAlternatives || 10,
|
|
161
161
|
enableWordConfidence: gcloudParams.enableWordConfidence || false,
|
|
162
|
-
model: gcloudParams.model
|
|
162
|
+
model: gcloudParams.model,
|
|
163
|
+
enableAutomaticPunctuation: true
|
|
163
164
|
},
|
|
164
165
|
single_utterance: gcloudParams.single_utterance,
|
|
165
166
|
interimResults: gcloudParams.interimResults // If you want interim results, set this to true
|