@nualang/nualang-ui-components 0.1.1193 → 0.1.1194

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.
@@ -69,11 +69,7 @@ function OverflowMenu({
69
69
  onClick: leaveClassroom
70
70
  }, /*#__PURE__*/_react.default.createElement(_CardElements.CardMenuIcon, null, /*#__PURE__*/_react.default.createElement(_ExitToApp.default, {
71
71
  fontSize: "small"
72
- })), /*#__PURE__*/_react.default.createElement(_material.Typography, null, t("leave_classroom"))), isCreator && /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
73
- onClick: viewClassroom
74
- }, /*#__PURE__*/_react.default.createElement(_CardElements.CardMenuIcon, null, /*#__PURE__*/_react.default.createElement(_Edit.default, {
75
- fontSize: "small"
76
- })), /*#__PURE__*/_react.default.createElement(_material.Typography, null, t("manage_classroom"))));
72
+ })), /*#__PURE__*/_react.default.createElement(_material.Typography, null, t("leave_classroom"))));
77
73
  }
78
74
  function ClassroomLoading() {
79
75
  return /*#__PURE__*/_react.default.createElement(_CardElements.CardContainer, null, /*#__PURE__*/_react.default.createElement(_CardElements.CardTop, null, /*#__PURE__*/_react.default.createElement(_Skeleton.default, {
@@ -81,11 +81,7 @@ function OverflowMenu({
81
81
  onClick: leaveCourse
82
82
  }, /*#__PURE__*/_react.default.createElement(_CardElements.CardMenuIcon, null, /*#__PURE__*/_react.default.createElement(_ExitToApp.default, {
83
83
  fontSize: "small"
84
- })), /*#__PURE__*/_react.default.createElement(_material.Typography, null, t("leave_course"))), isCreator && !isClassroomArchived && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
85
- onClick: viewCourse
86
- }, /*#__PURE__*/_react.default.createElement(_CardElements.CardMenuIcon, null, /*#__PURE__*/_react.default.createElement(_Edit.default, {
87
- fontSize: "small"
88
- })), /*#__PURE__*/_react.default.createElement(_material.Typography, null, t("manage_course"))), handleDuplicateCourse && /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
84
+ })), /*#__PURE__*/_react.default.createElement(_material.Typography, null, t("leave_course"))), isCreator && !isClassroomArchived && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, handleDuplicateCourse && /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
89
85
  onClick: async () => {
90
86
  handleClose();
91
87
  await handleDuplicateCourse(course);
@@ -37,13 +37,17 @@ function TotalGrades({
37
37
  }]]);
