@burdenoff/microfe-technospam 2026.705.2 → 2026.709.2

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 (113) hide show
  1. package/dist/dev/main.d.ts +2 -0
  2. package/dist/dev/main.d.ts.map +1 -0
  3. package/dist/generated/global-operations.d.ts +2 -0
  4. package/dist/generated/global-operations.d.ts.map +1 -0
  5. package/dist/generated/global-types.d.ts +18199 -0
  6. package/dist/generated/global-types.d.ts.map +1 -0
  7. package/dist/generated/wspace-operations.d.ts +267 -0
  8. package/dist/generated/wspace-operations.d.ts.map +1 -0
  9. package/dist/generated/wspace-operations.js +67 -0
  10. package/dist/generated/wspace-operations.js.map +1 -0
  11. package/dist/generated/wspace-types.d.ts +43083 -0
  12. package/dist/generated/wspace-types.d.ts.map +1 -0
  13. package/dist/index.d.ts +2 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +3 -1
  16. package/dist/technospam/TechnoSpamRoot.d.ts +5 -0
  17. package/dist/technospam/TechnoSpamRoot.d.ts.map +1 -0
  18. package/dist/technospam/TechnoSpamRoutes.d.ts +2 -0
  19. package/dist/technospam/TechnoSpamRoutes.d.ts.map +1 -0
  20. package/dist/technospam/api/technospamApi.d.ts +402 -0
  21. package/dist/technospam/api/technospamApi.d.ts.map +1 -0
  22. package/dist/technospam/components/LoadMore.d.ts +11 -0
  23. package/dist/technospam/components/LoadMore.d.ts.map +1 -0
  24. package/dist/technospam/components/MediaCover.d.ts +20 -0
  25. package/dist/technospam/components/MediaCover.d.ts.map +1 -0
  26. package/dist/technospam/components/PageLayout.d.ts +20 -0
  27. package/dist/technospam/components/PageLayout.d.ts.map +1 -0
  28. package/dist/technospam/components/StatCard.d.ts +20 -0
  29. package/dist/technospam/components/StatCard.d.ts.map +1 -0
  30. package/dist/technospam/components/StateViews.d.ts +30 -0
  31. package/dist/technospam/components/StateViews.d.ts.map +1 -0
  32. package/dist/technospam/components/StatusBadge.d.ts +5 -0
  33. package/dist/technospam/components/StatusBadge.d.ts.map +1 -0
  34. package/dist/technospam/components/index.d.ts +7 -0
  35. package/dist/technospam/components/index.d.ts.map +1 -0
  36. package/dist/technospam/hooks/useTechnoSpamAnalytics.d.ts +20 -0
  37. package/dist/technospam/hooks/useTechnoSpamAnalytics.d.ts.map +1 -0
  38. package/dist/technospam/hooks/useTechnoSpamAnalytics.js +13 -0
  39. package/dist/technospam/hooks/useTechnoSpamAnalytics.js.map +1 -0
  40. package/dist/technospam/index.d.ts +6 -0
  41. package/dist/technospam/index.d.ts.map +1 -0
  42. package/dist/technospam/index.js +2 -0
  43. package/dist/technospam/lib/toast.d.ts +18 -0
  44. package/dist/technospam/lib/toast.d.ts.map +1 -0
  45. package/dist/technospam/pages/AdminAdminDashboardPagePage.d.ts +2 -0
  46. package/dist/technospam/pages/AdminAdminDashboardPagePage.d.ts.map +1 -0
  47. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.d.ts +2 -0
  48. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -0
  49. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.d.ts +2 -0
  50. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.d.ts.map +1 -0
  51. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js +129 -105
  52. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js.map +1 -1
  53. package/dist/technospam/pages/ApplicationsProblemsPagePage.d.ts +2 -0
  54. package/dist/technospam/pages/ApplicationsProblemsPagePage.d.ts.map +1 -0
  55. package/dist/technospam/pages/ApplicationsProblemsPagePage.js +87 -72
  56. package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -1
  57. package/dist/technospam/pages/CoursesCourseDetailsPagePage.d.ts +2 -0
  58. package/dist/technospam/pages/CoursesCourseDetailsPagePage.d.ts.map +1 -0
  59. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +174 -143
  60. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -1
  61. package/dist/technospam/pages/CoursesCoursesPagePage.d.ts +2 -0
  62. package/dist/technospam/pages/CoursesCoursesPagePage.d.ts.map +1 -0
  63. package/dist/technospam/pages/CoursesCoursesPagePage.js +95 -80
  64. package/dist/technospam/pages/CoursesCoursesPagePage.js.map +1 -1
  65. package/dist/technospam/pages/CoursesMyLearningPagePage.d.ts +2 -0
  66. package/dist/technospam/pages/CoursesMyLearningPagePage.d.ts.map +1 -0
  67. package/dist/technospam/pages/DashboardDashboardPagePage.d.ts +2 -0
  68. package/dist/technospam/pages/DashboardDashboardPagePage.d.ts.map +1 -0
  69. package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.d.ts +2 -0
  70. package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.d.ts.map +1 -0
  71. package/dist/technospam/pages/HackathonsHackathonsPagePage.d.ts +2 -0
  72. package/dist/technospam/pages/HackathonsHackathonsPagePage.d.ts.map +1 -0
  73. package/dist/technospam/pages/HackathonsHackathonsPagePage.js +93 -78
  74. package/dist/technospam/pages/HackathonsHackathonsPagePage.js.map +1 -1
  75. package/dist/technospam/pages/MentorshipMentorProfilePagePage.d.ts +2 -0
  76. package/dist/technospam/pages/MentorshipMentorProfilePagePage.d.ts.map +1 -0
  77. package/dist/technospam/pages/MentorshipMentorProfilePagePage.js +135 -121
  78. package/dist/technospam/pages/MentorshipMentorProfilePagePage.js.map +1 -1
  79. package/dist/technospam/pages/MentorshipMentorsPagePage.d.ts +2 -0
  80. package/dist/technospam/pages/MentorshipMentorsPagePage.d.ts.map +1 -0
  81. package/dist/technospam/pages/MentorshipMentorsPagePage.js +156 -142
  82. package/dist/technospam/pages/MentorshipMentorsPagePage.js.map +1 -1
  83. package/dist/technospam/pages/MentorshipSessionsPagePage.d.ts +2 -0
  84. package/dist/technospam/pages/MentorshipSessionsPagePage.d.ts.map +1 -0
  85. package/dist/technospam/pages/MentorshipSessionsPagePage.js +129 -112
  86. package/dist/technospam/pages/MentorshipSessionsPagePage.js.map +1 -1
  87. package/dist/technospam/providers/TechnoSpamProvider.d.ts +13 -0
  88. package/dist/technospam/providers/TechnoSpamProvider.d.ts.map +1 -0
  89. package/dist/technospam/services/assistantApi.d.ts +76 -0
  90. package/dist/technospam/services/assistantApi.d.ts.map +1 -0
  91. package/dist/technospam/services/assistantApi.js +222 -0
  92. package/dist/technospam/services/assistantApi.js.map +1 -0
  93. package/dist/technospam/services/createSandboxAssistantTransport.d.ts +40 -0
  94. package/dist/technospam/services/createSandboxAssistantTransport.d.ts.map +1 -0
  95. package/dist/technospam/services/createSandboxAssistantTransport.js +120 -0
  96. package/dist/technospam/services/createSandboxAssistantTransport.js.map +1 -0
  97. package/dist/technospam/types/assistant.d.ts +15 -0
  98. package/dist/technospam/types/assistant.d.ts.map +1 -0
  99. package/dist/technospam/types/index.d.ts +51 -0
  100. package/dist/technospam/types/index.d.ts.map +1 -0
  101. package/dist/technospam/utils/cn.d.ts +4 -0
  102. package/dist/technospam/utils/cn.d.ts.map +1 -0
  103. package/dist/technospam/utils/format.d.ts +9 -0
  104. package/dist/technospam/utils/format.d.ts.map +1 -0
  105. package/dist/technospam/utils/i18n.d.ts +6 -0
  106. package/dist/technospam/utils/i18n.d.ts.map +1 -0
  107. package/dist/technospam/utils/navigation.d.ts +2 -0
  108. package/dist/technospam/utils/navigation.d.ts.map +1 -0
  109. package/dist/technospam/utils/pageContext.d.ts +28 -0
  110. package/dist/technospam/utils/pageContext.d.ts.map +1 -0
  111. package/dist/technospam/utils/pageContext.js +46 -0
  112. package/dist/technospam/utils/pageContext.js.map +1 -0
  113. package/package.json +5 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTechnoSpamAnalytics.js","names":[],"sources":["../../../src/technospam/hooks/useTechnoSpamAnalytics.ts"],"sourcesContent":["/**\n * TechnoSpam product analytics helper.\n *\n * Emits events on the shared event bus. The shell's RybbitSink forwards\n * allow-listed fact events to Rybbit Cloud; until TechnoSpam has a site ID,\n * events still flow to the bus and to backend audit / telemetry sinks.\n *\n * Pattern: emit an intent event before a mutation, then a fact event when the\n * server confirms the change.\n */\n\nimport { useCallback } from 'react';\nimport { useEventBus } from '@burdenoff/fe-libs/shared/events';\n\nexport interface EntityEventPayload {\n workspaceId?: string;\n entityId?: string;\n entityType?: string;\n}\n\nexport type TechnoSpamEventName =\n | 'technospam.course.viewed'\n | 'technospam.course.enroll_clicked'\n | 'technospam.course.enrolled'\n | 'technospam.course.progress_updated'\n | 'technospam.course.certificate_claimed'\n | 'technospam.problem.viewed'\n | 'technospam.problem.submit_clicked'\n | 'technospam.problem.submitted'\n | 'technospam.mentor.viewed'\n | 'technospam.mentor.book_clicked'\n | 'technospam.mentor.booked'\n | 'technospam.mentor.become_mentor_clicked'\n | 'technospam.mentor.became_mentor'\n | 'technospam.session.cancel_clicked'\n | 'technospam.session.cancelled'\n | 'technospam.session.complete_clicked'\n | 'technospam.session.completed'\n | 'technospam.hackathon.viewed'\n | 'technospam.hackathon.register_team_clicked'\n | 'technospam.hackathon.team_registered'\n | 'technospam.hackathon.submit_project_clicked'\n | 'technospam.hackathon.project_submitted'\n | 'technospam.search.performed';\n\nexport function useTechnoSpamAnalytics() {\n const bus = useEventBus();\n\n const emit = useCallback(\n (name: TechnoSpamEventName, payload: EntityEventPayload & Record<string, unknown> = {}) => {\n bus.emitCustom(name, payload, { component: 'microfe-technospam' });\n },\n [bus]\n );\n\n return { emit };\n}\n"],"mappings":";;;AA6CA,SAAgB,IAAyB;CACvC,IAAM,IAAM,GAAa;AASzB,QAAO,EAAE,MAPI,GACV,GAA2B,IAAwD,EAAE,KAAK;AACzF,IAAI,WAAW,GAAM,GAAS,EAAE,WAAW,sBAAsB,CAAC;IAEpE,CAAC,EAAI,CACN,EAEc"}
