@burdenoff/microfe-technospam 2026.828.1 → 2026.830.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.
- package/dist/index.js +4 -3
- package/dist/technospam/TechnoSpamRoot.js +4 -4
- package/dist/technospam/components/PageLayout.d.ts.map +1 -1
- package/dist/technospam/components/PageLayout.js +24 -23
- package/dist/technospam/components/PageLayout.js.map +1 -1
- package/dist/technospam/components/StateViews.d.ts +1 -1
- package/dist/technospam/components/StateViews.d.ts.map +1 -1
- package/dist/technospam/components/StateViews.js +28 -26
- package/dist/technospam/components/StateViews.js.map +1 -1
- package/dist/technospam/components/TagInput.d.ts +1 -1
- package/dist/technospam/components/TagInput.d.ts.map +1 -1
- package/dist/technospam/components/TagInput.js +39 -34
- package/dist/technospam/components/TagInput.js.map +1 -1
- package/dist/technospam/hooks/useTr.d.ts +17 -0
- package/dist/technospam/hooks/useTr.d.ts.map +1 -0
- package/dist/technospam/hooks/useTr.js +12 -0
- package/dist/technospam/hooks/useTr.js.map +1 -0
- package/dist/technospam/index.d.ts +1 -0
- package/dist/technospam/index.d.ts.map +1 -1
- package/dist/technospam/index.js +1 -0
- package/dist/technospam/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -1
- package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js +198 -189
- package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/technospam/pages/ApplicationsProblemsPagePage.d.ts.map +1 -1
- package/dist/technospam/pages/ApplicationsProblemsPagePage.js +165 -163
- package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -1
- package/dist/technospam/pages/CoursesCoursesPagePage.d.ts.map +1 -1
- package/dist/technospam/pages/CoursesCoursesPagePage.js +117 -113
- package/dist/technospam/pages/CoursesCoursesPagePage.js.map +1 -1
- package/dist/technospam/pages/DashboardDashboardPagePage.d.ts.map +1 -1
- package/dist/technospam/pages/DashboardDashboardPagePage.js +211 -193
- package/dist/technospam/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/technospam/pages/HackathonsHackathonsPagePage.d.ts.map +1 -1
- package/dist/technospam/pages/HackathonsHackathonsPagePage.js +110 -110
- package/dist/technospam/pages/HackathonsHackathonsPagePage.js.map +1 -1
- package/dist/technospam/pages/MentorshipMentorsPagePage.d.ts.map +1 -1
- package/dist/technospam/pages/MentorshipMentorsPagePage.js +174 -160
- package/dist/technospam/pages/MentorshipMentorsPagePage.js.map +1 -1
- package/dist/technospam/pages/MentorshipSessionsPagePage.d.ts.map +1 -1
- package/dist/technospam/pages/MentorshipSessionsPagePage.js +156 -151
- package/dist/technospam/pages/MentorshipSessionsPagePage.js.map +1 -1
- package/dist/technospam/utils/i18n.js +1 -1
- package/dist/technospam/utils/i18n.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,103 +1,41 @@
|
|
|
1
1
|
import { useTechnoSpam as e, useTechnoSpamNavigate as t } from "../providers/TechnoSpamProvider.js";
|
|
2
2
|
import { useTechnoSpamAnalytics as n } from "../hooks/useTechnoSpamAnalytics.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
3
|
+
import { useTr as r } from "../hooks/useTr.js";
|
|
4
|
+
import { PageLayout as i } from "../components/PageLayout.js";
|
|
5
|
+
import { StatCard as a } from "../components/StatCard.js";
|
|
6
|
+
import { MediaCover as o, topicIcon as s } from "../components/MediaCover.js";
|
|
7
|
+
import { StatusBadge as c } from "../components/StatusBadge.js";
|
|
8
|
+
import { LoadMore as l } from "../components/LoadMore.js";
|
|
9
|
+
import { EmptyView as ee, ErrorView as u, LoadingGrid as d } from "../components/StateViews.js";
|
|
10
|
+
import { PremiumBadge as f } from "../components/UpgradeGate.js";
|
|
10
11
|
import "../components/index.js";
|
|
11
|
-
import { pageArg as
|
|
12
|
-
import { useMemo as
|
|
13
|
-
import { Building2 as
|
|
12
|
+
import { pageArg as p, usePageLimit as m, useProblemsQuery as te, useSubmissionsQuery as h } from "../api/technospamApi.js";
|
|
13
|
+
import { useMemo as g, useState as _ } from "react";
|
|
14
|
+
import { Building2 as v, CheckCircle2 as y, Code2 as b, Flame as x, Gauge as ne, Layers as S, Search as re, Tag as C, Trophy as w } from "lucide-react";
|
|
14
15
|
import { jsx as T, jsxs as E } from "react/jsx-runtime";
|
|
15
|
-
import { Badge as D, GlassCard as O, Input as
|
|
16
|
+
import { Badge as D, GlassCard as O, Input as ie, Select as k, SelectContent as A, SelectItem as j, SelectTrigger as M, SelectValue as N, Tabs as P, TabsList as F, TabsTrigger as I } from "@burdenoff/fe-libs/ui";
|
|
16
17
|
//#region src/technospam/pages/ApplicationsProblemsPagePage.tsx
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
value: "ALL",
|
|
20
|
-
label: "All"
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
value: "EASY",
|
|
24
|
-
label: "Easy"
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
value: "MEDIUM",
|
|
28
|
-
label: "Medium"
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
value: "HARD",
|
|
32
|
-
label: "Hard"
|
|
33
|
-
}
|
|
34
|
-
], z = [
|
|
35
|
-
{
|
|
36
|
-
value: "google",
|
|
37
|
-
label: "Google"
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
value: "amazon",
|
|
41
|
-
label: "Amazon"
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
value: "meta",
|
|
45
|
-
label: "Meta"
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
value: "microsoft",
|
|
49
|
-
label: "Microsoft"
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
value: "apple",
|
|
53
|
-
label: "Apple"
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
value: "netflix",
|
|
57
|
-
label: "Netflix"
|
|
58
|
-
}
|
|
59
|
-
], B = [
|
|
60
|
-
{
|
|
61
|
-
value: "frontend",
|
|
62
|
-
label: "Frontend"
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
value: "backend",
|
|
66
|
-
label: "Backend"
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
value: "fullstack",
|
|
70
|
-
label: "Full-Stack"
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
value: "data-science",
|
|
74
|
-
label: "Data Science"
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
value: "mobile",
|
|
78
|
-
label: "Mobile"
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
value: "sre",
|
|
82
|
-
label: "SRE / Infra"
|
|
83
|
-
}
|
|
84
|
-
];
|
|
85
|
-
function V({ problem: e, solved: t, onOpen: n }) {
|
|
18
|
+
function L({ problem: e, solved: t, onOpen: n }) {
|
|
19
|
+
let i = r();
|
|
86
20
|
return /* @__PURE__ */ E(O, {
|
|
87
21
|
className: "group flex cursor-pointer flex-col overflow-hidden transition-all duration-200 hover:-translate-y-1 hover:shadow-lg",
|
|
88
22
|
onClick: n,
|
|
89
|
-
children: [/* @__PURE__ */ E(
|
|
23
|
+
children: [/* @__PURE__ */ E(o, {
|
|
90
24
|
seed: `${e.topic ?? ""} ${e.difficulty} ${e.title}`,
|
|
91
|
-
icon:
|
|
25
|
+
icon: s(e.topic ?? e.title),
|
|
92
26
|
children: [t ? /* @__PURE__ */ E("span", {
|
|
93
27
|
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",
|
|
94
|
-
children: [
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ T(y, { size: 12 }),
|
|
30
|
+
" ",
|
|
31
|
+
i("technospam.problems.solved", "Solved")
|
|
32
|
+
]
|
|
95
33
|
}) : /* @__PURE__ */ T("span", {}), /* @__PURE__ */ E("div", {
|
|
96
34
|
className: "flex flex-wrap items-center gap-1.5",
|
|
97
|
-
children: [/* @__PURE__ */ T(
|
|
35
|
+
children: [/* @__PURE__ */ T(c, {
|
|
98
36
|
status: e.difficulty,
|
|
99
37
|
kind: "level"
|
|
100
|
-
}), e.isPremiumOnly ? /* @__PURE__ */ T(
|
|
38
|
+
}), e.isPremiumOnly ? /* @__PURE__ */ T(f, { locked: e.isLocked }) : null]
|
|
101
39
|
})]
|
|
102
40
|
}), /* @__PURE__ */ E("div", {
|
|
103
41
|
className: "flex flex-1 flex-col gap-3 p-4",
|
|
@@ -118,7 +56,7 @@ function V({ problem: e, solved: t, onOpen: n }) {
|
|
|
118
56
|
e.topic ? /* @__PURE__ */ E("span", {
|
|
119
57
|
className: "inline-flex items-center gap-1",
|
|
120
58
|
children: [
|
|
121
|
-
/* @__PURE__ */ T(
|
|
59
|
+
/* @__PURE__ */ T(S, { size: 13 }),
|
|
122
60
|
" ",
|
|
123
61
|
e.topic
|
|
124
62
|
]
|
|
@@ -128,18 +66,15 @@ function V({ problem: e, solved: t, onOpen: n }) {
|
|
|
128
66
|
children: [
|
|
129
67
|
/* @__PURE__ */ T(w, { size: 13 }),
|
|
130
68
|
" ",
|
|
131
|
-
e.points
|
|
132
|
-
" pts"
|
|
69
|
+
i("technospam.problems.points", "{{count}} pts", { count: e.points })
|
|
133
70
|
]
|
|
134
71
|
}),
|
|
135
72
|
e.languages.length ? /* @__PURE__ */ E("span", {
|
|
136
73
|
className: "inline-flex items-center gap-1",
|
|
137
74
|
children: [
|
|
138
|
-
/* @__PURE__ */ T(
|
|
75
|
+
/* @__PURE__ */ T(b, { size: 13 }),
|
|
139
76
|
" ",
|
|
140
|
-
e.languages.length,
|
|
141
|
-
" lang",
|
|
142
|
-
e.languages.length === 1 ? "" : "s"
|
|
77
|
+
e.languages.length === 1 ? i("technospam.problems.languages", "{{count}} lang", { count: e.languages.length }) : i("technospam.problems.languagesPlural", "{{count}} langs", { count: e.languages.length })
|
|
143
78
|
]
|
|
144
79
|
}) : null
|
|
145
80
|
]
|
|
@@ -149,17 +84,17 @@ function V({ problem: e, solved: t, onOpen: n }) {
|
|
|
149
84
|
children: [e.companies.slice(0, 3).map((e) => /* @__PURE__ */ E(D, {
|
|
150
85
|
variant: "outline",
|
|
151
86
|
className: "text-[11px] capitalize",
|
|
152
|
-
children: [/* @__PURE__ */ T(
|
|
87
|
+
children: [/* @__PURE__ */ T(v, {
|
|
153
88
|
size: 10,
|
|
154
89
|
className: "mr-1"
|
|
155
90
|
}), e.replace(/-/g, " ")]
|
|
156
91
|
}, e)), e.interviewFrequency === "HIGH" ? /* @__PURE__ */ E(D, {
|
|
157
92
|
variant: "secondary",
|
|
158
93
|
className: "text-[11px] text-status-warning-text",
|
|
159
|
-
children: [/* @__PURE__ */ T(
|
|
94
|
+
children: [/* @__PURE__ */ T(x, {
|
|
160
95
|
size: 10,
|
|
161
96
|
className: "mr-1"
|
|
162
|
-
}), "Frequently asked"]
|
|
97
|
+
}), i("technospam.problems.frequentlyAsked", "Frequently asked")]
|
|
163
98
|
}) : null]
|
|
164
99
|
}) : null,
|
|
165
100
|
e.tags.length ? /* @__PURE__ */ T("div", {
|
|
@@ -177,74 +112,141 @@ function V({ problem: e, solved: t, onOpen: n }) {
|
|
|
177
112
|
})]
|
|
178
113
|
});
|
|
179
114
|
}
|
|
180
|
-
function
|
|
181
|
-
let
|
|
115
|
+
function R() {
|
|
116
|
+
let o = t(), { currentUser: s, workspaceId: c } = e(), { emit: f } = n(), v = r(), S = s?.id, [C, w] = _("ALL"), [D, O] = _("ALL"), [R, z] = _("ALL"), [B, V] = _(""), H = g(() => [
|
|
117
|
+
{
|
|
118
|
+
value: "ALL",
|
|
119
|
+
label: v("technospam.problems.filterAll", "All")
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
value: "EASY",
|
|
123
|
+
label: v("technospam.problems.filterEasy", "Easy")
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
value: "MEDIUM",
|
|
127
|
+
label: v("technospam.problems.filterMedium", "Medium")
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
value: "HARD",
|
|
131
|
+
label: v("technospam.problems.filterHard", "Hard")
|
|
132
|
+
}
|
|
133
|
+
], [v]), U = g(() => [
|
|
134
|
+
{
|
|
135
|
+
value: "google",
|
|
136
|
+
label: "Google"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
value: "amazon",
|
|
140
|
+
label: "Amazon"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
value: "meta",
|
|
144
|
+
label: "Meta"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
value: "microsoft",
|
|
148
|
+
label: "Microsoft"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
value: "apple",
|
|
152
|
+
label: "Apple"
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
value: "netflix",
|
|
156
|
+
label: "Netflix"
|
|
157
|
+
}
|
|
158
|
+
], []), W = g(() => [
|
|
159
|
+
{
|
|
160
|
+
value: "frontend",
|
|
161
|
+
label: "Frontend"
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
value: "backend",
|
|
165
|
+
label: "Backend"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
value: "fullstack",
|
|
169
|
+
label: "Full-Stack"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
value: "data-science",
|
|
173
|
+
label: "Data Science"
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
value: "mobile",
|
|
177
|
+
label: "Mobile"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
value: "sre",
|
|
181
|
+
label: "SRE / Infra"
|
|
182
|
+
}
|
|
183
|
+
], []), { limit: G, more: K } = m(), { data: q, loading: J, error: Y } = te({
|
|
182
184
|
status: "PUBLISHED",
|
|
183
|
-
pagination:
|
|
184
|
-
...
|
|
185
|
-
...
|
|
186
|
-
...
|
|
187
|
-
}), { data: X } =
|
|
188
|
-
let e =
|
|
185
|
+
pagination: p(G),
|
|
186
|
+
...C === "ALL" ? {} : { difficulty: C },
|
|
187
|
+
...D === "ALL" ? {} : { company: D },
|
|
188
|
+
...R === "ALL" ? {} : { role: R }
|
|
189
|
+
}), { data: X } = h(S ? { learnerId: S } : {}), Z = q?.tecListProblems?.items ?? [], ae = q?.tecListProblems?.pageInfo?.hasMore ?? !1, Q = g(() => new Set((X?.tecListSubmissions?.items ?? []).filter((e) => e.verdict === "ACCEPTED").map((e) => e.problemId)), [X]), oe = Z.filter((e) => Q.has(e.id)).length, se = Z.filter((e) => e.difficulty === "EASY").length, ce = Z.filter((e) => e.difficulty === "HARD").length, $ = g(() => {
|
|
190
|
+
let e = B.trim().toLowerCase();
|
|
189
191
|
return e ? Z.filter((t) => t.title.toLowerCase().includes(e) || (t.topic ?? "").toLowerCase().includes(e) || t.tags.some((t) => t.toLowerCase().includes(e))) : Z;
|
|
190
|
-
}, [Z,
|
|
191
|
-
return /* @__PURE__ */ E(
|
|
192
|
+
}, [Z, B]);
|
|
193
|
+
return /* @__PURE__ */ E(i, {
|
|
192
194
|
hero: !0,
|
|
193
|
-
title: "Coding Problems",
|
|
194
|
-
description: "Sharpen your problem-solving with hands-on, mentor-judged challenges across topics and difficulty.",
|
|
195
|
+
title: v("technospam.problems.title", "Coding Problems"),
|
|
196
|
+
description: v("technospam.problems.description", "Sharpen your problem-solving with hands-on, mentor-judged challenges across topics and difficulty."),
|
|
195
197
|
children: [
|
|
196
198
|
/* @__PURE__ */ E("div", {
|
|
197
199
|
className: "mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4",
|
|
198
200
|
children: [
|
|
199
|
-
/* @__PURE__ */ T(
|
|
200
|
-
label: "Problems",
|
|
201
|
+
/* @__PURE__ */ T(a, {
|
|
202
|
+
label: v("technospam.problems.statProblems", "Problems"),
|
|
201
203
|
value: Z.length,
|
|
202
|
-
icon:
|
|
204
|
+
icon: b,
|
|
203
205
|
tone: "blue"
|
|
204
206
|
}),
|
|
205
|
-
/* @__PURE__ */ T(
|
|
206
|
-
label: "Solved",
|
|
207
|
-
value:
|
|
208
|
-
icon:
|
|
207
|
+
/* @__PURE__ */ T(a, {
|
|
208
|
+
label: v("technospam.problems.statSolved", "Solved"),
|
|
209
|
+
value: oe,
|
|
210
|
+
icon: y,
|
|
209
211
|
tone: "green"
|
|
210
212
|
}),
|
|
211
|
-
/* @__PURE__ */ T(
|
|
212
|
-
label: "Easy",
|
|
213
|
-
value:
|
|
214
|
-
icon:
|
|
213
|
+
/* @__PURE__ */ T(a, {
|
|
214
|
+
label: v("technospam.problems.statEasy", "Easy"),
|
|
215
|
+
value: se,
|
|
216
|
+
icon: ne,
|
|
215
217
|
tone: "teal"
|
|
216
218
|
}),
|
|
217
|
-
/* @__PURE__ */ T(
|
|
218
|
-
label: "Hard",
|
|
219
|
-
value:
|
|
220
|
-
icon:
|
|
219
|
+
/* @__PURE__ */ T(a, {
|
|
220
|
+
label: v("technospam.problems.statHard", "Hard"),
|
|
221
|
+
value: ce,
|
|
222
|
+
icon: x,
|
|
221
223
|
tone: "amber"
|
|
222
224
|
})
|
|
223
225
|
]
|
|
224
226
|
}),
|
|
225
227
|
/* @__PURE__ */ E("div", {
|
|
226
228
|
className: "mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
|
|
227
|
-
children: [/* @__PURE__ */ T(
|
|
228
|
-
value:
|
|
229
|
-
onValueChange: (e) =>
|
|
230
|
-
children: /* @__PURE__ */ T(
|
|
229
|
+
children: [/* @__PURE__ */ T(P, {
|
|
230
|
+
value: C,
|
|
231
|
+
onValueChange: (e) => w(e),
|
|
232
|
+
children: /* @__PURE__ */ T(F, { children: H.map((e) => /* @__PURE__ */ T(I, {
|
|
231
233
|
value: e.value,
|
|
232
234
|
children: e.label
|
|
233
235
|
}, e.value)) })
|
|
234
236
|
}), /* @__PURE__ */ E("div", {
|
|
235
237
|
className: "relative w-full sm:w-72",
|
|
236
|
-
children: [/* @__PURE__ */ T(
|
|
238
|
+
children: [/* @__PURE__ */ T(re, {
|
|
237
239
|
className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-text-muted",
|
|
238
240
|
size: 16
|
|
239
|
-
}), /* @__PURE__ */ T(
|
|
241
|
+
}), /* @__PURE__ */ T(ie, {
|
|
240
242
|
className: "pl-9",
|
|
241
|
-
placeholder: "Search problems…",
|
|
242
|
-
value:
|
|
243
|
-
onChange: (e) =>
|
|
243
|
+
placeholder: v("technospam.problems.searchPlaceholder", "Search problems…"),
|
|
244
|
+
value: B,
|
|
245
|
+
onChange: (e) => V(e.target.value),
|
|
244
246
|
onBlur: () => {
|
|
245
|
-
let e =
|
|
246
|
-
e &&
|
|
247
|
-
workspaceId:
|
|
247
|
+
let e = B.trim();
|
|
248
|
+
e && f("technospam.search.performed", {
|
|
249
|
+
workspaceId: c,
|
|
248
250
|
entityType: "problem",
|
|
249
251
|
queryLength: e.length
|
|
250
252
|
});
|
|
@@ -254,57 +256,57 @@ function H() {
|
|
|
254
256
|
}),
|
|
255
257
|
/* @__PURE__ */ E("div", {
|
|
256
258
|
className: "mb-4 flex flex-col gap-3 sm:flex-row sm:items-center",
|
|
257
|
-
children: [/* @__PURE__ */ E(
|
|
258
|
-
value:
|
|
259
|
-
onValueChange:
|
|
260
|
-
children: [/* @__PURE__ */ T(
|
|
259
|
+
children: [/* @__PURE__ */ E(k, {
|
|
260
|
+
value: D,
|
|
261
|
+
onValueChange: O,
|
|
262
|
+
children: [/* @__PURE__ */ T(M, {
|
|
261
263
|
className: "w-full sm:w-48",
|
|
262
|
-
children: /* @__PURE__ */ T(
|
|
263
|
-
}), /* @__PURE__ */ E(
|
|
264
|
+
children: /* @__PURE__ */ T(N, { placeholder: v("technospam.problems.companyPlaceholder", "Company") })
|
|
265
|
+
}), /* @__PURE__ */ E(A, { children: [/* @__PURE__ */ T(j, {
|
|
264
266
|
value: "ALL",
|
|
265
|
-
children: "All companies"
|
|
266
|
-
}),
|
|
267
|
+
children: v("technospam.problems.companyAll", "All companies")
|
|
268
|
+
}), U.map((e) => /* @__PURE__ */ T(j, {
|
|
267
269
|
value: e.value,
|
|
268
270
|
children: e.label
|
|
269
271
|
}, e.value))] })]
|
|
270
|
-
}), /* @__PURE__ */ E(
|
|
271
|
-
value:
|
|
272
|
-
onValueChange:
|
|
273
|
-
children: [/* @__PURE__ */ T(
|
|
272
|
+
}), /* @__PURE__ */ E(k, {
|
|
273
|
+
value: R,
|
|
274
|
+
onValueChange: z,
|
|
275
|
+
children: [/* @__PURE__ */ T(M, {
|
|
274
276
|
className: "w-full sm:w-48",
|
|
275
|
-
children: /* @__PURE__ */ T(
|
|
276
|
-
}), /* @__PURE__ */ E(
|
|
277
|
+
children: /* @__PURE__ */ T(N, { placeholder: v("technospam.problems.rolePlaceholder", "Role") })
|
|
278
|
+
}), /* @__PURE__ */ E(A, { children: [/* @__PURE__ */ T(j, {
|
|
277
279
|
value: "ALL",
|
|
278
|
-
children: "All roles"
|
|
279
|
-
}),
|
|
280
|
+
children: v("technospam.problems.roleAll", "All roles")
|
|
281
|
+
}), W.map((e) => /* @__PURE__ */ T(j, {
|
|
280
282
|
value: e.value,
|
|
281
283
|
children: e.label
|
|
282
284
|
}, e.value))] })]
|
|
283
285
|
})]
|
|
284
286
|
}),
|
|
285
|
-
J && !Z.length ? /* @__PURE__ */ T(
|
|
286
|
-
title: "Couldn't load problems",
|
|
287
|
+
J && !Z.length ? /* @__PURE__ */ T(d, {}) : Y ? /* @__PURE__ */ T(u, {
|
|
288
|
+
title: v("technospam.common.errorLoadProblems", "Couldn't load problems"),
|
|
287
289
|
error: Y
|
|
288
|
-
}) : $.length === 0 ? /* @__PURE__ */ T(
|
|
289
|
-
icon: /* @__PURE__ */ T(
|
|
290
|
-
title:
|
|
291
|
-
description:
|
|
290
|
+
}) : $.length === 0 ? /* @__PURE__ */ T(ee, {
|
|
291
|
+
icon: /* @__PURE__ */ T(b, { size: 26 }),
|
|
292
|
+
title: B || C !== "ALL" || D !== "ALL" || R !== "ALL" ? v("technospam.problems.emptySearchTitle", "No matching problems") : v("technospam.problems.emptyDefaultTitle", "No problems published yet"),
|
|
293
|
+
description: B || C !== "ALL" || D !== "ALL" || R !== "ALL" ? v("technospam.problems.emptySearchDesc", "Try a different search, difficulty, company, or role filter.") : v("technospam.problems.emptyDefaultDesc", "Published problems will appear here. Check back soon — TechnoSpam is pre-launch.")
|
|
292
294
|
}) : /* @__PURE__ */ T("div", {
|
|
293
295
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
294
|
-
children: $.map((e) => /* @__PURE__ */ T(
|
|
296
|
+
children: $.map((e) => /* @__PURE__ */ T(L, {
|
|
295
297
|
problem: e,
|
|
296
298
|
solved: Q.has(e.id),
|
|
297
299
|
onOpen: () => {
|
|
298
|
-
|
|
299
|
-
workspaceId:
|
|
300
|
+
f("technospam.problem.viewed", {
|
|
301
|
+
workspaceId: c,
|
|
300
302
|
entityId: e.id,
|
|
301
303
|
entityType: "TEC_PROBLEM"
|
|
302
|
-
}),
|
|
304
|
+
}), o(`/applications/problem-details-page?id=${e.id}`);
|
|
303
305
|
}
|
|
304
306
|
}, e.id))
|
|
305
307
|
}),
|
|
306
|
-
/* @__PURE__ */ T(
|
|
307
|
-
hasMore:
|
|
308
|
+
/* @__PURE__ */ T(l, {
|
|
309
|
+
hasMore: ae,
|
|
308
310
|
loading: J,
|
|
309
311
|
onClick: K
|
|
310
312
|
})
|
|
@@ -312,6 +314,6 @@ function H() {
|
|
|
312
314
|
});
|
|
313
315
|
}
|
|
314
316
|
//#endregion
|
|
315
|
-
export {
|
|
317
|
+
export { R as ApplicationsProblemsPagePage };
|
|
316
318
|
|
|
317
319
|
//# 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 {\n Building2,\n CheckCircle2,\n Code2,\n Flame,\n Gauge,\n Layers,\n Search,\n Tag,\n Trophy,\n} from 'lucide-react';\nimport {\n Badge,\n GlassCard,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tabs,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport {\n EmptyView,\n ErrorView,\n LoadMore,\n LoadingGrid,\n MediaCover,\n PageLayout,\n PremiumBadge,\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\n// Curated interview-target lists for the catalog filters. Values follow the\n// backend's lowercase-slug convention (see practice.service.ts normalizeSlug).\nconst COMPANIES: Array<{ value: string; label: string }> = [\n { value: 'google', label: 'Google' },\n { value: 'amazon', label: 'Amazon' },\n { value: 'meta', label: 'Meta' },\n { value: 'microsoft', label: 'Microsoft' },\n { value: 'apple', label: 'Apple' },\n { value: 'netflix', label: 'Netflix' },\n];\n\nconst ROLES: Array<{ value: string; label: string }> = [\n { value: 'frontend', label: 'Frontend' },\n { value: 'backend', label: 'Backend' },\n { value: 'fullstack', label: 'Full-Stack' },\n { value: 'data-science', label: 'Data Science' },\n { value: 'mobile', label: 'Mobile' },\n { value: 'sre', label: 'SRE / Infra' },\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 <div className=\"flex flex-wrap items-center gap-1.5\">\n <StatusBadge status={problem.difficulty} kind=\"level\" />\n {problem.isPremiumOnly ? <PremiumBadge locked={problem.isLocked} /> : null}\n </div>\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.companies.length ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {problem.companies.slice(0, 3).map((c) => (\n <Badge key={c} variant=\"outline\" className=\"text-[11px] capitalize\">\n <Building2 size={10} className=\"mr-1\" />\n {c.replace(/-/g, ' ')}\n </Badge>\n ))}\n {problem.interviewFrequency === 'HIGH' ? (\n <Badge variant=\"secondary\" className=\"text-[11px] text-status-warning-text\">\n <Flame size={10} className=\"mr-1\" />\n Frequently asked\n </Badge>\n ) : null}\n </div>\n ) : null}\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 [company, setCompany] = useState<string>('ALL');\n const [role, setRole] = useState<string>('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 ...(company !== 'ALL' ? { company } : {}),\n ...(role !== 'ALL' ? { role } : {}),\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 <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center\">\n <Select value={company} onValueChange={setCompany}>\n <SelectTrigger className=\"w-full sm:w-48\">\n <SelectValue placeholder=\"Company\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All companies</SelectItem>\n {COMPANIES.map((c) => (\n <SelectItem key={c.value} value={c.value}>\n {c.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select value={role} onValueChange={setRole}>\n <SelectTrigger className=\"w-full sm:w-48\">\n <SelectValue placeholder=\"Role\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All roles</SelectItem>\n {ROLES.map((r) => (\n <SelectItem key={r.value} value={r.value}>\n {r.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\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' || company !== 'ALL' || role !== 'ALL'\n ? 'No matching problems'\n : 'No problems published yet'\n }\n description={\n search || difficulty !== 'ALL' || company !== 'ALL' || role !== 'ALL'\n ? 'Try a different search, difficulty, company, or role 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":";;;;;;;;;;;;;;;;AAgDA,IAAM,IAA8E;CAClF;EAAE,OAAO;EAAO,OAAO;EAAO;CAC9B;EAAE,OAAO;EAAQ,OAAO;EAAQ;CAChC;EAAE,OAAO;EAAU,OAAO;EAAU;CACpC;EAAE,OAAO;EAAQ,OAAO;EAAQ;CACjC,EAIK,IAAqD;CACzD;EAAE,OAAO;EAAU,OAAO;EAAU;CACpC;EAAE,OAAO;EAAU,OAAO;EAAU;CACpC;EAAE,OAAO;EAAQ,OAAO;EAAQ;CAChC;EAAE,OAAO;EAAa,OAAO;EAAa;CAC1C;EAAE,OAAO;EAAS,OAAO;EAAS;CAClC;EAAE,OAAO;EAAW,OAAO;EAAW;CACvC,EAEK,IAAiD;CACrD;EAAE,OAAO;EAAY,OAAO;EAAY;CACxC;EAAE,OAAO;EAAW,OAAO;EAAW;CACtC;EAAE,OAAO;EAAa,OAAO;EAAc;CAC3C;EAAE,OAAO;EAAgB,OAAO;EAAgB;CAChD;EAAE,OAAO;EAAU,OAAO;EAAU;CACpC;EAAE,OAAO;EAAO,OAAO;EAAe;CACvC;AAED,SAAS,EAAY,EACnB,YACA,WACA,aAKC;AACD,QACE,kBAAC,GAAD;EACE,WAAU;EACV,SAAS;YAFX,CAIE,kBAAC,GAAD;GACE,MAAM,GAAG,EAAQ,SAAS,GAAG,GAAG,EAAQ,WAAW,GAAG,EAAQ;GAC9D,MAAM,EAAU,EAAQ,SAAS,EAAQ,MAAM;aAFjD,CAIG,IACC,kBAAC,QAAD;IAAM,WAAU;cAAhB,CACE,kBAAC,GAAD,EAAc,MAAM,IAAM,CAAA,EAAA,UACrB;QAEP,kBAAC,QAAD,EAAQ,CAAA,EAEV,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAa,QAAQ,EAAQ;KAAY,MAAK;KAAU,CAAA,EACvD,EAAQ,gBAAgB,kBAAC,GAAD,EAAc,QAAQ,EAAQ,UAAY,CAAA,GAAG,KAClE;MACK;MACb,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAQ;MACN,CAAA,EACJ,EAAQ,YACP,kBAAC,KAAD;MAAG,WAAU;gBAAiD,EAAQ;MAAc,CAAA,GAClF,KACA;;IACN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,EAAQ,QACP,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QACE,kBAAC,GAAD,EAAQ,MAAM,IAAM,CAAA;;QAAE,EAAQ;QACzB;WACL;MACJ,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QACE,kBAAC,GAAD,EAAQ,MAAM,IAAM,CAAA;;QAAE,EAAQ;QAAO;QAChC;;MACN,EAAQ,UAAU,SACjB,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QACE,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;;QAAE,EAAQ,UAAU;QAAO;QAC7C,EAAQ,UAAU,WAAW,IAAI,KAAK;QAClC;WACL;MACA;;IACL,EAAQ,UAAU,SACjB,kBAAC,OAAD;KAAK,WAAU;eAAf,CACG,EAAQ,UAAU,MAAM,GAAG,EAAE,CAAC,KAAK,MAClC,kBAAC,GAAD;MAAe,SAAQ;MAAU,WAAU;gBAA3C,CACE,kBAAC,GAAD;OAAW,MAAM;OAAI,WAAU;OAAS,CAAA,EACvC,EAAE,QAAQ,MAAM,IAAI,CACf;QAHI,EAGJ,CACR,EACD,EAAQ,uBAAuB,SAC9B,kBAAC,GAAD;MAAO,SAAQ;MAAY,WAAU;gBAArC,CACE,kBAAC,GAAD;OAAO,MAAM;OAAI,WAAU;OAAS,CAAA,EAAA,mBAE9B;UACN,KACA;SACJ;IACH,EAAQ,KAAK,SACZ,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAQ,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,MAC7B,kBAAC,GAAD;MAAe,SAAQ;MAAY,WAAU;gBAA7C,CACE,kBAAC,GAAD;OAAK,MAAM;OAAI,WAAU;OAAS,CAAA,EACjC,EACK;QAHI,EAGJ,CACR;KACE,CAAA,GACJ;IACA;KACI;;;AAIhB,SAAgB,IAA+B;CAC7C,IAAM,IAAW,GAAuB,EAClC,EAAE,gBAAa,mBAAgB,GAAe,EAC9C,EAAE,YAAS,GAAwB,EACnC,IAAY,GAAa,IACzB,CAAC,GAAY,KAAiB,EAAuC,MAAM,EAC3E,CAAC,GAAS,KAAc,EAAiB,MAAM,EAC/C,CAAC,GAAM,KAAW,EAAiB,MAAM,EACzC,CAAC,GAAQ,KAAa,EAAS,GAAG,EAElC,EAAE,UAAO,YAAS,GAAc,EAChC,EAAE,SAAM,YAAS,aAAU,EAAiB;EAChD,QAAQ;EACR,YAAY,GAAQ,EAAM;EAC1B,GAAI,MAAe,QAAyB,EAAE,GAAnB,EAAE,eAAY;EACzC,GAAI,MAAY,QAAsB,EAAE,GAAhB,EAAE,YAAS;EACnC,GAAI,MAAS,QAAmB,EAAE,GAAb,EAAE,SAAM;EAC9B,CAAC,EACI,EAAE,MAAM,MAAa,GAAoB,IAAY,EAAE,cAAW,GAAG,EAAE,CAAC,EAExE,IAAW,GAAM,iBAAiB,SAAS,EAAE,EAC7C,KAAU,GAAM,iBAAiB,UAAU,WAAW,IAEtD,IAAY,QAEd,IAAI,KACD,GAAU,oBAAoB,SAAS,EAAE,EACvC,QAAQ,MAAM,EAAE,YAAY,WAAW,CACvC,KAAK,MAAM,EAAE,UAAU,CAC3B,EACH,CAAC,EAAS,CACX,EAEK,KAAc,EAAS,QAAQ,MAAM,EAAU,IAAI,EAAE,GAAG,CAAC,CAAC,QAC1D,KAAY,EAAS,QAAQ,MAAM,EAAE,eAAe,OAAO,CAAC,QAC5D,KAAY,EAAS,QAAQ,MAAM,EAAE,eAAe,OAAO,CAAC,QAE5D,IAAW,QAAc;EAC7B,IAAM,IAAI,EAAO,MAAM,CAAC,aAAa;AAErC,SADK,IACE,EAAS,QACb,MACC,EAAE,MAAM,aAAa,CAAC,SAAS,EAAE,KAChC,EAAE,SAAS,IAAI,aAAa,CAAC,SAAS,EAAE,IACzC,EAAE,KAAK,MAAM,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC,CAClD,GANc;IAOd,CAAC,GAAU,EAAO,CAAC;AAEtB,QACE,kBAAC,GAAD;EACE,MAAA;EACA,OAAM;EACN,aAAY;YAHd;GAKE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MAAU,OAAM;MAAW,OAAO,EAAS;MAAQ,MAAM;MAAO,MAAK;MAAS,CAAA;KAC9E,kBAAC,GAAD;MAAU,OAAM;MAAS,OAAO;MAAa,MAAM;MAAc,MAAK;MAAU,CAAA;KAChF,kBAAC,GAAD;MAAU,OAAM;MAAO,OAAO;MAAW,MAAM;MAAO,MAAK;MAAS,CAAA;KACpE,kBAAC,GAAD;MAAU,OAAM;MAAO,OAAO;MAAW,MAAM;MAAO,MAAK;MAAU,CAAA;KACjE;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KACE,OAAO;KACP,gBAAgB,MAAM,EAAc,EAAkC;eAEtE,kBAAC,GAAD,EAAA,UACG,EAAa,KAAK,MACjB,kBAAC,GAAD;MAA2B,OAAO,EAAE;gBACjC,EAAE;MACS,EAFI,EAAE,MAEN,CACd,EACO,CAAA;KACN,CAAA,EACP,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MACE,WAAU;MACV,MAAM;MACN,CAAA,EACF,kBAAC,GAAD;MACE,WAAU;MACV,aAAY;MACZ,OAAO;MACP,WAAW,MAAM,EAAU,EAAE,OAAO,MAAM;MAC1C,cAAc;OACZ,IAAM,IAAQ,EAAO,MAAM;AAC3B,OAAI,KACF,EAAK,+BAA+B;QAClC;QACA,YAAY;QACZ,aAAa,EAAM;QACpB,CAAC;;MAGN,CAAA,CACE;OACF;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAQ,OAAO;KAAS,eAAe;eAAvC,CACE,kBAAC,GAAD;MAAe,WAAU;gBACvB,kBAAC,GAAD,EAAa,aAAY,WAAY,CAAA;MACvB,CAAA,EAChB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MAAY,OAAM;gBAAM;MAA0B,CAAA,EACjD,EAAU,KAAK,MACd,kBAAC,GAAD;MAA0B,OAAO,EAAE;gBAChC,EAAE;MACQ,EAFI,EAAE,MAEN,CACb,CACY,EAAA,CAAA,CACT;QACT,kBAAC,GAAD;KAAQ,OAAO;KAAM,eAAe;eAApC,CACE,kBAAC,GAAD;MAAe,WAAU;gBACvB,kBAAC,GAAD,EAAa,aAAY,QAAS,CAAA;MACpB,CAAA,EAChB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MAAY,OAAM;gBAAM;MAAsB,CAAA,EAC7C,EAAM,KAAK,MACV,kBAAC,GAAD;MAA0B,OAAO,EAAE;gBAChC,EAAE;MACQ,EAFI,EAAE,MAEN,CACb,CACY,EAAA,CAAA,CACT;OACL;;GAEL,KAAW,CAAC,EAAS,SACpB,kBAAC,GAAD,EAAe,CAAA,GACb,IACF,kBAAC,IAAD;IAAW,OAAM;IAAgC;IAAS,CAAA,GACxD,EAAS,WAAW,IACtB,kBAAC,GAAD;IACE,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OACE,KAAU,MAAe,SAAS,MAAY,SAAS,MAAS,QAC5D,yBACA;IAEN,aACE,KAAU,MAAe,SAAS,MAAY,SAAS,MAAS,QAC5D,iEACA;IAEN,CAAA,GAEF,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAS,KAAK,MACb,kBAAC,GAAD;KAEW;KACT,QAAQ,EAAU,IAAI,EAAQ,GAAG;KACjC,cAAc;AAMZ,MALA,EAAK,6BAA6B;OAChC;OACA,UAAU,EAAQ;OAClB,YAAY;OACb,CAAC,EACF,EAAS,yCAAyC,EAAQ,KAAK;;KAEjE,EAXK,EAAQ,GAWb,CACF;IACE,CAAA;GAER,kBAAC,GAAD;IAAmB;IAAkB;IAAS,SAAS;IAAQ,CAAA;GACpD"}
|
|
1
|
+
{"version":3,"file":"ApplicationsProblemsPagePage.js","names":[],"sources":["../../../src/technospam/pages/ApplicationsProblemsPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Building2,\n CheckCircle2,\n Code2,\n Flame,\n Gauge,\n Layers,\n Search,\n Tag,\n Trophy,\n} from 'lucide-react';\nimport {\n Badge,\n GlassCard,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tabs,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport {\n EmptyView,\n ErrorView,\n LoadMore,\n LoadingGrid,\n MediaCover,\n PageLayout,\n PremiumBadge,\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';\nimport { useTr } from '../hooks/useTr';\n\nfunction ProblemCard({\n problem,\n solved,\n onOpen,\n}: {\n problem: TecProblem;\n solved: boolean;\n onOpen: () => void;\n}) {\n const tr = useTr();\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} /> {tr('technospam.problems.solved', 'Solved')}\n </span>\n ) : (\n <span />\n )}\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <StatusBadge status={problem.difficulty} kind=\"level\" />\n {problem.isPremiumOnly ? <PremiumBadge locked={problem.isLocked} /> : null}\n </div>\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} />{' '}\n {tr('technospam.problems.points', '{{count}} pts', { count: problem.points })}\n </span>\n {problem.languages.length ? (\n <span className=\"inline-flex items-center gap-1\">\n <Code2 size={13} />{' '}\n {problem.languages.length === 1\n ? tr('technospam.problems.languages', '{{count}} lang', {\n count: problem.languages.length,\n })\n : tr('technospam.problems.languagesPlural', '{{count}} langs', {\n count: problem.languages.length,\n })}\n </span>\n ) : null}\n </div>\n {problem.companies.length ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {problem.companies.slice(0, 3).map((c) => (\n <Badge key={c} variant=\"outline\" className=\"text-[11px] capitalize\">\n <Building2 size={10} className=\"mr-1\" />\n {c.replace(/-/g, ' ')}\n </Badge>\n ))}\n {problem.interviewFrequency === 'HIGH' ? (\n <Badge variant=\"secondary\" className=\"text-[11px] text-status-warning-text\">\n <Flame size={10} className=\"mr-1\" />\n {tr('technospam.problems.frequentlyAsked', 'Frequently asked')}\n </Badge>\n ) : null}\n </div>\n ) : null}\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 tr = useTr();\n const learnerId = currentUser?.id;\n const [difficulty, setDifficulty] = useState<'ALL' | TecProblemDifficulty>('ALL');\n const [company, setCompany] = useState<string>('ALL');\n const [role, setRole] = useState<string>('ALL');\n const [search, setSearch] = useState('');\n\n const difficulties = useMemo(\n () => [\n { value: 'ALL' as const, label: tr('technospam.problems.filterAll', 'All') },\n {\n value: 'EASY' as TecProblemDifficulty,\n label: tr('technospam.problems.filterEasy', 'Easy'),\n },\n {\n value: 'MEDIUM' as TecProblemDifficulty,\n label: tr('technospam.problems.filterMedium', 'Medium'),\n },\n {\n value: 'HARD' as TecProblemDifficulty,\n label: tr('technospam.problems.filterHard', 'Hard'),\n },\n ],\n [tr]\n );\n\n // Curated interview-target lists for the catalog filters. Values follow the\n // backend's lowercase-slug convention (see practice.service.ts normalizeSlug).\n const companies = useMemo(\n () => [\n { value: 'google', label: 'Google' },\n { value: 'amazon', label: 'Amazon' },\n { value: 'meta', label: 'Meta' },\n { value: 'microsoft', label: 'Microsoft' },\n { value: 'apple', label: 'Apple' },\n { value: 'netflix', label: 'Netflix' },\n ],\n []\n );\n\n const roles = useMemo(\n () => [\n { value: 'frontend', label: 'Frontend' },\n { value: 'backend', label: 'Backend' },\n { value: 'fullstack', label: 'Full-Stack' },\n { value: 'data-science', label: 'Data Science' },\n { value: 'mobile', label: 'Mobile' },\n { value: 'sre', label: 'SRE / Infra' },\n ],\n []\n );\n\n const { limit, more } = usePageLimit();\n const { data, loading, error } = useProblemsQuery({\n status: 'PUBLISHED',\n pagination: pageArg(limit),\n ...(difficulty !== 'ALL' ? { difficulty } : {}),\n ...(company !== 'ALL' ? { company } : {}),\n ...(role !== 'ALL' ? { role } : {}),\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={tr('technospam.problems.title', 'Coding Problems')}\n description={tr(\n 'technospam.problems.description',\n 'Sharpen your problem-solving with hands-on, mentor-judged challenges across topics and difficulty.'\n )}\n >\n <div className=\"mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <StatCard\n label={tr('technospam.problems.statProblems', 'Problems')}\n value={problems.length}\n icon={Code2}\n tone=\"blue\"\n />\n <StatCard\n label={tr('technospam.problems.statSolved', 'Solved')}\n value={solvedCount}\n icon={CheckCircle2}\n tone=\"green\"\n />\n <StatCard\n label={tr('technospam.problems.statEasy', 'Easy')}\n value={easyCount}\n icon={Gauge}\n tone=\"teal\"\n />\n <StatCard\n label={tr('technospam.problems.statHard', 'Hard')}\n value={hardCount}\n icon={Flame}\n tone=\"amber\"\n />\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={tr('technospam.problems.searchPlaceholder', '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 <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center\">\n <Select value={company} onValueChange={setCompany}>\n <SelectTrigger className=\"w-full sm:w-48\">\n <SelectValue placeholder={tr('technospam.problems.companyPlaceholder', 'Company')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">\n {tr('technospam.problems.companyAll', 'All companies')}\n </SelectItem>\n {companies.map((c) => (\n <SelectItem key={c.value} value={c.value}>\n {c.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select value={role} onValueChange={setRole}>\n <SelectTrigger className=\"w-full sm:w-48\">\n <SelectValue placeholder={tr('technospam.problems.rolePlaceholder', 'Role')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">{tr('technospam.problems.roleAll', 'All roles')}</SelectItem>\n {roles.map((r) => (\n <SelectItem key={r.value} value={r.value}>\n {r.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {loading && !problems.length ? (\n <LoadingGrid />\n ) : error ? (\n <ErrorView\n title={tr('technospam.common.errorLoadProblems', \"Couldn't load problems\")}\n error={error}\n />\n ) : filtered.length === 0 ? (\n <EmptyView\n icon={<Code2 size={26} />}\n title={\n search || difficulty !== 'ALL' || company !== 'ALL' || role !== 'ALL'\n ? tr('technospam.problems.emptySearchTitle', 'No matching problems')\n : tr('technospam.problems.emptyDefaultTitle', 'No problems published yet')\n }\n description={\n search || difficulty !== 'ALL' || company !== 'ALL' || role !== 'ALL'\n ? tr(\n 'technospam.problems.emptySearchDesc',\n 'Try a different search, difficulty, company, or role filter.'\n )\n : tr(\n 'technospam.problems.emptyDefaultDesc',\n 'Published problems will appear here. Check back soon — TechnoSpam is pre-launch.'\n )\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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CoursesCoursesPagePage.d.ts","sourceRoot":"","sources":["../../../src/technospam/pages/CoursesCoursesPagePage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CoursesCoursesPagePage.d.ts","sourceRoot":"","sources":["../../../src/technospam/pages/CoursesCoursesPagePage.tsx"],"names":[],"mappings":"AAmFA,wBAAgB,sBAAsB,gCAwKrC"}
|