@schoolio/player 1.4.4 → 1.4.5

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/index.mjs CHANGED
@@ -103,6 +103,13 @@ var QuizApiClient = class {
103
103
  }
104
104
  return response.blob();
105
105
  }
106
+ async logError(params) {
107
+ try {
108
+ await this.request("POST", "/api/external/log-error", params);
109
+ } catch (e) {
110
+ console.warn("[QuizEngine] Failed to log error:", e);
111
+ }
112
+ }
106
113
  };
107
114
 
108
115
  // src/utils.ts
@@ -1023,8 +1030,191 @@ function QuestionChatPanel({
1023
1030
  ] });
1024
1031
  }
1025
1032
 
1033
+ // src/errors.ts
1034
+ var ERROR_DEFINITIONS = {
1035
+ QUIZ_NOT_FOUND: {
1036
+ code: "QUIZ_NOT_FOUND",
1037
+ userMessage: "We couldn't find this quiz",
1038
+ subMessage: "The quiz may have been removed or the link is incorrect.",
1039
+ cause: "The quiz ID does not exist in the database, or the quiz has been deleted.",
1040
+ isBlocking: true
1041
+ },
1042
+ ATTEMPT_NOT_FOUND: {
1043
+ code: "ATTEMPT_NOT_FOUND",
1044
+ userMessage: "We couldn't find this quiz attempt",
1045
+ subMessage: "The attempt may have expired or the link is incorrect.",
1046
+ cause: "The attempt ID does not exist, or the attempt has been deleted/archived.",
1047
+ isBlocking: true
1048
+ },
1049
+ QUIZ_EXPIRED: {
1050
+ code: "QUIZ_EXPIRED",
1051
+ userMessage: "This quiz has expired",
1052
+ subMessage: "The deadline for this quiz has passed.",
1053
+ cause: "The quiz end date/time has passed and submissions are no longer accepted.",
1054
+ isBlocking: true
1055
+ },
1056
+ QUIZ_NOT_STARTED: {
1057
+ code: "QUIZ_NOT_STARTED",
1058
+ userMessage: "This quiz is not available yet",
1059
+ subMessage: "Please check back when the quiz opens.",
1060
+ cause: "The quiz start date/time has not yet been reached.",
1061
+ isBlocking: true
1062
+ },
1063
+ NETWORK_ERROR: {
1064
+ code: "NETWORK_ERROR",
1065
+ userMessage: "Connection problem",
1066
+ subMessage: "Please check your internet connection and try again.",
1067
+ cause: "Unable to reach the server due to network connectivity issues.",
1068
+ isBlocking: true
1069
+ },
1070
+ SERVER_ERROR: {
1071
+ code: "SERVER_ERROR",
1072
+ userMessage: "Something went wrong on our end",
1073
+ subMessage: "Our team has been notified. Please try again later.",
1074
+ cause: "The server encountered an internal error (HTTP 500+).",
1075
+ isBlocking: true
1076
+ },
1077
+ UNAUTHORIZED: {
1078
+ code: "UNAUTHORIZED",
1079
+ userMessage: "Please sign in to continue",
1080
+ subMessage: "You need to be logged in to access this quiz.",
1081
+ cause: "The user is not authenticated (HTTP 401).",
1082
+ isBlocking: true
1083
+ },
1084
+ FORBIDDEN: {
1085
+ code: "FORBIDDEN",
1086
+ userMessage: "You don't have access to this quiz",
1087
+ subMessage: "Contact your instructor if you believe this is a mistake.",
1088
+ cause: "The user does not have permission to access this resource (HTTP 403).",
1089
+ isBlocking: true
1090
+ },
1091
+ TTS_FAILED: {
1092
+ code: "TTS_FAILED",
1093
+ userMessage: "Text-to-speech unavailable",
1094
+ subMessage: "Audio features are temporarily unavailable.",
1095
+ cause: "The text-to-speech service failed or is unreachable.",
1096
+ isBlocking: false
1097
+ },
1098
+ CHAT_FAILED: {
1099
+ code: "CHAT_FAILED",
1100
+ userMessage: "Chat assistance unavailable",
1101
+ subMessage: "The AI helper is temporarily unavailable.",
1102
+ cause: "The chat/AI service failed to initialize or respond.",
1103
+ isBlocking: false
1104
+ },
1105
+ SUBMISSION_FAILED: {
1106
+ code: "SUBMISSION_FAILED",
1107
+ userMessage: "Failed to submit your answer",
1108
+ subMessage: "Please try again. Your progress has been saved.",
1109
+ cause: "The answer submission request failed due to network or server issues.",
1110
+ isBlocking: false
1111
+ },
1112
+ UNKNOWN_ERROR: {
1113
+ code: "UNKNOWN_ERROR",
1114
+ userMessage: "Something unexpected happened",
1115
+ subMessage: "Please try refreshing the page.",
1116
+ cause: "An unclassified error occurred.",
1117
+ isBlocking: true
1118
+ }
1119
+ };
1120
+ function getErrorFromHttpStatus(status, context) {
1121
+ switch (status) {
1122
+ case 401:
1123
+ return "UNAUTHORIZED";
1124
+ case 403:
1125
+ return "FORBIDDEN";
1126
+ case 404:
1127
+ return context === "attempt" ? "ATTEMPT_NOT_FOUND" : "QUIZ_NOT_FOUND";
1128
+ case 410:
1129
+ return "QUIZ_EXPIRED";
1130
+ case 500:
1131
+ case 502:
1132
+ case 503:
1133
+ case 504:
1134
+ return "SERVER_ERROR";
1135
+ default:
1136
+ if (status >= 400 && status < 500) {
1137
+ return context === "attempt" ? "ATTEMPT_NOT_FOUND" : "QUIZ_NOT_FOUND";
1138
+ }
1139
+ return "UNKNOWN_ERROR";
1140
+ }
1141
+ }
1142
+ function getErrorFromMessage(message, context) {
1143
+ const lowerMessage = message.toLowerCase();
1144
+ if (lowerMessage.includes("network") || lowerMessage.includes("fetch") || lowerMessage.includes("connection")) {
1145
+ return "NETWORK_ERROR";
1146
+ }
1147
+ if (lowerMessage.includes("not found") || lowerMessage.includes("404")) {
1148
+ return context === "attempt" ? "ATTEMPT_NOT_FOUND" : "QUIZ_NOT_FOUND";
1149
+ }
1150
+ if (lowerMessage.includes("unauthorized") || lowerMessage.includes("401")) {
1151
+ return "UNAUTHORIZED";
1152
+ }
1153
+ if (lowerMessage.includes("forbidden") || lowerMessage.includes("403")) {
1154
+ return "FORBIDDEN";
1155
+ }
1156
+ if (lowerMessage.includes("expired")) {
1157
+ return "QUIZ_EXPIRED";
1158
+ }
1159
+ if (lowerMessage.includes("tts") || lowerMessage.includes("speech")) {
1160
+ return "TTS_FAILED";
1161
+ }
1162
+ if (lowerMessage.includes("chat")) {
1163
+ return "CHAT_FAILED";
1164
+ }
1165
+ return "UNKNOWN_ERROR";
1166
+ }
1167
+
1168
+ // src/MaintenanceScreen.tsx
1169
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
1170
+ function MaintenanceScreen({ errorCode }) {
1171
+ const errorDef = errorCode ? ERROR_DEFINITIONS[errorCode] : null;
1172
+ const message = errorDef?.userMessage || "Your quiz is on its way...";
1173
+ const subMessage = errorDef?.subMessage || "Please check back soon!";
1174
+ const containerStyle = {
1175
+ display: "flex",
1176
+ flexDirection: "column",
1177
+ alignItems: "center",
1178
+ justifyContent: "center",
1179
+ minHeight: "300px",
1180
+ padding: "40px",
1181
+ background: "linear-gradient(135deg, #f8f7ff 0%, #e8e4f8 50%, #f0ebff 100%)",
1182
+ borderRadius: "16px"
1183
+ };
1184
+ const iconStyle = {
1185
+ fontSize: "48px",
1186
+ marginBottom: "24px",
1187
+ color: "#8b5cf6"
1188
+ };
1189
+ const messageStyle = {
1190
+ fontSize: "20px",
1191
+ fontWeight: "600",
1192
+ color: "#4c1d95",
1193
+ textAlign: "center",
1194
+ marginBottom: "12px"
1195
+ };
1196
+ const submessageStyle = {
1197
+ fontSize: "14px",
1198
+ color: "#7c3aed",
1199
+ textAlign: "center",
1200
+ opacity: 0.8
1201
+ };
1202
+ return /* @__PURE__ */ jsxs3("div", { style: containerStyle, "data-testid": "maintenance-screen", "data-error-code": errorCode || "none", children: [
1203
+ /* @__PURE__ */ jsx3("div", { style: iconStyle, children: /* @__PURE__ */ jsxs3("svg", { width: "64", height: "64", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1204
+ /* @__PURE__ */ jsx3("circle", { cx: "12", cy: "12", r: "10" }),
1205
+ /* @__PURE__ */ jsx3("path", { d: "M12 8v4" }),
1206
+ /* @__PURE__ */ jsx3("path", { d: "M12 16h.01" })
1207
+ ] }) }),
1208
+ /* @__PURE__ */ jsx3("div", { style: messageStyle, "data-testid": "text-error-message", children: message }),
1209
+ /* @__PURE__ */ jsx3("div", { style: submessageStyle, "data-testid": "text-error-submessage", children: subMessage })
1210
+ ] });
1211
+ }
1212
+
1213
+ // src/assets/astronautData.ts
1214
+ var astronautImage = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB4AAAAQ4CAMAAADfDTFxAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAwBQTFRFYGBgsVEZcHBwq6urhYSEkZGRiomJuJsBMxoHJCAhUFBQQEBAXZu4ATtbnp6ev7+/dDURJnqMdnR1enl5ABoqAm2rVSYMamhpLCkqKCUlz8/PMS0uWksA39/fbmxtAViJEBAQAAAAzunzMDAwPDo6qKioj46OgICAoqKiOC8AOTU2oKCgaq3LNDExibbNQD4+mpqaV1RVRUJCZmRlpqampKSkSEVGlpaWUE5OTElKnJycIm5+mJiYXlxdf35+lJSUXFlaU1FSZGFiWFZWAV+UBGaebtLoWlhZqMjWTMjiS0hJc3FyAUlyidvtbGpraGZmb25ujYyMYF5ed3Z2F0lUFw4CAVB+////AUJnLCgpecXVKXyqfHp75eXlT0xN1dXVNzQ1hai8ksXZPzw9qNLlTn6UsOfywMDAICAgASxFwNzsEz1GgH5/R0RFJ1ZwOjc4JiIjNjM0KicoRmt4tra2HhscMi8vXVtbACU5CwsLLisreJ+xKUhWBHS0gYCBOzg5fnx9YmBghIOD/NQBITlHgH9/PMPgWVdYJyQlMCwtESYyIx8gTUtLgoGBPV5qSUdH8m4jg4KCVVNTAA8XfHt7DwcCAAcLAHW4FRQV7+/vr6+vBAwOOLfSDzE4LZKoHmJwRkNEQj9APjs8CyUqCBgcMZ62i4qLj4+P42chfXx8aWdoDw4OUk9QZWNjNavExVkcAGahGlViKYaal0UWjo2NbWtsiYiI1GAfh4aH7McBfmoBl5eXlZWVk5KSn5+fdHNzpaWlnZ2dfn19cW9viD4UkI+Qjo2OeHd33boBnoUBATNQzawBjncBbl0AnuHw7/b63+/3EBcbFH256urqEkpq+vr6mZmZElJ1GhgYU1xeo6OjGG6fm5ubEh4jRVdejIuM9fX1lpWWnp2elJOTICcrnJuboaGhornEE3WtQU5Wv9HaJzg8h5icQZSmz9jeeo+XY2xucHd7EjtTkJ2iBwYGfYqNGV+HMTtAQoWr8/v9v8bIw8vNIi0yZHyHFygs////mvWEFwAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAMcVSURBVHja7L3viyRnuf9f9CRCuhgLtAeTlj5TRcdTwSUkRo+bBDXG2SDoMIkubI/g8Sz4wBow5AdnzczAJsfAYGRXgo7MTPWjGA5pNAr7QEXQVNSQE9hnIsoiHvacj99z/oJ9dJ747brv+v2ju7q7qqa79/V6oMlmd3709vSrr+u+rvet/B0AAABqR+EhAAAAQMAAAAAIGAAAABAwAAAAAgYAAAAEDAAAgIABAAAAAQMAACBgAAAAQMAAAAAIGAAAAAEDAAAAAgaA6dE0zTkQKOqQhvzn4a92eGwAEDAAlE1bOzhQVd0YSVdVDhxMDICAAaCMktc5UC1jItTmQR8NAyBgAJjWvQOla0yLrjawMAACBoDJsPsNNb/CFTTNIfIfcytkqzlo82ACIGAAKFb5NjIKX0tVzIGmdXo5aFrf9XFGKdwcUAkDIGAAGE3HaaYKXsXU2r3CaI6ZKomtRp+HFgABA0CefQeJ0lc1+xOoN6bh5Pmxrjg2jzAAAgaAMfa1lMGU7g2wNTPekm46PMwACBgAIthON3Zs63R6JaGZsY+saDzYAAgYACR9JRqnYbZ75WL3lUiEh3XATBYAAgaAv9sHVrRJ3OlVQrsR/SyMZAEgYIDbHE2J2tfuVUjUwdYBE1kACBjg9sUJh6S6g06vcrSwF60rdKIBEDDAbYntWKEN272aiDi/yUAWAAIGuP30exAUo12nVyedRvCZVRQMgIABblf91lf8RsrgLgoGQMAAtyGBfnXT7p0KWhMFAyBggNuM4OzXck5Jv6ITHcxfNxnHAkDAAMuPFuq3d7qEClZYSgJAwADLTUedF/3GFKwf8FcDgIABlhf7YJ70G1OwxVEwAAIGWFb61imPXmUqWOUoGAABAywzgekac6RfMRHtLSXpA/6S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";
1215
+
1026
1216
  // src/QuizPlayer.tsx