@@ -0,0 +1,6 @@
1
+ export { TechnoSpamRoot } from './TechnoSpamRoot';
2
+ export type { TechnoSpamRootProps, NavItem, FooterItem } from './types';
3
+ export { useTechnoSpam, useTechnoSpamNavigate } from './providers/TechnoSpamProvider';
4
+ export * from './services/createSandboxAssistantTransport';
5
+ export { useTechnoSpamAnalytics } from './hooks/useTechnoSpamAnalytics';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/technospam/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAOtF,cAAc,4CAA4C,CAAC;AAG3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC"}
@@ -1,2 +1,4 @@
1
1
  import "./providers/TechnoSpamProvider.js";
2
2
  import "./TechnoSpamRoot.js";
3
+ import "./services/createSandboxAssistantTransport.js";
4
+ import "./hooks/useTechnoSpamAnalytics.js";
@@ -0,0 +1,18 @@
1
+ import { toast } from 'sonner';
2
+
3
+ /**
4
+ * Module-wide toast API. sonner is a global singleton; the matching <Toaster>
5
+ * is owned by the HOST app shell (mounted once via AppShellProvider). Every
6
+ * page/component surfaces feedback through these helpers instead of hand-rolling
7
+ * fixed-position toast markup, so success/error notifications stay consistent
8
+ * with the rest of the platform.
9
+ */
10
+ export declare const notify: {
11
+ success(message: string, description?: string): void;
12
+ info(message: string, description?: string): void;
13
+ warning(message: string, description?: string): void;
14
+ error(message: string, description?: string): void;
15
+ dismiss(id?: string | number): void;
16
+ };
17
+ export { toast };
18
+ //# sourceMappingURL=toast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../../src/technospam/lib/toast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B;;;;;;GAMG;AACH,eAAO,MAAM,MAAM;qBACA,MAAM,gBAAgB,MAAM,GAAG,IAAI;kBAGtC,MAAM,gBAAgB,MAAM,GAAG,IAAI;qBAGhC,MAAM,gBAAgB,MAAM,GAAG,IAAI;mBAGrC,MAAM,gBAAgB,MAAM,GAAG,IAAI;iBAGrC,MAAM,GAAG,MAAM,GAAG,IAAI;CAGpC,CAAC;AAEF,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function AdminAdminDashboardPagePage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=AdminAdminDashboardPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminAdminDashboardPagePage.d.ts","sourceRoot":"","sources":["../../../src/technospam/pages/AdminAdminDashboardPagePage.tsx"],"names":[],"mappings":"AAszCA,wBAAgB,2BAA2B,gCAqD1C"}
@@ -0,0 +1,2 @@
1
+ export declare function AnalyticsAnalyticsPagePage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=AnalyticsAnalyticsPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsAnalyticsPagePage.d.ts","sourceRoot":"","sources":["../../../src/technospam/pages/AnalyticsAnalyticsPagePage.tsx"],"names":[],"mappings":"AAiNA,wBAAgB,0BAA0B,gCAmVzC"}
@@ -0,0 +1,2 @@
1
+ export declare function ApplicationsProblemDetailsPagePage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=ApplicationsProblemDetailsPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApplicationsProblemDetailsPagePage.d.ts","sourceRoot":"","sources":["../../../src/technospam/pages/ApplicationsProblemDetailsPagePage.tsx"],"names":[],"mappings":"AA6FA,wBAAgB,kCAAkC,gCAgPjD"}
@@ -4,162 +4,175 @@ import { PageLayout as n } from "../components/PageLayout.js";
4
4
  import { StatCard as r } from "../components/StatCard.js";
5
5
  import { formatDateTime as i, humanizeEnum as a } from "../utils/format.js";
6
6
  import { StatusBadge as o } from "../components/StatusBadge.js";