38
38
  recordings.forEach(recording => {
39
39
  for (let i = 0; i <= 7; i++) {
40
- if (recording[`feedback${i}`]) {
40
+ const feedback = recording[`feedback${i}`];
41
+ if (feedback && feedback[0]) {
41
42
  const {
42
43
  feedbackLevelName,
43
44
  methodCheck
44
- } = recording[`feedback${i}`][0];
45
+ } = feedback[0];
45
46
  if (feedbackLevelName && methodCheck) {
46
- feedbackCounts.get(feedbackLevelName)[methodCheck] += 1;
47
+ const feedbackLevel = feedbackCounts.get(feedbackLevelName);
48
+ if (feedbackLevel) {
49
+ feedbackLevel[methodCheck] += 1;
50
+ }
47
51
  }
48
52
  }
49
53
  }
@@ -12,6 +12,8 @@ var _Grid = _interopRequireDefault(require("@mui/material/Grid"));
12
12
  var _FeedbackDialog = _interopRequireDefault(require("../FeedbackDialog/FeedbackDialog"));
13
13
  var _propTypes = _interopRequireDefault(require("prop-types"));
14
14
  var _material = require("@mui/material");
15
+ var _Error = _interopRequireDefault(require("@mui/icons-material/Error"));
16
+ var _colors = require("@mui/material/colors");
15
17
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
18
  /* eslint-disable react/prop-types */
17
19
 
@@ -92,13 +94,37 @@ function RecordingDialog({
92
94
  playerRef,
93
95
  conversation,
94
96
  handleCreateFeedback,
95
- attendeesData
97
+ attendeesData,
98
+ hasBadLanguage
96
99
  }) {
97
100
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, attendeesData.length > 0 && /*#__PURE__*/_react.default.createElement(_ResponsiveDialog.default, {
98
101
  open: open,
99
102
  handleClose: handleClose,
100
103
  maxWidth: 1,
101
- dialogTitle: t("recording_info")
104
+ dialogTitle: /*#__PURE__*/_react.default.createElement(_material.Box, {
105
+ sx: {
106
+ display: "flex",
107
+ alignItems: "center",
108
+ gap: 2
109
+ }
110
+ }, /*#__PURE__*/_react.default.createElement(_material.Typography, null, t("recording_info")), hasBadLanguage && /*#__PURE__*/_react.default.createElement(_material.Box, {
111
+ sx: {
112
+ display: "flex",
113
+ alignItems: "center",
114
+ px: 2,
115
+ py: 1,
116
+ backgroundColor: _colors.red[800],
117
+ borderRadius: "4px",
118
+ color: "white"
119
+ }
120
+ }, /*#__PURE__*/_react.default.createElement(_Error.default, {
121
+ sx: {
122
+ mr: 1
123
+ }
124
+ }), /*#__PURE__*/_react.default.createElement(_material.Typography, {
125
+ fontWeight: "bold",
126
+ variant: "subtitle1"
127
+ }, t("inappropriate_language_detected"))))
102
128
  }, /*#__PURE__*/_react.default.createElement(_Grid.default, {
103
129
  container: true,
104
130
  spacing: 2
@@ -162,8 +162,7 @@ function Pronouncer({
162
162
  uploadAudioAttempt,
163
163
  languageTag,
164
164
  trackRecommendedEvent,
165
- parentClassroom,
166
- isHeritageSpeaker = false
165
+ parentClassroom
167
166
  }) {
168
167
  (0, _useExerciseDocumentTitle.default)({
169
168
  exerciseTitle: "Pronunciation",
@@ -265,8 +264,7 @@ function Pronouncer({
265
264
  indicateEndStream,
266
265
  disableShuffle,
267
266
  toggleMuteSound,
268
- audioBlob,
269
- isHeritageSpeaker
267
+ audioBlob
270
268
  });
271
269
  const {
272
270
  questions,
@@ -629,9 +627,9 @@ function Pronouncer({
629
627
  wordList: currentPhrase ? (0, _utils.removeExtraWhiteSpaces)(currentPhrase.phrase).split(" ") : [],
630
628
  disableTranslation: false,
631
629
  isMessage: false,
632
- muteSound: isHeritageSpeaker ? true : muteSound,
630
+ muteSound: muteSound,
633
631
  t: t
634
- }), learnLang !== "irish" && !isHeritageSpeaker && /*#__PURE__*/_react.default.createElement(_material.Box, null, /*#__PURE__*/_react.default.createElement(_WaveFormLite.default, {
632
+ }), learnLang !== "irish" && /*#__PURE__*/_react.default.createElement(_material.Box, null, /*#__PURE__*/_react.default.createElement(_WaveFormLite.default, {
635
633
  src: pollyResult ? pollyResult : "",
636
634
  controls: false,
637
635
  isSpeaking: isSpeaking,
@@ -71,7 +71,8 @@ function RoleplayGame({
71
71
  stopAudio,
72
72
  languageInformation,
73
73
  translationEnabled,
74
- parentClassroom
74
+ parentClassroom,
75
+ isHeritageSpeaker = false
75
76
  }) {
76
77
  (0, _useExerciseDocumentTitle.default)({
77
78
  exerciseTitle: "Fill in the blanks",
@@ -124,7 +125,8 @@ function RoleplayGame({
124
125
  },
125
126
  clearQueue,
126
127
  stopAudio,
127
- languageInformation
128
+ languageInformation,
129
+ isHeritageSpeaker
128
130
  });
129
131
  const {
130
132
  muteSound,
@@ -264,7 +266,7 @@ function RoleplayGame({
264
266
  handleOpenVoiceSpeedMenu: handleOpenVoiceSpeedMenu,
265
267
  handleCloseVoiceSpeedMenu: handleCloseVoiceSpeedMenu,
266
268
  handleChangeVoiceSpeed: handleChangeVoiceSpeed,
267
- muteSound: muteSound,
269
+ muteSound: isHeritageSpeaker ? true : muteSound,
268
270
  handleMute: handleMute,
269
271
  isReportProblemOpen: isReportProblemOpen,
270
272
  handleOpenReportProblem: handleOpenReportProblem,
@@ -301,7 +303,7 @@ function RoleplayGame({
301
303
  gameId: gameId,
302
304
  formatUnderscores: false,
303
305
  hideBottomBar: true,
304
- muteSound: muteSound
306
+ muteSound: isHeritageSpeaker ? true : muteSound
305
307
  }), /*#__PURE__*/_react.default.createElement(_InProgressExercise.default, {
306
308
  t: t,
307
309
  open: isInProgressModalOpen,
@@ -34,7 +34,7 @@ function RoleplayGames({
34
34
  sx: {
35
35
  m: 2
36
36
  }
37
- }, t("choose_game_mode"))), gameList.map((game, index) => !gamesHidden[game.gameId] && !((game.gameId === "act-it-out-listening" || game.gameId === "act-it-out-listening-speaking") && isHeritageSpeaker) || isCreator ? /*#__PURE__*/_react.default.createElement(_Grid.default, {
37
+ }, t("choose_game_mode"))), gameList.map((game, index) => !gamesHidden[game.gameId] && !((game.gameId === "act-it-out-listening" || game.gameId === "act-it-out-listening-speaking" || game.gameId === "act-it-out-speaking") && isHeritageSpeaker) || isCreator ? /*#__PURE__*/_react.default.createElement(_Grid.default, {
38
38
  item: true,
39
39
  xs: 12,
40
40
  key: index,
@@ -33,7 +33,7 @@ function Adornment(props) {
33
33
  const {
34
34
  t = text => text,
35
35
  onChange,
36
- characters = ["¡", "¿", "ß", "à", "á", "â", "ã", "ä", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ñ", "ò", "ó", "ô", "õ", "ö", "ù", "ú", "û", "ü", "œ", "À", "Á", "Â", "Ã", "Ä", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "Ù", "Ú", "Û", "Ü"],
36
+ characters,
37
37
  emoji,
38
38
  name,
39
39
  value,
@@ -43,61 +43,50 @@ function Adornment(props) {
43
43
  width = 90,
44
44
  title = "accents_and_special_characters",
45
45
  activeRef,
46
- learnLang,
47
46
  whiteIcon = false,
48
47
  isDisabled,
49
- isEditView,
50
- setIsDisabled,
51
- setIsButtonClicked
48
+ isEditView
52
49
  } = props;
53
50
  const theme = (0, _styles.useTheme)();
54
- const isEnglish = learnLang === "english";
55
- const isSmallScreen = (0, _useMediaQuery.default)("(max-width:420px)");
56
- const {
57
- selectionStart
58
- } = activeRef && activeRef.current ? activeRef.current : {};
59
- const [anchorEl, setAnchorEl] = _react.default.useState(null);
60
- const handleClick = event => {
61
- setAnchorEl(event.currentTarget);
62
- };
63
- const handleClose = () => {
64
- setAnchorEl(null);
65
- };
66
- const handleMouseDown = event => {
67
- event.preventDefault();
68
- };
51
+ const [anchorEl, setAnchorEl] = (0, _react.useState)(null);
69
52
  const [showEmojiPicker, setShowEmojiPicker] = (0, _react.useState)(false);
70
- const toggleEmojiPicker = () => {
71
- setShowEmojiPicker(!showEmojiPicker);
72
- };
73
- const handleToggleEmojiPicker = event => {
74
- if (event.key === "Enter" || event.key === " ") {
75
- // Handle insertPhoto on Enter or Space key press
76
- toggleEmojiPicker();
77
- }
78
- };
79
- const handleClickOption = option => {
80
- handleClose();
81
- const newText = [value.slice(0, selectionStart), `${option}`, value.slice(selectionStart)].join("");
53
+ const handleClickAccents = event => setAnchorEl(event.currentTarget);
54
+ const handleCloseAccents = () => setAnchorEl(null);
55
+ const toggleEmojiPicker = () => setShowEmojiPicker(prev => !prev);
56
+ const handleEmojiClose = () => setShowEmojiPicker(false);
57
+ const onEmojiClick = event => {
58
+ const newText = [value.slice(0, activeRef.current.selectionStart), `${event.emoji}`, value.slice(activeRef.current.selectionStart)].join("");
82
59
  onChange({
83
60
  target: {
84
61
  name: name,
85
62
  value: newText
86
63
  }
87
64
  });
88
- };
89
- const handleEmojiClose = () => {
90
65
  setShowEmojiPicker(false);
91
66
  };
92
- const onEmojiClick = event => {
93
- const newText = [value.slice(0, selectionStart), `${event.emoji}`, value.slice(selectionStart)].join("");
67
+ const handleClickOption = option => {
68
+ handleCloseAccents();
69
+ const newText = [value.slice(0, activeRef.current.selectionStart), `${option}`, value.slice(activeRef.current.selectionStart)].join("");
94
70
  onChange({
95
71
  target: {
96
72
  name: name,
97
73
  value: newText
98
74
  }
99
75
  });
100
- setShowEmojiPicker(false);
76
+ };
77
+ const handleKeyDown = event => {
78
+ const {
79
+ key,
80
+ target
81
+ } = event;
82
+ if (key === "Enter" || key === " ") {
83
+ event.preventDefault();
84
+ if (target.id === "emoji-button") {
85
+ toggleEmojiPicker();
86
+ } else if (target.id === "accents-button") {
87
+ handleClickAccents(event);
88
+ }
89
+ }
101
90
  };
102
91
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_InputAdornment.default, {
103
92
  position: adornmentPosition
@@ -111,48 +100,49 @@ function Adornment(props) {
111
100
  theme: theme.palette.mode === "dark" ? "dark" : "light",
112
101
  onEmojiClick: onEmojiClick
113
102
  })), /*#__PURE__*/_react.default.createElement(_Tooltip.default, {
114
- title: isDisabled ? t("Please select a textfield") : t("insert_emoji")
115
- }, /*#__PURE__*/_react.default.createElement("span", null, /*#__PURE__*/_react.default.createElement(_IconButton.default, {
103
+ title: t("insert_emoji")
104
+ }, /*#__PURE__*/_react.default.createElement(_IconButton.default, {
105
+ id: "emoji-button",
116
106
  edge: iconButtonEdge,
117
107
  "aria-haspopup": "true",
108
+ "aria-label": "Emoji Picker",
118
109
  onClick: toggleEmojiPicker,
110
+ onKeyDown: handleKeyDown,
119
111
  size: "large",
120
- "aria-label": "Emojis",
121
112
  disabled: isDisabled && !isEditView,
122
- onKeyDown: handleToggleEmojiPicker,
123
- onMouseDown: () => setIsButtonClicked(true),
124
- sx: theme => ({
113
+ sx: {
125
114
  padding: "8px",
126
115
  ...(whiteIcon && {
127
116
  "& svg": {
128
117
  fill: theme.palette.mode === "light" ? "white" : "inherit"
129
118
  }
130
119
  })
131
- })
132
- }, /*#__PURE__*/_react.default.createElement(_reactFeather.Smile, null))))), !isEnglish && characters && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Tooltip.default, {
120
+ }
121
+ }, /*#__PURE__*/_react.default.createElement(_reactFeather.Smile, null)))), characters && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Tooltip.default, {
133
122
  title: t(title)
134
123
  }, /*#__PURE__*/_react.default.createElement(_IconButton.default, {
135
- onMouseDown: handleMouseDown,
136
- onClick: handleClick,
124
+ id: "accents-button",
125
+ onClick: handleClickAccents,
126
+ onKeyDown: handleKeyDown,
137
127
  edge: iconButtonEdge,
138
128
  "aria-haspopup": "true",
139
- icon: icon,
140
129
  "aria-expanded": Boolean(anchorEl),
130
+ "aria-label": title,
141
131
  size: "large",
142
- sx: theme => ({
132
+ sx: {
143
133
  padding: "8px",
144
134
  ...(whiteIcon && {
145
135
  "& svg": {
146
136
  fill: theme.palette.mode === "light" ? "white" : "inherit"
147
137
  }
148
138
  })
149
- })
139
+ }
150
140
  }, icon)), /*#__PURE__*/_react.default.createElement(_Menu.default, {
151
- id: `char-menu-${(0, _index.randomId)()}`,
141
+ id: `char-menu-${name}`,
152
142
  anchorEl: anchorEl,
153
143
  keepMounted: true,
154
144
  open: Boolean(anchorEl),
155
- onClose: handleClose,
145
+ onClose: handleCloseAccents,
156
146
  PaperProps: {
157
147
  style: {
158
148
  maxHeight: 48 * 4.5,
@@ -179,16 +169,30 @@ function InputHelper(props) {
179
169
  learnLang
180
170
  } = props;
181
171
  const textInput = (0, _react.useRef)(null);
182
- const activeRef = inputRef ? inputRef : textInput;
172
+ const activeRef = inputRef || textInput;
183
173
  const helperTextId = helperText && id ? `${id}-helper-text` : undefined;
184
174
  const inputLabelId = label && id ? `${id}-label` : undefined;
175
+ const handleKeyDown = event => {
176
+ if ((event.key === "Enter" || event.key === " ") && adornmentPosition) {
177
+ const adornmentButton = document.getElementById(`${id}-adornment`);
178
+ if (adornmentButton) {
179
+ adornmentButton.click();
180
+ event.preventDefault();
181
+ }
182
+ }
183
+ };
185
184
  const adornment = characters ? /*#__PURE__*/_react.default.createElement(Adornment, _extends({}, props, {
186
185
  activeRef: activeRef,
187
- learnLang: learnLang
186
+ learnLang: learnLang,
187
+ id: `${id}-adornment`,
188
+ role: "button",
189
+ tabIndex: 0,
190
+ "aria-haspopup": "true",
191
+ onKeyDown: handleKeyDown
188
192
  })) : null;
189
193
  return /*#__PURE__*/_react.default.createElement(_FormControl.default, _extends({}, props, {
190
194
  id: props.id ? `${props.id}FormControl` : undefined
191
- }), /*#__PURE__*/_react.default.createElement(_InputLabel.default, {
195
+ }), label && /*#__PURE__*/_react.default.createElement(_InputLabel.default, {
192
196
  htmlFor: id,
193
197
  id: `${inputLabelId}${(0, _index.randomId)()}`,
194
198
  sx: theme => ({
@@ -199,9 +203,11 @@ function InputHelper(props) {
199
203
  startAdornment: adornmentPosition === "start" ? adornment : null,
200
204
  endAdornment: adornmentPosition === "end" ? adornment : null,
201
205
  inputRef: activeRef,
206
+ autoFocus: autofocus,
202
207
  inputProps: {
203
208
  maxLength
204
- }
209
+ },
210
+ onKeyDown: handleKeyDown
205
211
  })), variant === "outlined" && /*#__PURE__*/_react.default.createElement(_OutlinedInput.default, _extends({}, props, {
206
212
  margin: margin === "normal" ? "none" : margin,
207
213
  startAdornment: adornmentPosition === "start" ? adornment : null,
@@ -211,7 +217,8 @@ function InputHelper(props) {
211
217
  autoFocus: autofocus,
212
218
  inputProps: {
213
219
  maxLength
214
- }
220
+ },
221
+ onKeyDown: handleKeyDown
215
222
  })), (variant === "standard" || variant !== "outlined" && variant !== "filled") && /*#__PURE__*/_react.default.createElement(_Input.default, _extends({}, props, {
216
223
  startAdornment: adornmentPosition === "start" ? adornment : null,
217
224
  endAdornment: adornmentPosition === "end" ? adornment : null,
@@ -15,9 +15,12 @@ var _Skeleton = _interopRequireDefault(require("@mui/material/Skeleton"));
15
15
  var _Members = _interopRequireDefault(require("../../Misc/NotFound/Members"));
16
16
  var _luxon = require("luxon");
17
17
  var _useConfirm = _interopRequireDefault(require("../../hooks/useConfirm"));
18
+ var _styles = require("@mui/material/styles");
19
+ var _Tooltip = require("@mui/material/Tooltip");
18
20
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
19
21
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
20
22
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
23
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
21
24
  const useStyles = (0, _mui.makeStyles)()(theme => ({
22
25
  root: {
23
26
  width: "100%",
@@ -87,6 +90,53 @@ function Member(props) {
87
90
  width: "100%"
88
91
  })));
89
92
  }
93
+ const HtmlTooltip = (0, _styles.styled)(({
94
+ className,
95
+ ...props
96
+ }) => /*#__PURE__*/_react.default.createElement(_material.Tooltip, _extends({}, props, {
97
+ classes: {
98
+ popper: className
99
+ },
100
+ title: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
101
+ style: {
102
+ fontWeight: "bold",
103
+ marginBottom: "8px"
104
+ }
105
+ }, t("heritage_speaker")), /*#__PURE__*/_react.default.createElement("div", {
106
+ style: {
107
+ marginBottom: "8px"
108
+ }
109
+ }, t("heritage_speaker_desc")), /*#__PURE__*/_react.default.createElement("ul", {
110
+ style: {
111
+ marginLeft: "16px",
112
+ marginBottom: "8px",
113
+ paddingLeft: "0"
114
+ }
115
+ }, /*#__PURE__*/_react.default.createElement("li", null, t("heritage_speaker_point_1")), /*#__PURE__*/_react.default.createElement("li", null, t("heritage_speaker_point_2"))), /*#__PURE__*/_react.default.createElement("div", {
116
+ style: {
117
+ fontSize: "12px"
118
+ }
119
+ }, t("freely_changed")))
120
+ })))(({
121
+ theme
122
+ }) => ({
123
+ [`& .${_Tooltip.tooltipClasses.tooltip}`]: {
124
+ padding: theme.spacing(2),
125
+ backgroundColor: theme.palette.background.paper,
126
+ color: theme.palette.text.primary,
127
+ fontSize: theme.typography.pxToRem(12),
128
+ border: `1px solid ${theme.palette.divider}`
129
+ },
130
+ [`& ul`]: {
131
+ listStyleType: "disc",
132
+ paddingLeft: theme.spacing(2),
133
+ margin: 0
134
+ },
135
+ [`& li`]: {
136
+ display: "list-item",
137
+ marginBottom: theme.spacing(0.5)
138
+ }
139
+ }));
90
140
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_material.ListItem, {
91
141
  ContainerComponent: "div",
92
142
  secondaryAction: isCreator && handleDeleteClassroomMember && !isClassroomArchived ? /*#__PURE__*/_react.default.createElement(_material.Tooltip, {
@@ -112,12 +162,14 @@ function Member(props) {
112
162
  display: "flex",
113
163
  alignItems: "center",
114
164
  gap: "8px"
115
- }, member.username, /*#__PURE__*/_react.default.createElement(_material.Chip, {
165
+ }, member.username, /*#__PURE__*/_react.default.createElement(HtmlTooltip, {
166
+ placement: "right"
167
+ }, /*#__PURE__*/_react.default.createElement(_material.Chip, {
116
168
  label: t("heritage_speaker"),
117
169
  size: "small",
118
170
  variant: "outlined",
119
171
  color: "primary"
120
- })) : member.username,
172
+ }))) : member.username,
121
173
  secondary: `Joined ${_luxon.DateTime.fromMillis(member.createdAt).toRelative()}`
122
174
  }), /*#__PURE__*/_react.default.createElement(_material.Box, {
123
175
  className: classes.actionsWrapper
@@ -139,7 +191,9 @@ function Member(props) {
139
191
  "aria-label": `Unmark as heritage speaker: ${member.username}`
140
192
  }, /*#__PURE__*/_react.default.createElement(_material.ListItemText, {
141
193
  primary: t("unmark_as_heritage_speaker")
142
- })) : /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
194
+ })) : /*#__PURE__*/_react.default.createElement(HtmlTooltip, {
195
+ placement: "right"
196
+ }, /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
143
197
  onClick: () => {
144
198
  handleUpdateClassroomMember(member.classroomId, member.memberId, {
145
199
  isHeritageSpeaker: true
@@ -148,7 +202,7 @@ function Member(props) {
148
202
  "aria-label": `Mark as heritage speaker: ${member.username}`
149
203
  }, /*#__PURE__*/_react.default.createElement(_material.ListItemText, {
150
204
  primary: t("mark_as_heritage_speaker")
151
- }))), /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
205
+ })))), /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
152
206
  onClick: deleteClassroomMember,
153
207
  "aria-label": `Delete Member: ${member.username}`
154
208
  }, /*#__PURE__*/_react.default.createElement(_material.ListItemText, {
@@ -380,7 +380,8 @@ function Classroom({
380
380
  editBackgroundImages,
381
381
  editMeetingImages,
382
382
  setSelectedDiscussion,
383
- meetingRecsData
383
+ meetingRecsData,
384
+ hasBadLanguage
384
385
  } = vchatProps;
385
386
  const isSmallScreen = (0, _useMediaQuery.default)("(max-width:410px)");
386
387
  const {
@@ -792,7 +793,8 @@ function Classroom({
792
793
  reportFilters: reportFilters,
793
794
  filter: filter,
794
795
  handleFilterChange: handleFilterChange,
795
- submissions: submissionsTableData
796
+ submissions: submissionsTableData,
797
+ featureFlags: featureFlags
796
798
  }))
797
799
  }, ...(isVideoChatEnabled && isNualangLiveEnabled && (isMember && isVideoChatEnabledInSettings || isCreator) ? [{
798
800
  label: t("discuss"),
@@ -853,7 +855,8 @@ function Classroom({
853
855
  getRecordings: getRecordings,
854
856
  selectedRecording: selectedRecording,
855
857
  setSelectedRecording: setSelectedRecording,
856
- meetingRecsData: meetingRecsData
858
+ meetingRecsData: meetingRecsData,
859
+ hasBadLanguage: hasBadLanguage
857
860
  }))), discussions?.length > 0 && /*#__PURE__*/_react.default.createElement("div", {
858
861
  id: "discussScheduled"
859
862
  }, /*#__PURE__*/_react.default.createElement(_ScheduleListCards.default, {
@@ -146,7 +146,8 @@ function Progress({
146
146
  filter,
147
147
  handleFilterChange,
148
148
  submissions,
149
- courseIds
149
+ courseIds,
150
+ featureFlags
150
151
  }) {
151
152
  const theme = (0, _styles.useTheme)();
152
153
  const isSmallScreen = (0, _useMediaQuery.default)(theme.breakpoints.down("sm"));
@@ -476,7 +477,8 @@ function Progress({
476
477
  filter: filter,
477
478
  roleplays: roleplays,
478
479
  bots: bots,
479
- courseIds: courseIds
480
+ courseIds: courseIds,
481
+ featureFlags: featureFlags
480
482
  }));
481
483
  }
482
484
  var _default = exports.default = Progress;
@@ -515,7 +515,8 @@ function TableRow({
515
515
  roleplays,
516
516
  bots,
517
517
  index,
518
- courseIds
518
+ courseIds,
519
+ featureFlags
519
520
  }) {
520
521
  const {
521
522
  memberId
@@ -572,7 +573,16 @@ function TableRow({
572
573
  sx: {
573
574
  fontWeight: "bold"
574
575
  }
575
- }, member.username), /*#__PURE__*/_react.default.createElement(_DefaultColourButton.default, {
576
+ }, featureFlags.heritageSpeakers && member.isHeritageSpeaker ? /*#__PURE__*/_react.default.createElement(_Box.default, {
577
+ display: "flex",
578
+ alignItems: "center",
579
+ gap: "8px"
580
+ }, member.username, /*#__PURE__*/_react.default.createElement(_material.Chip, {
581
+ label: t("heritage_speaker"),
582
+ size: "small",
583
+ variant: "outlined",
584
+ color: "primary"
585
+ })) : member.username), /*#__PURE__*/_react.default.createElement(_DefaultColourButton.default, {
576
586
  startIcon: /*#__PURE__*/_react.default.createElement(_Timeline.default, null),
577
587
  size: "small",
578
588
  component: _reactRouterDom.Link,
@@ -695,7 +705,8 @@ function ProgressTable({
695
705
  hideSorting,
696
706
  roleplays,
697
707
  bots,
698
- courseIds
708
+ courseIds,
709
+ featureFlags
699
710
  }) {
700
711
  const exercisesArray = ["translation", "listening", "pronunciation"];
701
712
  const roleplayGames = ["story", "fill_in_blanks", "act_it_out", "act_it_out_listening", "act_it_out_speaking", "act_it_out_listening_speaking"];
@@ -1080,7 +1091,8 @@ function ProgressTable({
1080
1091
  roleplays: roleplays,
1081
1092
  bots: bots,
1082
1093
  index: i,
1083
- courseIds: courseIds
1094
+ courseIds: courseIds,
1095
+ featureFlags: featureFlags
1084
1096
  })))));
1085
1097
  }
1086
1098
  var _default = exports.default = ProgressTable;
@@ -32,6 +32,7 @@ const RecordingListCards = (0, _mui.withStyles)(({
32
32
  selectedRecording,
33
33
  handleGradeConversation,
34
34
  aiGrade,
35
+ hasBadLanguage,
35
36
  t = text => text,
36
37
  isTeacher = false,
37
38
  attendeesData = []
@@ -109,7 +110,8 @@ const RecordingListCards = (0, _mui.withStyles)(({
109
110
  getMeeting: getMeeting,
110
111
  conversation: conversation,
111
112
  handleGradeConversation: handleGradeConversation,
112
- aiGrade: aiGrade
113
+ aiGrade: aiGrade,
114
+ hasBadLanguage: hasBadLanguage
113
115
  }), /*#__PURE__*/_react.default.createElement(_FeedbackInfoDialog.default, {
114
116
  t: t,
115
117
  attendees: attendeeUsernames,
@@ -34,6 +34,7 @@ const SubmissionsTableCards = (0, _mui.withStyles)(({
34
34
  saveTranscript = () => {},
35
35
  getMeeting = () => {},
36
36
  meetingRecsData,
37
+ hasBadLanguage,
37
38
  resetVideoState = () => {},
38
39
  t = text => text
39
40
  }) => {
@@ -128,7 +129,8 @@ const SubmissionsTableCards = (0, _mui.withStyles)(({
128
129
  recordingsTableData: groupedData[groupedId],
129
130
  handleGradeConversation: handleGradeConversation,
130
131
  aiGrade: aiGrade,
131
- playerRef: playerRef
132
+ playerRef: playerRef,
133
+ hasBadLanguage: hasBadLanguage
132
134
  }))), /*#__PURE__*/_react.default.createElement(_material.List, null, uniqueGroups.slice(0, cardsToShow).map((discussion, i) => /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_material.Card, {
133
135
  "aria-label": `View Created Recording: ${discussion}`,
134
136
  key: i,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nualang/nualang-ui-components",
3
- "version": "0.1.1193",
3
+ "version": "0.1.1194",
4
4
  "main": "dist/index.js",
5
5
  "files": [
6
6
  "dist",