@burdenoff/microfe-technospam 2026.705.1 → 2026.709.1

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 (48) hide show
  1. package/dist/generated/wspace-operations.js +67 -0
  2. package/dist/generated/wspace-operations.js.map +1 -0
  3. package/dist/index.js +3 -1
  4. package/dist/technospam/components/MediaCover.js +57 -0
  5. package/dist/technospam/components/MediaCover.js.map +1 -0
  6. package/dist/technospam/components/PageLayout.js +1 -1
  7. package/dist/technospam/components/PageLayout.js.map +1 -1
  8. package/dist/technospam/components/StatCard.js +19 -11
  9. package/dist/technospam/components/StatCard.js.map +1 -1
  10. package/dist/technospam/components/StatusBadge.js +1 -1
  11. package/dist/technospam/components/StatusBadge.js.map +1 -1
  12. package/dist/technospam/components/index.js +1 -0
  13. package/dist/technospam/hooks/useTechnoSpamAnalytics.js +13 -0
  14. package/dist/technospam/hooks/useTechnoSpamAnalytics.js.map +1 -0
  15. package/dist/technospam/index.js +2 -0
  16. package/dist/technospam/pages/AdminAdminDashboardPagePage.js +525 -459
  17. package/dist/technospam/pages/AdminAdminDashboardPagePage.js.map +1 -1
  18. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js +167 -127
  19. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  20. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js +178 -101
  21. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js.map +1 -1
  22. package/dist/technospam/pages/ApplicationsProblemsPagePage.js +103 -99
  23. package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -1
  24. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +316 -184
  25. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -1
  26. package/dist/technospam/pages/CoursesCoursesPagePage.js +101 -93
  27. package/dist/technospam/pages/CoursesCoursesPagePage.js.map +1 -1
  28. package/dist/technospam/pages/CoursesMyLearningPagePage.js +119 -88
  29. package/dist/technospam/pages/CoursesMyLearningPagePage.js.map +1 -1
  30. package/dist/technospam/pages/DashboardDashboardPagePage.js +232 -199
  31. package/dist/technospam/pages/DashboardDashboardPagePage.js.map +1 -1
  32. package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js +128 -106
  33. package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js.map +1 -1
  34. package/dist/technospam/pages/HackathonsHackathonsPagePage.js +99 -91
  35. package/dist/technospam/pages/HackathonsHackathonsPagePage.js.map +1 -1
  36. package/dist/technospam/pages/MentorshipMentorProfilePagePage.js +185 -116
  37. package/dist/technospam/pages/MentorshipMentorProfilePagePage.js.map +1 -1
  38. package/dist/technospam/pages/MentorshipMentorsPagePage.js +233 -165
  39. package/dist/technospam/pages/MentorshipMentorsPagePage.js.map +1 -1
  40. package/dist/technospam/pages/MentorshipSessionsPagePage.js +146 -113
  41. package/dist/technospam/pages/MentorshipSessionsPagePage.js.map +1 -1
  42. package/dist/technospam/services/assistantApi.js +222 -0
  43. package/dist/technospam/services/assistantApi.js.map +1 -0
  44. package/dist/technospam/services/createSandboxAssistantTransport.js +120 -0
  45. package/dist/technospam/services/createSandboxAssistantTransport.js.map +1 -0
  46. package/dist/technospam/utils/pageContext.js +46 -0
  47. package/dist/technospam/utils/pageContext.js.map +1 -0
  48. package/package.json +5 -1
@@ -1,17 +1,19 @@
1
1
  import { useTechnoSpam as e, useTechnoSpamNavigate as t } from "../providers/TechnoSpamProvider.js";
2
2
  import { PageLayout as n } from "../components/PageLayout.js";
3
3
  import { StatCard as r } from "../components/StatCard.js";
4
- import { StatusBadge as i } from "../components/StatusBadge.js";
5
- import { LoadMore as a } from "../components/LoadMore.js";
6
- import { EmptyView as o, ErrorView as s, LoadingGrid as c } from "../components/StateViews.js";
4
+ import { MediaCover as i, topicIcon as a } from "../components/MediaCover.js";
5
+ import { StatusBadge as o } from "../components/StatusBadge.js";
6
+ import { LoadMore as s } from "../components/LoadMore.js";
7
+ import { EmptyView as c, ErrorView as l, LoadingGrid as u } from "../components/StateViews.js";
7
8
  import "../components/index.js";