7
- import { EmptyView as s, ErrorView as c, LoadingRows as l } from "../components/StateViews.js";
7
+ import { EmptyView as s, ErrorView as c, LoadingRows as ee } from "../components/StateViews.js";
8
8
  import "../components/index.js";
9
- import { notify as u } from "../lib/toast.js";
10
- import { useProblemQuery as d, useSubmissionsQuery as ee, useSubmitSolution as f } from "../api/technospamApi.js";
9
+ import { notify as l } from "../lib/toast.js";
10
+ import { useProblemQuery as te, useSubmissionsQuery as u, useSubmitSolution as d } from "../api/technospamApi.js";
11
+ import { useTechnoSpamAnalytics as f } from "../hooks/useTechnoSpamAnalytics.js";
11
12
  import { useEffect as p, useMemo as m, useRef as h, useState as g } from "react";
12
- import { Clock as _, Code2 as v, FileText as y, Layers as b, Send as x, Tag as S, Trophy as C } from "lucide-react";
13
- import { useSearchParams as w } from "react-router-dom";
14
- import { jsx as T, jsxs as E } from "react/jsx-runtime";
15
- import { Badge as D, Button as O, GlassCard as k, Select as te, SelectContent as ne, SelectItem as re, SelectTrigger as ie, SelectValue as ae, Skeleton as A, Textarea as j } from "@burdenoff/fe-libs/ui";
13
+ import { Clock as _, Code2 as v, FileText as y, Layers as b, Send as ne, Tag as x, Trophy as S } from "lucide-react";
14
+ import { useSearchParams as C } from "react-router-dom";
15
+ import { jsx as w, jsxs as T } from "react/jsx-runtime";
16
+ import { Badge as E, Button as D, GlassCard as O, Select as re, SelectContent as ie, SelectItem as ae, SelectTrigger as oe, SelectValue as se, Skeleton as k, Textarea as ce } from "@burdenoff/fe-libs/ui";
16
17
  //#region src/technospam/pages/ApplicationsProblemDetailsPagePage.tsx
