@burdenoff/microfe-technospam 2026.1102.3 → 2026.1102.4

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.
Files changed (46) hide show
  1. package/dist/generated/global-types.d.ts +307 -41
  2. package/dist/generated/global-types.d.ts.map +1 -1
  3. package/dist/generated/wspace-types.d.ts +1730 -8
  4. package/dist/generated/wspace-types.d.ts.map +1 -1
  5. package/dist/stories/fixtures/technospamFixtures.d.ts.map +1 -1
  6. package/dist/technospam/TechnoSpamRoutes.d.ts.map +1 -1
  7. package/dist/technospam/TechnoSpamRoutes.js +32 -28
  8. package/dist/technospam/TechnoSpamRoutes.js.map +1 -1
  9. package/dist/technospam/api/assessmentApi.d.ts +183 -0
  10. package/dist/technospam/api/assessmentApi.d.ts.map +1 -0
  11. package/dist/technospam/api/assessmentApi.js +278 -0
  12. package/dist/technospam/api/assessmentApi.js.map +1 -0
  13. package/dist/technospam/components/CourseAssessments.d.ts +9 -0
  14. package/dist/technospam/components/CourseAssessments.d.ts.map +1 -0
  15. package/dist/technospam/components/CourseAssessments.js +66 -0
  16. package/dist/technospam/components/CourseAssessments.js.map +1 -0
  17. package/dist/technospam/components/StatusBadge.d.ts.map +1 -1
  18. package/dist/technospam/components/StatusBadge.js +8 -1
  19. package/dist/technospam/components/StatusBadge.js.map +1 -1
  20. package/dist/technospam/components/admin/AssessmentsAdminTab.d.ts +7 -0
  21. package/dist/technospam/components/admin/AssessmentsAdminTab.d.ts.map +1 -0
  22. package/dist/technospam/components/admin/AssessmentsAdminTab.js +421 -0
  23. package/dist/technospam/components/admin/AssessmentsAdminTab.js.map +1 -0
  24. package/dist/technospam/components/lesson/LessonKindFields.d.ts +3 -1
  25. package/dist/technospam/components/lesson/LessonKindFields.d.ts.map +1 -1
  26. package/dist/technospam/components/lesson/LessonKindFields.js +2 -2
  27. package/dist/technospam/components/lesson/LessonKindFields.js.map +1 -1
  28. package/dist/technospam/hooks/useAssessmentIntegrity.d.ts +29 -0
  29. package/dist/technospam/hooks/useAssessmentIntegrity.d.ts.map +1 -0
  30. package/dist/technospam/hooks/useAssessmentIntegrity.js +57 -0
  31. package/dist/technospam/hooks/useAssessmentIntegrity.js.map +1 -0
  32. package/dist/technospam/pages/AdminAdminDashboardPagePage.d.ts.map +1 -1
  33. package/dist/technospam/pages/AdminAdminDashboardPagePage.js +364 -359
  34. package/dist/technospam/pages/AdminAdminDashboardPagePage.js.map +1 -1
  35. package/dist/technospam/pages/CoursesAssessmentPagePage.d.ts +9 -0
  36. package/dist/technospam/pages/CoursesAssessmentPagePage.d.ts.map +1 -0
  37. package/dist/technospam/pages/CoursesAssessmentPagePage.js +464 -0
  38. package/dist/technospam/pages/CoursesAssessmentPagePage.js.map +1 -0
  39. package/dist/technospam/pages/CoursesCourseDetailsPagePage.d.ts.map +1 -1
  40. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +210 -208
  41. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -1
  42. package/dist/technospam/utils/assessment.d.ts +64 -0
  43. package/dist/technospam/utils/assessment.d.ts.map +1 -0
  44. package/dist/technospam/utils/assessment.js +122 -0
  45. package/dist/technospam/utils/assessment.js.map +1 -0
  46. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"technospamFixtures.d.ts","sourceRoot":"","sources":["../../../src/stories/fixtures/technospamFixtures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAEV,SAAS,EACT,aAAa,EACb,YAAY,EAEZ,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,UAAU,EAEV,aAAa,EACd,MAAM,oCAAoC,CAAC;AAE5C,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;CAMd,CAAC;AASX,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACpC,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;AA0JxC,MAAM,WAAW,wBAAwB;IACvC,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,wBAA6B;;;;;;;;;;;;;;;EAsjB9E;AAED,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
1
+ {"version":3,"file":"technospamFixtures.d.ts","sourceRoot":"","sources":["../../../src/stories/fixtures/technospamFixtures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAEV,SAAS,EACT,aAAa,EACb,YAAY,EAEZ,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,UAAU,EAEV,aAAa,EACd,MAAM,oCAAoC,CAAC;AAE5C,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;CAMd,CAAC;AASX,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACpC,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;AA0JxC,MAAM,WAAW,wBAAwB;IACvC,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,wBAA6B;;;;;;;;;;;;;;;EAglB9E;AAED,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TechnoSpamRoutes.d.ts","sourceRoot":"","sources":["../../src/technospam/TechnoSpamRoutes.tsx"],"names":[],"mappings":"AAwJA,wBAAgB,gBAAgB,gCAqK/B"}
1
+ {"version":3,"file":"TechnoSpamRoutes.d.ts","sourceRoot":"","sources":["../../src/technospam/TechnoSpamRoutes.tsx"],"names":[],"mappings":"AA8JA,wBAAgB,gBAAgB,gCAyK/B"}
@@ -10,8 +10,8 @@ import { Navigate as u, Route as d, Routes as f, useLocation as p } from "react-
10
10
  import { jsx as m, jsxs as h } from "react/jsx-runtime";
11
11
  import { FeatureGate as g } from "@burdenoff/fe-libs/shared/feature-flags";
12
12
  //#region src/technospam/TechnoSpamRoutes.tsx
13
- var _ = o(() => import("./pages/DashboardDashboardPagePage.js").then((e) => ({ default: e.DashboardDashboardPagePage }))), v = o(() => import("./pages/CoursesCoursesPagePage.js").then((e) => ({ default: e.CoursesCoursesPagePage }))), y = o(() => import("./pages/CoursesCourseDetailsPagePage.js").then((e) => ({ default: e.CoursesCourseDetailsPagePage }))), b = o(() => import("./pages/CoursesLessonPlayerPagePage.js").then((e) => ({ default: e.CoursesLessonPlayerPagePage }))), x = o(() => import("./pages/CoursesMyLearningPagePage.js").then((e) => ({ default: e.CoursesMyLearningPagePage }))), S = o(() => import("./pages/ApplicationsProblemsPagePage.js").then((e) => ({ default: e.ApplicationsProblemsPagePage }))), C = o(() => import("./pages/ApplicationsProblemDetailsPagePage.js").then((e) => ({ default: e.ApplicationsProblemDetailsPagePage }))), w = o(() => import("./pages/MentorshipMentorsPagePage.js").then((e) => ({ default: e.MentorshipMentorsPagePage }))), T = o(() => import("./pages/MentorshipMentorProfilePagePage.js").then((e) => ({ default: e.MentorshipMentorProfilePagePage }))), E = o(() => import("./pages/MentorshipSessionsPagePage.js").then((e) => ({ default: e.MentorshipSessionsPagePage }))), D = o(() => import("./pages/HackathonsHackathonsPagePage.js").then((e) => ({ default: e.HackathonsHackathonsPagePage }))), O = o(() => import("./pages/HackathonsHackathonDetailsPagePage.js").then((e) => ({ default: e.HackathonsHackathonDetailsPagePage }))), k = o(() => import("./pages/AnalyticsAnalyticsPagePage.js").then((e) => ({ default: e.AnalyticsAnalyticsPagePage }))), A = o(() => import("./pages/AdminAdminDashboardPagePage.js").then((e) => ({ default: e.AdminAdminDashboardPagePage }))), j = o(() => import("./pages/StudyPlannerStudyPlannerPagePage.js").then((e) => ({ default: e.StudyPlannerStudyPlannerPagePage }))), M = o(() => import("./pages/ApplicationsPortfolioPagePage.js").then((e) => ({ default: e.ApplicationsPortfolioPagePage })));
14
- function N() {
13
+ var _ = o(() => import("./pages/DashboardDashboardPagePage.js").then((e) => ({ default: e.DashboardDashboardPagePage }))), v = o(() => import("./pages/CoursesCoursesPagePage.js").then((e) => ({ default: e.CoursesCoursesPagePage }))), y = o(() => import("./pages/CoursesCourseDetailsPagePage.js").then((e) => ({ default: e.CoursesCourseDetailsPagePage }))), b = o(() => import("./pages/CoursesLessonPlayerPagePage.js").then((e) => ({ default: e.CoursesLessonPlayerPagePage }))), x = o(() => import("./pages/CoursesAssessmentPagePage.js").then((e) => ({ default: e.CoursesAssessmentPagePage }))), S = o(() => import("./pages/CoursesMyLearningPagePage.js").then((e) => ({ default: e.CoursesMyLearningPagePage }))), C = o(() => import("./pages/ApplicationsProblemsPagePage.js").then((e) => ({ default: e.ApplicationsProblemsPagePage }))), w = o(() => import("./pages/ApplicationsProblemDetailsPagePage.js").then((e) => ({ default: e.ApplicationsProblemDetailsPagePage }))), T = o(() => import("./pages/MentorshipMentorsPagePage.js").then((e) => ({ default: e.MentorshipMentorsPagePage }))), E = o(() => import("./pages/MentorshipMentorProfilePagePage.js").then((e) => ({ default: e.MentorshipMentorProfilePagePage }))), D = o(() => import("./pages/MentorshipSessionsPagePage.js").then((e) => ({ default: e.MentorshipSessionsPagePage }))), O = o(() => import("./pages/HackathonsHackathonsPagePage.js").then((e) => ({ default: e.HackathonsHackathonsPagePage }))), k = o(() => import("./pages/HackathonsHackathonDetailsPagePage.js").then((e) => ({ default: e.HackathonsHackathonDetailsPagePage }))), A = o(() => import("./pages/AnalyticsAnalyticsPagePage.js").then((e) => ({ default: e.AnalyticsAnalyticsPagePage }))), j = o(() => import("./pages/AdminAdminDashboardPagePage.js").then((e) => ({ default: e.AdminAdminDashboardPagePage }))), M = o(() => import("./pages/StudyPlannerStudyPlannerPagePage.js").then((e) => ({ default: e.StudyPlannerStudyPlannerPagePage }))), N = o(() => import("./pages/ApplicationsPortfolioPagePage.js").then((e) => ({ default: e.ApplicationsPortfolioPagePage })));
14
+ function P() {
15
15
  return /* @__PURE__ */ m("div", {
16
16
  className: "flex h-full min-h-[40vh] items-center justify-center",
17
17
  children: /* @__PURE__ */ m(c, {
@@ -20,7 +20,7 @@ function N() {
20
20
  })
21
21
  });
22
22
  }
23
- function P() {
23
+ function F() {
24
24
  return /* @__PURE__ */ m("div", {
25
25
  className: "flex h-full min-h-[40vh] items-center justify-center p-6",
26
26
  children: /* @__PURE__ */ m(t, {
@@ -30,45 +30,49 @@ function P() {
30
30
  })
31
31
  });
32
32
  }
33
- function F(e, t) {
33
+ function I(e, t) {
34
34
  return /* @__PURE__ */ m(g, {
35
35
  flag: e,
36
36
  defaultValue: !0,
37
- fallback: /* @__PURE__ */ m(P, {}),
37
+ fallback: /* @__PURE__ */ m(F, {}),
38
38
  children: t
39
39
  });
40
40
  }
41
- function I() {
41
+ function L() {
42
42
  let { pathname: t } = p();
43
- e(s(() => t.includes("/courses/lesson-player") ? "lesson-player" : t.includes("/courses/course-details") ? "course-details" : t.includes("/courses/my-learning") ? "my-learning" : t.includes("/courses") ? "courses" : t.includes("/applications/problem-details") ? "problem-details" : t.includes("/applications/portfolio") ? "portfolio" : t.includes("/applications") ? "problems" : t.includes("/study-planner") ? "study-planner" : t.includes("/mentorship/mentor-profile") ? "mentor-profile" : t.includes("/mentorship/sessions") ? "sessions" : t.includes("/mentorship") ? "mentors" : t.includes("/hackathons/hackathon-details") ? "hackathon-details" : t.includes("/hackathons") ? "hackathons" : t.includes("/analytics") ? "analytics" : t.includes("/admin") ? "admin" : "dashboard", [t]));
43
+ e(s(() => t.includes("/courses/lesson-player") ? "lesson-player" : t.includes("/courses/course-details") ? "course-details" : t.includes("/courses/assessment") ? "assessment" : t.includes("/courses/my-learning") ? "my-learning" : t.includes("/courses") ? "courses" : t.includes("/applications/problem-details") ? "problem-details" : t.includes("/applications/portfolio") ? "portfolio" : t.includes("/applications") ? "problems" : t.includes("/study-planner") ? "study-planner" : t.includes("/mentorship/mentor-profile") ? "mentor-profile" : t.includes("/mentorship/sessions") ? "sessions" : t.includes("/mentorship") ? "mentors" : t.includes("/hackathons/hackathon-details") ? "hackathon-details" : t.includes("/hackathons") ? "hackathons" : t.includes("/analytics") ? "analytics" : t.includes("/admin") ? "admin" : "dashboard", [t]));
44
44
  }
45
- function L() {
46
- return I(), /* @__PURE__ */ m(a, {
47
- fallback: /* @__PURE__ */ m(N, {}),
45
+ function R() {
46
+ return L(), /* @__PURE__ */ m(a, {
47
+ fallback: /* @__PURE__ */ m(P, {}),
48
48
  children: /* @__PURE__ */ h(n, { children: [/* @__PURE__ */ m(r, {}), /* @__PURE__ */ h(f, { children: [
49
49
  /* @__PURE__ */ m(d, {
50
50
  index: !0,
51
- element: F("technospam.dashboard", /* @__PURE__ */ m(i, {}))
51
+ element: I("technospam.dashboard", /* @__PURE__ */ m(i, {}))
52
52
  }),
53
53
  /* @__PURE__ */ m(d, {
54
54
  path: "dashboard/dashboard-page",
55
- element: F("technospam.dashboard", /* @__PURE__ */ m(_, {}))
55
+ element: I("technospam.dashboard", /* @__PURE__ */ m(_, {}))
56
56
  }),
57
57
  /* @__PURE__ */ m(d, {
58
58
  path: "courses/courses-page",
59
- element: F("technospam.courses", /* @__PURE__ */ m(v, {}))
59
+ element: I("technospam.courses", /* @__PURE__ */ m(v, {}))
60
60
  }),
61
61
  /* @__PURE__ */ m(d, {
62
62
  path: "courses/course-details-page",
63
- element: F("technospam.courses", /* @__PURE__ */ m(y, {}))
63
+ element: I("technospam.courses", /* @__PURE__ */ m(y, {}))
64
64
  }),
65
65
  /* @__PURE__ */ m(d, {
66
66
  path: "courses/lesson-player-page",
67
- element: F("technospam.courses", /* @__PURE__ */ m(b, {}))
67
+ element: I("technospam.courses", /* @__PURE__ */ m(b, {}))
68
+ }),
69
+ /* @__PURE__ */ m(d, {
70
+ path: "courses/assessment-page",
71
+ element: I("technospam.courses", /* @__PURE__ */ m(x, {}))
68
72
  }),
69
73
  /* @__PURE__ */ m(d, {
70
74
  path: "courses/my-learning-page",
71
- element: F("technospam.courses", /* @__PURE__ */ m(x, {}))
75
+ element: I("technospam.courses", /* @__PURE__ */ m(S, {}))
72
76
  }),
73
77
  /* @__PURE__ */ m(d, {
74
78
  path: "courses/instructors-page",
@@ -86,11 +90,11 @@ function L() {
86
90
  }),
87
91
  /* @__PURE__ */ m(d, {
88
92
  path: "applications/problems-page",
89
- element: F("technospam.problems", /* @__PURE__ */ m(S, {}))
93
+ element: I("technospam.problems", /* @__PURE__ */ m(C, {}))
90
94
  }),
91
95
  /* @__PURE__ */ m(d, {
92
96
  path: "applications/problem-details-page",
93
- element: F("technospam.problems", /* @__PURE__ */ m(C, {}))
97
+ element: I("technospam.problems", /* @__PURE__ */ m(w, {}))
94
98
  }),
95
99
  /* @__PURE__ */ m(d, {
96
100
  path: "applications/solutions-page",
@@ -101,19 +105,19 @@ function L() {
101
105
  }),
102
106
  /* @__PURE__ */ m(d, {
103
107
  path: "applications/portfolio-page",
104
- element: F("technospam.portfolio", /* @__PURE__ */ m(M, {}))
108
+ element: I("technospam.portfolio", /* @__PURE__ */ m(N, {}))
105
109
  }),
106
110
  /* @__PURE__ */ m(d, {
107
111
  path: "mentorship/mentors-page",
108
- element: F("technospam.mentorship", /* @__PURE__ */ m(w, {}))
112
+ element: I("technospam.mentorship", /* @__PURE__ */ m(T, {}))
109
113
  }),
110
114
  /* @__PURE__ */ m(d, {
111
115
  path: "mentorship/mentor-profile-page",
112
- element: F("technospam.mentorship", /* @__PURE__ */ m(T, {}))
116
+ element: I("technospam.mentorship", /* @__PURE__ */ m(E, {}))
113
117
  }),
114
118
  /* @__PURE__ */ m(d, {
115
119
  path: "mentorship/sessions-page",
116
- element: F("technospam.mentorship", /* @__PURE__ */ m(E, {}))
120
+ element: I("technospam.mentorship", /* @__PURE__ */ m(D, {}))
117
121
  }),
118
122
  /* @__PURE__ */ m(d, {
119
123
  path: "mentorship/mentorship-page",
@@ -131,11 +135,11 @@ function L() {
131
135
  }),
132
136
  /* @__PURE__ */ m(d, {
133
137
  path: "hackathons/hackathons-page",
134
- element: F("technospam.hackathons", /* @__PURE__ */ m(D, {}))
138
+ element: I("technospam.hackathons", /* @__PURE__ */ m(O, {}))
135
139
  }),
136
140
  /* @__PURE__ */ m(d, {
137
141
  path: "hackathons/hackathon-details-page",
138
- element: F("technospam.hackathons", /* @__PURE__ */ m(O, {}))
142
+ element: I("technospam.hackathons", /* @__PURE__ */ m(k, {}))
139
143
  }),
140
144
  /* @__PURE__ */ m(d, {
141
145
  path: "hackathons/events-page",
@@ -153,7 +157,7 @@ function L() {
153
157
  }),
154
158
  /* @__PURE__ */ m(d, {
155
159
  path: "analytics/analytics-page",
156
- element: F("technospam.analytics", /* @__PURE__ */ m(k, {}))
160
+ element: I("technospam.analytics", /* @__PURE__ */ m(A, {}))
157
161
  }),
158
162
  /* @__PURE__ */ m(d, {
159
163
  path: "analytics/progress-page",
@@ -178,7 +182,7 @@ function L() {
178
182
  }),
179
183
  /* @__PURE__ */ m(d, {
180
184
  path: "admin/admin-dashboard-page",
181
- element: F("technospam.admin", /* @__PURE__ */ m(A, {}))
185
+ element: I("technospam.admin", /* @__PURE__ */ m(j, {}))
182
186
  }),
183
187
  /* @__PURE__ */ m(d, {
184
188
  path: "admin/audit-reports-page",
@@ -189,7 +193,7 @@ function L() {
189
193
  }),
190
194
  /* @__PURE__ */ m(d, {
191
195
  path: "study-planner/study-planner-page",
192
- element: F("technospam.studyPlanner", /* @__PURE__ */ m(j, {}))
196
+ element: I("technospam.studyPlanner", /* @__PURE__ */ m(M, {}))
193
197
  }),
194
198
  /* @__PURE__ */ m(d, {
195
199
  path: "study-planner/*",
@@ -223,6 +227,6 @@ function L() {
223
227
  });
224
228
  }
225
229
  //#endregion
226
- export { L as TechnoSpamRoutes };
230
+ export { R as TechnoSpamRoutes };
227
231
 
228
232
  //# sourceMappingURL=TechnoSpamRoutes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TechnoSpamRoutes.js","names":[],"sources":["../../src/technospam/TechnoSpamRoutes.tsx"],"sourcesContent":["import { lazy, Suspense, useMemo } from 'react';\nimport { Navigate, Route, Routes, useLocation } from 'react-router';\nimport { Loader2, ShieldAlert } from 'lucide-react';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useTechnoSpamPageView } from './hooks/useTechnoSpamPageView';\nimport { EmptyView, TechnoSpamErrorBoundary } from './components';\nimport { OfflineProgressSync } from './components/lesson/OfflineProgressSync';\n\n/**\n * TechnoSpam routes — every page is backed by the real wspace-technospam-svc\n * (Tec* fields). Modules with no backend (open source, knowledge base,\n * standalone instructors, extra analytics/admin sub-pages) were removed\n * during the backend-reconciliation rebuild; their old paths redirect to\n * the nearest live page so stale links never 404.\n *\n * study-planner (BOFF-4415) and applications/portfolio-page (BOFF-4432) are\n * real pages again as of this pass — see their page components' honesty\n * notes for exactly what is/isn't AI and what's deferred.\n */\n\nimport { DashboardDashboardPagePage as IndexPage } from './pages/DashboardDashboardPagePage';\n\nconst DashboardDashboardPagePage = lazy(() =>\n import('./pages/DashboardDashboardPagePage').then((m) => ({\n default: m.DashboardDashboardPagePage,\n }))\n);\nconst CoursesCoursesPagePage = lazy(() =>\n import('./pages/CoursesCoursesPagePage').then((m) => ({ default: m.CoursesCoursesPagePage }))\n);\nconst CoursesCourseDetailsPagePage = lazy(() =>\n import('./pages/CoursesCourseDetailsPagePage').then((m) => ({\n default: m.CoursesCourseDetailsPagePage,\n }))\n);\nconst CoursesLessonPlayerPagePage = lazy(() =>\n import('./pages/CoursesLessonPlayerPagePage').then((m) => ({\n default: m.CoursesLessonPlayerPagePage,\n }))\n);\nconst CoursesMyLearningPagePage = lazy(() =>\n import('./pages/CoursesMyLearningPagePage').then((m) => ({\n default: m.CoursesMyLearningPagePage,\n }))\n);\nconst ApplicationsProblemsPagePage = lazy(() =>\n import('./pages/ApplicationsProblemsPagePage').then((m) => ({\n default: m.ApplicationsProblemsPagePage,\n }))\n);\nconst ApplicationsProblemDetailsPagePage = lazy(() =>\n import('./pages/ApplicationsProblemDetailsPagePage').then((m) => ({\n default: m.ApplicationsProblemDetailsPagePage,\n }))\n);\nconst MentorshipMentorsPagePage = lazy(() =>\n import('./pages/MentorshipMentorsPagePage').then((m) => ({\n default: m.MentorshipMentorsPagePage,\n }))\n);\nconst MentorshipMentorProfilePagePage = lazy(() =>\n import('./pages/MentorshipMentorProfilePagePage').then((m) => ({\n default: m.MentorshipMentorProfilePagePage,\n }))\n);\nconst MentorshipSessionsPagePage = lazy(() =>\n import('./pages/MentorshipSessionsPagePage').then((m) => ({\n default: m.MentorshipSessionsPagePage,\n }))\n);\nconst HackathonsHackathonsPagePage = lazy(() =>\n import('./pages/HackathonsHackathonsPagePage').then((m) => ({\n default: m.HackathonsHackathonsPagePage,\n }))\n);\nconst HackathonsHackathonDetailsPagePage = lazy(() =>\n import('./pages/HackathonsHackathonDetailsPagePage').then((m) => ({\n default: m.HackathonsHackathonDetailsPagePage,\n }))\n);\nconst AnalyticsAnalyticsPagePage = lazy(() =>\n import('./pages/AnalyticsAnalyticsPagePage').then((m) => ({\n default: m.AnalyticsAnalyticsPagePage,\n }))\n);\nconst AdminAdminDashboardPagePage = lazy(() =>\n import('./pages/AdminAdminDashboardPagePage').then((m) => ({\n default: m.AdminAdminDashboardPagePage,\n }))\n);\nconst StudyPlannerStudyPlannerPagePage = lazy(() =>\n import('./pages/StudyPlannerStudyPlannerPagePage').then((m) => ({\n default: m.StudyPlannerStudyPlannerPagePage,\n }))\n);\nconst ApplicationsPortfolioPagePage = lazy(() =>\n import('./pages/ApplicationsPortfolioPagePage').then((m) => ({\n default: m.ApplicationsPortfolioPagePage,\n }))\n);\n\nfunction PageLoader() {\n return (\n <div className=\"flex h-full min-h-[40vh] items-center justify-center\">\n <Loader2 className=\"animate-spin text-text-muted\" size={28} />\n </div>\n );\n}\n\nfunction FeatureDisabledFallback() {\n return (\n <div className=\"flex h-full min-h-[40vh] items-center justify-center p-6\">\n <EmptyView\n icon={<ShieldAlert size={28} />}\n title=\"Feature not available\"\n description=\"This TechnoSpam feature is currently disabled for your workspace.\"\n />\n </div>\n );\n}\n\nfunction gated(flag: string, element: React.ReactNode): React.ReactElement {\n return (\n <FeatureGate flag={flag} defaultValue={true} fallback={<FeatureDisabledFallback />}>\n {element}\n </FeatureGate>\n );\n}\n\nfunction useTrackedPageView() {\n const { pathname } = useLocation();\n const page = useMemo(() => {\n if (pathname.includes('/courses/lesson-player')) return 'lesson-player';\n if (pathname.includes('/courses/course-details')) return 'course-details';\n if (pathname.includes('/courses/my-learning')) return 'my-learning';\n if (pathname.includes('/courses')) return 'courses';\n if (pathname.includes('/applications/problem-details')) return 'problem-details';\n if (pathname.includes('/applications/portfolio')) return 'portfolio';\n if (pathname.includes('/applications')) return 'problems';\n if (pathname.includes('/study-planner')) return 'study-planner';\n if (pathname.includes('/mentorship/mentor-profile')) return 'mentor-profile';\n if (pathname.includes('/mentorship/sessions')) return 'sessions';\n if (pathname.includes('/mentorship')) return 'mentors';\n if (pathname.includes('/hackathons/hackathon-details')) return 'hackathon-details';\n if (pathname.includes('/hackathons')) return 'hackathons';\n if (pathname.includes('/analytics')) return 'analytics';\n if (pathname.includes('/admin')) return 'admin';\n return 'dashboard';\n }, [pathname]);\n useTechnoSpamPageView(page);\n}\n\nexport function TechnoSpamRoutes() {\n useTrackedPageView();\n return (\n <Suspense fallback={<PageLoader />}>\n <TechnoSpamErrorBoundary>\n <OfflineProgressSync />\n <Routes>\n <Route index element={gated('technospam.dashboard', <IndexPage />)} />\n <Route\n path=\"dashboard/dashboard-page\"\n element={gated('technospam.dashboard', <DashboardDashboardPagePage />)}\n />\n\n {/* Courses */}\n <Route\n path=\"courses/courses-page\"\n element={gated('technospam.courses', <CoursesCoursesPagePage />)}\n />\n <Route\n path=\"courses/course-details-page\"\n element={gated('technospam.courses', <CoursesCourseDetailsPagePage />)}\n />\n <Route\n path=\"courses/lesson-player-page\"\n element={gated('technospam.courses', <CoursesLessonPlayerPagePage />)}\n />\n <Route\n path=\"courses/my-learning-page\"\n element={gated('technospam.courses', <CoursesMyLearningPagePage />)}\n />\n <Route\n path=\"courses/instructors-page\"\n element={<Navigate to=\"../courses/courses-page\" replace />}\n />\n <Route\n path=\"courses/instructor-profile-page\"\n element={<Navigate to=\"../courses/courses-page\" replace />}\n />\n\n {/* Practice (applications) */}\n <Route\n path=\"applications/problems-page\"\n element={gated('technospam.problems', <ApplicationsProblemsPagePage />)}\n />\n <Route\n path=\"applications/problem-details-page\"\n element={gated('technospam.problems', <ApplicationsProblemDetailsPagePage />)}\n />\n <Route\n path=\"applications/solutions-page\"\n element={<Navigate to=\"../applications/problems-page\" replace />}\n />\n <Route\n path=\"applications/portfolio-page\"\n element={gated('technospam.portfolio', <ApplicationsPortfolioPagePage />)}\n />\n\n {/* Mentorship */}\n <Route\n path=\"mentorship/mentors-page\"\n element={gated('technospam.mentorship', <MentorshipMentorsPagePage />)}\n />\n <Route\n path=\"mentorship/mentor-profile-page\"\n element={gated('technospam.mentorship', <MentorshipMentorProfilePagePage />)}\n />\n <Route\n path=\"mentorship/sessions-page\"\n element={gated('technospam.mentorship', <MentorshipSessionsPagePage />)}\n />\n <Route\n path=\"mentorship/mentorship-page\"\n element={<Navigate to=\"../mentorship/mentors-page\" replace />}\n />\n <Route\n path=\"mentorship/bookings-page\"\n element={<Navigate to=\"../mentorship/sessions-page\" replace />}\n />\n\n {/* Hackathons */}\n <Route\n path=\"hackathons/hackathons-page\"\n element={gated('technospam.hackathons', <HackathonsHackathonsPagePage />)}\n />\n <Route\n path=\"hackathons/hackathon-details-page\"\n element={gated('technospam.hackathons', <HackathonsHackathonDetailsPagePage />)}\n />\n <Route\n path=\"hackathons/events-page\"\n element={<Navigate to=\"../hackathons/hackathons-page\" replace />}\n />\n <Route\n path=\"hackathons/teams-page\"\n element={<Navigate to=\"../hackathons/hackathons-page\" replace />}\n />\n\n {/* Analytics */}\n <Route\n path=\"analytics/analytics-page\"\n element={gated('technospam.analytics', <AnalyticsAnalyticsPagePage />)}\n />\n <Route\n path=\"analytics/progress-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n <Route\n path=\"analytics/achievements-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n <Route\n path=\"analytics/reports-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n\n {/* Admin */}\n <Route\n path=\"admin/admin-dashboard-page\"\n element={gated('technospam.admin', <AdminAdminDashboardPagePage />)}\n />\n <Route\n path=\"admin/audit-reports-page\"\n element={<Navigate to=\"../admin/admin-dashboard-page\" replace />}\n />\n\n {/*\n * Study Planner (BOFF-4415): a real, deterministic (non-AI)\n * scheduler now lives at study-planner/study-planner-page — see\n * StudyPlannerStudyPlannerPagePage's honesty note. This single page\n * intentionally consolidates what the nav scaffolding originally\n * anticipated as several separate pages (plans list, plan details,\n * edit, learning paths, goals) — those richer standalone views,\n * plus true AI/adaptive re-planning (BOFF-3874/3895), remain\n * deferred. Any other study-planner/* sub-path falls back here\n * rather than to the dashboard, since the real page now exists.\n */}\n <Route\n path=\"study-planner/study-planner-page\"\n element={gated('technospam.studyPlanner', <StudyPlannerStudyPlannerPagePage />)}\n />\n <Route\n path=\"study-planner/*\"\n element={<Navigate to=\"../study-planner/study-planner-page\" replace />}\n />\n {/*\n * Removed modules → dashboard.\n *\n * open-source and knowledge-base were never shipped and have no nav\n * entries anymore (BOFF-3086) — these redirects are a defensive\n * fallback for stale bookmarks/links only.\n */}\n <Route\n path=\"open-source/*\"\n element={<Navigate to=\"../dashboard/dashboard-page\" replace />}\n />\n <Route\n path=\"knowledge-base/*\"\n element={<Navigate to=\"../dashboard/dashboard-page\" replace />}\n />\n\n <Route path=\"*\" element={<Navigate to=\"../dashboard/dashboard-page\" replace />} />\n </Routes>\n </TechnoSpamErrorBoundary>\n </Suspense>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAsBA,IAAM,IAA6B,QACjC,OAAO,yCAAsC,MAAM,OAAO,EACxD,SAAS,EAAE,4BACZ,EAAE,CACJ,EACK,IAAyB,QAC7B,OAAO,qCAAkC,MAAM,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAC9F,EACK,IAA+B,QACnC,OAAO,2CAAwC,MAAM,OAAO,EAC1D,SAAS,EAAE,8BACZ,EAAE,CACJ,EACK,IAA8B,QAClC,OAAO,0CAAuC,MAAM,OAAO,EACzD,SAAS,EAAE,6BACZ,EAAE,CACJ,EACK,IAA4B,QAChC,OAAO,wCAAqC,MAAM,OAAO,EACvD,SAAS,EAAE,2BACZ,EAAE,CACJ,EACK,IAA+B,QACnC,OAAO,2CAAwC,MAAM,OAAO,EAC1D,SAAS,EAAE,8BACZ,EAAE,CACJ,EACK,IAAqC,QACzC,OAAO,iDAA8C,MAAM,OAAO,EAChE,SAAS,EAAE,oCACZ,EAAE,CACJ,EACK,IAA4B,QAChC,OAAO,wCAAqC,MAAM,OAAO,EACvD,SAAS,EAAE,2BACZ,EAAE,CACJ,EACK,IAAkC,QACtC,OAAO,8CAA2C,MAAM,OAAO,EAC7D,SAAS,EAAE,iCACZ,EAAE,CACJ,EACK,IAA6B,QACjC,OAAO,yCAAsC,MAAM,OAAO,EACxD,SAAS,EAAE,4BACZ,EAAE,CACJ,EACK,IAA+B,QACnC,OAAO,2CAAwC,MAAM,OAAO,EAC1D,SAAS,EAAE,8BACZ,EAAE,CACJ,EACK,IAAqC,QACzC,OAAO,iDAA8C,MAAM,OAAO,EAChE,SAAS,EAAE,oCACZ,EAAE,CACJ,EACK,IAA6B,QACjC,OAAO,yCAAsC,MAAM,OAAO,EACxD,SAAS,EAAE,4BACZ,EAAE,CACJ,EACK,IAA8B,QAClC,OAAO,0CAAuC,MAAM,OAAO,EACzD,SAAS,EAAE,6BACZ,EAAE,CACJ,EACK,IAAmC,QACvC,OAAO,+CAA4C,MAAM,OAAO,EAC9D,SAAS,EAAE,kCACZ,EAAE,CACJ,EACK,IAAgC,QACpC,OAAO,4CAAyC,MAAM,OAAO,EAC3D,SAAS,EAAE,+BACZ,EAAE,CACJ;AAED,SAAS,IAAa;AACpB,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GAAS,WAAU;GAA+B,MAAM;GAAM,CAAA;EAC1D,CAAA;;AAIV,SAAS,IAA0B;AACjC,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GACE,MAAM,kBAAC,GAAD,EAAa,MAAM,IAAM,CAAA;GAC/B,OAAM;GACN,aAAY;GACZ,CAAA;EACE,CAAA;;AAIV,SAAS,EAAM,GAAc,GAA8C;AACzE,QACE,kBAAC,GAAD;EAAmB;EAAM,cAAc;EAAM,UAAU,kBAAC,GAAD,EAA2B,CAAA;YAC/E;EACW,CAAA;;AAIlB,SAAS,IAAqB;CAC5B,IAAM,EAAE,gBAAa,GAAa;AAmBlC,GAlBa,QACP,EAAS,SAAS,yBAAyB,GAAS,kBACpD,EAAS,SAAS,0BAA0B,GAAS,mBACrD,EAAS,SAAS,uBAAuB,GAAS,gBAClD,EAAS,SAAS,WAAW,GAAS,YACtC,EAAS,SAAS,gCAAgC,GAAS,oBAC3D,EAAS,SAAS,0BAA0B,GAAS,cACrD,EAAS,SAAS,gBAAgB,GAAS,aAC3C,EAAS,SAAS,iBAAiB,GAAS,kBAC5C,EAAS,SAAS,6BAA6B,GAAS,mBACxD,EAAS,SAAS,uBAAuB,GAAS,aAClD,EAAS,SAAS,cAAc,GAAS,YACzC,EAAS,SAAS,gCAAgC,GAAS,sBAC3D,EAAS,SAAS,cAAc,GAAS,eACzC,EAAS,SAAS,aAAa,GAAS,cACxC,EAAS,SAAS,SAAS,GAAS,UACjC,aACN,CAAC,EAAS,CAAC,CACa;;AAG7B,SAAgB,IAAmB;AAEjC,QADA,GAAoB,EAElB,kBAAC,GAAD;EAAU,UAAU,kBAAC,GAAD,EAAc,CAAA;YAChC,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAuB,CAAA,EACvB,kBAAC,GAAD,EAAA,UAAA;GACE,kBAAC,GAAD;IAAO,OAAA;IAAM,SAAS,EAAM,wBAAwB,kBAAC,GAAD,EAAa,CAAA,CAAC;IAAI,CAAA;GACtE,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,EAAM,wBAAwB,kBAAC,GAAD,EAA8B,CAAA,CAAC;IACtE,CAAA;GAGF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,EAAM,sBAAsB,kBAAC,GAAD,EAA0B,CAAA,CAAC;IAChE,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,EAAM,sBAAsB,kBAAC,GAAD,EAAgC,CAAA,CAAC;IACtE,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,EAAM,sBAAsB,kBAAC,GAAD,EAA+B,CAAA,CAAC;IACrE,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,EAAM,sBAAsB,kBAAC,GAAD,EAA6B,CAAA,CAAC;IACnE,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD;KAAU,IAAG;KAA0B,SAAA;KAAU,CAAA;IAC1D,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD;KAAU,IAAG;KAA0B,SAAA;KAAU,CAAA;IAC1D,CAAA;GAGF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,EAAM,uBAAuB,kBAAC,GAAD,EAAgC,CAAA,CAAC;IACvE,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,EAAM,uBAAuB,kBAAC,GAAD,EAAsC,CAAA,CAAC;IAC7E,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD;KAAU,IAAG;KAAgC,SAAA;KAAU,CAAA;IAChE,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,EAAM,wBAAwB,kBAAC,GAAD,EAAiC,CAAA,CAAC;IACzE,CAAA;GAGF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,EAAM,yBAAyB,kBAAC,GAAD,EAA6B,CAAA,CAAC;IACtE,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,EAAM,yBAAyB,kBAAC,GAAD,EAAmC,CAAA,CAAC;IAC5E,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,EAAM,yBAAyB,kBAAC,GAAD,EAA8B,CAAA,CAAC;IACvE,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD;KAAU,IAAG;KAA6B,SAAA;KAAU,CAAA;IAC7D,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD;KAAU,IAAG;KAA8B,SAAA;KAAU,CAAA;IAC9D,CAAA;GAGF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,EAAM,yBAAyB,kBAAC,GAAD,EAAgC,CAAA,CAAC;IACzE,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,EAAM,yBAAyB,kBAAC,GAAD,EAAsC,CAAA,CAAC;IAC/E,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD;KAAU,IAAG;KAAgC,SAAA;KAAU,CAAA;IAChE,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD;KAAU,IAAG;KAAgC,SAAA;KAAU,CAAA;IAChE,CAAA;GAGF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,EAAM,wBAAwB,kBAAC,GAAD,EAA8B,CAAA,CAAC;IACtE,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD;KAAU,IAAG;KAA8B,SAAA;KAAU,CAAA;IAC9D,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD;KAAU,IAAG;KAA8B,SAAA;KAAU,CAAA;IAC9D,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD;KAAU,IAAG;KAA8B,SAAA;KAAU,CAAA;IAC9D,CAAA;GAGF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,EAAM,oBAAoB,kBAAC,GAAD,EAA+B,CAAA,CAAC;IACnE,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD;KAAU,IAAG;KAAgC,SAAA;KAAU,CAAA;IAChE,CAAA;GAaF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,EAAM,2BAA2B,kBAAC,GAAD,EAAoC,CAAA,CAAC;IAC/E,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD;KAAU,IAAG;KAAsC,SAAA;KAAU,CAAA;IACtE,CAAA;GAQF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD;KAAU,IAAG;KAA8B,SAAA;KAAU,CAAA;IAC9D,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD;KAAU,IAAG;KAA8B,SAAA;KAAU,CAAA;IAC9D,CAAA;GAEF,kBAAC,GAAD;IAAO,MAAK;IAAI,SAAS,kBAAC,GAAD;KAAU,IAAG;KAA8B,SAAA;KAAU,CAAA;IAAI,CAAA;GAC3E,EAAA,CAAA,CACe,EAAA,CAAA;EACjB,CAAA"}
1
+ {"version":3,"file":"TechnoSpamRoutes.js","names":[],"sources":["../../src/technospam/TechnoSpamRoutes.tsx"],"sourcesContent":["import { lazy, Suspense, useMemo } from 'react';\nimport { Navigate, Route, Routes, useLocation } from 'react-router';\nimport { Loader2, ShieldAlert } from 'lucide-react';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useTechnoSpamPageView } from './hooks/useTechnoSpamPageView';\nimport { EmptyView, TechnoSpamErrorBoundary } from './components';\nimport { OfflineProgressSync } from './components/lesson/OfflineProgressSync';\n\n/**\n * TechnoSpam routes — every page is backed by the real wspace-technospam-svc\n * (Tec* fields). Modules with no backend (open source, knowledge base,\n * standalone instructors, extra analytics/admin sub-pages) were removed\n * during the backend-reconciliation rebuild; their old paths redirect to\n * the nearest live page so stale links never 404.\n *\n * study-planner (BOFF-4415) and applications/portfolio-page (BOFF-4432) are\n * real pages again as of this pass — see their page components' honesty\n * notes for exactly what is/isn't AI and what's deferred.\n */\n\nimport { DashboardDashboardPagePage as IndexPage } from './pages/DashboardDashboardPagePage';\n\nconst DashboardDashboardPagePage = lazy(() =>\n import('./pages/DashboardDashboardPagePage').then((m) => ({\n default: m.DashboardDashboardPagePage,\n }))\n);\nconst CoursesCoursesPagePage = lazy(() =>\n import('./pages/CoursesCoursesPagePage').then((m) => ({ default: m.CoursesCoursesPagePage }))\n);\nconst CoursesCourseDetailsPagePage = lazy(() =>\n import('./pages/CoursesCourseDetailsPagePage').then((m) => ({\n default: m.CoursesCourseDetailsPagePage,\n }))\n);\nconst CoursesLessonPlayerPagePage = lazy(() =>\n import('./pages/CoursesLessonPlayerPagePage').then((m) => ({\n default: m.CoursesLessonPlayerPagePage,\n }))\n);\nconst CoursesAssessmentPagePage = lazy(() =>\n import('./pages/CoursesAssessmentPagePage').then((m) => ({\n default: m.CoursesAssessmentPagePage,\n }))\n);\nconst CoursesMyLearningPagePage = lazy(() =>\n import('./pages/CoursesMyLearningPagePage').then((m) => ({\n default: m.CoursesMyLearningPagePage,\n }))\n);\nconst ApplicationsProblemsPagePage = lazy(() =>\n import('./pages/ApplicationsProblemsPagePage').then((m) => ({\n default: m.ApplicationsProblemsPagePage,\n }))\n);\nconst ApplicationsProblemDetailsPagePage = lazy(() =>\n import('./pages/ApplicationsProblemDetailsPagePage').then((m) => ({\n default: m.ApplicationsProblemDetailsPagePage,\n }))\n);\nconst MentorshipMentorsPagePage = lazy(() =>\n import('./pages/MentorshipMentorsPagePage').then((m) => ({\n default: m.MentorshipMentorsPagePage,\n }))\n);\nconst MentorshipMentorProfilePagePage = lazy(() =>\n import('./pages/MentorshipMentorProfilePagePage').then((m) => ({\n default: m.MentorshipMentorProfilePagePage,\n }))\n);\nconst MentorshipSessionsPagePage = lazy(() =>\n import('./pages/MentorshipSessionsPagePage').then((m) => ({\n default: m.MentorshipSessionsPagePage,\n }))\n);\nconst HackathonsHackathonsPagePage = lazy(() =>\n import('./pages/HackathonsHackathonsPagePage').then((m) => ({\n default: m.HackathonsHackathonsPagePage,\n }))\n);\nconst HackathonsHackathonDetailsPagePage = lazy(() =>\n import('./pages/HackathonsHackathonDetailsPagePage').then((m) => ({\n default: m.HackathonsHackathonDetailsPagePage,\n }))\n);\nconst AnalyticsAnalyticsPagePage = lazy(() =>\n import('./pages/AnalyticsAnalyticsPagePage').then((m) => ({\n default: m.AnalyticsAnalyticsPagePage,\n }))\n);\nconst AdminAdminDashboardPagePage = lazy(() =>\n import('./pages/AdminAdminDashboardPagePage').then((m) => ({\n default: m.AdminAdminDashboardPagePage,\n }))\n);\nconst StudyPlannerStudyPlannerPagePage = lazy(() =>\n import('./pages/StudyPlannerStudyPlannerPagePage').then((m) => ({\n default: m.StudyPlannerStudyPlannerPagePage,\n }))\n);\nconst ApplicationsPortfolioPagePage = lazy(() =>\n import('./pages/ApplicationsPortfolioPagePage').then((m) => ({\n default: m.ApplicationsPortfolioPagePage,\n }))\n);\n\nfunction PageLoader() {\n return (\n <div className=\"flex h-full min-h-[40vh] items-center justify-center\">\n <Loader2 className=\"animate-spin text-text-muted\" size={28} />\n </div>\n );\n}\n\nfunction FeatureDisabledFallback() {\n return (\n <div className=\"flex h-full min-h-[40vh] items-center justify-center p-6\">\n <EmptyView\n icon={<ShieldAlert size={28} />}\n title=\"Feature not available\"\n description=\"This TechnoSpam feature is currently disabled for your workspace.\"\n />\n </div>\n );\n}\n\nfunction gated(flag: string, element: React.ReactNode): React.ReactElement {\n return (\n <FeatureGate flag={flag} defaultValue={true} fallback={<FeatureDisabledFallback />}>\n {element}\n </FeatureGate>\n );\n}\n\nfunction useTrackedPageView() {\n const { pathname } = useLocation();\n const page = useMemo(() => {\n if (pathname.includes('/courses/lesson-player')) return 'lesson-player';\n if (pathname.includes('/courses/course-details')) return 'course-details';\n if (pathname.includes('/courses/assessment')) return 'assessment';\n if (pathname.includes('/courses/my-learning')) return 'my-learning';\n if (pathname.includes('/courses')) return 'courses';\n if (pathname.includes('/applications/problem-details')) return 'problem-details';\n if (pathname.includes('/applications/portfolio')) return 'portfolio';\n if (pathname.includes('/applications')) return 'problems';\n if (pathname.includes('/study-planner')) return 'study-planner';\n if (pathname.includes('/mentorship/mentor-profile')) return 'mentor-profile';\n if (pathname.includes('/mentorship/sessions')) return 'sessions';\n if (pathname.includes('/mentorship')) return 'mentors';\n if (pathname.includes('/hackathons/hackathon-details')) return 'hackathon-details';\n if (pathname.includes('/hackathons')) return 'hackathons';\n if (pathname.includes('/analytics')) return 'analytics';\n if (pathname.includes('/admin')) return 'admin';\n return 'dashboard';\n }, [pathname]);\n useTechnoSpamPageView(page);\n}\n\nexport function TechnoSpamRoutes() {\n useTrackedPageView();\n return (\n <Suspense fallback={<PageLoader />}>\n <TechnoSpamErrorBoundary>\n <OfflineProgressSync />\n <Routes>\n <Route index element={gated('technospam.dashboard', <IndexPage />)} />\n <Route\n path=\"dashboard/dashboard-page\"\n element={gated('technospam.dashboard', <DashboardDashboardPagePage />)}\n />\n\n {/* Courses */}\n <Route\n path=\"courses/courses-page\"\n element={gated('technospam.courses', <CoursesCoursesPagePage />)}\n />\n <Route\n path=\"courses/course-details-page\"\n element={gated('technospam.courses', <CoursesCourseDetailsPagePage />)}\n />\n <Route\n path=\"courses/lesson-player-page\"\n element={gated('technospam.courses', <CoursesLessonPlayerPagePage />)}\n />\n <Route\n path=\"courses/assessment-page\"\n element={gated('technospam.courses', <CoursesAssessmentPagePage />)}\n />\n <Route\n path=\"courses/my-learning-page\"\n element={gated('technospam.courses', <CoursesMyLearningPagePage />)}\n />\n <Route\n path=\"courses/instructors-page\"\n element={<Navigate to=\"../courses/courses-page\" replace />}\n />\n <Route\n path=\"courses/instructor-profile-page\"\n element={<Navigate to=\"../courses/courses-page\" replace />}\n />\n\n {/* Practice (applications) */}\n <Route\n path=\"applications/problems-page\"\n element={gated('technospam.problems', <ApplicationsProblemsPagePage />)}\n />\n <Route\n path=\"applications/problem-details-page\"\n element={gated('technospam.problems', <ApplicationsProblemDetailsPagePage />)}\n />\n <Route\n path=\"applications/solutions-page\"\n element={<Navigate to=\"../applications/problems-page\" replace />}\n />\n <Route\n path=\"applications/portfolio-page\"\n element={gated('technospam.portfolio', <ApplicationsPortfolioPagePage />)}\n />\n\n {/* Mentorship */}\n <Route\n path=\"mentorship/mentors-page\"\n element={gated('technospam.mentorship', <MentorshipMentorsPagePage />)}\n />\n <Route\n path=\"mentorship/mentor-profile-page\"\n element={gated('technospam.mentorship', <MentorshipMentorProfilePagePage />)}\n />\n <Route\n path=\"mentorship/sessions-page\"\n element={gated('technospam.mentorship', <MentorshipSessionsPagePage />)}\n />\n <Route\n path=\"mentorship/mentorship-page\"\n element={<Navigate to=\"../mentorship/mentors-page\" replace />}\n />\n <Route\n path=\"mentorship/bookings-page\"\n element={<Navigate to=\"../mentorship/sessions-page\" replace />}\n />\n\n {/* Hackathons */}\n <Route\n path=\"hackathons/hackathons-page\"\n element={gated('technospam.hackathons', <HackathonsHackathonsPagePage />)}\n />\n <Route\n path=\"hackathons/hackathon-details-page\"\n element={gated('technospam.hackathons', <HackathonsHackathonDetailsPagePage />)}\n />\n <Route\n path=\"hackathons/events-page\"\n element={<Navigate to=\"../hackathons/hackathons-page\" replace />}\n />\n <Route\n path=\"hackathons/teams-page\"\n element={<Navigate to=\"../hackathons/hackathons-page\" replace />}\n />\n\n {/* Analytics */}\n <Route\n path=\"analytics/analytics-page\"\n element={gated('technospam.analytics', <AnalyticsAnalyticsPagePage />)}\n />\n <Route\n path=\"analytics/progress-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n <Route\n path=\"analytics/achievements-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n <Route\n path=\"analytics/reports-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n\n {/* Admin */}\n <Route\n path=\"admin/admin-dashboard-page\"\n element={gated('technospam.admin', <AdminAdminDashboardPagePage />)}\n />\n <Route\n path=\"admin/audit-reports-page\"\n element={<Navigate to=\"../admin/admin-dashboard-page\" replace />}\n />\n\n {/*\n * Study Planner (BOFF-4415): a real, deterministic (non-AI)\n * scheduler now lives at study-planner/study-planner-page — see\n * StudyPlannerStudyPlannerPagePage's honesty note. This single page\n * intentionally consolidates what the nav scaffolding originally\n * anticipated as several separate pages (plans list, plan details,\n * edit, learning paths, goals) — those richer standalone views,\n * plus true AI/adaptive re-planning (BOFF-3874/3895), remain\n * deferred. Any other study-planner/* sub-path falls back here\n * rather than to the dashboard, since the real page now exists.\n */}\n <Route\n path=\"study-planner/study-planner-page\"\n element={gated('technospam.studyPlanner', <StudyPlannerStudyPlannerPagePage />)}\n />\n <Route\n path=\"study-planner/*\"\n element={<Navigate to=\"../study-planner/study-planner-page\" replace />}\n />\n {/*\n * Removed modules → dashboard.\n *\n * open-source and knowledge-base were never shipped and have no nav\n * entries anymore (BOFF-3086) — these redirects are a defensive\n * fallback for stale bookmarks/links only.\n */}\n <Route\n path=\"open-source/*\"\n element={<Navigate to=\"../dashboard/dashboard-page\" replace />}\n />\n <Route\n path=\"knowledge-base/*\"\n element={<Navigate to=\"../dashboard/dashboard-page\" replace />}\n />\n\n <Route path=\"*\" element={<Navigate to=\"../dashboard/dashboard-page\" replace />} />\n </Routes>\n </TechnoSpamErrorBoundary>\n </Suspense>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,183 @@
1
+ import { useMutation, useQuery } from '@apollo/client/react';
2
+ import { TecQuizQuestionKey } from './technospamApi';
3
+
4
+ export type TecAssessmentStatus = 'DRAFT' | 'PUBLISHED' | 'ARCHIVED';
5
+ export type TecProctoringMode = 'NONE' | 'INTEGRITY_MONITORING' | 'REVIEW_REQUIRED';
6
+ export type TecAssessmentAttemptStatus = 'IN_PROGRESS' | 'SUBMITTED' | 'EXPIRED';
7
+ export type TecProctoringStatus = 'NOT_REQUIRED' | 'MONITORING' | 'PENDING_REVIEW' | 'VERIFIED' | 'FLAGGED' | 'REJECTED';
8
+ export type TecAssessmentSignal = 'FULLSCREEN_ENTER' | 'FULLSCREEN_EXIT' | 'VISIBILITY_HIDDEN' | 'WINDOW_BLUR' | 'COPY_ATTEMPT' | 'CUT_ATTEMPT' | 'PASTE_ATTEMPT' | 'CONTEXT_MENU';
9
+ export type TecAssessmentEventType = TecAssessmentSignal | 'STARTED' | 'SUBMITTED' | 'EXPIRED' | 'REVIEWED' | 'CERTIFICATE_ISSUED';
10
+ export type TecAssessmentReviewDecision = 'VERIFIED' | 'REJECTED';
11
+ export interface TecAssessment {
12
+ id: string;
13
+ courseId: string;
14
+ title: string;
15
+ description?: string | null;
16
+ status: TecAssessmentStatus;
17
+ timeLimitMinutes: number;
18
+ passingScore: number;
19
+ maxAttempts: number;
20
+ questionCount: number;
21
+ shuffleQuestions: boolean;
22
+ shuffleOptions: boolean;
23
+ proctoringMode: TecProctoringMode;
24
+ requireFullscreen: boolean;
25
+ blockClipboard: boolean;
26
+ maxIntegrityViolations: number;
27
+ issuesCertificate: boolean;
28
+ publishedAt?: string | null;
29
+ createdAt: string;
30
+ updatedAt: string;
31
+ course?: {
32
+ id: string;
33
+ title: string;
34
+ } | null;
35
+ }
36
+ export interface TecAssessmentQuestion {
37
+ position: number;
38
+ prompt: string;
39
+ options: string[];
40
+ }
41
+ export interface TecAssessmentAttempt {
42
+ id: string;
43
+ assessmentId: string;
44
+ courseId: string;
45
+ learnerId: string;
46
+ attemptNumber: number;
47
+ status: TecAssessmentAttemptStatus;
48
+ startedAt: string;
49
+ deadlineAt: string;
50
+ submittedAt?: string | null;
51
+ remainingSeconds: number;
52
+ questions: TecAssessmentQuestion[];
53
+ savedAnswers: number[];
54
+ requireFullscreen: boolean;
55
+ blockClipboard: boolean;
56
+ score?: number | null;
57
+ passed?: boolean | null;
58
+ passingScore: number;
59
+ correctCount: number;
60
+ totalCount: number;
61
+ proctoringMode: TecProctoringMode;
62
+ proctoringStatus: TecProctoringStatus;
63
+ integrityViolations: number;
64
+ maxIntegrityViolations: number;
65
+ consentedAt?: string | null;
66
+ reviewedBy?: string | null;
67
+ reviewedAt?: string | null;
68
+ reviewNotes?: string | null;
69
+ certificateId?: string | null;
70
+ certificate?: {
71
+ id: string;
72
+ serial: string;
73
+ score: number;
74
+ status: string;
75
+ issuedAt: string;
76
+ } | null;
77
+ }
78
+ export interface TecAssessmentEvent {
79
+ id: string;
80
+ attemptId: string;
81
+ type: TecAssessmentEventType;
82
+ violation: boolean;
83
+ detail?: Record<string, unknown> | null;
84
+ occurredAt: string;
85
+ }
86
+ export interface TecAssessmentQuestionInput {
87
+ prompt: string;
88
+ options: string[];
89
+ correctOption: number;
90
+ explanation: string | null;
91
+ }
92
+ export interface TecAssessmentInput {
93
+ title?: string;
94
+ description?: string | null;
95
+ timeLimitMinutes?: number;
96
+ passingScore?: number;
97
+ maxAttempts?: number;
98
+ shuffleQuestions?: boolean;
99
+ shuffleOptions?: boolean;
100
+ proctoringMode?: TecProctoringMode;
101
+ requireFullscreen?: boolean;
102
+ blockClipboard?: boolean;
103
+ maxIntegrityViolations?: number;
104
+ issuesCertificate?: boolean;
105
+ questions?: TecAssessmentQuestionInput[];
106
+ }
107
+ export declare const useAssessmentsQuery: (vars: {
108
+ courseId?: string | null;
109
+ status?: TecAssessmentStatus | null;
110
+ }, skip?: boolean) => useQuery.Result<{
111
+ tecListAssessments: TecAssessment[];
112
+ }, import('@apollo/client').OperationVariables, "empty" | "complete" | "streaming", import('@apollo/client').OperationVariables>;
113
+ export declare const useAssessmentQuery: (id: string) => useQuery.Result<{
114
+ tecAssessment: TecAssessment | null;
115
+ }, import('@apollo/client').OperationVariables, "empty" | "complete" | "streaming", import('@apollo/client').OperationVariables>;
116
+ export declare const useAssessmentQuestionKeyQuery: (id: string | null) => useQuery.Result<{
117
+ tecAssessmentQuestionKey: TecQuizQuestionKey[];
118
+ }, import('@apollo/client').OperationVariables, "empty" | "complete" | "streaming", import('@apollo/client').OperationVariables>;
119
+ export declare const useMyAssessmentAttemptsQuery: (assessmentId: string | null) => useQuery.Result<{
120
+ tecMyAssessmentAttempts: TecAssessmentAttempt[];
121
+ }, import('@apollo/client').OperationVariables, "empty" | "complete" | "streaming", import('@apollo/client').OperationVariables>;
122
+ export declare const useAssessmentAttemptsQuery: (vars: {
123
+ assessmentId?: string | null;
124
+ proctoringStatus?: TecProctoringStatus | null;
125
+ }) => useQuery.Result<{
126
+ tecListAssessmentAttempts: TecAssessmentAttempt[];
127
+ }, import('@apollo/client').OperationVariables, "empty" | "complete" | "streaming", import('@apollo/client').OperationVariables>;
128
+ export declare const useAssessmentAttemptEventsQuery: (attemptId: string | null) => useQuery.Result<{
129
+ tecAssessmentAttemptEvents: TecAssessmentEvent[];
130
+ }, import('@apollo/client').OperationVariables, "empty" | "complete" | "streaming", import('@apollo/client').OperationVariables>;
131
+ export declare const useCreateAssessment: () => useMutation.ResultTuple<{
132
+ tecCreateAssessment: TecAssessment;
133
+ }, {
134
+ [x: string]: any;
135
+ }, import('@apollo/client').ApolloCache, undefined>;
136
+ export declare const useUpdateAssessment: () => useMutation.ResultTuple<{
137
+ tecUpdateAssessment: TecAssessment;
138
+ }, {
139
+ [x: string]: any;
140
+ }, import('@apollo/client').ApolloCache, undefined>;
141
+ export declare const usePublishAssessment: () => useMutation.ResultTuple<{
142
+ tecPublishAssessment: TecAssessment;
143
+ }, {
144
+ [x: string]: any;
145
+ }, import('@apollo/client').ApolloCache, undefined>;
146
+ export declare const useArchiveAssessment: () => useMutation.ResultTuple<{
147
+ tecArchiveAssessment: TecAssessment;
148
+ }, {
149
+ [x: string]: any;
150
+ }, import('@apollo/client').ApolloCache, undefined>;
151
+ /** Errors are shown inline on the assessment page, not as toasts. */
152
+ export declare const useStartAssessment: () => useMutation.ResultTuple<{
153
+ tecStartAssessment: TecAssessmentAttempt;
154
+ }, {
155
+ [x: string]: any;
156
+ }, import('@apollo/client').ApolloCache, undefined>;
157
+ export declare const useSaveAssessmentAnswers: () => useMutation.ResultTuple<{
158
+ tecSaveAssessmentAnswers: Pick<TecAssessmentAttempt, "id" | "status" | "savedAnswers" | "remainingSeconds">;
159
+ }, {
160
+ [x: string]: any;
161
+ }, import('@apollo/client').ApolloCache, undefined>;
162
+ /** Signals are fire-and-forget: a failed report must never interrupt the exam. */
163
+ export declare const useRecordAssessmentSignal: () => useMutation.ResultTuple<{
164
+ tecRecordAssessmentSignal: Pick<TecAssessmentAttempt, "id" | "status" | "integrityViolations" | "remainingSeconds">;
165
+ }, {
166
+ [x: string]: any;
167
+ }, import('@apollo/client').ApolloCache, undefined>;
168
+ export declare const useSubmitAssessment: () => useMutation.ResultTuple<{
169
+ tecSubmitAssessment: TecAssessmentAttempt;
170
+ }, {
171
+ [x: string]: any;
172
+ }, import('@apollo/client').ApolloCache, undefined>;
173
+ export declare const useClaimAssessmentCertificate: () => useMutation.ResultTuple<{
174
+ tecClaimAssessmentCertificate: TecAssessmentAttempt;
175
+ }, {
176
+ [x: string]: any;
177
+ }, import('@apollo/client').ApolloCache, undefined>;
178
+ export declare const useReviewAssessmentAttempt: () => useMutation.ResultTuple<{
179
+ tecReviewAssessmentAttempt: TecAssessmentAttempt;
180
+ }, {
181
+ [x: string]: any;
182
+ }, import('@apollo/client').ApolloCache, undefined>;
183
+ //# sourceMappingURL=assessmentApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assessmentApi.d.ts","sourceRoot":"","sources":["../../../src/technospam/api/assessmentApi.ts"],"names":[],"mappings":"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"}