8
- import { pageArg as l, usePageLimit as u, useProblemsQuery as d, useSubmissionsQuery as f } from "../api/technospamApi.js";
9
- import { useMemo as p, useState as m } from "react";
10
- import { CheckCircle2 as h, Code2 as g, Flame as _, Gauge as v, Layers as y, Search as b, Tag as x, Trophy as S } from "lucide-react";
11
- import { jsx as C, jsxs as w } from "react/jsx-runtime";
12
- import { Badge as T, GlassCard as E, Input as D, Tabs as O, TabsList as k, TabsTrigger as A } from "@burdenoff/fe-libs/ui";
9
+ import { pageArg as d, usePageLimit as f, useProblemsQuery as p, useSubmissionsQuery as m } from "../api/technospamApi.js";
10
+ import { useTechnoSpamAnalytics as h } from "../hooks/useTechnoSpamAnalytics.js";
11
+ import { useMemo as g, useState as _ } from "react";
12
+ import { CheckCircle2 as v, Code2 as y, Flame as b, Gauge as x, Layers as S, Search as C, Tag as w, Trophy as T } from "lucide-react";
13
+ import { jsx as E, jsxs as D } from "react/jsx-runtime";
14
+ import { Badge as O, GlassCard as k, Input as A, Tabs as j, TabsList as M, TabsTrigger as N } from "@burdenoff/fe-libs/ui";
13
15
  //#region src/technospam/pages/ApplicationsProblemsPagePage.tsx