17
- var M = [
18
+ var A = [
18
19
  "javascript",
19
20
  "python",
20
21
  "typescript"
21
22
  ];
22
- function N({ label: e, children: n, bodyClassName: r }) {
23
- return /* @__PURE__ */ E("div", {
23
+ function j({ label: e, children: n, bodyClassName: r }) {
24
+ return /* @__PURE__ */ T("div", {
24
25
  className: "overflow-hidden rounded-xl border border-border-strong bg-bg-sunken shadow-sm",
25
- children: [/* @__PURE__ */ E("div", {
26
+ children: [/* @__PURE__ */ T("div", {
26
27
  className: "flex items-center justify-between gap-2 border-b border-border-seam bg-bg-canvas/40 px-4 py-2",
27
- children: [/* @__PURE__ */ E("div", {
28
+ children: [/* @__PURE__ */ T("div", {
28
29
  className: "flex items-center gap-1.5",
29
30
  children: [
30
- /* @__PURE__ */ T("span", { className: "h-2.5 w-2.5 rounded-full bg-status-error-border" }),
31
- /* @__PURE__ */ T("span", { className: "h-2.5 w-2.5 rounded-full bg-status-warning-border" }),
32
- /* @__PURE__ */ T("span", { className: "h-2.5 w-2.5 rounded-full bg-status-success-border" })
31
+ /* @__PURE__ */ w("span", { className: "h-2.5 w-2.5 rounded-full bg-status-error-border" }),
32
+ /* @__PURE__ */ w("span", { className: "h-2.5 w-2.5 rounded-full bg-status-warning-border" }),
33
+ /* @__PURE__ */ w("span", { className: "h-2.5 w-2.5 rounded-full bg-status-success-border" })
33
34
  ]
34
- }), /* @__PURE__ */ E("span", {
35
+ }), /* @__PURE__ */ T("span", {
35
36
  className: "inline-flex items-center gap-1.5 font-mono text-xs text-text-muted",
36
37
  children: [
37
- /* @__PURE__ */ T(v, { size: 13 }),
38
+ /* @__PURE__ */ w(v, { size: 13 }),
38
39
  " ",
39
40
  e
40
41
  ]
41
42
  })]
42
- }), /* @__PURE__ */ T("pre", {
43
+ }), /* @__PURE__ */ w("pre", {
43
44
  className: t("overflow-auto p-4 font-mono text-xs leading-relaxed text-text-primary", r),
44
45
  children: n
45
46
  })]
46
47
  });
47
48
  }
48
- function P({ s: e }) {
49
- return /* @__PURE__ */ E("div", {
49
+ function M({ s: e }) {
50
+ return /* @__PURE__ */ T("div", {
50
51
  className: "flex flex-wrap items-center gap-x-4 gap-y-1 rounded-lg border border-transparent px-2 py-3 transition-colors hover:border-border-seam hover:bg-bg-sunken",
51
52
  children: [
52
- /* @__PURE__ */ T(o, { status: e.verdict }),
53
- /* @__PURE__ */ E("span", {
53
+ /* @__PURE__ */ w(o, { status: e.verdict }),
54
+ /* @__PURE__ */ T("span", {
54
55
  className: "inline-flex items-center gap-1 text-sm font-medium text-text-primary",
55
56
  children: [
56
- /* @__PURE__ */ T(v, { size: 13 }),
57
+ /* @__PURE__ */ w(v, { size: 13 }),
57
58
  " ",
58
59
  a(e.language)
59
60
  ]
60
61
  }),
61
- /* @__PURE__ */ E("span", {
62
+ /* @__PURE__ */ T("span", {
62
63
  className: "inline-flex items-center gap-1 text-xs text-text-muted",
63
64
  children: [
64
- /* @__PURE__ */ T(_, { size: 12 }),
65
+ /* @__PURE__ */ w(_, { size: 12 }),
65
66
  " ",
66
67
  e.runtimeMs,
67
68
  " ms"
68
69
  ]
69
70
  }),
70
- /* @__PURE__ */ E("span", {
71
+ /* @__PURE__ */ T("span", {
71
72
  className: "inline-flex items-center gap-1 text-xs text-text-muted",
72
73
  children: [
73
- /* @__PURE__ */ T(C, { size: 12 }),
74
+ /* @__PURE__ */ w(S, { size: 12 }),
74
75
  " ",
75
76
  e.pointsAwarded,
76
77
  " pts"
77
78
  ]
78
79
  }),
79
- /* @__PURE__ */ T("span", {
80
+ /* @__PURE__ */ w("span", {
80
81
  className: "ml-auto text-xs text-text-muted",
81
82
  children: i(e.createdAt)
82
83
  })
83
84
  ]
84
85
  });
85
86
  }
86
- function F() {
87
- let [t] = w(), i = t.get("id") ?? "", { currentUser: _ } = e(), F = _?.id, { data: I, loading: L, error: R, refetch: z } = d(i), { data: B, loading: V, error: H, refetch: U } = ee({
88
- ...F ? { learnerId: F } : {},
87
+ function N() {
88
+ let [t] = C(), i = t.get("id") ?? "", { currentUser: _, workspaceId: N } = e(), P = _?.id, { emit: F } = f(), { data: I, loading: L, error: R, refetch: z } = te(i);
89
+ p(() => {
90
+ i && F("technospam.problem.viewed", {
91
+ workspaceId: N,
92
+ entityId: i,
93
+ entityType: "TEC_PROBLEM"
94
+ });
95
+ }, [
96
+ i,
97
+ N,
98
+ F
99
+ ]);
100
+ let { data: B, loading: V, error: H, refetch: U } = u({
101
+ ...P ? { learnerId: P } : {},
89
102
  problemId: i
90
- }), [W, { loading: G }] = f(), K = I?.tecProblem ?? null, q = m(() => K?.languages?.length ? K.languages : M, [K]), [J, Y] = g(""), [X, Z] = g(""), Q = h(!1);
103
+ }), [W, { loading: G }] = d(), K = I?.tecProblem ?? null, q = m(() => K?.languages?.length ? K.languages : A, [K]), [J, Y] = g(""), [X, Z] = g(""), Q = h(!1);
91
104
  p(() => {
92
- K && !Q.current && (Y(K.languages[0] ?? M[0]), Z(K.starterCode ?? ""), Q.current = !0);
105
+ K && !Q.current && (Y(K.languages[0] ?? A[0]), Z(K.starterCode ?? ""), Q.current = !0);
93
106
  }, [K]);
94
107
  let $ = m(() => [...B?.tecListSubmissions.items ?? []].sort((e, t) => new Date(t.createdAt).getTime() - new Date(e.createdAt).getTime()), [B]);
95
- return L && !K ? /* @__PURE__ */ E(n, {
108
+ return L && !K ? /* @__PURE__ */ T(n, {
96
109
  title: "Problem",
97
110
  backPath: "/applications/problems-page",
98
- children: [/* @__PURE__ */ T(A, { className: "mb-4 h-28 w-full rounded-xl" }), /* @__PURE__ */ T(A, { className: "h-72 w-full rounded-xl" })]
99
- }) : R || !K ? /* @__PURE__ */ T(n, {
111
+ children: [/* @__PURE__ */ w(k, { className: "mb-4 h-28 w-full rounded-xl" }), /* @__PURE__ */ w(k, { className: "h-72 w-full rounded-xl" })]
112
+ }) : R || !K ? /* @__PURE__ */ w(n, {
100
113
  title: "Problem",
101
114
  backPath: "/applications/problems-page",
102
- children: R ? /* @__PURE__ */ T(c, {
115
+ children: R ? /* @__PURE__ */ w(c, {
103
116
  title: "Couldn't load problem",
104
117
  error: R
105
- }) : /* @__PURE__ */ T(s, {
118
+ }) : /* @__PURE__ */ w(s, {
106
119
  title: "Problem not found",
107
120
  description: "This problem may have been unpublished."
108
121
  })
109
- }) : /* @__PURE__ */ E(n, {
122
+ }) : /* @__PURE__ */ T(n, {
110
123
  hero: !0,
111
124
  backPath: "/applications/problems-page",
112
125
  title: K.title,
113
126
  description: K.topic ?? void 0,
114
127
  children: [
115
- /* @__PURE__ */ E("div", {
128
+ /* @__PURE__ */ T("div", {
116
129
  className: "mb-5 flex flex-wrap items-center gap-2",
117
130
  children: [
118
- /* @__PURE__ */ T(o, {
131
+ /* @__PURE__ */ w(o, {
119
132
  status: K.difficulty,
120
133
  kind: "level"
121
134
  }),
122
- /* @__PURE__ */ T(o, { status: K.status }),
123
- K.topic ? /* @__PURE__ */ E(D, {
135
+ /* @__PURE__ */ w(o, { status: K.status }),
136
+ K.topic ? /* @__PURE__ */ T(E, {
124
137
  variant: "outline",
125
138
  className: "gap-1",
126
139
  children: [
127
- /* @__PURE__ */ T(b, { size: 12 }),
140
+ /* @__PURE__ */ w(b, { size: 12 }),
128
141
  " ",
129
142
  K.topic
130
143
  ]
131
144
  }) : null,
132
- K.tags.map((e) => /* @__PURE__ */ E(D, {
145
+ K.tags.map((e) => /* @__PURE__ */ T(E, {
133
146
  variant: "secondary",
134
- children: [/* @__PURE__ */ T(S, {
147
+ children: [/* @__PURE__ */ w(x, {
135
148
  size: 10,
136
149
  className: "mr-1"
137
150
  }), e]
138
151
  }, e))
139
152
  ]
140
153
  }),
141
- /* @__PURE__ */ E("div", {
154
+ /* @__PURE__ */ T("div", {
142
155
  className: "mb-6 grid grid-cols-2 gap-3 sm:grid-cols-4",
143
156
  children: [
144
- /* @__PURE__ */ T(r, {
157
+ /* @__PURE__ */ w(r, {
145
158
  label: "Points",
146
159
  value: K.points,
147
- icon: C,
160
+ icon: S,
148
161
  tone: "amber"
149
162
  }),
150
- /* @__PURE__ */ T(r, {
163
+ /* @__PURE__ */ w(r, {
151
164
  label: "Languages",
152
165
  value: q.length,
153
166
  icon: v,
154
167
  tone: "blue"
155
168
  }),
156
- /* @__PURE__ */ T(r, {
169
+ /* @__PURE__ */ w(r, {
157
170
  label: "Difficulty",
158
171
  value: a(K.difficulty),
159
172
  icon: b,
160
173
  tone: "purple"
161
174
  }),
162
- /* @__PURE__ */ T(r, {
175
+ /* @__PURE__ */ w(r, {
163
176
  label: "My submissions",
164
177
  value: $.length,
165
178
  icon: y,
@@ -167,81 +180,81 @@ function F() {
167
180
  })
168
181
  ]
169
182
  }),
170
- /* @__PURE__ */ E("div", {
183
+ /* @__PURE__ */ T("div", {
171
184
  className: "grid grid-cols-1 gap-5 lg:grid-cols-3",
172
- children: [/* @__PURE__ */ E("div", {
185
+ children: [/* @__PURE__ */ T("div", {
173
186
  className: "space-y-5 lg:col-span-2",
174
187
  children: [
175
- /* @__PURE__ */ E(k, {
188
+ /* @__PURE__ */ T(O, {
176
189
  className: "p-5",
177
- children: [/* @__PURE__ */ T("h2", {
190
+ children: [/* @__PURE__ */ w("h2", {
178
191
  className: "mb-2 text-base font-semibold text-text-primary",
179
192
  children: "Problem statement"
180
- }), K.statement ? /* @__PURE__ */ T("p", {
193
+ }), K.statement ? /* @__PURE__ */ w("p", {
181
194
  className: "whitespace-pre-wrap text-sm leading-relaxed text-text-secondary",
182
195
  children: K.statement
183
- }) : /* @__PURE__ */ T("p", {
196
+ }) : /* @__PURE__ */ w("p", {
184
197
  className: "py-4 text-center text-sm text-text-muted",
185
198
  children: "The statement for this problem is being prepared."
186
199
  })]
187
200
  }),
188
- K.starterCode ? /* @__PURE__ */ E(k, {
201
+ K.starterCode ? /* @__PURE__ */ T(O, {
189
202
  className: "p-5",
190
- children: [/* @__PURE__ */ T("h2", {
203
+ children: [/* @__PURE__ */ w("h2", {
191
204
  className: "mb-3 text-base font-semibold text-text-primary",
192
205
  children: "Starter code"
193
- }), /* @__PURE__ */ T(N, {
206
+ }), /* @__PURE__ */ w(j, {
194
207
  label: a(q[0] ?? "code"),
195
208
  bodyClassName: "max-h-72",
196
209
  children: K.starterCode
197
210
  })]
198
211
  }) : null,
199
- /* @__PURE__ */ E(k, {
212
+ /* @__PURE__ */ T(O, {
200
213
  className: "p-5",
201
214
  children: [
202
- /* @__PURE__ */ E("div", {
215
+ /* @__PURE__ */ T("div", {
203
216
  className: "mb-3 flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between",
204
- children: [/* @__PURE__ */ T("h2", {
217
+ children: [/* @__PURE__ */ w("h2", {
205
218
  className: "text-base font-semibold text-text-primary",
206
219
  children: "Submit a solution"
207
- }), /* @__PURE__ */ E("div", {
220
+ }), /* @__PURE__ */ T("div", {
208
221
  className: "flex items-center gap-2",
209
- children: [/* @__PURE__ */ T("span", {
222
+ children: [/* @__PURE__ */ w("span", {
210
223
  className: "text-sm text-text-secondary",
211
224
  children: "Language"
212
- }), /* @__PURE__ */ E(te, {
225
+ }), /* @__PURE__ */ T(re, {
213
226
  value: J,
214
227
  onValueChange: Y,
215
- children: [/* @__PURE__ */ T(ie, {
228
+ children: [/* @__PURE__ */ w(oe, {
216
229
  className: "w-full sm:w-48",
217
- children: /* @__PURE__ */ T(ae, { placeholder: "Choose a language" })
218
- }), /* @__PURE__ */ T(ne, { children: q.map((e) => /* @__PURE__ */ T(re, {
230
+ children: /* @__PURE__ */ w(se, { placeholder: "Choose a language" })
231
+ }), /* @__PURE__ */ w(ie, { children: q.map((e) => /* @__PURE__ */ w(ae, {
219
232
  value: e,
220
233
  children: a(e)
221
234
  }, e)) })]
222
235
  })]
223
236
  })]
224
237
  }),
225
- /* @__PURE__ */ E("div", {
238
+ /* @__PURE__ */ T("div", {
226
239
  className: "overflow-hidden rounded-xl border border-border-strong bg-bg-sunken shadow-sm",
227
- children: [/* @__PURE__ */ E("div", {
240
+ children: [/* @__PURE__ */ T("div", {
228
241
  className: "flex items-center justify-between gap-2 border-b border-border-seam bg-bg-canvas/40 px-4 py-2",
229
- children: [/* @__PURE__ */ E("div", {
242
+ children: [/* @__PURE__ */ T("div", {
230
243
  className: "flex items-center gap-1.5",
231
244
  children: [
232
- /* @__PURE__ */ T("span", { className: "h-2.5 w-2.5 rounded-full bg-status-error-border" }),
233
- /* @__PURE__ */ T("span", { className: "h-2.5 w-2.5 rounded-full bg-status-warning-border" }),
234
- /* @__PURE__ */ T("span", { className: "h-2.5 w-2.5 rounded-full bg-status-success-border" })
245
+ /* @__PURE__ */ w("span", { className: "h-2.5 w-2.5 rounded-full bg-status-error-border" }),
246
+ /* @__PURE__ */ w("span", { className: "h-2.5 w-2.5 rounded-full bg-status-warning-border" }),
247
+ /* @__PURE__ */ w("span", { className: "h-2.5 w-2.5 rounded-full bg-status-success-border" })
235
248
  ]
236
- }), /* @__PURE__ */ E("span", {
249
+ }), /* @__PURE__ */ T("span", {
237
250
  className: "inline-flex items-center gap-1.5 font-mono text-xs text-text-muted",
238
251
  children: [
239
- /* @__PURE__ */ T(v, { size: 13 }),
252
+ /* @__PURE__ */ w(v, { size: 13 }),
240
253
  " ",
241
254
  J ? a(J) : "solution"
242
255
  ]
243
256
  })]
244
- }), /* @__PURE__ */ T(j, {
257
+ }), /* @__PURE__ */ w(ce, {
245
258
  value: X,
246
259
  onChange: (e) => Z(e.target.value),
247
260
  placeholder: "Write your solution…",
@@ -249,28 +262,39 @@ function F() {
249
262
  spellCheck: !1
250
263
  })]
251
264
  }),
252
- /* @__PURE__ */ E(O, {
265
+ /* @__PURE__ */ T(D, {
253
266
  className: "mt-4 w-full",
254
267
  onClick: async () => {
255
- if (i) {
256
- if (!J) {
257
- u.error("Pick a language", "Choose a language before submitting.");
258
- return;
259
- }
260
- if (!X.trim()) {
261
- u.error("Add your solution", "Write some code before submitting.");
262
- return;
263
- }
264
- (await W({ variables: { input: {
265
- problemId: i,
266
- language: J,
267
- code: X
268
- } } })).data?.tecSubmitSolution && (u.success("Solution submitted", "Your submission was recorded."), await Promise.all([z(), U()]));
268
+ if (!i) return;
269
+ if (!J) {
270
+ l.error("Pick a language", "Choose a language before submitting.");
271
+ return;
272
+ }
273
+ if (!X.trim()) {
274
+ l.error("Add your solution", "Write some code before submitting.");
275
+ return;
269
276
  }
277
+ F("technospam.problem.submit_clicked", {
278
+ workspaceId: N,
279
+ entityId: i,
280
+ entityType: "TEC_PROBLEM",
281
+ language: J
282
+ });
283
+ let e = await W({ variables: { input: {
284
+ problemId: i,
285
+ language: J,
286
+ code: X
287
+ } } });
288
+ e.data?.tecSubmitSolution && (F("technospam.problem.submitted", {
289
+ workspaceId: N,
290
+ entityId: i,
291
+ entityType: "TEC_PROBLEM",
292
+ submissionId: e.data.tecSubmitSolution.id
293
+ }), l.success("Solution submitted", "Your submission was recorded."), await Promise.all([z(), U()]));
270
294
  },
271
295
  disabled: G || !X.trim(),
272
296
  children: [
273
- /* @__PURE__ */ T(x, { size: 16 }),
297
+ /* @__PURE__ */ w(ne, { size: 16 }),
274
298
  " ",
275
299
  G ? "Submitting…" : "Submit solution"
276
300
  ]
@@ -278,26 +302,26 @@ function F() {
278
302
  ]
279
303
  })
280
304
  ]
281
- }), /* @__PURE__ */ T("div", {
305
+ }), /* @__PURE__ */ w("div", {
282
306
  className: "lg:col-span-1",
283
- children: /* @__PURE__ */ E(k, {
307
+ children: /* @__PURE__ */ T(O, {
284
308
  className: "p-5",
285
- children: [/* @__PURE__ */ T("h2", {
309
+ children: [/* @__PURE__ */ w("h2", {
286
310
  className: "mb-3 text-base font-semibold text-text-primary",
287
311
  children: "My submissions"
288
- }), V && !$.length ? /* @__PURE__ */ T(l, {
312
+ }), V && !$.length ? /* @__PURE__ */ w(ee, {
289
313
  count: 3,
290
314
  height: "h-12"
291
- }) : H ? /* @__PURE__ */ T(c, {
315
+ }) : H ? /* @__PURE__ */ w(c, {
292
316
  title: "Couldn't load submissions",
293
317
  error: H
294
- }) : $.length === 0 ? /* @__PURE__ */ T(s, {
295
- icon: /* @__PURE__ */ T(y, { size: 24 }),
318
+ }) : $.length === 0 ? /* @__PURE__ */ w(s, {
319
+ icon: /* @__PURE__ */ w(y, { size: 24 }),
296
320
  title: "No submissions yet",
297
321
  description: "Submit a solution above to see your verdicts and points here."
298
- }) : /* @__PURE__ */ T("div", {
322
+ }) : /* @__PURE__ */ w("div", {
299
323
  className: "space-y-1",
300
- children: $.map((e) => /* @__PURE__ */ T(P, { s: e }, e.id))
324
+ children: $.map((e) => /* @__PURE__ */ w(M, { s: e }, e.id))
301
325
  })]
302
326
  })
303
327
  })]
@@ -306,6 +330,6 @@ function F() {
306
330
  });
307
331
  }
308
332
  //#endregion
309
- export { F as ApplicationsProblemDetailsPagePage };
333
+ export { N as ApplicationsProblemDetailsPagePage };
310
334
 
311
335
  //# sourceMappingURL=ApplicationsProblemDetailsPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationsProblemDetailsPagePage.js","names":[],"sources":["../../../src/technospam/pages/ApplicationsProblemDetailsPagePage.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Clock, Code2, FileText, Layers, Send, Tag, Trophy } from 'lucide-react';\nimport {\n Badge,\n Button,\n GlassCard,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Skeleton,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport {\n EmptyView,\n ErrorView,\n LoadingRows,\n PageLayout,\n StatCard,\n StatusBadge,\n} from '../components';\nimport { useTechnoSpam } from '../providers/TechnoSpamProvider';\nimport {\n useProblemQuery,\n useSubmissionsQuery,\n useSubmitSolution,\n type TecSubmission,\n} from '../api/technospamApi';\nimport { formatDateTime, humanizeEnum } from '../utils/format';\nimport { cn } from '../utils/cn';\nimport { notify } from '../lib/toast';\n\nconst FALLBACK_LANGUAGES = ['javascript', 'python', 'typescript'];\n\n/**\n * A dark, editor-window styled code surface: mac-style traffic-light dots plus a\n * language label header over a scrollable monospace body so read-only code reads\n * like a real IDE panel rather than a flat block.\n */\nfunction CodePanel({\n label,\n children,\n bodyClassName,\n}: {\n label: string;\n children: ReactNode;\n bodyClassName?: string;\n}) {\n return (\n <div className=\"overflow-hidden rounded-xl border border-border-strong bg-bg-sunken shadow-sm\">\n <div className=\"flex items-center justify-between gap-2 border-b border-border-seam bg-bg-canvas/40 px-4 py-2\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"h-2.5 w-2.5 rounded-full bg-status-error-border\" />\n <span className=\"h-2.5 w-2.5 rounded-full bg-status-warning-border\" />\n <span className=\"h-2.5 w-2.5 rounded-full bg-status-success-border\" />\n </div>\n <span className=\"inline-flex items-center gap-1.5 font-mono text-xs text-text-muted\">\n <Code2 size={13} /> {label}\n </span>\n </div>\n <pre\n className={cn(\n 'overflow-auto p-4 font-mono text-xs leading-relaxed text-text-primary',\n bodyClassName\n )}\n >\n {children}\n </pre>\n </div>\n );\n}\n\nfunction SubmissionRow({ s }: { s: TecSubmission }) {\n return (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 rounded-lg border border-transparent px-2 py-3 transition-colors hover:border-border-seam hover:bg-bg-sunken\">\n <StatusBadge status={s.verdict} />\n <span className=\"inline-flex items-center gap-1 text-sm font-medium text-text-primary\">\n <Code2 size={13} /> {humanizeEnum(s.language)}\n </span>\n <span className=\"inline-flex items-center gap-1 text-xs text-text-muted\">\n <Clock size={12} /> {s.runtimeMs} ms\n </span>\n <span className=\"inline-flex items-center gap-1 text-xs text-text-muted\">\n <Trophy size={12} /> {s.pointsAwarded} pts\n </span>\n <span className=\"ml-auto text-xs text-text-muted\">{formatDateTime(s.createdAt)}</span>\n </div>\n );\n}\n\nexport function ApplicationsProblemDetailsPagePage() {\n const [params] = useSearchParams();\n const id = params.get('id') ?? '';\n const { currentUser } = useTechnoSpam();\n const learnerId = currentUser?.id;\n\n const { data, loading, error, refetch } = useProblemQuery(id);\n const {\n data: subsData,\n loading: subsLoading,\n error: subsError,\n refetch: refetchSubs,\n } = useSubmissionsQuery({ ...(learnerId ? { learnerId } : {}), problemId: id });\n const [submit, { loading: submitting }] = useSubmitSolution();\n\n const problem = data?.tecProblem ?? null;\n\n const languages = useMemo(\n () => (problem?.languages?.length ? problem.languages : FALLBACK_LANGUAGES),\n [problem]\n );\n\n const [language, setLanguage] = useState('');\n const [code, setCode] = useState('');\n const initedRef = useRef(false);\n\n useEffect(() => {\n if (problem && !initedRef.current) {\n setLanguage(problem.languages[0] ?? FALLBACK_LANGUAGES[0]!);\n setCode(problem.starterCode ?? '');\n initedRef.current = true;\n }\n }, [problem]);\n\n const submissions = useMemo(\n () =>\n [...(subsData?.tecListSubmissions.items ?? [])].sort(\n (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n ),\n [subsData]\n );\n\n const handleSubmit = async () => {\n if (!id) return;\n if (!language) {\n notify.error('Pick a language', 'Choose a language before submitting.');\n return;\n }\n if (!code.trim()) {\n notify.error('Add your solution', 'Write some code before submitting.');\n return;\n }\n const res = await submit({ variables: { input: { problemId: id, language, code } } });\n if (res.data?.tecSubmitSolution) {\n notify.success('Solution submitted', 'Your submission was recorded.');\n await Promise.all([refetch(), refetchSubs()]);\n }\n };\n\n if (loading && !problem) {\n return (\n <PageLayout title=\"Problem\" backPath=\"/applications/problems-page\">\n <Skeleton className=\"mb-4 h-28 w-full rounded-xl\" />\n <Skeleton className=\"h-72 w-full rounded-xl\" />\n </PageLayout>\n );\n }\n\n if (error || !problem) {\n return (\n <PageLayout title=\"Problem\" backPath=\"/applications/problems-page\">\n {error ? (\n <ErrorView title=\"Couldn't load problem\" error={error} />\n ) : (\n <EmptyView\n title=\"Problem not found\"\n description=\"This problem may have been unpublished.\"\n />\n )}\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n hero\n backPath=\"/applications/problems-page\"\n title={problem.title}\n description={problem.topic ?? undefined}\n >\n <div className=\"mb-5 flex flex-wrap items-center gap-2\">\n <StatusBadge status={problem.difficulty} kind=\"level\" />\n <StatusBadge status={problem.status} />\n {problem.topic ? (\n <Badge variant=\"outline\" className=\"gap-1\">\n <Layers size={12} /> {problem.topic}\n </Badge>\n ) : null}\n {problem.tags.map((t) => (\n <Badge key={t} variant=\"secondary\">\n <Tag size={10} className=\"mr-1\" />\n {t}\n </Badge>\n ))}\n </div>\n\n <div className=\"mb-6 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <StatCard label=\"Points\" value={problem.points} icon={Trophy} tone=\"amber\" />\n <StatCard label=\"Languages\" value={languages.length} icon={Code2} tone=\"blue\" />\n <StatCard\n label=\"Difficulty\"\n value={humanizeEnum(problem.difficulty)}\n icon={Layers}\n tone=\"purple\"\n />\n <StatCard label=\"My submissions\" value={submissions.length} icon={FileText} tone=\"teal\" />\n </div>\n\n <div className=\"grid grid-cols-1 gap-5 lg:grid-cols-3\">\n <div className=\"space-y-5 lg:col-span-2\">\n <GlassCard className=\"p-5\">\n <h2 className=\"mb-2 text-base font-semibold text-text-primary\">Problem statement</h2>\n {problem.statement ? (\n <p className=\"whitespace-pre-wrap text-sm leading-relaxed text-text-secondary\">\n {problem.statement}\n </p>\n ) : (\n <p className=\"py-4 text-center text-sm text-text-muted\">\n The statement for this problem is being prepared.\n </p>\n )}\n </GlassCard>\n\n {problem.starterCode ? (\n <GlassCard className=\"p-5\">\n <h2 className=\"mb-3 text-base font-semibold text-text-primary\">Starter code</h2>\n <CodePanel label={humanizeEnum(languages[0] ?? 'code')} bodyClassName=\"max-h-72\">\n {problem.starterCode}\n </CodePanel>\n </GlassCard>\n ) : null}\n\n <GlassCard className=\"p-5\">\n <div className=\"mb-3 flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n <h2 className=\"text-base font-semibold text-text-primary\">Submit a solution</h2>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-text-secondary\">Language</span>\n <Select value={language} onValueChange={setLanguage}>\n <SelectTrigger className=\"w-full sm:w-48\">\n <SelectValue placeholder=\"Choose a language\" />\n </SelectTrigger>\n <SelectContent>\n {languages.map((l) => (\n <SelectItem key={l} value={l}>\n {humanizeEnum(l)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"overflow-hidden rounded-xl border border-border-strong bg-bg-sunken shadow-sm\">\n <div className=\"flex items-center justify-between gap-2 border-b border-border-seam bg-bg-canvas/40 px-4 py-2\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"h-2.5 w-2.5 rounded-full bg-status-error-border\" />\n <span className=\"h-2.5 w-2.5 rounded-full bg-status-warning-border\" />\n <span className=\"h-2.5 w-2.5 rounded-full bg-status-success-border\" />\n </div>\n <span className=\"inline-flex items-center gap-1.5 font-mono text-xs text-text-muted\">\n <Code2 size={13} /> {language ? humanizeEnum(language) : 'solution'}\n </span>\n </div>\n <Textarea\n value={code}\n onChange={(e) => setCode(e.target.value)}\n placeholder=\"Write your solution…\"\n className=\"min-h-[280px] resize-y rounded-none border-0 bg-transparent font-mono text-xs leading-relaxed focus-visible:ring-0 focus-visible:ring-offset-0\"\n spellCheck={false}\n />\n </div>\n\n <Button\n className=\"mt-4 w-full\"\n onClick={handleSubmit}\n disabled={submitting || !code.trim()}\n >\n <Send size={16} /> {submitting ? 'Submitting…' : 'Submit solution'}\n </Button>\n </GlassCard>\n </div>\n\n <div className=\"lg:col-span-1\">\n <GlassCard className=\"p-5\">\n <h2 className=\"mb-3 text-base font-semibold text-text-primary\">My submissions</h2>\n {subsLoading && !submissions.length ? (\n <LoadingRows count={3} height=\"h-12\" />\n ) : subsError ? (\n <ErrorView title=\"Couldn't load submissions\" error={subsError} />\n ) : submissions.length === 0 ? (\n <EmptyView\n icon={<FileText size={24} />}\n title=\"No submissions yet\"\n description=\"Submit a solution above to see your verdicts and points here.\"\n />\n ) : (\n <div className=\"space-y-1\">\n {submissions.map((s) => (\n <SubmissionRow key={s.id} s={s} />\n ))}\n </div>\n )}\n </GlassCard>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ApplicationsProblemDetailsPagePage.js","names":[],"sources":["../../../src/technospam/pages/ApplicationsProblemDetailsPagePage.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Clock, Code2, FileText, Layers, Send, Tag, Trophy } from 'lucide-react';\nimport {\n Badge,\n Button,\n GlassCard,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Skeleton,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport {\n EmptyView,\n ErrorView,\n LoadingRows,\n PageLayout,\n StatCard,\n StatusBadge,\n} from '../components';\nimport { useTechnoSpam } from '../providers/TechnoSpamProvider';\nimport {\n useProblemQuery,\n useSubmissionsQuery,\n useSubmitSolution,\n type TecSubmission,\n} from '../api/technospamApi';\nimport { formatDateTime, humanizeEnum } from '../utils/format';\nimport { cn } from '../utils/cn';\nimport { notify } from '../lib/toast';\nimport { useTechnoSpamAnalytics } from '../hooks/useTechnoSpamAnalytics';\n\nconst FALLBACK_LANGUAGES = ['javascript', 'python', 'typescript'];\n\n/**\n * A dark, editor-window styled code surface: mac-style traffic-light dots plus a\n * language label header over a scrollable monospace body so read-only code reads\n * like a real IDE panel rather than a flat block.\n */\nfunction CodePanel({\n label,\n children,\n bodyClassName,\n}: {\n label: string;\n children: ReactNode;\n bodyClassName?: string;\n}) {\n return (\n <div className=\"overflow-hidden rounded-xl border border-border-strong bg-bg-sunken shadow-sm\">\n <div className=\"flex items-center justify-between gap-2 border-b border-border-seam bg-bg-canvas/40 px-4 py-2\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"h-2.5 w-2.5 rounded-full bg-status-error-border\" />\n <span className=\"h-2.5 w-2.5 rounded-full bg-status-warning-border\" />\n <span className=\"h-2.5 w-2.5 rounded-full bg-status-success-border\" />\n </div>\n <span className=\"inline-flex items-center gap-1.5 font-mono text-xs text-text-muted\">\n <Code2 size={13} /> {label}\n </span>\n </div>\n <pre\n className={cn(\n 'overflow-auto p-4 font-mono text-xs leading-relaxed text-text-primary',\n bodyClassName\n )}\n >\n {children}\n </pre>\n </div>\n );\n}\n\nfunction SubmissionRow({ s }: { s: TecSubmission }) {\n return (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 rounded-lg border border-transparent px-2 py-3 transition-colors hover:border-border-seam hover:bg-bg-sunken\">\n <StatusBadge status={s.verdict} />\n <span className=\"inline-flex items-center gap-1 text-sm font-medium text-text-primary\">\n <Code2 size={13} /> {humanizeEnum(s.language)}\n </span>\n <span className=\"inline-flex items-center gap-1 text-xs text-text-muted\">\n <Clock size={12} /> {s.runtimeMs} ms\n </span>\n <span className=\"inline-flex items-center gap-1 text-xs text-text-muted\">\n <Trophy size={12} /> {s.pointsAwarded} pts\n </span>\n <span className=\"ml-auto text-xs text-text-muted\">{formatDateTime(s.createdAt)}</span>\n </div>\n );\n}\n\nexport function ApplicationsProblemDetailsPagePage() {\n const [params] = useSearchParams();\n const id = params.get('id') ?? '';\n const { currentUser, workspaceId } = useTechnoSpam();\n const learnerId = currentUser?.id;\n const { emit } = useTechnoSpamAnalytics();\n\n const { data, loading, error, refetch } = useProblemQuery(id);\n\n useEffect(() => {\n if (id) {\n emit('technospam.problem.viewed', {\n workspaceId,\n entityId: id,\n entityType: 'TEC_PROBLEM',\n });\n }\n }, [id, workspaceId, emit]);\n const {\n data: subsData,\n loading: subsLoading,\n error: subsError,\n refetch: refetchSubs,\n } = useSubmissionsQuery({ ...(learnerId ? { learnerId } : {}), problemId: id });\n const [submit, { loading: submitting }] = useSubmitSolution();\n\n const problem = data?.tecProblem ?? null;\n\n const languages = useMemo(\n () => (problem?.languages?.length ? problem.languages : FALLBACK_LANGUAGES),\n [problem]\n );\n\n const [language, setLanguage] = useState('');\n const [code, setCode] = useState('');\n const initedRef = useRef(false);\n\n useEffect(() => {\n if (problem && !initedRef.current) {\n setLanguage(problem.languages[0] ?? FALLBACK_LANGUAGES[0]!);\n setCode(problem.starterCode ?? '');\n initedRef.current = true;\n }\n }, [problem]);\n\n const submissions = useMemo(\n () =>\n [...(subsData?.tecListSubmissions.items ?? [])].sort(\n (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n ),\n [subsData]\n );\n\n const handleSubmit = async () => {\n if (!id) return;\n if (!language) {\n notify.error('Pick a language', 'Choose a language before submitting.');\n return;\n }\n if (!code.trim()) {\n notify.error('Add your solution', 'Write some code before submitting.');\n return;\n }\n emit('technospam.problem.submit_clicked', {\n workspaceId,\n entityId: id,\n entityType: 'TEC_PROBLEM',\n language,\n });\n const res = await submit({ variables: { input: { problemId: id, language, code } } });\n if (res.data?.tecSubmitSolution) {\n emit('technospam.problem.submitted', {\n workspaceId,\n entityId: id,\n entityType: 'TEC_PROBLEM',\n submissionId: res.data.tecSubmitSolution.id,\n });\n notify.success('Solution submitted', 'Your submission was recorded.');\n await Promise.all([refetch(), refetchSubs()]);\n }\n };\n\n if (loading && !problem) {\n return (\n <PageLayout title=\"Problem\" backPath=\"/applications/problems-page\">\n <Skeleton className=\"mb-4 h-28 w-full rounded-xl\" />\n <Skeleton className=\"h-72 w-full rounded-xl\" />\n </PageLayout>\n );\n }\n\n if (error || !problem) {\n return (\n <PageLayout title=\"Problem\" backPath=\"/applications/problems-page\">\n {error ? (\n <ErrorView title=\"Couldn't load problem\" error={error} />\n ) : (\n <EmptyView\n title=\"Problem not found\"\n description=\"This problem may have been unpublished.\"\n />\n )}\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n hero\n backPath=\"/applications/problems-page\"\n title={problem.title}\n description={problem.topic ?? undefined}\n >\n <div className=\"mb-5 flex flex-wrap items-center gap-2\">\n <StatusBadge status={problem.difficulty} kind=\"level\" />\n <StatusBadge status={problem.status} />\n {problem.topic ? (\n <Badge variant=\"outline\" className=\"gap-1\">\n <Layers size={12} /> {problem.topic}\n </Badge>\n ) : null}\n {problem.tags.map((t) => (\n <Badge key={t} variant=\"secondary\">\n <Tag size={10} className=\"mr-1\" />\n {t}\n </Badge>\n ))}\n </div>\n\n <div className=\"mb-6 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <StatCard label=\"Points\" value={problem.points} icon={Trophy} tone=\"amber\" />\n <StatCard label=\"Languages\" value={languages.length} icon={Code2} tone=\"blue\" />\n <StatCard\n label=\"Difficulty\"\n value={humanizeEnum(problem.difficulty)}\n icon={Layers}\n tone=\"purple\"\n />\n <StatCard label=\"My submissions\" value={submissions.length} icon={FileText} tone=\"teal\" />\n </div>\n\n <div className=\"grid grid-cols-1 gap-5 lg:grid-cols-3\">\n <div className=\"space-y-5 lg:col-span-2\">\n <GlassCard className=\"p-5\">\n <h2 className=\"mb-2 text-base font-semibold text-text-primary\">Problem statement</h2>\n {problem.statement ? (\n <p className=\"whitespace-pre-wrap text-sm leading-relaxed text-text-secondary\">\n {problem.statement}\n </p>\n ) : (\n <p className=\"py-4 text-center text-sm text-text-muted\">\n The statement for this problem is being prepared.\n </p>\n )}\n </GlassCard>\n\n {problem.starterCode ? (\n <GlassCard className=\"p-5\">\n <h2 className=\"mb-3 text-base font-semibold text-text-primary\">Starter code</h2>\n <CodePanel label={humanizeEnum(languages[0] ?? 'code')} bodyClassName=\"max-h-72\">\n {problem.starterCode}\n </CodePanel>\n </GlassCard>\n ) : null}\n\n <GlassCard className=\"p-5\">\n <div className=\"mb-3 flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n <h2 className=\"text-base font-semibold text-text-primary\">Submit a solution</h2>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-text-secondary\">Language</span>\n <Select value={language} onValueChange={setLanguage}>\n <SelectTrigger className=\"w-full sm:w-48\">\n <SelectValue placeholder=\"Choose a language\" />\n </SelectTrigger>\n <SelectContent>\n {languages.map((l) => (\n <SelectItem key={l} value={l}>\n {humanizeEnum(l)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"overflow-hidden rounded-xl border border-border-strong bg-bg-sunken shadow-sm\">\n <div className=\"flex items-center justify-between gap-2 border-b border-border-seam bg-bg-canvas/40 px-4 py-2\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"h-2.5 w-2.5 rounded-full bg-status-error-border\" />\n <span className=\"h-2.5 w-2.5 rounded-full bg-status-warning-border\" />\n <span className=\"h-2.5 w-2.5 rounded-full bg-status-success-border\" />\n </div>\n <span className=\"inline-flex items-center gap-1.5 font-mono text-xs text-text-muted\">\n <Code2 size={13} /> {language ? humanizeEnum(language) : 'solution'}\n </span>\n </div>\n <Textarea\n value={code}\n onChange={(e) => setCode(e.target.value)}\n placeholder=\"Write your solution…\"\n className=\"min-h-[280px] resize-y rounded-none border-0 bg-transparent font-mono text-xs leading-relaxed focus-visible:ring-0 focus-visible:ring-offset-0\"\n spellCheck={false}\n />\n </div>\n\n <Button\n className=\"mt-4 w-full\"\n onClick={handleSubmit}\n disabled={submitting || !code.trim()}\n >\n <Send size={16} /> {submitting ? 'Submitting…' : 'Submit solution'}\n </Button>\n </GlassCard>\n </div>\n\n <div className=\"lg:col-span-1\">\n <GlassCard className=\"p-5\">\n <h2 className=\"mb-3 text-base font-semibold text-text-primary\">My submissions</h2>\n {subsLoading && !submissions.length ? (\n <LoadingRows count={3} height=\"h-12\" />\n ) : subsError ? (\n <ErrorView title=\"Couldn't load submissions\" error={subsError} />\n ) : submissions.length === 0 ? (\n <EmptyView\n icon={<FileText size={24} />}\n title=\"No submissions yet\"\n description=\"Submit a solution above to see your verdicts and points here.\"\n />\n ) : (\n <div className=\"space-y-1\">\n {submissions.map((s) => (\n <SubmissionRow key={s.id} s={s} />\n ))}\n </div>\n )}\n </GlassCard>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function ApplicationsProblemsPagePage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=ApplicationsProblemsPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApplicationsProblemsPagePage.d.ts","sourceRoot":"","sources":["../../../src/technospam/pages/ApplicationsProblemsPagePage.tsx"],"names":[],"mappings":"AAmGA,wBAAgB,4BAA4B,gCAoI3C"}