1027
- import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
1217
+ import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
1028
1218
  var defaultStyles = {
1029
1219
  container: {
1030
1220
  fontFamily: "system-ui, -apple-system, sans-serif",
@@ -1387,7 +1577,7 @@ function SortingDragDrop({ items, currentOrder, correctOrder, showFeedback, onOr
1387
1577
  setDraggedIndex(null);
1388
1578
  setDragOverIndex(null);
1389
1579
  };
1390
- return /* @__PURE__ */ jsx3("div", { style: defaultStyles.options, children: currentOrder.map((itemIndex, position) => {
1580
+ return /* @__PURE__ */ jsx4("div", { style: defaultStyles.options, children: currentOrder.map((itemIndex, position) => {
1391
1581
  const isCorrectPosition = correctOrder?.[position] === itemIndex;
1392
1582
  const isDragging = draggedIndex === position;
1393
1583
  const isDragOver = dragOverIndex === position;
@@ -1410,7 +1600,7 @@ function SortingDragDrop({ items, currentOrder, correctOrder, showFeedback, onOr
1410
1600
  } else if (isDragOver) {
1411
1601
  itemStyle = { ...itemStyle, borderColor: "#6366f1", backgroundColor: "#eef2ff" };
1412
1602
  }
1413
- return /* @__PURE__ */ jsxs3(
1603
+ return /* @__PURE__ */ jsxs4(
1414
1604
  "div",
1415
1605
  {
1416
1606
  style: itemStyle,
@@ -1422,34 +1612,34 @@ function SortingDragDrop({ items, currentOrder, correctOrder, showFeedback, onOr
1422
1612
  onDrop: (e) => handleDrop(e, position),
1423
1613
  onDragEnd: handleDragEnd,
1424
1614
  children: [
1425
- !showFeedback && /* @__PURE__ */ jsx3("div", { style: {
1615
+ !showFeedback && /* @__PURE__ */ jsx4("div", { style: {
1426
1616
  cursor: "grab",
1427
1617
  padding: "4px",
1428
1618
  display: "flex",
1429
1619
  alignItems: "center",
1430
1620
  color: "#9ca3af"
1431
- }, children: /* @__PURE__ */ jsxs3("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1432
- /* @__PURE__ */ jsx3("circle", { cx: "9", cy: "5", r: "1" }),
1433
- /* @__PURE__ */ jsx3("circle", { cx: "9", cy: "12", r: "1" }),
1434
- /* @__PURE__ */ jsx3("circle", { cx: "9", cy: "19", r: "1" }),
1435
- /* @__PURE__ */ jsx3("circle", { cx: "15", cy: "5", r: "1" }),
1436
- /* @__PURE__ */ jsx3("circle", { cx: "15", cy: "12", r: "1" }),
1437
- /* @__PURE__ */ jsx3("circle", { cx: "15", cy: "19", r: "1" })
1621
+ }, children: /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1622
+ /* @__PURE__ */ jsx4("circle", { cx: "9", cy: "5", r: "1" }),
1623
+ /* @__PURE__ */ jsx4("circle", { cx: "9", cy: "12", r: "1" }),
1624
+ /* @__PURE__ */ jsx4("circle", { cx: "9", cy: "19", r: "1" }),
1625
+ /* @__PURE__ */ jsx4("circle", { cx: "15", cy: "5", r: "1" }),
1626
+ /* @__PURE__ */ jsx4("circle", { cx: "15", cy: "12", r: "1" }),
1627
+ /* @__PURE__ */ jsx4("circle", { cx: "15", cy: "19", r: "1" })
1438
1628
  ] }) }),
1439
- showFeedback && /* @__PURE__ */ jsx3("div", { style: {
1629
+ showFeedback && /* @__PURE__ */ jsx4("div", { style: {
1440
1630
  display: "flex",
1441
1631
  alignItems: "center",
1442
1632
  color: isCorrectPosition ? "#22c55e" : "#ef4444"
1443
- }, children: isCorrectPosition ? /* @__PURE__ */ jsxs3("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1444
- /* @__PURE__ */ jsx3("path", { d: "M22 11.08V12a10 10 0 1 1-5.93-9.14" }),
1445
- /* @__PURE__ */ jsx3("polyline", { points: "22 4 12 14.01 9 11.01" })
1446
- ] }) : /* @__PURE__ */ jsxs3("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1447
- /* @__PURE__ */ jsx3("circle", { cx: "12", cy: "12", r: "10" }),
1448
- /* @__PURE__ */ jsx3("line", { x1: "15", y1: "9", x2: "9", y2: "15" }),
1449
- /* @__PURE__ */ jsx3("line", { x1: "9", y1: "9", x2: "15", y2: "15" })
1633
+ }, children: isCorrectPosition ? /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1634
+ /* @__PURE__ */ jsx4("path", { d: "M22 11.08V12a10 10 0 1 1-5.93-9.14" }),
1635
+ /* @__PURE__ */ jsx4("polyline", { points: "22 4 12 14.01 9 11.01" })
1636
+ ] }) : /* @__PURE__ */ jsxs4("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1637
+ /* @__PURE__ */ jsx4("circle", { cx: "12", cy: "12", r: "10" }),
1638
+ /* @__PURE__ */ jsx4("line", { x1: "15", y1: "9", x2: "9", y2: "15" }),
1639
+ /* @__PURE__ */ jsx4("line", { x1: "9", y1: "9", x2: "15", y2: "15" })
1450
1640
  ] }) }),
1451
- /* @__PURE__ */ jsx3("span", { style: { flex: 1 }, children: items[itemIndex] }),
1452
- /* @__PURE__ */ jsx3("span", { onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx3(TextToSpeech, { text: items[itemIndex], size: "sm" }) })
1641
+ /* @__PURE__ */ jsx4("span", { style: { flex: 1 }, children: items[itemIndex] }),
1642
+ /* @__PURE__ */ jsx4("span", { onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx4(TextToSpeech, { text: items[itemIndex], size: "sm" }) })
1453
1643
  ]
1454
1644
  },
1455
1645
  itemIndex
@@ -1503,9 +1693,9 @@ function MatchingDragDrop({ leftItems, rightItems, currentMatches, correctMatche
1503
1693
  delete newMatches[leftItem];
1504
1694
  onMatchChange(newMatches);
1505
1695
  };
1506
- return /* @__PURE__ */ jsxs3("div", { style: { display: "flex", gap: "24px", flexWrap: "wrap" }, children: [
1507
- /* @__PURE__ */ jsxs3("div", { style: { flex: 1, minWidth: "200px", display: "flex", flexDirection: "column", gap: "8px" }, children: [
1508
- /* @__PURE__ */ jsx3("div", { style: { fontSize: "14px", fontWeight: "600", color: "#6b7280", marginBottom: "4px" }, children: "Match these items:" }),
1696
+ return /* @__PURE__ */ jsxs4("div", { style: { display: "flex", gap: "24px", flexWrap: "wrap" }, children: [
1697
+ /* @__PURE__ */ jsxs4("div", { style: { flex: 1, minWidth: "200px", display: "flex", flexDirection: "column", gap: "8px" }, children: [
1698
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: "14px", fontWeight: "600", color: "#6b7280", marginBottom: "4px" }, children: "Match these items:" }),
1509
1699
  leftItems.map((leftItem, idx) => {
1510
1700
  const matchedRight = currentMatches[leftItem];
1511
1701
  const correctMatch = correctMatches?.[leftItem];
@@ -1534,7 +1724,7 @@ function MatchingDragDrop({ leftItems, rightItems, currentMatches, correctMatche
1534
1724
  } else if (matchedRight) {
1535
1725
  rowStyle = { ...rowStyle, borderStyle: "solid", borderColor: "#22c55e" };
1536
1726
  }
1537
- return /* @__PURE__ */ jsxs3(
1727
+ return /* @__PURE__ */ jsxs4(
1538
1728
  "div",
1539
1729
  {
1540
1730
  style: rowStyle,
@@ -1543,9 +1733,9 @@ function MatchingDragDrop({ leftItems, rightItems, currentMatches, correctMatche
1543
1733
  onDragLeave: handleDragLeave,
1544
1734
  onDrop: (e) => handleDrop(e, leftItem),
1545
1735
  children: [
1546
- /* @__PURE__ */ jsx3("span", { style: { flex: 1, fontWeight: "500" }, children: leftItem }),
1547
- /* @__PURE__ */ jsx3("span", { style: { color: "#6b7280" }, children: "\u2192" }),
1548
- matchedRight ? /* @__PURE__ */ jsxs3("div", { style: {
1736
+ /* @__PURE__ */ jsx4("span", { style: { flex: 1, fontWeight: "500" }, children: leftItem }),
1737
+ /* @__PURE__ */ jsx4("span", { style: { color: "#6b7280" }, children: "\u2192" }),
1738
+ matchedRight ? /* @__PURE__ */ jsxs4("div", { style: {
1549
1739
  display: "flex",
1550
1740
  alignItems: "center",
1551
1741
  gap: "8px",
@@ -1554,8 +1744,8 @@ function MatchingDragDrop({ leftItems, rightItems, currentMatches, correctMatche
1554
1744
  borderRadius: "6px",
1555
1745
  fontSize: "14px"
1556
1746
  }, children: [
1557
- /* @__PURE__ */ jsx3("span", { children: matchedRight }),
1558
- !showFeedback && /* @__PURE__ */ jsx3(
1747
+ /* @__PURE__ */ jsx4("span", { children: matchedRight }),
1748
+ !showFeedback && /* @__PURE__ */ jsx4(
1559
1749
  "button",
1560
1750
  {
1561
1751
  onClick: () => handleClearMatch(leftItem),
@@ -1568,18 +1758,18 @@ function MatchingDragDrop({ leftItems, rightItems, currentMatches, correctMatche
1568
1758
  color: "#6b7280"
1569
1759
  },
1570
1760
  "aria-label": "Remove match",
1571
- children: /* @__PURE__ */ jsxs3("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1572
- /* @__PURE__ */ jsx3("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
1573
- /* @__PURE__ */ jsx3("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
1761
+ children: /* @__PURE__ */ jsxs4("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1762
+ /* @__PURE__ */ jsx4("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
1763
+ /* @__PURE__ */ jsx4("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
1574
1764
  ] })
1575
1765
  }
1576
1766
  ),
1577
- showFeedback && (isCorrect ? /* @__PURE__ */ jsx3("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "#22c55e", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx3("polyline", { points: "20 6 9 17 4 12" }) }) : /* @__PURE__ */ jsxs3("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "#ef4444", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1578
- /* @__PURE__ */ jsx3("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
1579
- /* @__PURE__ */ jsx3("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
1767
+ showFeedback && (isCorrect ? /* @__PURE__ */ jsx4("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "#22c55e", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx4("polyline", { points: "20 6 9 17 4 12" }) }) : /* @__PURE__ */ jsxs4("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "#ef4444", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1768
+ /* @__PURE__ */ jsx4("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
1769
+ /* @__PURE__ */ jsx4("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
1580
1770
  ] }))
1581
- ] }) : /* @__PURE__ */ jsx3("span", { style: { color: "#9ca3af", fontSize: "14px", fontStyle: "italic" }, children: "Drop here" }),
1582
- showFeedback && !isCorrect && correctMatch && /* @__PURE__ */ jsxs3("span", { style: { color: "#166534", fontSize: "13px", marginLeft: "8px" }, children: [
1771
+ ] }) : /* @__PURE__ */ jsx4("span", { style: { color: "#9ca3af", fontSize: "14px", fontStyle: "italic" }, children: "Drop here" }),
1772
+ showFeedback && !isCorrect && correctMatch && /* @__PURE__ */ jsxs4("span", { style: { color: "#166534", fontSize: "13px", marginLeft: "8px" }, children: [
1583
1773
  "(Correct: ",
1584
1774
  correctMatch,
1585
1775
  ")"
@@ -1590,11 +1780,11 @@ function MatchingDragDrop({ leftItems, rightItems, currentMatches, correctMatche
1590
1780
  );
1591
1781
  })
1592
1782
  ] }),
1593
- /* @__PURE__ */ jsxs3("div", { style: { flex: 1, minWidth: "200px", display: "flex", flexDirection: "column", gap: "8px" }, children: [
1594
- /* @__PURE__ */ jsx3("div", { style: { fontSize: "14px", fontWeight: "600", color: "#6b7280", marginBottom: "4px" }, children: "Drag to match:" }),
1783
+ /* @__PURE__ */ jsxs4("div", { style: { flex: 1, minWidth: "200px", display: "flex", flexDirection: "column", gap: "8px" }, children: [
1784
+ /* @__PURE__ */ jsx4("div", { style: { fontSize: "14px", fontWeight: "600", color: "#6b7280", marginBottom: "4px" }, children: "Drag to match:" }),
1595
1785
  unmatchedRightItems.length > 0 ? unmatchedRightItems.map((rightItem, idx) => {
1596
1786
  const isDragging = draggedItem === rightItem;
1597
- return /* @__PURE__ */ jsxs3(
1787
+ return /* @__PURE__ */ jsxs4(
1598
1788
  "div",
1599
1789
  {
1600
1790
  style: {
@@ -1614,20 +1804,20 @@ function MatchingDragDrop({ leftItems, rightItems, currentMatches, correctMatche
1614
1804
  onDragEnd: handleDragEnd,
1615
1805
  "data-testid": `draggable-right-${idx}`,
1616
1806
  children: [
1617
- !showFeedback && /* @__PURE__ */ jsx3("div", { style: { color: "#9ca3af", display: "flex" }, children: /* @__PURE__ */ jsxs3("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1618
- /* @__PURE__ */ jsx3("circle", { cx: "9", cy: "5", r: "1" }),
1619
- /* @__PURE__ */ jsx3("circle", { cx: "9", cy: "12", r: "1" }),
1620
- /* @__PURE__ */ jsx3("circle", { cx: "9", cy: "19", r: "1" }),
1621
- /* @__PURE__ */ jsx3("circle", { cx: "15", cy: "5", r: "1" }),
1622
- /* @__PURE__ */ jsx3("circle", { cx: "15", cy: "12", r: "1" }),
1623
- /* @__PURE__ */ jsx3("circle", { cx: "15", cy: "19", r: "1" })
1807
+ !showFeedback && /* @__PURE__ */ jsx4("div", { style: { color: "#9ca3af", display: "flex" }, children: /* @__PURE__ */ jsxs4("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1808
+ /* @__PURE__ */ jsx4("circle", { cx: "9", cy: "5", r: "1" }),
1809
+ /* @__PURE__ */ jsx4("circle", { cx: "9", cy: "12", r: "1" }),
1810
+ /* @__PURE__ */ jsx4("circle", { cx: "9", cy: "19", r: "1" }),
1811
+ /* @__PURE__ */ jsx4("circle", { cx: "15", cy: "5", r: "1" }),
1812
+ /* @__PURE__ */ jsx4("circle", { cx: "15", cy: "12", r: "1" }),
1813
+ /* @__PURE__ */ jsx4("circle", { cx: "15", cy: "19", r: "1" })
1624
1814
  ] }) }),
1625
- /* @__PURE__ */ jsx3("span", { style: { flex: 1 }, children: rightItem })
1815
+ /* @__PURE__ */ jsx4("span", { style: { flex: 1 }, children: rightItem })
1626
1816
  ]
1627
1817
  },
1628
1818
  idx
1629
1819
  );
1630
- }) : /* @__PURE__ */ jsx3("div", { style: {
1820
+ }) : /* @__PURE__ */ jsx4("div", { style: {
1631
1821
  padding: "16px",
1632
1822
  textAlign: "center",
1633
1823
  color: "#22c55e",
@@ -1637,7 +1827,7 @@ function MatchingDragDrop({ leftItems, rightItems, currentMatches, correctMatche
1637
1827
  ] });
1638
1828
  }
1639
1829
  function Spinner({ size = 16, color = "#ffffff" }) {
1640
- return /* @__PURE__ */ jsx3(
1830
+ return /* @__PURE__ */ jsx4(
1641
1831
  "span",
1642
1832
  {
1643
1833
  style: {
@@ -1649,7 +1839,7 @@ function Spinner({ size = 16, color = "#ffffff" }) {
1649
1839
  borderRadius: "50%",
1650
1840
  animation: "spin 0.8s linear infinite"
1651
1841
  },
1652
- children: /* @__PURE__ */ jsx3("style", { children: `@keyframes spin { to { transform: rotate(360deg); } }` })
1842
+ children: /* @__PURE__ */ jsx4("style", { children: `@keyframes spin { to { transform: rotate(360deg); } }` })
1653
1843
  }
1654
1844
  );
1655
1845
  }
@@ -1667,7 +1857,8 @@ function QuizPlayer({
1667
1857
  onProgress,
1668
1858
  onGenerateMoreQuestions,
1669
1859
  className,
1670
- forceNewAttempt = true
1860
+ forceNewAttempt = true,
1861
+ hideScore = false
1671
1862
  }) {
1672
1863
  const [quiz, setQuiz] = useState3(null);
1673
1864
  const [attempt, setAttempt] = useState3(null);
@@ -1678,10 +1869,14 @@ function QuizPlayer({
1678
1869
  const [isNavigating, setIsNavigating] = useState3(false);
1679
1870
  const [isCompleted, setIsCompleted] = useState3(false);
1680
1871
  const [result, setResult] = useState3(null);
1681
- const [error, setError] = useState3(null);
1872
+ const [errorCode, setErrorCode] = useState3(null);
1682
1873
  const [isLoading, setIsLoading] = useState3(true);
1683
1874
  const [elapsedSeconds, setElapsedSeconds] = useState3(0);
1684
1875
  const [showIntro, setShowIntro] = useState3(true);
1876
+ const [showResumeChoice, setShowResumeChoice] = useState3(false);
1877
+ const [hasExistingProgress, setHasExistingProgress] = useState3(false);
1878
+ const [existingProgressCount, setExistingProgressCount] = useState3(0);
1879
+ const [isStartingFresh, setIsStartingFresh] = useState3(false);
1685
1880
  const [timerStarted, setTimerStarted] = useState3(false);
1686
1881
  const [showFeedback, setShowFeedback] = useState3(false);
1687
1882
  const [currentAnswerDetail, setCurrentAnswerDetail] = useState3(null);
@@ -1716,7 +1911,7 @@ function QuizPlayer({
1716
1911
  if (!apiClient.current) return;
1717
1912
  try {
1718
1913
  setIsLoading(true);
1719
- setError(null);
1914
+ setErrorCode(null);
1720
1915
  const quizData = await apiClient.current.getQuiz(quizId);
1721
1916
  setQuiz(quizData);
1722
1917
  const attemptData = await apiClient.current.createAttempt({
@@ -1729,7 +1924,10 @@ function QuizPlayer({
1729
1924
  forceNew: forceNewAttempt
1730
1925
  });
1731
1926
  setAttempt(attemptData);
1732
- if (!forceNewAttempt && attemptData.answers && attemptData.answers.length > 0) {
1927
+ if (!forceNewAttempt && attemptData.answers && attemptData.answers.length > 0 && attemptData.status === "in_progress") {
1928
+ setHasExistingProgress(true);
1929
+ setExistingProgressCount(attemptData.answers.length);
1930
+ setShowResumeChoice(true);
1733
1931
  setAnswersDetail(attemptData.answers);
1734
1932
  const answersMap = /* @__PURE__ */ new Map();
1735
1933
  attemptData.answers.forEach((a) => {
@@ -1752,7 +1950,15 @@ function QuizPlayer({
1752
1950
  setIsLoading(false);
1753
1951
  } catch (err) {
1754
1952
  const message = err instanceof Error ? err.message : "Failed to load quiz";
1755
- setError(message);
1953
+ const code = getErrorFromMessage(message, "quiz");
1954
+ setErrorCode(code);
1955
+ apiClient.current?.logError({
1956
+ errorCode: code,
1957
+ context: "quiz",
1958
+ resourceId: quizId,
1959
+ component: "QuizPlayer",
1960
+ message
1961
+ });
1756
1962
  setIsLoading(false);
1757
1963
  onErrorRef.current?.(err instanceof Error ? err : new Error(message));
1758
1964
  }
@@ -1760,7 +1966,7 @@ function QuizPlayer({
1760
1966
  initialize();
1761
1967
  }, [quizId, lessonId, assignLessonId, courseId, childId, parentId, forceNewAttempt]);
1762
1968
  useEffect3(() => {
1763
- if (timerStarted && !isCompleted && !error) {
1969
+ if (timerStarted && !isCompleted && !errorCode) {
1764
1970
  startTimeRef.current = Date.now();
1765
1971
  timerRef.current = setInterval(() => {
1766
1972
  setElapsedSeconds(Math.floor((Date.now() - startTimeRef.current) / 1e3));
@@ -1771,11 +1977,62 @@ function QuizPlayer({
1771
1977
  clearInterval(timerRef.current);
1772
1978
  }
1773
1979
  };
1774
- }, [timerStarted, isCompleted, error]);
1980
+ }, [timerStarted, isCompleted, errorCode]);
1775
1981
  const handleStart = useCallback2(() => {
1776
1982
  setShowIntro(false);
1983
+ setShowResumeChoice(false);
1777
1984
  setTimerStarted(true);
1778
1985
  }, []);
1986
+ const handleResumePrevious = useCallback2(() => {
1987
+ if (quiz && answers.size > 0) {
1988
+ const answeredIds = new Set(answers.keys());
1989
+ const allQs = [...quiz.questions, ...extraQuestions].filter((q) => !skippedQuestionIds.has(q.id));
1990
+ let resumeIndex = 0;
1991
+ for (let i = 0; i < allQs.length; i++) {
1992
+ if (!answeredIds.has(allQs[i].id)) {
1993
+ resumeIndex = i;
1994
+ break;
1995
+ }
1996
+ resumeIndex = allQs.length - 1;
1997
+ }
1998
+ setCurrentQuestionIndex(resumeIndex);
1999
+ }
2000
+ setShowIntro(false);
2001
+ setShowResumeChoice(false);
2002
+ setTimerStarted(true);
2003
+ }, [quiz, answers, extraQuestions, skippedQuestionIds]);
2004
+ const handleStartFresh = useCallback2(async () => {
2005
+ if (!apiClient.current || !attempt) return;
2006
+ setIsStartingFresh(true);
2007
+ try {
2008
+ await apiClient.current.updateAttempt(attempt.id, {
2009
+ status: "abandoned"
2010
+ });
2011
+ const newAttemptData = await apiClient.current.createAttempt({
2012
+ quizId,
2013
+ lessonId,
2014
+ assignLessonId,
2015
+ courseId,
2016
+ childId,
2017
+ parentId,
2018
+ forceNew: true
2019
+ });
2020
+ setAttempt(newAttemptData);
2021
+ setAnswers(/* @__PURE__ */ new Map());
2022
+ setAnswersDetail([]);
2023
+ setCurrentQuestionIndex(0);
2024
+ setHasExistingProgress(false);
2025
+ setExistingProgressCount(0);
2026
+ setShowResumeChoice(false);
2027
+ setShowIntro(false);
2028
+ setTimerStarted(true);
2029
+ } catch (err) {
2030
+ const message = err instanceof Error ? err.message : "Failed to start fresh";
2031
+ onErrorRef.current?.(new Error(message));
2032
+ } finally {
2033
+ setIsStartingFresh(false);
2034
+ }
2035
+ }, [attempt, quizId, lessonId, assignLessonId, courseId, childId, parentId]);
1779
2036
  useEffect3(() => {
1780
2037
  setShowFeedback(false);
1781
2038
  setCurrentAnswerDetail(null);
@@ -1895,7 +2152,15 @@ function QuizPlayer({
1895
2152
  onCompleteRef.current?.(quizResult);
1896
2153
  } catch (err) {
1897
2154
  const message = err instanceof Error ? err.message : "Failed to submit quiz";
1898
- setError(message);
2155
+ const code = getErrorFromMessage(message, "quiz");
2156
+ setErrorCode(code);
2157
+ apiClient.current?.logError({
2158
+ errorCode: code,
2159
+ context: "quiz",
2160
+ resourceId: quizId,
2161
+ component: "QuizPlayer",
2162
+ message
2163
+ });
1899
2164
  onErrorRef.current?.(err instanceof Error ? err : new Error(message));
1900
2165
  } finally {
1901
2166
  setIsSubmitting(false);
@@ -1974,13 +2239,10 @@ function QuizPlayer({
1974
2239
  }
1975
2240
  }, [currentQuestion, apiClient, attempt, quiz, childId, parentId, lessonId, courseId, assignLessonId]);
1976
2241
  if (isLoading) {
1977
- return /* @__PURE__ */ jsx3("div", { className, style: defaultStyles.container, children: /* @__PURE__ */ jsx3("div", { style: defaultStyles.loading, children: "Loading quiz..." }) });
2242
+ return /* @__PURE__ */ jsx4("div", { className, style: defaultStyles.container, children: /* @__PURE__ */ jsx4("div", { style: defaultStyles.loading, children: "Loading quiz..." }) });
1978
2243
  }
1979
- if (error) {
1980
- return /* @__PURE__ */ jsx3("div", { className, style: defaultStyles.container, children: /* @__PURE__ */ jsx3("div", { style: defaultStyles.error, children: /* @__PURE__ */ jsxs3("p", { children: [
1981
- "Error: ",
1982
- error
1983
- ] }) }) });
2244
+ if (errorCode) {
2245
+ return /* @__PURE__ */ jsx4("div", { className, style: defaultStyles.container, children: /* @__PURE__ */ jsx4(MaintenanceScreen, { errorCode }) });
1984
2246
  }
1985
2247
  if (isCompleted && result) {
1986
2248
  const percentage = result.totalQuestions > 0 ? Math.round(result.correctAnswers / result.totalQuestions * 100) : 0;
@@ -2038,7 +2300,7 @@ function QuizPlayer({
2038
2300
  rotation: Math.random() * 360,
2039
2301
  size: 6 + Math.random() * 8
2040
2302
  }));
2041
- const StarIcon = ({ filled, delay }) => /* @__PURE__ */ jsx3(
2303
+ const StarIcon = ({ filled, delay }) => /* @__PURE__ */ jsx4(
2042
2304
  "svg",
2043
2305
  {
2044
2306
  width: "36",
@@ -2049,7 +2311,7 @@ function QuizPlayer({
2049
2311
  animationDelay: `${delay}s`,
2050
2312
  opacity: 0
2051
2313
  },
2052
- children: /* @__PURE__ */ jsx3(
2314
+ children: /* @__PURE__ */ jsx4(
2053
2315
  "path",
2054
2316
  {
2055
2317
  d: "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z",
@@ -2060,62 +2322,23 @@ function QuizPlayer({
2060
2322
  )
2061
2323
  }
2062
2324
  );
2063
- const MascotOwl = ({ mood }) => {
2064
- const getEyeExpression = () => {
2065
- switch (mood) {
2066
- case "celebrating":
2067
- return { leftEye: ">", rightEye: "<", pupilY: 42 };
2068
- // Squinting happy
2069
- case "happy":
2070
- return { leftEye: null, rightEye: null, pupilY: 42 };
2071
- // Normal happy
2072
- case "encouraging":
2073
- return { leftEye: null, rightEye: null, pupilY: 44 };
2074
- // Looking down warmly
2075
- default:
2076
- return { leftEye: null, rightEye: null, pupilY: 42 };
2077
- }
2078
- };
2079
- const eyeExpr = getEyeExpression();
2080
- return /* @__PURE__ */ jsxs3(
2081
- "svg",
2325
+ const Mascot = ({ mood }) => {
2326
+ return /* @__PURE__ */ jsx4(
2327
+ "img",
2082
2328
  {
2083
- width: "120",
2084
- height: "120",
2085
- viewBox: "0 0 100 100",
2329
+ src: astronautImage,
2330
+ alt: "Astronaut mascot",
2331
+ width: "180",
2332
+ height: "180",
2086
2333
  style: {
2087
- animation: mood === "celebrating" ? "bounce 0.6s ease-in-out infinite" : "gentleBob 2s ease-in-out infinite"
2088
- },
2089
- children: [
2090
- /* @__PURE__ */ jsx3("ellipse", { cx: "50", cy: "60", rx: "35", ry: "30", fill: "#8b5cf6" }),
2091
- /* @__PURE__ */ jsx3("ellipse", { cx: "50", cy: "65", rx: "25", ry: "20", fill: "#c4b5fd" }),
2092
- /* @__PURE__ */ jsx3("circle", { cx: "50", cy: "35", r: "28", fill: "#a78bfa" }),
2093
- /* @__PURE__ */ jsx3("polygon", { points: "28,15 35,30 22,28", fill: "#7c3aed" }),
2094
- /* @__PURE__ */ jsx3("polygon", { points: "72,15 65,30 78,28", fill: "#7c3aed" }),
2095
- /* @__PURE__ */ jsx3("ellipse", { cx: "38", cy: "38", rx: "10", ry: "12", fill: "white" }),
2096
- /* @__PURE__ */ jsx3("ellipse", { cx: "62", cy: "38", rx: "10", ry: "12", fill: "white" }),
2097
- eyeExpr.leftEye ? /* @__PURE__ */ jsx3("text", { x: "38", y: "44", textAnchor: "middle", fontSize: "16", fill: "#1f2937", children: eyeExpr.leftEye }) : /* @__PURE__ */ jsx3("circle", { cx: "38", cy: eyeExpr.pupilY, r: "5", fill: "#1f2937" }),
2098
- eyeExpr.rightEye ? /* @__PURE__ */ jsx3("text", { x: "62", y: "44", textAnchor: "middle", fontSize: "16", fill: "#1f2937", children: eyeExpr.rightEye }) : /* @__PURE__ */ jsx3("circle", { cx: "62", cy: eyeExpr.pupilY, r: "5", fill: "#1f2937" }),
2099
- /* @__PURE__ */ jsx3("polygon", { points: "50,45 45,52 55,52", fill: "#fbbf24" }),
2100
- (mood === "celebrating" || mood === "happy") && /* @__PURE__ */ jsxs3(Fragment2, { children: [
2101
- /* @__PURE__ */ jsx3("ellipse", { cx: "28", cy: "45", rx: "5", ry: "3", fill: "#fda4af", opacity: "0.6" }),
2102
- /* @__PURE__ */ jsx3("ellipse", { cx: "72", cy: "45", rx: "5", ry: "3", fill: "#fda4af", opacity: "0.6" })
2103
- ] }),
2104
- mood === "celebrating" ? /* @__PURE__ */ jsxs3(Fragment2, { children: [
2105
- /* @__PURE__ */ jsx3("ellipse", { cx: "18", cy: "55", rx: "8", ry: "15", fill: "#7c3aed", transform: "rotate(-30 18 55)" }),
2106
- /* @__PURE__ */ jsx3("ellipse", { cx: "82", cy: "55", rx: "8", ry: "15", fill: "#7c3aed", transform: "rotate(30 82 55)" })
2107
- ] }) : /* @__PURE__ */ jsxs3(Fragment2, { children: [
2108
- /* @__PURE__ */ jsx3("ellipse", { cx: "20", cy: "60", rx: "8", ry: "15", fill: "#7c3aed" }),
2109
- /* @__PURE__ */ jsx3("ellipse", { cx: "80", cy: "60", rx: "8", ry: "15", fill: "#7c3aed" })
2110
- ] }),
2111
- /* @__PURE__ */ jsx3("ellipse", { cx: "40", cy: "88", rx: "8", ry: "4", fill: "#fbbf24" }),
2112
- /* @__PURE__ */ jsx3("ellipse", { cx: "60", cy: "88", rx: "8", ry: "4", fill: "#fbbf24" })
2113
- ]
2334
+ animation: mood === "celebrating" ? "bounce 0.6s ease-in-out infinite" : "gentleBob 2s ease-in-out infinite",
2335
+ objectFit: "contain"
2336
+ }
2114
2337
  }
2115
2338
  );
2116
2339
  };
2117
- return /* @__PURE__ */ jsxs3("div", { className, style: defaultStyles.container, children: [
2118
- /* @__PURE__ */ jsx3("style", { children: `
2340
+ return /* @__PURE__ */ jsxs4("div", { className, style: defaultStyles.container, children: [
2341
+ /* @__PURE__ */ jsx4("style", { children: `
2119
2342
  @keyframes confettiFall {
2120
2343
  0% {
2121
2344
  transform: translateY(-10px) rotate(0deg);
@@ -2179,8 +2402,8 @@ function QuizPlayer({
2179
2402
  }
2180
2403
  }
2181
2404
  ` }),
2182
- /* @__PURE__ */ jsxs3("div", { style: defaultStyles.results, children: [
2183
- percentage >= 60 && /* @__PURE__ */ jsx3("div", { style: defaultStyles.confettiContainer, children: confettiPieces.map((piece) => /* @__PURE__ */ jsx3(
2405
+ /* @__PURE__ */ jsxs4("div", { style: defaultStyles.results, children: [
2406
+ percentage >= 60 && /* @__PURE__ */ jsx4("div", { style: defaultStyles.confettiContainer, children: confettiPieces.map((piece) => /* @__PURE__ */ jsx4(
2184
2407
  "div",
2185
2408
  {
2186
2409
  style: {
@@ -2197,15 +2420,70 @@ function QuizPlayer({
2197
2420
  },
2198
2421
  piece.id
2199
2422
  )) }),
2200
- /* @__PURE__ */ jsx3("div", { style: { ...defaultStyles.resultsBackground, background: theme.bgGradient } }),
2201
- /* @__PURE__ */ jsxs3("div", { style: defaultStyles.resultsContent, children: [
2202
- /* @__PURE__ */ jsxs3("div", { style: defaultStyles.resultStars, children: [
2203
- /* @__PURE__ */ jsx3(StarIcon, { filled: theme.stars >= 1, delay: 0.3 }),
2204
- /* @__PURE__ */ jsx3(StarIcon, { filled: theme.stars >= 2, delay: 0.5 }),
2205
- /* @__PURE__ */ jsx3(StarIcon, { filled: theme.stars >= 3, delay: 0.7 })
2423
+ /* @__PURE__ */ jsx4("div", { style: { ...defaultStyles.resultsBackground, background: theme.bgGradient } }),
2424
+ /* @__PURE__ */ jsx4("div", { style: defaultStyles.resultsContent, children: hideScore ? /* @__PURE__ */ jsxs4(Fragment2, { children: [
2425
+ /* @__PURE__ */ jsx4("div", { style: { marginBottom: "24px" }, children: /* @__PURE__ */ jsx4(Mascot, { mood: "happy" }) }),
2426
+ /* @__PURE__ */ jsx4(
2427
+ "div",
2428
+ {
2429
+ style: {
2430
+ background: "linear-gradient(135deg, #dcfce7 0%, #bbf7d0 100%)",
2431
+ padding: "12px 28px",
2432
+ borderRadius: "50px",
2433
+ boxShadow: "0 4px 12px rgba(0,0,0,0.15)",
2434
+ marginBottom: "20px",
2435
+ animation: "badgePop 0.6s ease-out 0.2s forwards",
2436
+ opacity: 0,
2437
+ border: "3px solid #22c55e"
2438
+ },
2439
+ children: /* @__PURE__ */ jsx4(
2440
+ "span",
2441
+ {
2442
+ style: {
2443
+ fontSize: "22px",
2444
+ fontWeight: "700",
2445
+ color: "#1f2937",
2446
+ textShadow: "0 1px 2px rgba(255,255,255,0.5)"
2447
+ },
2448
+ children: "All Done!"
2449
+ }
2450
+ )
2451
+ }
2452
+ ),
2453
+ /* @__PURE__ */ jsx4(
2454
+ "div",
2455
+ {
2456
+ style: {
2457
+ animation: "scoreSlideIn 0.5s ease-out 0.4s forwards",
2458
+ opacity: 0
2459
+ },
2460
+ children: /* @__PURE__ */ jsx4(
2461
+ "div",
2462
+ {
2463
+ style: {
2464
+ fontSize: "24px",
2465
+ fontWeight: "600",
2466
+ color: "#22c55e",
2467
+ lineHeight: "1.4",
2468
+ marginBottom: "12px"
2469
+ },
2470
+ children: "The quiz was submitted successfully!"
2471
+ }
2472
+ )
2473
+ }
2474
+ ),
2475
+ /* @__PURE__ */ jsxs4("div", { style: { ...defaultStyles.resultDetails, marginTop: "8px" }, children: [
2476
+ "Time: ",
2477
+ formatTime(result.timeSpentSeconds)
2478
+ ] })
2479
+ ] }) : /* @__PURE__ */ jsxs4(Fragment2, { children: [
2480
+ /* @__PURE__ */ jsxs4("div", { style: defaultStyles.resultStars, children: [
2481
+ /* @__PURE__ */ jsx4(StarIcon, { filled: theme.stars >= 1, delay: 0.3 }),
2482
+ /* @__PURE__ */ jsx4(StarIcon, { filled: theme.stars >= 2, delay: 0.5 }),
2483
+ /* @__PURE__ */ jsx4(StarIcon, { filled: theme.stars >= 3, delay: 0.7 })
2206
2484
  ] }),
2207
- /* @__PURE__ */ jsx3("div", { style: { marginBottom: "16px" }, children: /* @__PURE__ */ jsx3(MascotOwl, { mood: theme.mascotMood }) }),
2208
- /* @__PURE__ */ jsx3(
2485
+ /* @__PURE__ */ jsx4("div", { style: { marginBottom: "16px" }, children: /* @__PURE__ */ jsx4(Mascot, { mood: theme.mascotMood }) }),
2486
+ /* @__PURE__ */ jsx4(
2209
2487
  "div",
2210
2488
  {
2211
2489
  style: {
@@ -2218,7 +2496,7 @@ function QuizPlayer({
2218
2496
  opacity: 0,
2219
2497
  border: `3px solid ${theme.badgeColor}`
2220
2498
  },
2221
- children: /* @__PURE__ */ jsx3(
2499
+ children: /* @__PURE__ */ jsx4(
2222
2500
  "span",
2223
2501
  {
2224
2502
  style: {
@@ -2232,7 +2510,7 @@ function QuizPlayer({
2232
2510
  )
2233
2511
  }
2234
2512
  ),
2235
- /* @__PURE__ */ jsxs3(
2513
+ /* @__PURE__ */ jsxs4(
2236
2514
  "div",
2237
2515
  {
2238
2516
  style: {
@@ -2240,7 +2518,7 @@ function QuizPlayer({
2240
2518
  opacity: 0
2241
2519
  },
2242
2520
  children: [
2243
- /* @__PURE__ */ jsxs3(
2521
+ /* @__PURE__ */ jsxs4(
2244
2522
  "div",
2245
2523
  {
2246
2524
  style: {
@@ -2257,7 +2535,7 @@ function QuizPlayer({
2257
2535
  ]
2258
2536
  }
2259
2537
  ),
2260
- /* @__PURE__ */ jsx3(
2538
+ /* @__PURE__ */ jsx4(
2261
2539
  "div",
2262
2540
  {
2263
2541
  style: {
@@ -2272,25 +2550,84 @@ function QuizPlayer({
2272
2550
  ]
2273
2551
  }
2274
2552
  ),
2275
- /* @__PURE__ */ jsxs3("div", { style: { ...defaultStyles.resultDetails, marginTop: "8px" }, children: [
2553
+ /* @__PURE__ */ jsxs4("div", { style: { ...defaultStyles.resultDetails, marginTop: "8px" }, children: [
2276
2554
  "Time: ",
2277
2555
  formatTime(result.timeSpentSeconds)
2278
2556
  ] })
2279
- ] })
2557
+ ] }) })
2280
2558
  ] })
2281
2559
  ] });
2282
2560
  }
2561
+ if (quiz && showIntro && showResumeChoice && hasExistingProgress) {
2562
+ return /* @__PURE__ */ jsx4("div", { className, style: defaultStyles.container, children: /* @__PURE__ */ jsxs4("div", { style: defaultStyles.intro, children: [
2563
+ /* @__PURE__ */ jsx4("div", { style: defaultStyles.introTitle, children: "Welcome Back!" }),
2564
+ /* @__PURE__ */ jsx4("div", { style: defaultStyles.introSubtitle, children: "You have an unfinished quiz. Would you like to continue or start over?" }),
2565
+ /* @__PURE__ */ jsxs4("div", { style: defaultStyles.introQuestionCount, children: [
2566
+ existingProgressCount,
2567
+ " of ",
2568
+ quiz.questions.length,
2569
+ " question",
2570
+ quiz.questions.length !== 1 ? "s" : "",
2571
+ " answered"
2572
+ ] }),
2573
+ /* @__PURE__ */ jsxs4("div", { style: { display: "flex", flexDirection: "column", gap: "12px", marginTop: "8px" }, children: [
2574
+ /* @__PURE__ */ jsx4(
2575
+ "button",
2576
+ {
2577
+ style: defaultStyles.startButton,
2578
+ onClick: handleResumePrevious,
2579
+ onMouseOver: (e) => {
2580
+ e.currentTarget.style.transform = "translateY(-2px)";
2581
+ e.currentTarget.style.boxShadow = "0 6px 20px rgba(124, 58, 237, 0.5)";
2582
+ },
2583
+ onMouseOut: (e) => {
2584
+ e.currentTarget.style.transform = "translateY(0)";
2585
+ e.currentTarget.style.boxShadow = "0 4px 14px rgba(124, 58, 237, 0.4)";
2586
+ },
2587
+ "data-testid": "button-continue-quiz",
2588
+ children: "Continue Where I Left Off"
2589
+ }
2590
+ ),
2591
+ /* @__PURE__ */ jsx4(
2592
+ "button",
2593
+ {
2594
+ style: {
2595
+ ...defaultStyles.startButton,
2596
+ background: "transparent",
2597
+ color: "#7c3aed",
2598
+ border: "2px solid #7c3aed",
2599
+ boxShadow: "none"
2600
+ },
2601
+ onClick: handleStartFresh,
2602
+ disabled: isStartingFresh,
2603
+ onMouseOver: (e) => {
2604
+ if (!isStartingFresh) {
2605
+ e.currentTarget.style.transform = "translateY(-2px)";
2606
+ e.currentTarget.style.background = "rgba(124, 58, 237, 0.1)";
2607
+ }
2608
+ },
2609
+ onMouseOut: (e) => {
2610
+ e.currentTarget.style.transform = "translateY(0)";
2611
+ e.currentTarget.style.background = "transparent";
2612
+ },
2613
+ "data-testid": "button-start-fresh",
2614
+ children: isStartingFresh ? "Starting..." : "Start Fresh"
2615
+ }
2616
+ )
2617
+ ] })
2618
+ ] }) });
2619
+ }
2283
2620
  if (quiz && showIntro) {
2284
- return /* @__PURE__ */ jsx3("div", { className, style: defaultStyles.container, children: /* @__PURE__ */ jsxs3("div", { style: defaultStyles.intro, children: [
2285
- /* @__PURE__ */ jsx3("div", { style: defaultStyles.introTitle, children: quiz.title }),
2286
- /* @__PURE__ */ jsx3("div", { style: defaultStyles.introSubtitle, children: "Ready to test your knowledge?" }),
2287
- /* @__PURE__ */ jsxs3("div", { style: defaultStyles.introQuestionCount, children: [
2621
+ return /* @__PURE__ */ jsx4("div", { className, style: defaultStyles.container, children: /* @__PURE__ */ jsxs4("div", { style: defaultStyles.intro, children: [
2622
+ /* @__PURE__ */ jsx4("div", { style: defaultStyles.introTitle, children: quiz.title }),
2623
+ /* @__PURE__ */ jsx4("div", { style: defaultStyles.introSubtitle, children: "Ready to test your knowledge?" }),
2624
+ /* @__PURE__ */ jsxs4("div", { style: defaultStyles.introQuestionCount, children: [
2288
2625
  quiz.questions.length,
2289
2626
  " question",
2290
2627
  quiz.questions.length !== 1 ? "s" : "",
2291
2628
  " to answer"
2292
2629
  ] }),
2293
- /* @__PURE__ */ jsx3(
2630
+ /* @__PURE__ */ jsx4(
2294
2631
  "button",
2295
2632
  {
2296
2633
  style: defaultStyles.startButton,
@@ -2310,7 +2647,7 @@ function QuizPlayer({
2310
2647
  ] }) });
2311
2648
  }
2312
2649
  if (!quiz || !currentQuestion) {
2313
- return /* @__PURE__ */ jsx3("div", { className, style: defaultStyles.container, children: /* @__PURE__ */ jsx3("div", { style: defaultStyles.error, children: "No quiz data available" }) });
2650
+ return /* @__PURE__ */ jsx4("div", { className, style: defaultStyles.container, children: /* @__PURE__ */ jsx4("div", { style: defaultStyles.error, children: "No quiz data available" }) });
2314
2651
  }
2315
2652
  const selectedAnswer = answers.get(currentQuestion.id);
2316
2653
  const isLastQuestion = currentQuestionIndex === totalQuestions - 1;
@@ -2318,21 +2655,21 @@ function QuizPlayer({
2318
2655
  const remainingSlots = maxQuestions - totalQuestions;
2319
2656
  const questionsToAdd = Math.min(5, remainingSlots);
2320
2657
  const canAddMore = onGenerateMoreQuestions && remainingSlots > 0;
2321
- return /* @__PURE__ */ jsx3("div", { className, style: defaultStyles.container, children: /* @__PURE__ */ jsxs3("div", { style: defaultStyles.mainLayout, children: [
2322
- /* @__PURE__ */ jsxs3("div", { style: defaultStyles.quizContent, children: [
2323
- /* @__PURE__ */ jsxs3("div", { style: defaultStyles.header, children: [
2324
- /* @__PURE__ */ jsx3("div", { style: defaultStyles.title, children: quiz.title }),
2325
- /* @__PURE__ */ jsxs3("div", { style: defaultStyles.progress, children: [
2658
+ return /* @__PURE__ */ jsx4("div", { className, style: defaultStyles.container, children: /* @__PURE__ */ jsxs4("div", { style: defaultStyles.mainLayout, children: [
2659
+ /* @__PURE__ */ jsxs4("div", { style: defaultStyles.quizContent, children: [
2660
+ /* @__PURE__ */ jsxs4("div", { style: defaultStyles.header, children: [
2661
+ /* @__PURE__ */ jsx4("div", { style: defaultStyles.title, children: quiz.title }),
2662
+ /* @__PURE__ */ jsxs4("div", { style: defaultStyles.progress, children: [
2326
2663
  "Question ",
2327
2664
  currentQuestionIndex + 1,
2328
2665
  " of ",
2329
2666
  totalQuestions
2330
2667
  ] }),
2331
- /* @__PURE__ */ jsx3("div", { style: defaultStyles.progressBar, children: /* @__PURE__ */ jsx3("div", { style: { ...defaultStyles.progressFill, width: `${progressPercent}%` } }) })
2668
+ /* @__PURE__ */ jsx4("div", { style: defaultStyles.progressBar, children: /* @__PURE__ */ jsx4("div", { style: { ...defaultStyles.progressFill, width: `${progressPercent}%` } }) })
2332
2669
  ] }),
2333
- /* @__PURE__ */ jsxs3("div", { style: { ...defaultStyles.question, position: "relative", paddingBottom: "40px" }, children: [
2334
- /* @__PURE__ */ jsx3("div", { style: defaultStyles.questionText, children: /* @__PURE__ */ jsx3(TextToSpeech, { text: currentQuestion.question, inline: true, size: "md" }) }),
2335
- isExtraQuestion && /* @__PURE__ */ jsxs3(
2670
+ /* @__PURE__ */ jsxs4("div", { style: { ...defaultStyles.question, position: "relative", paddingBottom: "40px" }, children: [
2671
+ /* @__PURE__ */ jsx4("div", { style: defaultStyles.questionText, children: /* @__PURE__ */ jsx4(TextToSpeech, { text: currentQuestion.question, inline: true, size: "md" }) }),
2672
+ isExtraQuestion && /* @__PURE__ */ jsxs4(
2336
2673
  "button",
2337
2674
  {
2338
2675
  onClick: () => setShowSkipModal(true),
@@ -2365,15 +2702,15 @@ function QuizPlayer({
2365
2702
  },
2366
2703
  "data-testid": "button-skip-question",
2367
2704
  children: [
2368
- /* @__PURE__ */ jsxs3("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
2369
- /* @__PURE__ */ jsx3("polygon", { points: "5 4 15 12 5 20 5 4" }),
2370
- /* @__PURE__ */ jsx3("line", { x1: "19", y1: "5", x2: "19", y2: "19" })
2705
+ /* @__PURE__ */ jsxs4("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
2706
+ /* @__PURE__ */ jsx4("polygon", { points: "5 4 15 12 5 20 5 4" }),
2707
+ /* @__PURE__ */ jsx4("line", { x1: "19", y1: "5", x2: "19", y2: "19" })
2371
2708
  ] }),
2372
- /* @__PURE__ */ jsx3("span", { children: "Skip" })
2709
+ /* @__PURE__ */ jsx4("span", { children: "Skip" })
2373
2710
  ]
2374
2711
  }
2375
2712
  ),
2376
- !isExtraQuestion && /* @__PURE__ */ jsxs3(
2713
+ !isExtraQuestion && /* @__PURE__ */ jsxs4(
2377
2714
  "button",
2378
2715
  {
2379
2716
  onClick: () => setShowReportModal(true),
@@ -2406,15 +2743,15 @@ function QuizPlayer({
2406
2743
  },
2407
2744
  "data-testid": "button-report-question",
2408
2745
  children: [
2409
- /* @__PURE__ */ jsxs3("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
2410
- /* @__PURE__ */ jsx3("path", { d: "M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z" }),
2411
- /* @__PURE__ */ jsx3("line", { x1: "4", y1: "22", x2: "4", y2: "15" })
2746
+ /* @__PURE__ */ jsxs4("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
2747
+ /* @__PURE__ */ jsx4("path", { d: "M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z" }),
2748
+ /* @__PURE__ */ jsx4("line", { x1: "4", y1: "22", x2: "4", y2: "15" })
2412
2749
  ] }),
2413
- /* @__PURE__ */ jsx3("span", { children: "Report" })
2750
+ /* @__PURE__ */ jsx4("span", { children: "Report" })
2414
2751
  ]
2415
2752
  }
2416
2753
  ),
2417
- (currentQuestion.type === "single" || currentQuestion.type === "true-false") && /* @__PURE__ */ jsx3("div", { style: defaultStyles.options, children: currentQuestion.options?.map((option, idx) => {
2754
+ (currentQuestion.type === "single" || currentQuestion.type === "true-false") && /* @__PURE__ */ jsx4("div", { style: defaultStyles.options, children: currentQuestion.options?.map((option, idx) => {
2418
2755
  const isSelected = selectedAnswer === option;
2419
2756
  const isCorrectOption = currentQuestion.correctAnswer === option;
2420
2757
  let optionStyle = { ...defaultStyles.option };
@@ -2427,7 +2764,7 @@ function QuizPlayer({
2427
2764
  } else if (isSelected) {
2428
2765
  optionStyle = { ...optionStyle, ...defaultStyles.optionSelected };
2429
2766
  }
2430
- return /* @__PURE__ */ jsxs3(
2767
+ return /* @__PURE__ */ jsxs4(
2431
2768
  "div",
2432
2769
  {
2433
2770
  style: {
@@ -2439,14 +2776,14 @@ function QuizPlayer({
2439
2776
  },
2440
2777
  onClick: () => !showFeedback && handleAnswerChange(option),
2441
2778
  children: [
2442
- /* @__PURE__ */ jsx3("span", { onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx3(TextToSpeech, { text: option, size: "sm" }) }),
2443
- /* @__PURE__ */ jsx3("span", { style: { flex: 1 }, children: option })
2779
+ /* @__PURE__ */ jsx4("span", { onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx4(TextToSpeech, { text: option, size: "sm" }) }),
2780
+ /* @__PURE__ */ jsx4("span", { style: { flex: 1 }, children: option })
2444
2781
  ]
2445
2782
  },
2446
2783
  idx
2447
2784
  );
2448
2785
  }) }),
2449
- currentQuestion.type === "multiple" && /* @__PURE__ */ jsx3("div", { style: defaultStyles.options, children: currentQuestion.options?.map((option, idx) => {
2786
+ currentQuestion.type === "multiple" && /* @__PURE__ */ jsx4("div", { style: defaultStyles.options, children: currentQuestion.options?.map((option, idx) => {
2450
2787
  const selected = Array.isArray(selectedAnswer) && selectedAnswer.includes(option);
2451
2788
  const correctAnswers = Array.isArray(currentQuestion.correctAnswer) ? currentQuestion.correctAnswer : currentQuestion.correctAnswer ? [currentQuestion.correctAnswer] : [];
2452
2789
  const isCorrectOption = correctAnswers.includes(option);
@@ -2460,7 +2797,7 @@ function QuizPlayer({
2460
2797
  } else if (selected) {
2461
2798
  optionStyle = { ...optionStyle, ...defaultStyles.optionSelected };
2462
2799
  }
2463
- return /* @__PURE__ */ jsxs3(
2800
+ return /* @__PURE__ */ jsxs4(
2464
2801
  "div",
2465
2802
  {
2466
2803
  style: {
@@ -2480,14 +2817,14 @@ function QuizPlayer({
2480
2817
  }
2481
2818
  },
2482
2819
  children: [
2483
- /* @__PURE__ */ jsx3("span", { onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx3(TextToSpeech, { text: option, size: "sm" }) }),
2484
- /* @__PURE__ */ jsx3("span", { style: { flex: 1 }, children: option })
2820
+ /* @__PURE__ */ jsx4("span", { onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsx4(TextToSpeech, { text: option, size: "sm" }) }),
2821
+ /* @__PURE__ */ jsx4("span", { style: { flex: 1 }, children: option })
2485
2822
  ]
2486
2823
  },
2487
2824
  idx
2488
2825
  );
2489
2826
  }) }),
2490
- (currentQuestion.type === "free" || currentQuestion.type === "essay") && /* @__PURE__ */ jsx3(
2827
+ (currentQuestion.type === "free" || currentQuestion.type === "essay") && /* @__PURE__ */ jsx4(
2491
2828
  "textarea",
2492
2829
  {
2493
2830
  style: { ...defaultStyles.input, minHeight: currentQuestion.type === "essay" ? "150px" : "60px" },
@@ -2497,7 +2834,7 @@ function QuizPlayer({
2497
2834
  disabled: showFeedback
2498
2835
  }
2499
2836
  ),
2500
- currentQuestion.type === "fill" && /* @__PURE__ */ jsx3("div", { style: defaultStyles.options, children: currentQuestion.blanks?.map((_, idx) => /* @__PURE__ */ jsx3(
2837
+ currentQuestion.type === "fill" && /* @__PURE__ */ jsx4("div", { style: defaultStyles.options, children: currentQuestion.blanks?.map((_, idx) => /* @__PURE__ */ jsx4(
2501
2838
  "input",
2502
2839
  {
2503
2840
  style: defaultStyles.input,
@@ -2512,7 +2849,7 @@ function QuizPlayer({
2512
2849
  },
2513
2850
  idx
2514
2851
  )) }),
2515
- currentQuestion.type === "sorting" && currentQuestion.items && /* @__PURE__ */ jsx3(
2852
+ currentQuestion.type === "sorting" && currentQuestion.items && /* @__PURE__ */ jsx4(
2516
2853
  SortingDragDrop,
2517
2854
  {
2518
2855
  items: currentQuestion.items,
@@ -2522,7 +2859,7 @@ function QuizPlayer({
2522
2859
  onOrderChange: handleAnswerChange
2523
2860
  }
2524
2861
  ),
2525
- currentQuestion.type === "matrix" && currentQuestion.leftItems && currentQuestion.rightItems && /* @__PURE__ */ jsx3(
2862
+ currentQuestion.type === "matrix" && currentQuestion.leftItems && currentQuestion.rightItems && /* @__PURE__ */ jsx4(
2526
2863
  MatchingDragDrop,
2527
2864
  {
2528
2865
  leftItems: currentQuestion.leftItems,
@@ -2533,7 +2870,7 @@ function QuizPlayer({
2533
2870
  onMatchChange: handleAnswerChange
2534
2871
  }
2535
2872
  ),
2536
- currentQuestion.type === "assessment" && /* @__PURE__ */ jsx3("div", { style: defaultStyles.options, children: (() => {
2873
+ currentQuestion.type === "assessment" && /* @__PURE__ */ jsx4("div", { style: defaultStyles.options, children: (() => {
2537
2874
  const scaleType = currentQuestion.scaleType || "likert";
2538
2875
  if (scaleType === "yes-no") {
2539
2876
  const options = ["Yes", "No"];
@@ -2543,7 +2880,7 @@ function QuizPlayer({
2543
2880
  if (isSelected) {
2544
2881
  optionStyle = { ...optionStyle, ...defaultStyles.optionSelected };
2545
2882
  }
2546
- return /* @__PURE__ */ jsx3(
2883
+ return /* @__PURE__ */ jsx4(
2547
2884
  "div",
2548
2885
  {
2549
2886
  style: {
@@ -2555,7 +2892,7 @@ function QuizPlayer({
2555
2892
  },
2556
2893
  onClick: () => !showFeedback && handleAnswerChange(option),
2557
2894
  "data-testid": `assessment-option-${option.toLowerCase()}`,
2558
- children: /* @__PURE__ */ jsx3("span", { style: { flex: 1 }, children: option })
2895
+ children: /* @__PURE__ */ jsx4("span", { style: { flex: 1 }, children: option })
2559
2896
  },
2560
2897
  idx
2561
2898
  );
@@ -2565,9 +2902,9 @@ function QuizPlayer({
2565
2902
  const min = currentQuestion.scaleMin || 1;
2566
2903
  const max = currentQuestion.scaleMax || 5;
2567
2904
  const ratings = Array.from({ length: max - min + 1 }, (_, i) => min + i);
2568
- return /* @__PURE__ */ jsx3("div", { style: { display: "flex", gap: "8px", flexWrap: "wrap", justifyContent: "center" }, children: ratings.map((rating) => {
2905
+ return /* @__PURE__ */ jsx4("div", { style: { display: "flex", gap: "8px", flexWrap: "wrap", justifyContent: "center" }, children: ratings.map((rating) => {
2569
2906
  const isSelected = selectedAnswer === rating;
2570
- return /* @__PURE__ */ jsx3(
2907
+ return /* @__PURE__ */ jsx4(
2571
2908
  "button",
2572
2909
  {
2573
2910
  onClick: () => !showFeedback && handleAnswerChange(rating),
@@ -2603,7 +2940,7 @@ function QuizPlayer({
2603
2940
  if (isSelected) {
2604
2941
  optionStyle = { ...optionStyle, ...defaultStyles.optionSelected };
2605
2942
  }
2606
- return /* @__PURE__ */ jsx3(
2943
+ return /* @__PURE__ */ jsx4(
2607
2944
  "div",
2608
2945
  {
2609
2946
  style: {
@@ -2615,24 +2952,24 @@ function QuizPlayer({
2615
2952
  },
2616
2953
  onClick: () => !showFeedback && handleAnswerChange(option),
2617
2954
  "data-testid": `assessment-likert-${idx}`,
2618
- children: /* @__PURE__ */ jsx3("span", { style: { flex: 1 }, children: option })
2955
+ children: /* @__PURE__ */ jsx4("span", { style: { flex: 1 }, children: option })
2619
2956
  },
2620
2957
  idx
2621
2958
  );
2622
2959
  });
2623
2960
  })() }),
2624
- showFeedback && currentAnswerDetail && /* @__PURE__ */ jsxs3("div", { style: {
2961
+ showFeedback && currentAnswerDetail && /* @__PURE__ */ jsxs4("div", { style: {
2625
2962
  ...defaultStyles.feedback,
2626
2963
  ...currentQuestion.type === "assessment" ? defaultStyles.feedbackNeutral : currentAnswerDetail.isCorrect ? defaultStyles.feedbackCorrect : defaultStyles.feedbackIncorrect
2627
2964
  }, children: [
2628
- /* @__PURE__ */ jsx3("div", { style: {
2965
+ /* @__PURE__ */ jsx4("div", { style: {
2629
2966
  ...defaultStyles.feedbackTitle,
2630
2967
  ...currentQuestion.type === "assessment" ? defaultStyles.feedbackTitleNeutral : currentAnswerDetail.isCorrect ? defaultStyles.feedbackTitleCorrect : defaultStyles.feedbackTitleIncorrect
2631
2968
  }, children: currentQuestion.type === "assessment" ? "\u2713 Response recorded" : currentAnswerDetail.isCorrect ? "\u2713 Correct!" : "\u2717 Incorrect" }),
2632
- currentQuestion.explanation && /* @__PURE__ */ jsx3("div", { style: defaultStyles.feedbackExplanation, children: currentQuestion.explanation })
2969
+ currentQuestion.explanation && /* @__PURE__ */ jsx4("div", { style: defaultStyles.feedbackExplanation, children: currentQuestion.explanation })
2633
2970
  ] })
2634
2971
  ] }),
2635
- showSkipModal && /* @__PURE__ */ jsx3("div", { style: {
2972
+ showSkipModal && /* @__PURE__ */ jsx4("div", { style: {
2636
2973
  position: "fixed",
2637
2974
  top: 0,
2638
2975
  left: 0,
@@ -2643,7 +2980,7 @@ function QuizPlayer({
2643
2980
  alignItems: "center",
2644
2981
  justifyContent: "center",
2645
2982
  zIndex: 1e3
2646
- }, children: /* @__PURE__ */ jsxs3("div", { style: {
2983
+ }, children: /* @__PURE__ */ jsxs4("div", { style: {
2647
2984
  backgroundColor: "#ffffff",
2648
2985
  borderRadius: "12px",
2649
2986
  padding: "24px",
@@ -2651,10 +2988,10 @@ function QuizPlayer({
2651
2988
  width: "90%",
2652
2989
  boxShadow: "0 20px 40px rgba(0, 0, 0, 0.2)"
2653
2990
  }, children: [
2654
- /* @__PURE__ */ jsx3("h3", { style: { margin: "0 0 8px 0", fontSize: "18px", fontWeight: "600", color: "#1f2937" }, children: "Skip Question" }),
2655
- /* @__PURE__ */ jsx3("p", { style: { margin: "0 0 16px 0", fontSize: "14px", color: "#6b7280" }, children: "Help us improve by telling us why you're skipping this question." }),
2656
- /* @__PURE__ */ jsxs3("div", { style: { display: "flex", flexDirection: "column", gap: "8px", marginBottom: "16px" }, children: [
2657
- /* @__PURE__ */ jsx3(
2991
+ /* @__PURE__ */ jsx4("h3", { style: { margin: "0 0 8px 0", fontSize: "18px", fontWeight: "600", color: "#1f2937" }, children: "Skip Question" }),
2992
+ /* @__PURE__ */ jsx4("p", { style: { margin: "0 0 16px 0", fontSize: "14px", color: "#6b7280" }, children: "Help us improve by telling us why you're skipping this question." }),
2993
+ /* @__PURE__ */ jsxs4("div", { style: { display: "flex", flexDirection: "column", gap: "8px", marginBottom: "16px" }, children: [
2994
+ /* @__PURE__ */ jsx4(
2658
2995
  "button",
2659
2996
  {
2660
2997
  onClick: () => setSelectedSkipReason("question_issue"),
@@ -2675,7 +3012,7 @@ function QuizPlayer({
2675
3012
  children: "Question has an issue"
2676
3013
  }
2677
3014
  ),
2678
- /* @__PURE__ */ jsx3(
3015
+ /* @__PURE__ */ jsx4(
2679
3016
  "button",
2680
3017
  {
2681
3018
  onClick: () => setSelectedSkipReason("dont_know"),
@@ -2697,9 +3034,9 @@ function QuizPlayer({
2697
3034
  }
2698
3035
  )
2699
3036
  ] }),
2700
- /* @__PURE__ */ jsxs3("div", { style: { marginBottom: "16px" }, children: [
2701
- /* @__PURE__ */ jsx3("label", { style: { display: "block", fontSize: "13px", fontWeight: "500", color: "#374151", marginBottom: "6px" }, children: "Additional details (optional)" }),
2702
- /* @__PURE__ */ jsx3(
3037
+ /* @__PURE__ */ jsxs4("div", { style: { marginBottom: "16px" }, children: [
3038
+ /* @__PURE__ */ jsx4("label", { style: { display: "block", fontSize: "13px", fontWeight: "500", color: "#374151", marginBottom: "6px" }, children: "Additional details (optional)" }),
3039
+ /* @__PURE__ */ jsx4(
2703
3040
  "textarea",
2704
3041
  {
2705
3042
  value: skipComment,
@@ -2720,13 +3057,13 @@ function QuizPlayer({
2720
3057
  "data-testid": "input-skip-comment"
2721
3058
  }
2722
3059
  ),
2723
- /* @__PURE__ */ jsxs3("div", { style: { fontSize: "12px", color: "#9ca3af", marginTop: "4px", textAlign: "right" }, children: [
3060
+ /* @__PURE__ */ jsxs4("div", { style: { fontSize: "12px", color: "#9ca3af", marginTop: "4px", textAlign: "right" }, children: [
2724
3061
  skipComment.length,
2725
3062
  "/200"
2726
3063
  ] })
2727
3064
  ] }),
2728
- /* @__PURE__ */ jsxs3("div", { style: { display: "flex", gap: "10px" }, children: [
2729
- /* @__PURE__ */ jsx3(
3065
+ /* @__PURE__ */ jsxs4("div", { style: { display: "flex", gap: "10px" }, children: [
3066
+ /* @__PURE__ */ jsx4(
2730
3067
  "button",
2731
3068
  {
2732
3069
  onClick: () => {
@@ -2749,7 +3086,7 @@ function QuizPlayer({
2749
3086
  children: "Cancel"
2750
3087
  }
2751
3088
  ),
2752
- /* @__PURE__ */ jsx3(
3089
+ /* @__PURE__ */ jsx4(
2753
3090
  "button",
2754
3091
  {
2755
3092
  onClick: () => selectedSkipReason && handleSkipQuestion(selectedSkipReason, skipComment),
@@ -2772,7 +3109,7 @@ function QuizPlayer({
2772
3109
  )
2773
3110
  ] })
2774
3111
  ] }) }),
2775
- showReportModal && /* @__PURE__ */ jsx3("div", { style: {
3112
+ showReportModal && /* @__PURE__ */ jsx4("div", { style: {
2776
3113
  position: "fixed",
2777
3114
  top: 0,
2778
3115
  left: 0,
@@ -2783,7 +3120,7 @@ function QuizPlayer({
2783
3120
  alignItems: "center",
2784
3121
  justifyContent: "center",
2785
3122
  zIndex: 1e3
2786
- }, children: /* @__PURE__ */ jsxs3("div", { style: {
3123
+ }, children: /* @__PURE__ */ jsxs4("div", { style: {
2787
3124
  backgroundColor: "#ffffff",
2788
3125
  borderRadius: "12px",
2789
3126
  padding: "24px",
@@ -2791,10 +3128,10 @@ function QuizPlayer({
2791
3128
  width: "90%",
2792
3129
  boxShadow: "0 20px 40px rgba(0, 0, 0, 0.2)"
2793
3130
  }, children: [
2794
- /* @__PURE__ */ jsx3("h3", { style: { margin: "0 0 8px 0", fontSize: "18px", fontWeight: "600", color: "#1f2937" }, children: "Report Question" }),
2795
- /* @__PURE__ */ jsx3("p", { style: { margin: "0 0 16px 0", fontSize: "14px", color: "#6b7280" }, children: "What's wrong with this question?" }),
2796
- /* @__PURE__ */ jsxs3("div", { style: { marginBottom: "16px" }, children: [
2797
- /* @__PURE__ */ jsx3(
3131
+ /* @__PURE__ */ jsx4("h3", { style: { margin: "0 0 8px 0", fontSize: "18px", fontWeight: "600", color: "#1f2937" }, children: "Report Question" }),
3132
+ /* @__PURE__ */ jsx4("p", { style: { margin: "0 0 16px 0", fontSize: "14px", color: "#6b7280" }, children: "What's wrong with this question?" }),
3133
+ /* @__PURE__ */ jsxs4("div", { style: { marginBottom: "16px" }, children: [
3134
+ /* @__PURE__ */ jsx4(
2798
3135
  "textarea",
2799
3136
  {
2800
3137
  value: reportComment,
@@ -2815,13 +3152,13 @@ function QuizPlayer({
2815
3152
  "data-testid": "input-report-comment"
2816
3153
  }
2817
3154
  ),
2818
- /* @__PURE__ */ jsxs3("div", { style: { fontSize: "12px", color: "#9ca3af", marginTop: "4px", textAlign: "right" }, children: [
3155
+ /* @__PURE__ */ jsxs4("div", { style: { fontSize: "12px", color: "#9ca3af", marginTop: "4px", textAlign: "right" }, children: [
2819
3156
  reportComment.length,
2820
3157
  "/300"
2821
3158
  ] })
2822
3159
  ] }),
2823
- /* @__PURE__ */ jsxs3("div", { style: { display: "flex", gap: "10px" }, children: [
2824
- /* @__PURE__ */ jsx3(
3160
+ /* @__PURE__ */ jsxs4("div", { style: { display: "flex", gap: "10px" }, children: [
3161
+ /* @__PURE__ */ jsx4(
2825
3162
  "button",
2826
3163
  {
2827
3164
  onClick: () => {
@@ -2843,7 +3180,7 @@ function QuizPlayer({
2843
3180
  children: "Cancel"
2844
3181
  }
2845
3182
  ),
2846
- /* @__PURE__ */ jsx3(
3183
+ /* @__PURE__ */ jsx4(
2847
3184
  "button",
2848
3185
  {
2849
3186
  onClick: () => handleReportQuestion(reportComment),
@@ -2866,8 +3203,8 @@ function QuizPlayer({
2866
3203
  )
2867
3204
  ] })
2868
3205
  ] }) }),
2869
- /* @__PURE__ */ jsxs3("div", { style: defaultStyles.buttonsColumn, children: [
2870
- showFeedback && isLastQuestion && canAddMore && /* @__PURE__ */ jsx3(
3206
+ /* @__PURE__ */ jsxs4("div", { style: defaultStyles.buttonsColumn, children: [
3207
+ showFeedback && isLastQuestion && canAddMore && /* @__PURE__ */ jsx4(
2871
3208
  "button",
2872
3209
  {
2873
3210
  style: {
@@ -2877,10 +3214,10 @@ function QuizPlayer({
2877
3214
  onClick: handleAddMoreQuestions,
2878
3215
  disabled: isGeneratingExtra,
2879
3216
  "data-testid": "button-add-more-questions",
2880
- children: isGeneratingExtra ? /* @__PURE__ */ jsxs3(Fragment2, { children: [
2881
- /* @__PURE__ */ jsx3(Spinner, { size: 16, color: "#9ca3af" }),
3217
+ children: isGeneratingExtra ? /* @__PURE__ */ jsxs4(Fragment2, { children: [
3218
+ /* @__PURE__ */ jsx4(Spinner, { size: 16, color: "#9ca3af" }),
2882
3219
  "Generating Questions..."
2883
- ] }) : /* @__PURE__ */ jsxs3(Fragment2, { children: [
3220
+ ] }) : /* @__PURE__ */ jsxs4(Fragment2, { children: [
2884
3221
  "+ Add ",
2885
3222
  questionsToAdd,
2886
3223
  " More Question",
@@ -2888,9 +3225,9 @@ function QuizPlayer({
2888
3225
  ] })
2889
3226
  }
2890
3227
  ),
2891
- /* @__PURE__ */ jsx3("div", { style: { ...defaultStyles.buttons, justifyContent: "flex-end" }, children: showFeedback ? (
3228
+ /* @__PURE__ */ jsx4("div", { style: { ...defaultStyles.buttons, justifyContent: "flex-end" }, children: showFeedback ? (
2892
3229
  // After viewing feedback
2893
- isLastQuestion ? /* @__PURE__ */ jsx3(
3230
+ isLastQuestion ? /* @__PURE__ */ jsx4(
2894
3231
  "button",
2895
3232
  {
2896
3233
  style: {
@@ -2900,9 +3237,9 @@ function QuizPlayer({
2900
3237
  onClick: handleSubmit,
2901
3238
  disabled: isSubmitting || isGeneratingExtra,
2902
3239
  "data-testid": "button-submit-quiz",
2903
- children: isSubmitting ? /* @__PURE__ */ jsx3(Spinner, { size: 16, color: "#9ca3af" }) : "Submit Quiz"
3240
+ children: isSubmitting ? /* @__PURE__ */ jsx4(Spinner, { size: 16, color: "#9ca3af" }) : "Submit Quiz"
2904
3241
  }
2905
- ) : /* @__PURE__ */ jsx3(
3242
+ ) : /* @__PURE__ */ jsx4(
2906
3243
  "button",
2907
3244
  {
2908
3245
  style: {
@@ -2916,7 +3253,7 @@ function QuizPlayer({
2916
3253
  )
2917
3254
  ) : (
2918
3255
  // Before checking answer
2919
- /* @__PURE__ */ jsx3(
3256
+ /* @__PURE__ */ jsx4(
2920
3257
  "button",
2921
3258
  {
2922
3259
  style: {
@@ -2926,13 +3263,13 @@ function QuizPlayer({
2926
3263
  onClick: handleCheckAnswer,
2927
3264
  disabled: isNavigating || selectedAnswer === void 0,
2928
3265
  "data-testid": "button-check-answer",
2929
- children: isNavigating ? /* @__PURE__ */ jsx3(Spinner, { size: 16, color: "#9ca3af" }) : "Check Answer"
3266
+ children: isNavigating ? /* @__PURE__ */ jsx4(Spinner, { size: 16, color: "#9ca3af" }) : "Check Answer"
2930
3267
  }
2931
3268
  )
2932
3269
  ) })
2933
3270
  ] })
2934
3271
  ] }),
2935
- /* @__PURE__ */ jsx3("div", { style: defaultStyles.chatPanel, children: apiClient.current && /* @__PURE__ */ jsx3(
3272
+ /* @__PURE__ */ jsx4("div", { style: defaultStyles.chatPanel, children: apiClient.current && /* @__PURE__ */ jsx4(
2936
3273
  QuestionChatPanel,
2937
3274
  {
2938
3275
  apiClient: apiClient.current,
@@ -2961,8 +3298,8 @@ function QuizPlayer({
2961
3298
  }
2962
3299
 
2963
3300
  // src/AttemptViewer.tsx
2964
- import { useState as useState4, useEffect as useEffect4 } from "react";
2965
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
3301
+ import { useState as useState4, useEffect as useEffect4, useRef as useRef4 } from "react";
3302
+ import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
2966
3303
  var defaultStyles2 = {
2967
3304
  container: {
2968
3305
  fontFamily: "system-ui, -apple-system, sans-serif",
@@ -3215,23 +3552,39 @@ function AttemptViewer({
3215
3552
  }) {
3216
3553
  const [attempt, setAttempt] = useState4(null);
3217
3554
  const [loading, setLoading] = useState4(true);
3218
- const [error, setError] = useState4(null);
3555
+ const [errorCode, setErrorCode] = useState4(null);
3219
3556
  const [chatHistories, setChatHistories] = useState4({});
3220
3557
  const [expandedChats, setExpandedChats] = useState4(/* @__PURE__ */ new Set());
3558
+ const [fetchedAttemptId, setFetchedAttemptId] = useState4(null);
3559
+ const onErrorRef = useRef4(onError);
3560
+ onErrorRef.current = onError;
3221
3561
  useEffect4(() => {
3562
+ if (fetchedAttemptId === attemptId) return;
3222
3563
  const apiClient = new QuizApiClient({
3223
3564
  baseUrl: apiBaseUrl,
3224
3565
  authToken
3225
3566
  });
3226
3567
  async function fetchAttempt() {
3227
3568
  setLoading(true);
3228
- setError(null);
3569
+ setErrorCode(null);
3229
3570
  try {
3230
3571
  const response = await fetch(`${apiBaseUrl}/api/external/quiz-attempts/${attemptId}`, {
3231
3572
  headers: authToken ? { Authorization: `Bearer ${authToken}` } : {}
3232
3573
  });
3233
3574
  if (!response.ok) {
3234
- throw new Error(`Failed to fetch attempt: ${response.statusText}`);
3575
+ const code = getErrorFromHttpStatus(response.status, "attempt");
3576
+ setErrorCode(code);
3577
+ apiClient.logError({
3578
+ errorCode: code,
3579
+ context: "attempt",
3580
+ resourceId: attemptId,
3581
+ component: "AttemptViewer",
3582
+ message: `HTTP ${response.status}: ${response.statusText}`
3583
+ });
3584
+ onErrorRef.current?.(new Error(`Failed to fetch attempt: ${response.statusText}`));
3585
+ setLoading(false);
3586
+ setFetchedAttemptId(attemptId);
3587
+ return;
3235
3588
  }
3236
3589
  const data = await response.json();
3237
3590
  setAttempt(data);
@@ -3245,14 +3598,23 @@ function AttemptViewer({
3245
3598
  }
3246
3599
  } catch (err) {
3247
3600
  const errorMessage = err instanceof Error ? err.message : "Failed to load attempt";
3248
- setError(errorMessage);
3249
- onError?.(err instanceof Error ? err : new Error(errorMessage));
3601
+ const code = getErrorFromMessage(errorMessage, "attempt");
3602
+ setErrorCode(code);
3603
+ apiClient.logError({
3604
+ errorCode: code,
3605
+ context: "attempt",
3606
+ resourceId: attemptId,
3607
+ component: "AttemptViewer",
3608
+ message: errorMessage
3609
+ });
3610
+ onErrorRef.current?.(err instanceof Error ? err : new Error(errorMessage));
3250
3611
  } finally {
3251
3612
  setLoading(false);
3613
+ setFetchedAttemptId(attemptId);
3252
3614
  }
3253
3615
  }
3254
3616
  fetchAttempt();
3255
- }, [attemptId, apiBaseUrl, authToken, onError, showConversation]);
3617
+ }, [attemptId, apiBaseUrl, authToken, showConversation, fetchedAttemptId]);
3256
3618
  const toggleChatExpanded = (questionId) => {
3257
3619
  setExpandedChats((prev) => {
3258
3620
  const newSet = new Set(prev);
@@ -3266,53 +3628,49 @@ function AttemptViewer({
3266
3628
  };
3267
3629
  const handleRetry = () => {
3268
3630
  setLoading(true);
3269
- setError(null);
3631
+ setErrorCode(null);
3270
3632
  window.location.reload();
3271
3633
  };
3272
3634
  if (loading) {
3273
- return /* @__PURE__ */ jsxs4("div", { style: defaultStyles2.container, className, children: [
3274
- /* @__PURE__ */ jsx4("style", { children: spinnerKeyframes }),
3275
- /* @__PURE__ */ jsxs4("div", { style: defaultStyles2.loading, children: [
3276
- /* @__PURE__ */ jsx4("div", { style: defaultStyles2.spinner }),
3277
- /* @__PURE__ */ jsx4("p", { style: { marginTop: "16px", color: "#6b7280" }, children: "Loading attempt..." })
3635
+ return /* @__PURE__ */ jsxs5("div", { style: defaultStyles2.container, className, children: [
3636
+ /* @__PURE__ */ jsx5("style", { children: spinnerKeyframes }),
3637
+ /* @__PURE__ */ jsxs5("div", { style: defaultStyles2.loading, children: [
3638
+ /* @__PURE__ */ jsx5("div", { style: defaultStyles2.spinner }),
3639
+ /* @__PURE__ */ jsx5("p", { style: { marginTop: "16px", color: "#6b7280" }, children: "Loading attempt..." })
3278
3640
  ] })
3279
3641
  ] });
3280
3642
  }
3281
- if (error || !attempt) {
3282
- return /* @__PURE__ */ jsx4("div", { style: defaultStyles2.container, className, children: /* @__PURE__ */ jsxs4("div", { style: defaultStyles2.error, children: [
3283
- /* @__PURE__ */ jsx4("p", { style: { fontSize: "18px", fontWeight: "500" }, children: "Failed to load attempt" }),
3284
- /* @__PURE__ */ jsx4("p", { style: { marginTop: "8px", color: "#6b7280" }, children: error }),
3285
- /* @__PURE__ */ jsx4("button", { style: defaultStyles2.retryButton, onClick: handleRetry, children: "Try Again" })
3286
- ] }) });
3643
+ if (errorCode || !attempt) {
3644
+ return /* @__PURE__ */ jsx5("div", { style: defaultStyles2.container, className, children: /* @__PURE__ */ jsx5(MaintenanceScreen, { errorCode: errorCode || "ATTEMPT_NOT_FOUND" }) });
3287
3645
  }
3288
3646
  const scorePercentage = attempt.score ?? 0;
3289
3647
  const correctCount = attempt.correctAnswers ?? 0;
3290
3648
  const totalQuestions = attempt.totalQuestions;
3291
3649
  const timeSpent = attempt.timeSpentSeconds ?? 0;
3292
- return /* @__PURE__ */ jsxs4("div", { style: defaultStyles2.container, className, children: [
3293
- /* @__PURE__ */ jsx4("style", { children: spinnerKeyframes }),
3294
- /* @__PURE__ */ jsx4("div", { style: defaultStyles2.header, children: /* @__PURE__ */ jsxs4("div", { style: defaultStyles2.summaryGrid, children: [
3295
- /* @__PURE__ */ jsxs4("div", { style: defaultStyles2.summaryCard, children: [
3296
- /* @__PURE__ */ jsxs4("div", { style: defaultStyles2.summaryValue, children: [
3650
+ return /* @__PURE__ */ jsxs5("div", { style: defaultStyles2.container, className, children: [
3651
+ /* @__PURE__ */ jsx5("style", { children: spinnerKeyframes }),
3652
+ /* @__PURE__ */ jsx5("div", { style: defaultStyles2.header, children: /* @__PURE__ */ jsxs5("div", { style: defaultStyles2.summaryGrid, children: [
3653
+ /* @__PURE__ */ jsxs5("div", { style: defaultStyles2.summaryCard, children: [
3654
+ /* @__PURE__ */ jsxs5("div", { style: defaultStyles2.summaryValue, children: [
3297
3655
  scorePercentage,
3298
3656
  "%"
3299
3657
  ] }),
3300
- /* @__PURE__ */ jsx4("div", { style: defaultStyles2.summaryLabel, children: "Score" })
3658
+ /* @__PURE__ */ jsx5("div", { style: defaultStyles2.summaryLabel, children: "Score" })
3301
3659
  ] }),
3302
- /* @__PURE__ */ jsxs4("div", { style: defaultStyles2.summaryCard, children: [
3303
- /* @__PURE__ */ jsxs4("div", { style: defaultStyles2.summaryValue, children: [
3660
+ /* @__PURE__ */ jsxs5("div", { style: defaultStyles2.summaryCard, children: [
3661
+ /* @__PURE__ */ jsxs5("div", { style: defaultStyles2.summaryValue, children: [
3304
3662
  correctCount,
3305
3663
  "/",
3306
3664
  totalQuestions
3307
3665
  ] }),
3308
- /* @__PURE__ */ jsx4("div", { style: defaultStyles2.summaryLabel, children: "Correct" })
3666
+ /* @__PURE__ */ jsx5("div", { style: defaultStyles2.summaryLabel, children: "Correct" })
3309
3667
  ] }),
3310
- /* @__PURE__ */ jsxs4("div", { style: defaultStyles2.summaryCard, children: [
3311
- /* @__PURE__ */ jsx4("div", { style: defaultStyles2.summaryValue, children: formatTime(timeSpent) }),
3312
- /* @__PURE__ */ jsx4("div", { style: defaultStyles2.summaryLabel, children: "Time" })
3668
+ /* @__PURE__ */ jsxs5("div", { style: defaultStyles2.summaryCard, children: [
3669
+ /* @__PURE__ */ jsx5("div", { style: defaultStyles2.summaryValue, children: formatTime(timeSpent) }),
3670
+ /* @__PURE__ */ jsx5("div", { style: defaultStyles2.summaryLabel, children: "Time" })
3313
3671
  ] })
3314
3672
  ] }) }),
3315
- /* @__PURE__ */ jsx4("div", { style: defaultStyles2.questionsList, children: attempt.answers.map((answer, index) => /* @__PURE__ */ jsxs4(
3673
+ /* @__PURE__ */ jsx5("div", { style: defaultStyles2.questionsList, children: attempt.answers.map((answer, index) => /* @__PURE__ */ jsxs5(
3316
3674
  "div",
3317
3675
  {
3318
3676
  style: {
@@ -3320,12 +3678,12 @@ function AttemptViewer({
3320
3678
  ...answer.isCorrect ? defaultStyles2.questionCardCorrect : defaultStyles2.questionCardIncorrect
3321
3679
  },
3322
3680
  children: [
3323
- /* @__PURE__ */ jsxs4("div", { style: defaultStyles2.questionHeader, children: [
3324
- /* @__PURE__ */ jsxs4("span", { style: defaultStyles2.questionNumber, children: [
3681
+ /* @__PURE__ */ jsxs5("div", { style: defaultStyles2.questionHeader, children: [
3682
+ /* @__PURE__ */ jsxs5("span", { style: defaultStyles2.questionNumber, children: [
3325
3683
  "Question ",
3326
3684
  index + 1
3327
3685
  ] }),
3328
- /* @__PURE__ */ jsx4(
3686
+ /* @__PURE__ */ jsx5(
3329
3687
  "span",
3330
3688
  {
3331
3689
  style: {
@@ -3336,35 +3694,35 @@ function AttemptViewer({
3336
3694
  }
3337
3695
  )
3338
3696
  ] }),
3339
- /* @__PURE__ */ jsx4("div", { style: defaultStyles2.questionText, children: answer.questionText }),
3340
- /* @__PURE__ */ jsxs4("div", { style: defaultStyles2.answerSection, children: [
3341
- /* @__PURE__ */ jsx4("span", { style: defaultStyles2.answerLabel, children: "Your answer:" }),
3342
- /* @__PURE__ */ jsx4("span", { style: defaultStyles2.studentAnswer, children: formatAnswer(answer.selectedAnswer, answer.questionType, answer.items, answer.leftItems) })
3697
+ /* @__PURE__ */ jsx5("div", { style: defaultStyles2.questionText, children: answer.questionText }),
3698
+ /* @__PURE__ */ jsxs5("div", { style: defaultStyles2.answerSection, children: [
3699
+ /* @__PURE__ */ jsx5("span", { style: defaultStyles2.answerLabel, children: "Your answer:" }),
3700
+ /* @__PURE__ */ jsx5("span", { style: defaultStyles2.studentAnswer, children: formatAnswer(answer.selectedAnswer, answer.questionType, answer.items, answer.leftItems) })
3343
3701
  ] }),
3344
- !answer.isCorrect && answer.correctAnswer && /* @__PURE__ */ jsxs4("div", { style: defaultStyles2.answerSection, children: [
3345
- /* @__PURE__ */ jsx4("span", { style: defaultStyles2.answerLabel, children: "Correct answer:" }),
3346
- /* @__PURE__ */ jsx4("span", { style: defaultStyles2.correctAnswer, children: answer.questionType === "sorting" && answer.items && answer.correctOrder ? formatCorrectSortingAnswer(answer.items, answer.correctOrder) : answer.questionType === "matrix" && answer.correctAnswer && typeof answer.correctAnswer === "object" && !Array.isArray(answer.correctAnswer) ? formatCorrectMatrixAnswer(answer.correctAnswer, answer.leftItems) : formatAnswer(answer.correctAnswer, answer.questionType, answer.items, answer.leftItems) })
3702
+ !answer.isCorrect && answer.correctAnswer && /* @__PURE__ */ jsxs5("div", { style: defaultStyles2.answerSection, children: [
3703
+ /* @__PURE__ */ jsx5("span", { style: defaultStyles2.answerLabel, children: "Correct answer:" }),
3704
+ /* @__PURE__ */ jsx5("span", { style: defaultStyles2.correctAnswer, children: answer.questionType === "sorting" && answer.items && answer.correctOrder ? formatCorrectSortingAnswer(answer.items, answer.correctOrder) : answer.questionType === "matrix" && answer.correctAnswer && typeof answer.correctAnswer === "object" && !Array.isArray(answer.correctAnswer) ? formatCorrectMatrixAnswer(answer.correctAnswer, answer.leftItems) : formatAnswer(answer.correctAnswer, answer.questionType, answer.items, answer.leftItems) })
3347
3705
  ] }),
3348
- /* @__PURE__ */ jsxs4("div", { style: defaultStyles2.points, children: [
3706
+ /* @__PURE__ */ jsxs5("div", { style: defaultStyles2.points, children: [
3349
3707
  answer.pointsEarned,
3350
3708
  " / ",
3351
3709
  answer.points,
3352
3710
  " points"
3353
3711
  ] }),
3354
- showExplanations && answer.explanation && /* @__PURE__ */ jsxs4("div", { style: defaultStyles2.explanation, children: [
3355
- /* @__PURE__ */ jsx4("strong", { children: "Explanation:" }),
3712
+ showExplanations && answer.explanation && /* @__PURE__ */ jsxs5("div", { style: defaultStyles2.explanation, children: [
3713
+ /* @__PURE__ */ jsx5("strong", { children: "Explanation:" }),
3356
3714
  " ",
3357
3715
  answer.explanation
3358
3716
  ] }),
3359
- showConversation && chatHistories[answer.questionId] && chatHistories[answer.questionId].messages.length > 0 && /* @__PURE__ */ jsxs4("div", { style: defaultStyles2.chatHistorySection, children: [
3360
- /* @__PURE__ */ jsxs4(
3717
+ showConversation && chatHistories[answer.questionId] && chatHistories[answer.questionId].messages.length > 0 && /* @__PURE__ */ jsxs5("div", { style: defaultStyles2.chatHistorySection, children: [
3718
+ /* @__PURE__ */ jsxs5(
3361
3719
  "button",
3362
3720
  {
3363
3721
  style: defaultStyles2.chatToggleButton,
3364
3722
  onClick: () => toggleChatExpanded(answer.questionId),
3365
3723
  "data-testid": `button-toggle-chat-${answer.questionId}`,
3366
3724
  children: [
3367
- /* @__PURE__ */ jsx4("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx4("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) }),
3725
+ /* @__PURE__ */ jsx5("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx5("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) }),
3368
3726
  expandedChats.has(answer.questionId) ? "Hide" : "View",
3369
3727
  " Chat History (",
3370
3728
  chatHistories[answer.questionId].messages.length,
@@ -3372,7 +3730,7 @@ function AttemptViewer({
3372
3730
  ]
3373
3731
  }
3374
3732
  ),
3375
- expandedChats.has(answer.questionId) && /* @__PURE__ */ jsx4("div", { style: defaultStyles2.chatMessages, children: chatHistories[answer.questionId].messages.map((msg, msgIndex) => /* @__PURE__ */ jsx4(
3733
+ expandedChats.has(answer.questionId) && /* @__PURE__ */ jsx5("div", { style: defaultStyles2.chatMessages, children: chatHistories[answer.questionId].messages.map((msg, msgIndex) => /* @__PURE__ */ jsx5(
3376
3734
  "div",
3377
3735
  {
3378
3736
  style: {
@@ -3390,14 +3748,620 @@ function AttemptViewer({
3390
3748
  )) })
3391
3749
  ] });
3392
3750
  }
3751
+
3752
+ // src/ErrorTypesPanel.tsx
3753
+ import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
3754
+ var panelStyles2 = {
3755
+ container: {
3756
+ fontFamily: "system-ui, -apple-system, sans-serif",
3757
+ padding: "24px",
3758
+ backgroundColor: "#ffffff",
3759
+ borderRadius: "12px",
3760
+ maxWidth: "800px"
3761
+ },
3762
+ header: {
3763
+ marginBottom: "24px"
3764
+ },
3765
+ title: {
3766
+ fontSize: "20px",
3767
+ fontWeight: "600",
3768
+ color: "#111827",
3769
+ marginBottom: "8px"
3770
+ },
3771
+ subtitle: {
3772
+ fontSize: "14px",
3773
+ color: "#6b7280"
3774
+ },
3775
+ section: {
3776
+ marginBottom: "24px"
3777
+ },
3778
+ sectionTitle: {
3779
+ fontSize: "14px",
3780
+ fontWeight: "600",
3781
+ color: "#374151",
3782
+ marginBottom: "12px",
3783
+ textTransform: "uppercase",
3784
+ letterSpacing: "0.05em"
3785
+ },
3786
+ errorList: {
3787
+ display: "flex",
3788
+ flexDirection: "column",
3789
+ gap: "12px"
3790
+ },
3791
+ errorCard: {
3792
+ padding: "16px",
3793
+ backgroundColor: "#f9fafb",
3794
+ borderRadius: "8px",
3795
+ border: "1px solid #e5e7eb"
3796
+ },
3797
+ errorCardBlocking: {
3798
+ borderLeft: "4px solid #ef4444"
3799
+ },
3800
+ errorCardNonBlocking: {
3801
+ borderLeft: "4px solid #f59e0b"
3802
+ },
3803
+ errorHeader: {
3804
+ display: "flex",
3805
+ justifyContent: "space-between",
3806
+ alignItems: "flex-start",
3807
+ marginBottom: "8px"
3808
+ },
3809
+ errorCode: {
3810
+ fontSize: "13px",
3811
+ fontWeight: "600",
3812
+ color: "#1f2937",
3813
+ fontFamily: "monospace",
3814
+ backgroundColor: "#e5e7eb",
3815
+ padding: "2px 8px",
3816
+ borderRadius: "4px"
3817
+ },
3818
+ errorBadge: {
3819
+ fontSize: "11px",
3820
+ fontWeight: "500",
3821
+ padding: "2px 8px",
3822
+ borderRadius: "12px"
3823
+ },
3824
+ blockingBadge: {
3825
+ backgroundColor: "#fee2e2",
3826
+ color: "#dc2626"
3827
+ },
3828
+ nonBlockingBadge: {
3829
+ backgroundColor: "#fef3c7",
3830
+ color: "#d97706"
3831
+ },
3832
+ userMessage: {
3833
+ fontSize: "15px",
3834
+ fontWeight: "500",
3835
+ color: "#111827",
3836
+ marginBottom: "4px"
3837
+ },
3838
+ subMessage: {
3839
+ fontSize: "13px",
3840
+ color: "#6b7280",
3841
+ marginBottom: "8px"
3842
+ },
3843
+ causeLabel: {
3844
+ fontSize: "11px",
3845
+ fontWeight: "600",
3846
+ color: "#9ca3af",
3847
+ textTransform: "uppercase",
3848
+ marginBottom: "4px"
3849
+ },
3850
+ causeText: {
3851
+ fontSize: "13px",
3852
+ color: "#4b5563",
3853
+ fontStyle: "italic"
3854
+ }
3855
+ };
3856
+ function ErrorTypesPanel({ className }) {
3857
+ const blockingErrors = Object.values(ERROR_DEFINITIONS).filter((e) => e.isBlocking);
3858
+ const nonBlockingErrors = Object.values(ERROR_DEFINITIONS).filter((e) => !e.isBlocking);
3859
+ const renderErrorCard = (error) => /* @__PURE__ */ jsxs6(
3860
+ "div",
3861
+ {
3862
+ style: {
3863
+ ...panelStyles2.errorCard,
3864
+ ...error.isBlocking ? panelStyles2.errorCardBlocking : panelStyles2.errorCardNonBlocking
3865
+ },
3866
+ "data-testid": `error-card-${error.code}`,
3867
+ children: [
3868
+ /* @__PURE__ */ jsxs6("div", { style: panelStyles2.errorHeader, children: [
3869
+ /* @__PURE__ */ jsx6("code", { style: panelStyles2.errorCode, children: error.code }),
3870
+ /* @__PURE__ */ jsx6(
3871
+ "span",
3872
+ {
3873
+ style: {
3874
+ ...panelStyles2.errorBadge,
3875
+ ...error.isBlocking ? panelStyles2.blockingBadge : panelStyles2.nonBlockingBadge
3876
+ },
3877
+ children: error.isBlocking ? "Blocking" : "Non-Blocking"
3878
+ }
3879
+ )
3880
+ ] }),
3881
+ /* @__PURE__ */ jsx6("div", { style: panelStyles2.userMessage, children: error.userMessage }),
3882
+ /* @__PURE__ */ jsx6("div", { style: panelStyles2.subMessage, children: error.subMessage }),
3883
+ /* @__PURE__ */ jsx6("div", { style: panelStyles2.causeLabel, children: "Why this happens:" }),
3884
+ /* @__PURE__ */ jsx6("div", { style: panelStyles2.causeText, children: error.cause })
3885
+ ]
3886
+ },
3887
+ error.code
3888
+ );
3889
+ return /* @__PURE__ */ jsxs6("div", { style: panelStyles2.container, className, "data-testid": "error-types-panel", children: [
3890
+ /* @__PURE__ */ jsxs6("div", { style: panelStyles2.header, children: [
3891
+ /* @__PURE__ */ jsx6("h2", { style: panelStyles2.title, children: "Error Types Reference" }),
3892
+ /* @__PURE__ */ jsx6("p", { style: panelStyles2.subtitle, children: "List of all error types that can occur in the quiz components, with user-facing messages and technical causes." })
3893
+ ] }),
3894
+ /* @__PURE__ */ jsxs6("div", { style: panelStyles2.section, children: [
3895
+ /* @__PURE__ */ jsxs6("h3", { style: panelStyles2.sectionTitle, children: [
3896
+ "Blocking Errors (",
3897
+ blockingErrors.length,
3898
+ ")"
3899
+ ] }),
3900
+ /* @__PURE__ */ jsx6("p", { style: { ...panelStyles2.subtitle, marginBottom: "12px" }, children: "These errors prevent the quiz from loading or continuing. Users see a full-screen error message." }),
3901
+ /* @__PURE__ */ jsx6("div", { style: panelStyles2.errorList, children: blockingErrors.map(renderErrorCard) })
3902
+ ] }),
3903
+ /* @__PURE__ */ jsxs6("div", { style: panelStyles2.section, children: [
3904
+ /* @__PURE__ */ jsxs6("h3", { style: panelStyles2.sectionTitle, children: [
3905
+ "Non-Blocking Errors (",
3906
+ nonBlockingErrors.length,
3907
+ ")"
3908
+ ] }),
3909
+ /* @__PURE__ */ jsx6("p", { style: { ...panelStyles2.subtitle, marginBottom: "12px" }, children: "These errors affect specific features but allow the quiz to continue. Users may see a toast notification." }),
3910
+ /* @__PURE__ */ jsx6("div", { style: panelStyles2.errorList, children: nonBlockingErrors.map(renderErrorCard) })
3911
+ ] })
3912
+ ] });
3913
+ }
3914
+
3915
+ // src/ErrorLogsPanel.tsx
3916
+ import { useState as useState5, useEffect as useEffect5 } from "react";
3917
+ import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
3918
+ var panelStyles3 = {
3919
+ container: {
3920
+ fontFamily: "system-ui, -apple-system, sans-serif",
3921
+ padding: "24px",
3922
+ backgroundColor: "#ffffff",
3923
+ borderRadius: "12px",
3924
+ maxWidth: "1000px"
3925
+ },
3926
+ header: {
3927
+ marginBottom: "24px"
3928
+ },
3929
+ title: {
3930
+ fontSize: "20px",
3931
+ fontWeight: "600",
3932
+ color: "#111827",
3933
+ marginBottom: "8px"
3934
+ },
3935
+ subtitle: {
3936
+ fontSize: "14px",
3937
+ color: "#6b7280"
3938
+ },
3939
+ tabs: {
3940
+ display: "flex",
3941
+ gap: "8px",
3942
+ marginBottom: "16px",
3943
+ borderBottom: "1px solid #e5e7eb",
3944
+ paddingBottom: "12px"
3945
+ },
3946
+ tab: {
3947
+ padding: "8px 16px",
3948
+ fontSize: "14px",
3949
+ fontWeight: "500",
3950
+ borderRadius: "6px",
3951
+ cursor: "pointer",
3952
+ border: "none",
3953
+ backgroundColor: "transparent",
3954
+ color: "#6b7280"
3955
+ },
3956
+ tabActive: {
3957
+ backgroundColor: "#6721b0",
3958
+ color: "#ffffff"
3959
+ },
3960
+ stats: {
3961
+ display: "flex",
3962
+ gap: "16px",
3963
+ marginBottom: "20px"
3964
+ },
3965
+ statCard: {
3966
+ padding: "12px 16px",
3967
+ backgroundColor: "#f9fafb",
3968
+ borderRadius: "8px",
3969
+ flex: 1
3970
+ },
3971
+ statValue: {
3972
+ fontSize: "24px",
3973
+ fontWeight: "700",
3974
+ color: "#111827"
3975
+ },
3976
+ statLabel: {
3977
+ fontSize: "12px",
3978
+ color: "#6b7280",
3979
+ textTransform: "uppercase",
3980
+ letterSpacing: "0.05em"
3981
+ },
3982
+ errorList: {
3983
+ display: "flex",
3984
+ flexDirection: "column",
3985
+ gap: "12px"
3986
+ },
3987
+ errorCard: {
3988
+ padding: "16px",
3989
+ backgroundColor: "#f9fafb",
3990
+ borderRadius: "8px",
3991
+ border: "1px solid #e5e7eb"
3992
+ },
3993
+ errorCardRecent: {
3994
+ borderLeft: "4px solid #ef4444",
3995
+ backgroundColor: "#fef2f2"
3996
+ },
3997
+ errorCardOld: {
3998
+ borderLeft: "4px solid #9ca3af",
3999
+ opacity: 0.7
4000
+ },
4001
+ errorHeader: {
4002
+ display: "flex",
4003
+ justifyContent: "space-between",
4004
+ alignItems: "flex-start",
4005
+ marginBottom: "8px"
4006
+ },
4007
+ errorLeft: {
4008
+ flex: 1
4009
+ },
4010
+ errorCode: {
4011
+ fontSize: "13px",
4012
+ fontWeight: "600",
4013
+ color: "#1f2937",
4014
+ fontFamily: "monospace",
4015
+ backgroundColor: "#e5e7eb",
4016
+ padding: "2px 8px",
4017
+ borderRadius: "4px",
4018
+ display: "inline-block"
4019
+ },
4020
+ countBadge: {
4021
+ fontSize: "14px",
4022
+ fontWeight: "700",
4023
+ padding: "4px 12px",
4024
+ borderRadius: "16px",
4025
+ backgroundColor: "#ef4444",
4026
+ color: "#ffffff"
4027
+ },
4028
+ countBadgeLow: {
4029
+ backgroundColor: "#f59e0b"
4030
+ },
4031
+ contextBadge: {
4032
+ fontSize: "11px",
4033
+ fontWeight: "500",
4034
+ padding: "2px 8px",
4035
+ borderRadius: "4px",
4036
+ marginLeft: "8px",
4037
+ backgroundColor: "#dbeafe",
4038
+ color: "#1d4ed8"
4039
+ },
4040
+ userMessage: {
4041
+ fontSize: "15px",
4042
+ fontWeight: "500",
4043
+ color: "#111827",
4044
+ marginTop: "8px",
4045
+ marginBottom: "4px"
4046
+ },
4047
+ resourceId: {
4048
+ fontSize: "12px",
4049
+ color: "#6b7280",
4050
+ fontFamily: "monospace",
4051
+ marginTop: "4px"
4052
+ },
4053
+ resourceLink: {
4054
+ color: "#6721b0",
4055
+ textDecoration: "underline",
4056
+ cursor: "pointer"
4057
+ },
4058
+ timestamps: {
4059
+ display: "flex",
4060
+ gap: "16px",
4061
+ marginTop: "8px",
4062
+ fontSize: "12px",
4063
+ color: "#9ca3af"
4064
+ },
4065
+ dismissButton: {
4066
+ padding: "6px 12px",
4067
+ fontSize: "12px",
4068
+ fontWeight: "500",
4069
+ borderRadius: "4px",
4070
+ cursor: "pointer",
4071
+ border: "1px solid #e5e7eb",
4072
+ backgroundColor: "#ffffff",
4073
+ color: "#6b7280",
4074
+ marginTop: "8px"
4075
+ },
4076
+ dismissButtonHover: {
4077
+ backgroundColor: "#f3f4f6"
4078
+ },
4079
+ emptyState: {
4080
+ textAlign: "center",
4081
+ padding: "40px",
4082
+ color: "#9ca3af",
4083
+ fontSize: "14px"
4084
+ },
4085
+ loading: {
4086
+ textAlign: "center",
4087
+ padding: "40px",
4088
+ color: "#6b7280",
4089
+ fontSize: "14px"
4090
+ },
4091
+ pagination: {
4092
+ display: "flex",
4093
+ justifyContent: "center",
4094
+ gap: "8px",
4095
+ marginTop: "20px"
4096
+ },
4097
+ pageButton: {
4098
+ padding: "8px 12px",
4099
+ fontSize: "14px",
4100
+ borderRadius: "4px",
4101
+ cursor: "pointer",
4102
+ border: "1px solid #e5e7eb",
4103
+ backgroundColor: "#ffffff",
4104
+ color: "#374151"
4105
+ },
4106
+ pageButtonDisabled: {
4107
+ opacity: 0.5,
4108
+ cursor: "not-allowed"
4109
+ }
4110
+ };
4111
+ function formatRelativeTime(dateStr) {
4112
+ const date = new Date(dateStr);
4113
+ const now = /* @__PURE__ */ new Date();
4114
+ const diffMs = now.getTime() - date.getTime();
4115
+ const diffMins = Math.floor(diffMs / 6e4);
4116
+ const diffHours = Math.floor(diffMs / 36e5);
4117
+ const diffDays = Math.floor(diffMs / 864e5);
4118
+ if (diffMins < 1) return "Just now";
4119
+ if (diffMins < 60) return `${diffMins}m ago`;
4120
+ if (diffHours < 24) return `${diffHours}h ago`;
4121
+ if (diffDays < 7) return `${diffDays}d ago`;
4122
+ return date.toLocaleDateString();
4123
+ }
4124
+ function isRecent(dateStr) {
4125
+ const date = new Date(dateStr);
4126
+ const now = /* @__PURE__ */ new Date();
4127
+ const diffMs = now.getTime() - date.getTime();
4128
+ const diffHours = diffMs / 36e5;
4129
+ return diffHours < 24;
4130
+ }
4131
+ function ErrorLogsPanel({ apiBaseUrl, authToken, onResourceClick }) {
4132
+ const [logs, setLogs] = useState5([]);
4133
+ const [loading, setLoading] = useState5(true);
4134
+ const [showDismissed, setShowDismissed] = useState5(false);
4135
+ const [page, setPage] = useState5(1);
4136
+ const [totalPages, setTotalPages] = useState5(1);
4137
+ const [total, setTotal] = useState5(0);
4138
+ useEffect5(() => {
4139
+ fetchLogs();
4140
+ }, [showDismissed, page]);
4141
+ async function fetchLogs() {
4142
+ setLoading(true);
4143
+ try {
4144
+ const params = new URLSearchParams();
4145
+ params.set("dismissed", showDismissed ? "true" : "false");
4146
+ params.set("page", page.toString());
4147
+ params.set("limit", "20");
4148
+ const response = await fetch(`${apiBaseUrl}/api/admin/error-logs?${params}`, {
4149
+ headers: authToken ? { Authorization: `Bearer ${authToken}` } : {}
4150
+ });
4151
+ if (response.ok) {
4152
+ const data = await response.json();
4153
+ setLogs(data.items || []);
4154
+ setTotalPages(data.totalPages || 1);
4155
+ setTotal(data.total || 0);
4156
+ }
4157
+ } catch (err) {
4158
+ console.error("Failed to fetch error logs:", err);
4159
+ } finally {
4160
+ setLoading(false);
4161
+ }
4162
+ }
4163
+ async function handleDismiss(id) {
4164
+ try {
4165
+ const response = await fetch(`${apiBaseUrl}/api/admin/error-logs/${id}/dismiss`, {
4166
+ method: "PATCH",
4167
+ headers: authToken ? { Authorization: `Bearer ${authToken}` } : {}
4168
+ });
4169
+ if (response.ok) {
4170
+ fetchLogs();
4171
+ }
4172
+ } catch (err) {
4173
+ console.error("Failed to dismiss error:", err);
4174
+ }
4175
+ }
4176
+ async function handleUndismiss(id) {
4177
+ try {
4178
+ const response = await fetch(`${apiBaseUrl}/api/admin/error-logs/${id}/undismiss`, {
4179
+ method: "PATCH",
4180
+ headers: authToken ? { Authorization: `Bearer ${authToken}` } : {}
4181
+ });
4182
+ if (response.ok) {
4183
+ fetchLogs();
4184
+ }
4185
+ } catch (err) {
4186
+ console.error("Failed to undismiss error:", err);
4187
+ }
4188
+ }
4189
+ function getErrorDefinition(code) {
4190
+ return ERROR_DEFINITIONS[code];
4191
+ }
4192
+ const totalErrors = logs.reduce((sum, log) => sum + log.count, 0);
4193
+ const recentCount = logs.filter((log) => isRecent(log.lastSeenAt)).length;
4194
+ return /* @__PURE__ */ jsxs7("div", { style: panelStyles3.container, "data-testid": "error-logs-panel", children: [
4195
+ /* @__PURE__ */ jsxs7("div", { style: panelStyles3.header, children: [
4196
+ /* @__PURE__ */ jsx7("h2", { style: panelStyles3.title, children: "Error Tracking" }),
4197
+ /* @__PURE__ */ jsx7("p", { style: panelStyles3.subtitle, children: "Aggregated errors from QuizPlayer and AttemptViewer components, sorted by occurrence count" })
4198
+ ] }),
4199
+ /* @__PURE__ */ jsxs7("div", { style: panelStyles3.tabs, children: [
4200
+ /* @__PURE__ */ jsx7(
4201
+ "button",
4202
+ {
4203
+ style: {
4204
+ ...panelStyles3.tab,
4205
+ ...showDismissed ? {} : panelStyles3.tabActive
4206
+ },
4207
+ onClick: () => {
4208
+ setShowDismissed(false);
4209
+ setPage(1);
4210
+ },
4211
+ "data-testid": "tab-active-errors",
4212
+ children: "Active Errors"
4213
+ }
4214
+ ),
4215
+ /* @__PURE__ */ jsx7(
4216
+ "button",
4217
+ {
4218
+ style: {
4219
+ ...panelStyles3.tab,
4220
+ ...showDismissed ? panelStyles3.tabActive : {}
4221
+ },
4222
+ onClick: () => {
4223
+ setShowDismissed(true);
4224
+ setPage(1);
4225
+ },
4226
+ "data-testid": "tab-dismissed-errors",
4227
+ children: "Dismissed"
4228
+ }
4229
+ )
4230
+ ] }),
4231
+ !showDismissed && /* @__PURE__ */ jsxs7("div", { style: panelStyles3.stats, children: [
4232
+ /* @__PURE__ */ jsxs7("div", { style: panelStyles3.statCard, children: [
4233
+ /* @__PURE__ */ jsx7("div", { style: panelStyles3.statValue, children: total }),
4234
+ /* @__PURE__ */ jsx7("div", { style: panelStyles3.statLabel, children: "Unique Errors" })
4235
+ ] }),
4236
+ /* @__PURE__ */ jsxs7("div", { style: panelStyles3.statCard, children: [
4237
+ /* @__PURE__ */ jsx7("div", { style: panelStyles3.statValue, children: totalErrors }),
4238
+ /* @__PURE__ */ jsx7("div", { style: panelStyles3.statLabel, children: "Total Occurrences" })
4239
+ ] }),
4240
+ /* @__PURE__ */ jsxs7("div", { style: panelStyles3.statCard, children: [
4241
+ /* @__PURE__ */ jsx7("div", { style: { ...panelStyles3.statValue, color: recentCount > 0 ? "#ef4444" : "#22c55e" }, children: recentCount }),
4242
+ /* @__PURE__ */ jsx7("div", { style: panelStyles3.statLabel, children: "Last 24h" })
4243
+ ] })
4244
+ ] }),
4245
+ loading ? /* @__PURE__ */ jsx7("div", { style: panelStyles3.loading, children: "Loading..." }) : logs.length === 0 ? /* @__PURE__ */ jsx7("div", { style: panelStyles3.emptyState, children: showDismissed ? "No dismissed errors" : "No active errors" }) : /* @__PURE__ */ jsx7("div", { style: panelStyles3.errorList, children: logs.map((log) => {
4246
+ const def = getErrorDefinition(log.errorCode);
4247
+ const recent = isRecent(log.lastSeenAt);
4248
+ return /* @__PURE__ */ jsxs7(
4249
+ "div",
4250
+ {
4251
+ style: {
4252
+ ...panelStyles3.errorCard,
4253
+ ...recent ? panelStyles3.errorCardRecent : panelStyles3.errorCardOld
4254
+ },
4255
+ "data-testid": `error-log-${log.id}`,
4256
+ children: [
4257
+ /* @__PURE__ */ jsxs7("div", { style: panelStyles3.errorHeader, children: [
4258
+ /* @__PURE__ */ jsxs7("div", { style: panelStyles3.errorLeft, children: [
4259
+ /* @__PURE__ */ jsx7("span", { style: panelStyles3.errorCode, children: log.errorCode }),
4260
+ /* @__PURE__ */ jsx7("span", { style: panelStyles3.contextBadge, children: log.context }),
4261
+ /* @__PURE__ */ jsx7("span", { style: { ...panelStyles3.contextBadge, backgroundColor: "#f3e8ff", color: "#7c3aed" }, children: log.component })
4262
+ ] }),
4263
+ /* @__PURE__ */ jsxs7(
4264
+ "span",
4265
+ {
4266
+ style: {
4267
+ ...panelStyles3.countBadge,
4268
+ ...log.count < 10 ? panelStyles3.countBadgeLow : {}
4269
+ },
4270
+ children: [
4271
+ log.count,
4272
+ "x"
4273
+ ]
4274
+ }
4275
+ )
4276
+ ] }),
4277
+ /* @__PURE__ */ jsx7("div", { style: panelStyles3.userMessage, children: def?.userMessage || log.lastMessage || "Unknown error" }),
4278
+ log.resourceId && /* @__PURE__ */ jsxs7("div", { style: panelStyles3.resourceId, children: [
4279
+ "Resource:",
4280
+ " ",
4281
+ onResourceClick ? /* @__PURE__ */ jsx7(
4282
+ "span",
4283
+ {
4284
+ style: panelStyles3.resourceLink,
4285
+ onClick: () => onResourceClick(log.resourceId, log.context),
4286
+ "data-testid": `link-resource-${log.id}`,
4287
+ children: log.resourceId
4288
+ }
4289
+ ) : log.resourceId
4290
+ ] }),
4291
+ /* @__PURE__ */ jsxs7("div", { style: panelStyles3.timestamps, children: [
4292
+ /* @__PURE__ */ jsxs7("span", { children: [
4293
+ "First: ",
4294
+ formatRelativeTime(log.firstSeenAt)
4295
+ ] }),
4296
+ /* @__PURE__ */ jsxs7("span", { children: [
4297
+ "Last: ",
4298
+ formatRelativeTime(log.lastSeenAt)
4299
+ ] })
4300
+ ] }),
4301
+ /* @__PURE__ */ jsx7(
4302
+ "button",
4303
+ {
4304
+ style: panelStyles3.dismissButton,
4305
+ onClick: () => showDismissed ? handleUndismiss(log.id) : handleDismiss(log.id),
4306
+ "data-testid": `button-dismiss-${log.id}`,
4307
+ children: showDismissed ? "Restore" : "Dismiss"
4308
+ }
4309
+ )
4310
+ ]
4311
+ },
4312
+ log.id
4313
+ );
4314
+ }) }),
4315
+ totalPages > 1 && /* @__PURE__ */ jsxs7("div", { style: panelStyles3.pagination, children: [
4316
+ /* @__PURE__ */ jsx7(
4317
+ "button",
4318
+ {
4319
+ style: {
4320
+ ...panelStyles3.pageButton,
4321
+ ...page <= 1 ? panelStyles3.pageButtonDisabled : {}
4322
+ },
4323
+ onClick: () => setPage((p) => Math.max(1, p - 1)),
4324
+ disabled: page <= 1,
4325
+ "data-testid": "button-prev-page",
4326
+ children: "Previous"
4327
+ }
4328
+ ),
4329
+ /* @__PURE__ */ jsxs7("span", { style: { padding: "8px 12px", color: "#6b7280" }, children: [
4330
+ "Page ",
4331
+ page,
4332
+ " of ",
4333
+ totalPages
4334
+ ] }),
4335
+ /* @__PURE__ */ jsx7(
4336
+ "button",
4337
+ {
4338
+ style: {
4339
+ ...panelStyles3.pageButton,
4340
+ ...page >= totalPages ? panelStyles3.pageButtonDisabled : {}
4341
+ },
4342
+ onClick: () => setPage((p) => Math.min(totalPages, p + 1)),
4343
+ disabled: page >= totalPages,
4344
+ "data-testid": "button-next-page",
4345
+ children: "Next"
4346
+ }
4347
+ )
4348
+ ] })
4349
+ ] });
4350
+ }
3393
4351
  export {
3394
4352
  AttemptViewer,
4353
+ ERROR_DEFINITIONS,
4354
+ ErrorLogsPanel,
4355
+ ErrorTypesPanel,
4356
+ MaintenanceScreen,
3395
4357
  QuizApiClient,
3396
4358
  QuizPlayer,
3397
4359
  TextToSpeech,
3398
4360
  calculateScore,
3399
4361
  checkAnswer,
3400
4362
  createAnswerDetail,
3401
- formatTime
4363
+ formatTime,
4364
+ getErrorFromHttpStatus,
4365
+ getErrorFromMessage
3402
4366
  };
3403
4367
  //# sourceMappingURL=index.mjs.map