14
- var j = [
16
+ var P = [
15
17
  {
16
18
  value: "ALL",
17
19
  label: "All"
@@ -29,73 +31,57 @@ var j = [
29
31
  label: "Hard"
30
32
  }
31
33
  ];
32
- function M(e) {
33
- let t = [
34
- "from-accent-primary/25 to-accent-teal/20",
35
- "from-accent-teal/25 to-accent-primary/15",
36
- "from-status-success-bg-subtle to-accent-wash",
37
- "from-accent-wash to-bg-sunken"
38
- ], n = 0;
39
- for (let t = 0; t < e.length; t += 1) n = n * 31 + e.charCodeAt(t) >>> 0;
40
- return t[n % t.length];
41
- }
42
- function N({ problem: e, solved: t, onOpen: n }) {
43
- return /* @__PURE__ */ w(E, {
44
- className: "group flex cursor-pointer flex-col overflow-hidden transition-shadow hover:shadow-md",
34
+ function F({ problem: e, solved: t, onOpen: n }) {
35
+ return /* @__PURE__ */ D(k, {
36
+ className: "group flex cursor-pointer flex-col overflow-hidden transition-all duration-200 hover:-translate-y-1 hover:shadow-lg",
45
37
  onClick: n,
46
- children: [/* @__PURE__ */ w("div", {
47
- className: `relative flex h-20 items-end bg-gradient-to-br ${M(e.topic ?? e.difficulty)} p-4`,
48
- children: [
49
- /* @__PURE__ */ C(g, {
50
- className: "absolute right-3 top-3 text-text-muted/60",
51
- size: 18
52
- }),
53
- t ? /* @__PURE__ */ w("span", {
54
- className: "absolute left-3 top-3 inline-flex items-center gap-1 rounded-full bg-status-success-bg-subtle px-2 py-0.5 text-[11px] font-medium text-status-success-text",
55
- children: [/* @__PURE__ */ C(h, { size: 12 }), " Solved"]
56
- }) : null,
57
- /* @__PURE__ */ C(i, {
58
- status: e.difficulty,
59
- kind: "level"
60
- })
61
- ]
62
- }), /* @__PURE__ */ w("div", {
38
+ children: [/* @__PURE__ */ D(i, {
39
+ seed: `${e.topic ?? ""} ${e.difficulty} ${e.title}`,
40
+ icon: a(e.topic ?? e.title),
41
+ children: [t ? /* @__PURE__ */ D("span", {
42
+ className: "inline-flex items-center gap-1 rounded-full bg-status-success-bg-subtle px-2 py-0.5 text-[11px] font-medium text-status-success-text ring-1 ring-status-success-border/30",
43
+ children: [/* @__PURE__ */ E(v, { size: 12 }), " Solved"]
44
+ }) : /* @__PURE__ */ E("span", {}), /* @__PURE__ */ E(o, {
45
+ status: e.difficulty,
46
+ kind: "level"
47
+ })]
48
+ }), /* @__PURE__ */ D("div", {
63
49
  className: "flex flex-1 flex-col gap-3 p-4",
64
50
  children: [
65
- /* @__PURE__ */ w("div", {
51
+ /* @__PURE__ */ D("div", {
66
52
  className: "min-w-0",
67
- children: [/* @__PURE__ */ C("h3", {
53
+ children: [/* @__PURE__ */ E("h3", {
68
54
  className: "truncate text-base font-semibold text-text-primary group-hover:text-accent-primary",
69
55
  children: e.title
70
- }), e.statement ? /* @__PURE__ */ C("p", {
56
+ }), e.statement ? /* @__PURE__ */ E("p", {
71
57
  className: "mt-1 line-clamp-2 text-sm text-text-secondary",
72
58
  children: e.statement
73
59
  }) : null]
74
60
  }),
75
- /* @__PURE__ */ w("div", {
61
+ /* @__PURE__ */ D("div", {
76
62
  className: "mt-auto flex flex-wrap items-center gap-3 text-xs text-text-muted",
77
63
  children: [
78
- e.topic ? /* @__PURE__ */ w("span", {
64
+ e.topic ? /* @__PURE__ */ D("span", {
79
65
  className: "inline-flex items-center gap-1",
80
66
  children: [
81
- /* @__PURE__ */ C(y, { size: 13 }),
67
+ /* @__PURE__ */ E(S, { size: 13 }),
82
68
  " ",
83
69
  e.topic
84
70
  ]
85
71
  }) : null,
86
- /* @__PURE__ */ w("span", {
72
+ /* @__PURE__ */ D("span", {
87
73
  className: "inline-flex items-center gap-1",
88
74
  children: [
89
- /* @__PURE__ */ C(S, { size: 13 }),
75
+ /* @__PURE__ */ E(T, { size: 13 }),
90
76
  " ",
91
77
  e.points,
92
78
  " pts"
93
79
  ]
94
80
  }),
95
- e.languages.length ? /* @__PURE__ */ w("span", {
81
+ e.languages.length ? /* @__PURE__ */ D("span", {
96
82
  className: "inline-flex items-center gap-1",
97
83
  children: [
98
- /* @__PURE__ */ C(g, { size: 13 }),
84
+ /* @__PURE__ */ E(y, { size: 13 }),
99
85
  " ",
100
86
  e.languages.length,
101
87
  " lang",
@@ -104,12 +90,12 @@ function N({ problem: e, solved: t, onOpen: n }) {
104
90
  }) : null
105
91
  ]
106
92
  }),
107
- e.tags.length ? /* @__PURE__ */ C("div", {
93
+ e.tags.length ? /* @__PURE__ */ E("div", {
108
94
  className: "flex flex-wrap gap-1.5",
109
- children: e.tags.slice(0, 3).map((e) => /* @__PURE__ */ w(T, {
95
+ children: e.tags.slice(0, 3).map((e) => /* @__PURE__ */ D(O, {
110
96
  variant: "secondary",
111
97
  className: "text-[11px]",
112
- children: [/* @__PURE__ */ C(x, {
98
+ children: [/* @__PURE__ */ E(w, {
113
99
  size: 10,
114
100
  className: "mr-1"
115
101
  }), e]
@@ -119,91 +105,109 @@ function N({ problem: e, solved: t, onOpen: n }) {
119
105
  })]
120
106
  });
121
107
  }
122
- function P() {
123
- let i = t(), { currentUser: y } = e(), x = y?.id, [S, T] = m("ALL"), [E, M] = m(""), { limit: P, more: F } = u(), { data: I, loading: L, error: R } = d({
108
+ function I() {
109
+ let i = t(), { currentUser: a, workspaceId: o } = e(), { emit: S } = h(), w = a?.id, [T, O] = _("ALL"), [k, I] = _(""), { limit: L, more: R } = f(), { data: z, loading: B, error: V } = p({
124
110
  status: "PUBLISHED",
125
- pagination: l(P),
126
- ...S === "ALL" ? {} : { difficulty: S }
127
- }), { data: z } = f(x ? { learnerId: x } : {}), B = I?.tecListProblems.items ?? [], V = I?.tecListProblems.pageInfo.hasMore ?? !1, H = p(() => new Set((z?.tecListSubmissions.items ?? []).filter((e) => e.verdict === "ACCEPTED").map((e) => e.problemId)), [z]), U = B.filter((e) => H.has(e.id)).length, W = B.filter((e) => e.difficulty === "EASY").length, G = B.filter((e) => e.difficulty === "HARD").length, K = p(() => {
128
- let e = E.trim().toLowerCase();
129
- return e ? B.filter((t) => t.title.toLowerCase().includes(e) || (t.topic ?? "").toLowerCase().includes(e) || t.tags.some((t) => t.toLowerCase().includes(e))) : B;
130
- }, [B, E]);
131
- return /* @__PURE__ */ w(n, {
111
+ pagination: d(L),
112
+ ...T === "ALL" ? {} : { difficulty: T }
113
+ }), { data: H } = m(w ? { learnerId: w } : {}), U = z?.tecListProblems.items ?? [], W = z?.tecListProblems.pageInfo.hasMore ?? !1, G = g(() => new Set((H?.tecListSubmissions.items ?? []).filter((e) => e.verdict === "ACCEPTED").map((e) => e.problemId)), [H]), K = U.filter((e) => G.has(e.id)).length, q = U.filter((e) => e.difficulty === "EASY").length, J = U.filter((e) => e.difficulty === "HARD").length, Y = g(() => {
114
+ let e = k.trim().toLowerCase();
115
+ return e ? U.filter((t) => t.title.toLowerCase().includes(e) || (t.topic ?? "").toLowerCase().includes(e) || t.tags.some((t) => t.toLowerCase().includes(e))) : U;
116
+ }, [U, k]);
117
+ return /* @__PURE__ */ D(n, {
132
118
  hero: !0,
133
119
  title: "Coding Problems",
134
120
  description: "Sharpen your problem-solving with hands-on, mentor-judged challenges across topics and difficulty.",
135
121
  children: [
136
- /* @__PURE__ */ w("div", {
122
+ /* @__PURE__ */ D("div", {
137
123
  className: "mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4",
138
124
  children: [
139
- /* @__PURE__ */ C(r, {
125
+ /* @__PURE__ */ E(r, {
140
126
  label: "Problems",
141
- value: B.length,
142
- icon: g
127
+ value: U.length,
128
+ icon: y,
129
+ tone: "blue"
143
130
  }),
144
- /* @__PURE__ */ C(r, {
131
+ /* @__PURE__ */ E(r, {
145
132
  label: "Solved",
146
- value: U,
147
- icon: h
133
+ value: K,
134
+ icon: v,
135
+ tone: "green"
148
136
  }),
149
- /* @__PURE__ */ C(r, {
137
+ /* @__PURE__ */ E(r, {
150
138
  label: "Easy",
151
- value: W,
152
- icon: v
139
+ value: q,
140
+ icon: x,
141
+ tone: "teal"
153
142
  }),
154
- /* @__PURE__ */ C(r, {
143
+ /* @__PURE__ */ E(r, {
155
144
  label: "Hard",
156
- value: G,
157
- icon: _
145
+ value: J,
146
+ icon: b,
147
+ tone: "amber"
158
148
  })
159
149
  ]
160
150
  }),
161
- /* @__PURE__ */ w("div", {
151
+ /* @__PURE__ */ D("div", {
162
152
  className: "mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
163
- children: [/* @__PURE__ */ C(O, {
164
- value: S,
165
- onValueChange: (e) => T(e),
166
- children: /* @__PURE__ */ C(k, { children: j.map((e) => /* @__PURE__ */ C(A, {
153
+ children: [/* @__PURE__ */ E(j, {
154
+ value: T,
155
+ onValueChange: (e) => O(e),
156
+ children: /* @__PURE__ */ E(M, { children: P.map((e) => /* @__PURE__ */ E(N, {
167
157
  value: e.value,
168
158
  children: e.label
169
159
  }, e.value)) })
170
- }), /* @__PURE__ */ w("div", {
160
+ }), /* @__PURE__ */ D("div", {
171
161
  className: "relative w-full sm:w-72",
172
- children: [/* @__PURE__ */ C(b, {
162
+ children: [/* @__PURE__ */ E(C, {
173
163
  className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-text-muted",
174
164
  size: 16
175
- }), /* @__PURE__ */ C(D, {
165
+ }), /* @__PURE__ */ E(A, {
176
166
  className: "pl-9",
177
167
  placeholder: "Search problems…",
178
- value: E,
179
- onChange: (e) => M(e.target.value)
168
+ value: k,
169
+ onChange: (e) => I(e.target.value),
170
+ onBlur: () => {
171
+ let e = k.trim();
172
+ e && S("technospam.search.performed", {
173
+ workspaceId: o,
174
+ entityType: "problem",
175
+ queryLength: e.length
176
+ });
177
+ }
180
178
  })]
181
179
  })]
182
180
  }),
183
- L && !B.length ? /* @__PURE__ */ C(c, {}) : R ? /* @__PURE__ */ C(s, {
181
+ B && !U.length ? /* @__PURE__ */ E(u, {}) : V ? /* @__PURE__ */ E(l, {
184
182
  title: "Couldn't load problems",
185
- error: R
186
- }) : K.length === 0 ? /* @__PURE__ */ C(o, {
187
- icon: /* @__PURE__ */ C(g, { size: 26 }),
188
- title: E || S !== "ALL" ? "No matching problems" : "No problems published yet",
189
- description: E || S !== "ALL" ? "Try a different search or difficulty filter." : "Published problems will appear here. Check back soon — TechnoSpam is pre-launch."
190
- }) : /* @__PURE__ */ C("div", {
183
+ error: V
184
+ }) : Y.length === 0 ? /* @__PURE__ */ E(c, {
185
+ icon: /* @__PURE__ */ E(y, { size: 26 }),
186
+ title: k || T !== "ALL" ? "No matching problems" : "No problems published yet",
187
+ description: k || T !== "ALL" ? "Try a different search or difficulty filter." : "Published problems will appear here. Check back soon — TechnoSpam is pre-launch."
188
+ }) : /* @__PURE__ */ E("div", {
191
189
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
192
- children: K.map((e) => /* @__PURE__ */ C(N, {
190
+ children: Y.map((e) => /* @__PURE__ */ E(F, {
193
191
  problem: e,
194
- solved: H.has(e.id),
195
- onOpen: () => i(`/applications/problem-details-page?id=${e.id}`)
192
+ solved: G.has(e.id),
193
+ onOpen: () => {
194
+ S("technospam.problem.viewed", {
195
+ workspaceId: o,
196
+ entityId: e.id,
197
+ entityType: "TEC_PROBLEM"
198
+ }), i(`/applications/problem-details-page?id=${e.id}`);
199
+ }
196
200
  }, e.id))
197
201
  }),
198
- /* @__PURE__ */ C(a, {
199
- hasMore: V,
200
- loading: L,
201
- onClick: F
202
+ /* @__PURE__ */ E(s, {
203
+ hasMore: W,
204
+ loading: B,
205
+ onClick: R
202
206
  })
203
207
  ]
204
208
  });
205
209
  }
206
210
  //#endregion
207
- export { P as ApplicationsProblemsPagePage };
211
+ export { I as ApplicationsProblemsPagePage };
208
212
 
209
213
  //# sourceMappingURL=ApplicationsProblemsPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationsProblemsPagePage.js","names":[],"sources":["../../../src/technospam/pages/ApplicationsProblemsPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { CheckCircle2, Code2, Flame, Gauge, Layers, Search, Tag, Trophy } from 'lucide-react';\nimport { Badge, GlassCard, Input, Tabs, TabsList, TabsTrigger } from '@burdenoff/fe-libs/ui';\nimport {\n EmptyView,\n ErrorView,\n LoadMore,\n LoadingGrid,\n PageLayout,\n StatCard,\n StatusBadge,\n} from '../components';\nimport { useTechnoSpam, useTechnoSpamNavigate } from '../providers/TechnoSpamProvider';\nimport {\n pageArg,\n usePageLimit,\n useProblemsQuery,\n useSubmissionsQuery,\n type TecProblem,\n type TecProblemDifficulty,\n} from '../api/technospamApi';\n\nconst DIFFICULTIES: Array<{ value: 'ALL' | TecProblemDifficulty; label: string }> = [\n { value: 'ALL', label: 'All' },\n { value: 'EASY', label: 'Easy' },\n { value: 'MEDIUM', label: 'Medium' },\n { value: 'HARD', label: 'Hard' },\n];\n\n/** Deterministic token-based header gradient keyed off the problem topic/difficulty. */\nfunction coverGradient(seed: string): string {\n const gradients = [\n 'from-accent-primary/25 to-accent-teal/20',\n 'from-accent-teal/25 to-accent-primary/15',\n 'from-status-success-bg-subtle to-accent-wash',\n 'from-accent-wash to-bg-sunken',\n ];\n let hash = 0;\n for (let i = 0; i < seed.length; i += 1) hash = (hash * 31 + seed.charCodeAt(i)) >>> 0;\n return gradients[hash % gradients.length]!;\n}\n\nfunction ProblemCard({\n problem,\n solved,\n onOpen,\n}: {\n problem: TecProblem;\n solved: boolean;\n onOpen: () => void;\n}) {\n return (\n <GlassCard\n className=\"group flex cursor-pointer flex-col overflow-hidden transition-shadow hover:shadow-md\"\n onClick={onOpen}\n >\n <div\n className={`relative flex h-20 items-end bg-gradient-to-br ${coverGradient(\n problem.topic ?? problem.difficulty\n )} p-4`}\n >\n <Code2 className=\"absolute right-3 top-3 text-text-muted/60\" size={18} />\n {solved ? (\n <span className=\"absolute left-3 top-3 inline-flex items-center gap-1 rounded-full bg-status-success-bg-subtle px-2 py-0.5 text-[11px] font-medium text-status-success-text\">\n <CheckCircle2 size={12} /> Solved\n </span>\n ) : null}\n <StatusBadge status={problem.difficulty} kind=\"level\" />\n </div>\n <div className=\"flex flex-1 flex-col gap-3 p-4\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary group-hover:text-accent-primary\">\n {problem.title}\n </h3>\n {problem.statement ? (\n <p className=\"mt-1 line-clamp-2 text-sm text-text-secondary\">{problem.statement}</p>\n ) : null}\n </div>\n <div className=\"mt-auto flex flex-wrap items-center gap-3 text-xs text-text-muted\">\n {problem.topic ? (\n <span className=\"inline-flex items-center gap-1\">\n <Layers size={13} /> {problem.topic}\n </span>\n ) : null}\n <span className=\"inline-flex items-center gap-1\">\n <Trophy size={13} /> {problem.points} pts\n </span>\n {problem.languages.length ? (\n <span className=\"inline-flex items-center gap-1\">\n <Code2 size={13} /> {problem.languages.length} lang\n {problem.languages.length === 1 ? '' : 's'}\n </span>\n ) : null}\n </div>\n {problem.tags.length ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {problem.tags.slice(0, 3).map((t) => (\n <Badge key={t} variant=\"secondary\" className=\"text-[11px]\">\n <Tag size={10} className=\"mr-1\" />\n {t}\n </Badge>\n ))}\n </div>\n ) : null}\n </div>\n </GlassCard>\n );\n}\n\nexport function ApplicationsProblemsPagePage() {\n const navigate = useTechnoSpamNavigate();\n const { currentUser } = useTechnoSpam();\n const learnerId = currentUser?.id;\n const [difficulty, setDifficulty] = useState<'ALL' | TecProblemDifficulty>('ALL');\n const [search, setSearch] = useState('');\n\n const { limit, more } = usePageLimit();\n const { data, loading, error } = useProblemsQuery({\n status: 'PUBLISHED',\n pagination: pageArg(limit),\n ...(difficulty !== 'ALL' ? { difficulty } : {}),\n });\n const { data: subsData } = useSubmissionsQuery(learnerId ? { learnerId } : {});\n\n const problems = data?.tecListProblems.items ?? [];\n const hasMore = data?.tecListProblems.pageInfo.hasMore ?? false;\n\n const solvedSet = useMemo(\n () =>\n new Set(\n (subsData?.tecListSubmissions.items ?? [])\n .filter((s) => s.verdict === 'ACCEPTED')\n .map((s) => s.problemId)\n ),\n [subsData]\n );\n\n const solvedCount = problems.filter((p) => solvedSet.has(p.id)).length;\n const easyCount = problems.filter((p) => p.difficulty === 'EASY').length;\n const hardCount = problems.filter((p) => p.difficulty === 'HARD').length;\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return problems;\n return problems.filter(\n (p) =>\n p.title.toLowerCase().includes(q) ||\n (p.topic ?? '').toLowerCase().includes(q) ||\n p.tags.some((t) => t.toLowerCase().includes(q))\n );\n }, [problems, search]);\n\n return (\n <PageLayout\n hero\n title=\"Coding Problems\"\n description=\"Sharpen your problem-solving with hands-on, mentor-judged challenges across topics and difficulty.\"\n >\n <div className=\"mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <StatCard label=\"Problems\" value={problems.length} icon={Code2} />\n <StatCard label=\"Solved\" value={solvedCount} icon={CheckCircle2} />\n <StatCard label=\"Easy\" value={easyCount} icon={Gauge} />\n <StatCard label=\"Hard\" value={hardCount} icon={Flame} />\n </div>\n\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <Tabs\n value={difficulty}\n onValueChange={(v) => setDifficulty(v as 'ALL' | TecProblemDifficulty)}\n >\n <TabsList>\n {DIFFICULTIES.map((d) => (\n <TabsTrigger key={d.value} value={d.value}>\n {d.label}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n <div className=\"relative w-full sm:w-72\">\n <Search\n className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-text-muted\"\n size={16}\n />\n <Input\n className=\"pl-9\"\n placeholder=\"Search problems…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n </div>\n\n {loading && !problems.length ? (\n <LoadingGrid />\n ) : error ? (\n <ErrorView title=\"Couldn't load problems\" error={error} />\n ) : filtered.length === 0 ? (\n <EmptyView\n icon={<Code2 size={26} />}\n title={\n search || difficulty !== 'ALL' ? 'No matching problems' : 'No problems published yet'\n }\n description={\n search || difficulty !== 'ALL'\n ? 'Try a different search or difficulty filter.'\n : 'Published problems will appear here. Check back soon — TechnoSpam is pre-launch.'\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filtered.map((problem) => (\n <ProblemCard\n key={problem.id}\n problem={problem}\n solved={solvedSet.has(problem.id)}\n onOpen={() => navigate(`/applications/problem-details-page?id=${problem.id}`)}\n />\n ))}\n </div>\n )}\n <LoadMore hasMore={hasMore} loading={loading} onClick={more} />\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ApplicationsProblemsPagePage.js","names":[],"sources":["../../../src/technospam/pages/ApplicationsProblemsPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { CheckCircle2, Code2, Flame, Gauge, Layers, Search, Tag, Trophy } from 'lucide-react';\nimport { Badge, GlassCard, Input, Tabs, TabsList, TabsTrigger } from '@burdenoff/fe-libs/ui';\nimport {\n EmptyView,\n ErrorView,\n LoadMore,\n LoadingGrid,\n MediaCover,\n PageLayout,\n StatCard,\n StatusBadge,\n topicIcon,\n} from '../components';\nimport { useTechnoSpam, useTechnoSpamNavigate } from '../providers/TechnoSpamProvider';\nimport {\n pageArg,\n usePageLimit,\n useProblemsQuery,\n useSubmissionsQuery,\n type TecProblem,\n type TecProblemDifficulty,\n} from '../api/technospamApi';\nimport { useTechnoSpamAnalytics } from '../hooks/useTechnoSpamAnalytics';\n\nconst DIFFICULTIES: Array<{ value: 'ALL' | TecProblemDifficulty; label: string }> = [\n { value: 'ALL', label: 'All' },\n { value: 'EASY', label: 'Easy' },\n { value: 'MEDIUM', label: 'Medium' },\n { value: 'HARD', label: 'Hard' },\n];\n\nfunction ProblemCard({\n problem,\n solved,\n onOpen,\n}: {\n problem: TecProblem;\n solved: boolean;\n onOpen: () => void;\n}) {\n return (\n <GlassCard\n className=\"group flex cursor-pointer flex-col overflow-hidden transition-all duration-200 hover:-translate-y-1 hover:shadow-lg\"\n onClick={onOpen}\n >\n <MediaCover\n seed={`${problem.topic ?? ''} ${problem.difficulty} ${problem.title}`}\n icon={topicIcon(problem.topic ?? problem.title)}\n >\n {solved ? (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-status-success-bg-subtle px-2 py-0.5 text-[11px] font-medium text-status-success-text ring-1 ring-status-success-border/30\">\n <CheckCircle2 size={12} /> Solved\n </span>\n ) : (\n <span />\n )}\n <StatusBadge status={problem.difficulty} kind=\"level\" />\n </MediaCover>\n <div className=\"flex flex-1 flex-col gap-3 p-4\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary group-hover:text-accent-primary\">\n {problem.title}\n </h3>\n {problem.statement ? (\n <p className=\"mt-1 line-clamp-2 text-sm text-text-secondary\">{problem.statement}</p>\n ) : null}\n </div>\n <div className=\"mt-auto flex flex-wrap items-center gap-3 text-xs text-text-muted\">\n {problem.topic ? (\n <span className=\"inline-flex items-center gap-1\">\n <Layers size={13} /> {problem.topic}\n </span>\n ) : null}\n <span className=\"inline-flex items-center gap-1\">\n <Trophy size={13} /> {problem.points} pts\n </span>\n {problem.languages.length ? (\n <span className=\"inline-flex items-center gap-1\">\n <Code2 size={13} /> {problem.languages.length} lang\n {problem.languages.length === 1 ? '' : 's'}\n </span>\n ) : null}\n </div>\n {problem.tags.length ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {problem.tags.slice(0, 3).map((t) => (\n <Badge key={t} variant=\"secondary\" className=\"text-[11px]\">\n <Tag size={10} className=\"mr-1\" />\n {t}\n </Badge>\n ))}\n </div>\n ) : null}\n </div>\n </GlassCard>\n );\n}\n\nexport function ApplicationsProblemsPagePage() {\n const navigate = useTechnoSpamNavigate();\n const { currentUser, workspaceId } = useTechnoSpam();\n const { emit } = useTechnoSpamAnalytics();\n const learnerId = currentUser?.id;\n const [difficulty, setDifficulty] = useState<'ALL' | TecProblemDifficulty>('ALL');\n const [search, setSearch] = useState('');\n\n const { limit, more } = usePageLimit();\n const { data, loading, error } = useProblemsQuery({\n status: 'PUBLISHED',\n pagination: pageArg(limit),\n ...(difficulty !== 'ALL' ? { difficulty } : {}),\n });\n const { data: subsData } = useSubmissionsQuery(learnerId ? { learnerId } : {});\n\n const problems = data?.tecListProblems.items ?? [];\n const hasMore = data?.tecListProblems.pageInfo.hasMore ?? false;\n\n const solvedSet = useMemo(\n () =>\n new Set(\n (subsData?.tecListSubmissions.items ?? [])\n .filter((s) => s.verdict === 'ACCEPTED')\n .map((s) => s.problemId)\n ),\n [subsData]\n );\n\n const solvedCount = problems.filter((p) => solvedSet.has(p.id)).length;\n const easyCount = problems.filter((p) => p.difficulty === 'EASY').length;\n const hardCount = problems.filter((p) => p.difficulty === 'HARD').length;\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return problems;\n return problems.filter(\n (p) =>\n p.title.toLowerCase().includes(q) ||\n (p.topic ?? '').toLowerCase().includes(q) ||\n p.tags.some((t) => t.toLowerCase().includes(q))\n );\n }, [problems, search]);\n\n return (\n <PageLayout\n hero\n title=\"Coding Problems\"\n description=\"Sharpen your problem-solving with hands-on, mentor-judged challenges across topics and difficulty.\"\n >\n <div className=\"mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <StatCard label=\"Problems\" value={problems.length} icon={Code2} tone=\"blue\" />\n <StatCard label=\"Solved\" value={solvedCount} icon={CheckCircle2} tone=\"green\" />\n <StatCard label=\"Easy\" value={easyCount} icon={Gauge} tone=\"teal\" />\n <StatCard label=\"Hard\" value={hardCount} icon={Flame} tone=\"amber\" />\n </div>\n\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <Tabs\n value={difficulty}\n onValueChange={(v) => setDifficulty(v as 'ALL' | TecProblemDifficulty)}\n >\n <TabsList>\n {DIFFICULTIES.map((d) => (\n <TabsTrigger key={d.value} value={d.value}>\n {d.label}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n <div className=\"relative w-full sm:w-72\">\n <Search\n className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-text-muted\"\n size={16}\n />\n <Input\n className=\"pl-9\"\n placeholder=\"Search problems…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onBlur={() => {\n const value = search.trim();\n if (value) {\n emit('technospam.search.performed', {\n workspaceId,\n entityType: 'problem',\n queryLength: value.length,\n });\n }\n }}\n />\n </div>\n </div>\n\n {loading && !problems.length ? (\n <LoadingGrid />\n ) : error ? (\n <ErrorView title=\"Couldn't load problems\" error={error} />\n ) : filtered.length === 0 ? (\n <EmptyView\n icon={<Code2 size={26} />}\n title={\n search || difficulty !== 'ALL' ? 'No matching problems' : 'No problems published yet'\n }\n description={\n search || difficulty !== 'ALL'\n ? 'Try a different search or difficulty filter.'\n : 'Published problems will appear here. Check back soon — TechnoSpam is pre-launch.'\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filtered.map((problem) => (\n <ProblemCard\n key={problem.id}\n problem={problem}\n solved={solvedSet.has(problem.id)}\n onOpen={() => {\n emit('technospam.problem.viewed', {\n workspaceId,\n entityId: problem.id,\n entityType: 'TEC_PROBLEM',\n });\n navigate(`/applications/problem-details-page?id=${problem.id}`);\n }}\n />\n ))}\n </div>\n )}\n <LoadMore hasMore={hasMore} loading={loading} onClick={more} />\n </PageLayout>\n );\n}\n"],"mappings":"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"}