@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.
- package/dist/generated/wspace-operations.js +67 -0
- package/dist/generated/wspace-operations.js.map +1 -0
- package/dist/index.js +3 -1
- package/dist/technospam/components/MediaCover.js +57 -0
- package/dist/technospam/components/MediaCover.js.map +1 -0
- package/dist/technospam/components/PageLayout.js +1 -1
- package/dist/technospam/components/PageLayout.js.map +1 -1
- package/dist/technospam/components/StatCard.js +19 -11
- package/dist/technospam/components/StatCard.js.map +1 -1
- package/dist/technospam/components/StatusBadge.js +1 -1
- package/dist/technospam/components/StatusBadge.js.map +1 -1
- package/dist/technospam/components/index.js +1 -0
- package/dist/technospam/hooks/useTechnoSpamAnalytics.js +13 -0
- package/dist/technospam/hooks/useTechnoSpamAnalytics.js.map +1 -0
- package/dist/technospam/index.js +2 -0
- package/dist/technospam/pages/AdminAdminDashboardPagePage.js +525 -459
- package/dist/technospam/pages/AdminAdminDashboardPagePage.js.map +1 -1
- package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js +167 -127
- package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js +178 -101
- package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js.map +1 -1
- package/dist/technospam/pages/ApplicationsProblemsPagePage.js +103 -99
- package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -1
- package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +316 -184
- package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -1
- package/dist/technospam/pages/CoursesCoursesPagePage.js +101 -93
- package/dist/technospam/pages/CoursesCoursesPagePage.js.map +1 -1
- package/dist/technospam/pages/CoursesMyLearningPagePage.js +119 -88
- package/dist/technospam/pages/CoursesMyLearningPagePage.js.map +1 -1
- package/dist/technospam/pages/DashboardDashboardPagePage.js +232 -199
- package/dist/technospam/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js +128 -106
- package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js.map +1 -1
- package/dist/technospam/pages/HackathonsHackathonsPagePage.js +99 -91
- package/dist/technospam/pages/HackathonsHackathonsPagePage.js.map +1 -1
- package/dist/technospam/pages/MentorshipMentorProfilePagePage.js +185 -116
- package/dist/technospam/pages/MentorshipMentorProfilePagePage.js.map +1 -1
- package/dist/technospam/pages/MentorshipMentorsPagePage.js +233 -165
- package/dist/technospam/pages/MentorshipMentorsPagePage.js.map +1 -1
- package/dist/technospam/pages/MentorshipSessionsPagePage.js +146 -113
- package/dist/technospam/pages/MentorshipSessionsPagePage.js.map +1 -1
- package/dist/technospam/services/assistantApi.js +222 -0
- package/dist/technospam/services/assistantApi.js.map +1 -0
- package/dist/technospam/services/createSandboxAssistantTransport.js +120 -0
- package/dist/technospam/services/createSandboxAssistantTransport.js.map +1 -0
- package/dist/technospam/utils/pageContext.js +46 -0
- package/dist/technospam/utils/pageContext.js.map +1 -0
- package/package.json +5 -1
|
@@ -1,222 +1,291 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { useTechnoSpam as e } from "../providers/TechnoSpamProvider.js";
|
|
2
|
+
import { cn as t } from "../utils/cn.js";
|
|
3
|
+
import { PageLayout as n } from "../components/PageLayout.js";
|
|
4
|
+
import { StatCard as r } from "../components/StatCard.js";
|
|
5
|
+
import { coverGradient as i, topicIcon as a } from "../components/MediaCover.js";
|
|
6
|
+
import { formatDateTime as o, formatDuration as s, formatMoney as c } from "../utils/format.js";
|
|
7
|
+
import { StatusBadge as l } from "../components/StatusBadge.js";
|
|
8
|
+
import { EmptyView as u, ErrorView as d } from "../components/StateViews.js";
|
|
6
9
|
import "../components/index.js";
|
|
7
|
-
import { notify as
|
|
8
|
-
import { useBookSession as
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
10
|
+
import { notify as f } from "../lib/toast.js";
|
|
11
|
+
import { useBookSession as p, useMentorQuery as m } from "../api/technospamApi.js";
|
|
12
|
+
import { useTechnoSpamAnalytics as h } from "../hooks/useTechnoSpamAnalytics.js";
|
|
13
|
+
import { createElement as g, useState as _ } from "react";
|
|
14
|
+
import { Award as v, CalendarClock as y, DollarSign as b, MessageSquare as x, Star as S, Video as C } from "lucide-react";
|
|
15
|
+
import { useSearchParams as w } from "react-router-dom";
|
|
16
|
+
import { jsx as T, jsxs as E } from "react/jsx-runtime";
|
|
17
|
+
import { Badge as D, Button as O, GlassCard as k, Input as A, Skeleton as j, Textarea as M } from "@burdenoff/fe-libs/ui";
|
|
14
18
|
//#region src/technospam/pages/MentorshipMentorProfilePagePage.tsx
|
|
15
|
-
function
|
|
16
|
-
let [
|
|
17
|
-
return /* @__PURE__ */
|
|
19
|
+
function N({ mentorId: e, disabled: t, onBooked: n, workspaceId: r }) {
|
|
20
|
+
let [i, a] = _(""), [o, s] = _(""), [c, l] = _(""), [u, d] = _("60"), [m, { loading: g }] = p(), { emit: v } = h(), b = c ? new Date(c) : null, x = b != null && !Number.isNaN(b.getTime()), S = i.trim().length > 0 && x && !g && !t;
|
|
21
|
+
return /* @__PURE__ */ E(k, {
|
|
18
22
|
className: "p-5",
|
|
19
23
|
children: [
|
|
20
|
-
/* @__PURE__ */
|
|
21
|
-
className: "mb-4 flex items-
|
|
22
|
-
children: [/* @__PURE__ */
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}), /* @__PURE__ */
|
|
24
|
+
/* @__PURE__ */ E("div", {
|
|
25
|
+
className: "mb-4 flex items-start gap-3",
|
|
26
|
+
children: [/* @__PURE__ */ T("span", {
|
|
27
|
+
className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-gradient-to-br from-accent-primary to-accent-purple text-white shadow-sm",
|
|
28
|
+
children: /* @__PURE__ */ T(y, { size: 20 })
|
|
29
|
+
}), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("h2", {
|
|
26
30
|
className: "text-base font-semibold text-text-primary",
|
|
27
31
|
children: "Book a session"
|
|
28
|
-
})
|
|
32
|
+
}), /* @__PURE__ */ T("p", {
|
|
33
|
+
className: "text-sm text-text-secondary",
|
|
34
|
+
children: "Schedule 1:1 time with your mentor."
|
|
35
|
+
})] })]
|
|
29
36
|
}),
|
|
30
|
-
t ? /* @__PURE__ */
|
|
37
|
+
t ? /* @__PURE__ */ T("p", {
|
|
31
38
|
className: "rounded-lg border border-border-seam bg-bg-sunken px-3 py-2 text-sm text-text-secondary",
|
|
32
39
|
children: "This mentor isn't accepting new mentees right now."
|
|
33
40
|
}) : null,
|
|
34
|
-
/* @__PURE__ */
|
|
41
|
+
/* @__PURE__ */ E("div", {
|
|
35
42
|
className: "mt-4 grid grid-cols-1 gap-4",
|
|
36
43
|
children: [
|
|
37
|
-
/* @__PURE__ */
|
|
44
|
+
/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ E("label", {
|
|
38
45
|
className: "mb-1.5 block text-sm font-medium text-text-primary",
|
|
39
|
-
children: ["Topic ", /* @__PURE__ */
|
|
46
|
+
children: ["Topic ", /* @__PURE__ */ T("span", {
|
|
40
47
|
className: "text-status-error-text",
|
|
41
48
|
children: "*"
|
|
42
49
|
})]
|
|
43
|
-
}), /* @__PURE__ */
|
|
50
|
+
}), /* @__PURE__ */ T(A, {
|
|
44
51
|
placeholder: "e.g. System design interview prep",
|
|
45
|
-
value:
|
|
46
|
-
onChange: (e) =>
|
|
52
|
+
value: i,
|
|
53
|
+
onChange: (e) => a(e.target.value),
|
|
47
54
|
disabled: t
|
|
48
55
|
})] }),
|
|
49
|
-
/* @__PURE__ */
|
|
56
|
+
/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("label", {
|
|
50
57
|
className: "mb-1.5 block text-sm font-medium text-text-primary",
|
|
51
58
|
children: "Agenda"
|
|
52
|
-
}), /* @__PURE__ */
|
|
59
|
+
}), /* @__PURE__ */ T(M, {
|
|
53
60
|
rows: 3,
|
|
54
61
|
placeholder: "What would you like to cover? Share context so your mentor can prepare.",
|
|
55
|
-
value:
|
|
56
|
-
onChange: (e) =>
|
|
62
|
+
value: o,
|
|
63
|
+
onChange: (e) => s(e.target.value),
|
|
57
64
|
disabled: t
|
|
58
65
|
})] }),
|
|
59
|
-
/* @__PURE__ */
|
|
66
|
+
/* @__PURE__ */ E("div", {
|
|
60
67
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
|
|
61
|
-
children: [/* @__PURE__ */
|
|
68
|
+
children: [/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ E("label", {
|
|
62
69
|
className: "mb-1.5 block text-sm font-medium text-text-primary",
|
|
63
|
-
children: ["When ", /* @__PURE__ */
|
|
70
|
+
children: ["When ", /* @__PURE__ */ T("span", {
|
|
64
71
|
className: "text-status-error-text",
|
|
65
72
|
children: "*"
|
|
66
73
|
})]
|
|
67
|
-
}), /* @__PURE__ */
|
|
74
|
+
}), /* @__PURE__ */ T(A, {
|
|
68
75
|
type: "datetime-local",
|
|
69
|
-
value:
|
|
70
|
-
onChange: (e) =>
|
|
76
|
+
value: c,
|
|
77
|
+
onChange: (e) => l(e.target.value),
|
|
71
78
|
disabled: t
|
|
72
|
-
})] }), /* @__PURE__ */
|
|
79
|
+
})] }), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("label", {
|
|
73
80
|
className: "mb-1.5 block text-sm font-medium text-text-primary",
|
|
74
81
|
children: "Duration (min)"
|
|
75
|
-
}), /* @__PURE__ */
|
|
82
|
+
}), /* @__PURE__ */ T(A, {
|
|
76
83
|
type: "number",
|
|
77
84
|
min: 15,
|
|
78
85
|
step: 15,
|
|
79
|
-
value:
|
|
80
|
-
onChange: (e) =>
|
|
86
|
+
value: u,
|
|
87
|
+
onChange: (e) => d(e.target.value),
|
|
81
88
|
disabled: t
|
|
82
89
|
})] })]
|
|
83
90
|
}),
|
|
84
|
-
/* @__PURE__ */
|
|
91
|
+
/* @__PURE__ */ E(O, {
|
|
92
|
+
className: "w-full bg-gradient-to-r from-accent-primary to-accent-purple",
|
|
85
93
|
onClick: async () => {
|
|
86
|
-
if (!
|
|
94
|
+
if (!S || !b) return;
|
|
87
95
|
let t = {
|
|
88
96
|
mentorId: e,
|
|
89
|
-
topic:
|
|
90
|
-
scheduledAt:
|
|
97
|
+
topic: i.trim(),
|
|
98
|
+
scheduledAt: b.toISOString()
|
|
91
99
|
};
|
|
92
|
-
|
|
93
|
-
let
|
|
94
|
-
!Number.isNaN(
|
|
100
|
+
o.trim() && (t.agenda = o.trim());
|
|
101
|
+
let c = Number.parseInt(u, 10);
|
|
102
|
+
!Number.isNaN(c) && c > 0 && (t.durationMinutes = c), v("technospam.mentor.book_clicked", {
|
|
103
|
+
workspaceId: r,
|
|
104
|
+
entityId: e,
|
|
105
|
+
entityType: "TEC_MENTOR"
|
|
106
|
+
});
|
|
107
|
+
let p = await m({ variables: { input: t } });
|
|
108
|
+
p.data?.tecBookSession && (v("technospam.mentor.booked", {
|
|
109
|
+
workspaceId: r,
|
|
110
|
+
entityId: e,
|
|
111
|
+
entityType: "TEC_MENTOR",
|
|
112
|
+
sessionId: p.data.tecBookSession.id
|
|
113
|
+
}), f.success("Session requested", "Your mentor will confirm the booking soon."), a(""), s(""), l(""), d("60"), n?.());
|
|
95
114
|
},
|
|
96
|
-
disabled: !
|
|
115
|
+
disabled: !S,
|
|
97
116
|
children: [
|
|
98
|
-
/* @__PURE__ */ y
|
|
117
|
+
/* @__PURE__ */ T(y, { size: 16 }),
|
|
99
118
|
" ",
|
|
100
119
|
g ? "Requesting…" : "Request session"
|
|
101
120
|
]
|
|
102
|
-
})
|
|
121
|
+
})
|
|
103
122
|
]
|
|
104
123
|
})
|
|
105
124
|
]
|
|
106
125
|
});
|
|
107
126
|
}
|
|
108
|
-
function
|
|
109
|
-
return /* @__PURE__ */
|
|
110
|
-
className: "flex items-center gap-3
|
|
127
|
+
function P({ session: e }) {
|
|
128
|
+
return /* @__PURE__ */ E("div", {
|
|
129
|
+
className: "flex items-center gap-3 rounded-lg px-1 py-3 transition-colors hover:bg-bg-sunken",
|
|
111
130
|
children: [
|
|
112
|
-
/* @__PURE__ */
|
|
113
|
-
className: "flex h-
|
|
114
|
-
children: /* @__PURE__ */
|
|
131
|
+
/* @__PURE__ */ T("span", {
|
|
132
|
+
className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-accent-purple/12 text-accent-purple",
|
|
133
|
+
children: /* @__PURE__ */ T(C, { size: 16 })
|
|
115
134
|
}),
|
|
116
|
-
/* @__PURE__ */
|
|
135
|
+
/* @__PURE__ */ E("div", {
|
|
117
136
|
className: "min-w-0 flex-1",
|
|
118
|
-
children: [/* @__PURE__ */
|
|
137
|
+
children: [/* @__PURE__ */ T("div", {
|
|
119
138
|
className: "truncate text-sm font-medium text-text-primary",
|
|
120
139
|
children: e.topic
|
|
121
|
-
}), /* @__PURE__ */
|
|
140
|
+
}), /* @__PURE__ */ E("div", {
|
|
122
141
|
className: "text-xs text-text-muted",
|
|
123
142
|
children: [
|
|
124
|
-
|
|
143
|
+
o(e.scheduledAt),
|
|
125
144
|
" · ",
|
|
126
|
-
|
|
145
|
+
s(e.durationMinutes)
|
|
127
146
|
]
|
|
128
147
|
})]
|
|
129
148
|
}),
|
|
130
|
-
/* @__PURE__ */
|
|
149
|
+
/* @__PURE__ */ T(l, { status: e.status })
|
|
131
150
|
]
|
|
132
151
|
});
|
|
133
152
|
}
|
|
134
|
-
function
|
|
135
|
-
let [
|
|
136
|
-
if (
|
|
153
|
+
function F() {
|
|
154
|
+
let [o] = w(), s = o.get("id") ?? "", { workspaceId: f } = e(), { data: p, loading: h, error: _, refetch: C } = m(s), O = p?.tecMentor ?? null;
|
|
155
|
+
if (h && !O) return /* @__PURE__ */ E(n, {
|
|
137
156
|
title: "Mentor",
|
|
138
157
|
backPath: "/mentorship/mentors-page",
|
|
139
|
-
children: [/* @__PURE__ */
|
|
158
|
+
children: [/* @__PURE__ */ T(j, { className: "mb-4 h-40 w-full rounded-xl" }), /* @__PURE__ */ T(j, { className: "h-64 w-full rounded-xl" })]
|
|
140
159
|
});
|
|
141
|
-
if (
|
|
160
|
+
if (_ || !O) return /* @__PURE__ */ T(n, {
|
|
142
161
|
title: "Mentor",
|
|
143
162
|
backPath: "/mentorship/mentors-page",
|
|
144
|
-
children:
|
|
163
|
+
children: _ ? /* @__PURE__ */ T(d, {
|
|
145
164
|
title: "Couldn't load mentor",
|
|
146
|
-
error:
|
|
147
|
-
}) : /* @__PURE__ */
|
|
165
|
+
error: _
|
|
166
|
+
}) : /* @__PURE__ */ T(u, {
|
|
148
167
|
title: "Mentor not found",
|
|
149
168
|
description: "This mentor profile may no longer be available."
|
|
150
169
|
})
|
|
151
170
|
});
|
|
152
|
-
let
|
|
153
|
-
return /* @__PURE__ */
|
|
171
|
+
let A = [...O.sessions ?? []].sort((e, t) => new Date(t.scheduledAt).getTime() - new Date(e.scheduledAt).getTime()).slice(0, 5), M = a(O.expertise.join(" ") || O.headline);
|
|
172
|
+
return /* @__PURE__ */ E(n, {
|
|
154
173
|
hero: !0,
|
|
155
174
|
backPath: "/mentorship/mentors-page",
|
|
156
|
-
title:
|
|
157
|
-
description: p.bio ?? void 0,
|
|
175
|
+
title: "Mentor Profile",
|
|
158
176
|
children: [
|
|
159
|
-
/* @__PURE__ */
|
|
160
|
-
className: "mb-
|
|
161
|
-
children: [
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
}) :
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
177
|
+
/* @__PURE__ */ E(k, {
|
|
178
|
+
className: "mb-6 overflow-hidden p-0",
|
|
179
|
+
children: [/* @__PURE__ */ E("div", {
|
|
180
|
+
className: t("relative h-24 overflow-hidden bg-gradient-to-br", i(O.headline)),
|
|
181
|
+
children: [g(M, {
|
|
182
|
+
className: "pointer-events-none absolute -right-3 -top-4 text-white/15",
|
|
183
|
+
size: 120,
|
|
184
|
+
strokeWidth: 1.3
|
|
185
|
+
}), /* @__PURE__ */ T("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/25 to-transparent" })]
|
|
186
|
+
}), /* @__PURE__ */ E("div", {
|
|
187
|
+
className: "px-6 pb-6",
|
|
188
|
+
children: [
|
|
189
|
+
/* @__PURE__ */ E("div", {
|
|
190
|
+
className: "-mt-10 flex flex-col gap-4 sm:flex-row sm:items-end",
|
|
191
|
+
children: [/* @__PURE__ */ E("div", {
|
|
192
|
+
className: "relative shrink-0",
|
|
193
|
+
children: [/* @__PURE__ */ T("span", {
|
|
194
|
+
className: t("flex h-20 w-20 items-center justify-center rounded-full bg-gradient-to-br text-white shadow-lg ring-4 ring-bg-surface", i(O.headline)),
|
|
195
|
+
children: g(M, {
|
|
196
|
+
size: 34,
|
|
197
|
+
strokeWidth: 1.6
|
|
198
|
+
})
|
|
199
|
+
}), O.isAcceptingMentees ? /* @__PURE__ */ T("span", { className: "absolute bottom-1 right-1 h-4 w-4 rounded-full border-2 border-bg-surface bg-status-success-text" }) : null]
|
|
200
|
+
}), /* @__PURE__ */ E("div", {
|
|
201
|
+
className: "min-w-0 flex-1 sm:pb-1",
|
|
202
|
+
children: [/* @__PURE__ */ T("h1", {
|
|
203
|
+
className: "text-xl font-semibold text-text-primary sm:text-2xl",
|
|
204
|
+
children: O.headline
|
|
205
|
+
}), /* @__PURE__ */ E("div", {
|
|
206
|
+
className: "mt-2 flex flex-wrap items-center gap-2",
|
|
207
|
+
children: [/* @__PURE__ */ T(l, { status: O.status }), O.isAcceptingMentees ? /* @__PURE__ */ E(D, {
|
|
208
|
+
variant: "outline",
|
|
209
|
+
className: "inline-flex items-center gap-1.5 border-status-success-border bg-status-success-bg-subtle text-status-success-text",
|
|
210
|
+
children: [/* @__PURE__ */ T("span", { className: "h-1.5 w-1.5 rounded-full bg-status-success-text" }), " Accepting mentees"]
|
|
211
|
+
}) : null]
|
|
212
|
+
})]
|
|
213
|
+
})]
|
|
214
|
+
}),
|
|
215
|
+
O.bio ? /* @__PURE__ */ T("p", {
|
|
216
|
+
className: "mt-4 max-w-2xl text-sm leading-relaxed text-text-secondary",
|
|
217
|
+
children: O.bio
|
|
218
|
+
}) : null,
|
|
219
|
+
O.expertise.length ? /* @__PURE__ */ T("div", {
|
|
220
|
+
className: "mt-4 flex flex-wrap gap-1.5",
|
|
221
|
+
children: O.expertise.map((e) => /* @__PURE__ */ T(D, {
|
|
222
|
+
variant: "secondary",
|
|
223
|
+
children: e
|
|
224
|
+
}, e))
|
|
225
|
+
}) : null
|
|
226
|
+
]
|
|
227
|
+
})]
|
|
173
228
|
}),
|
|
174
|
-
/* @__PURE__ */
|
|
229
|
+
/* @__PURE__ */ E("div", {
|
|
175
230
|
className: "mb-6 grid grid-cols-2 gap-3 sm:grid-cols-4",
|
|
176
231
|
children: [
|
|
177
|
-
/* @__PURE__ */
|
|
232
|
+
/* @__PURE__ */ T(r, {
|
|
178
233
|
label: "Rate",
|
|
179
|
-
value: `${
|
|
180
|
-
icon:
|
|
234
|
+
value: `${c(O.hourlyRate, O.currency)}/hr`,
|
|
235
|
+
icon: b,
|
|
236
|
+
tone: "blue"
|
|
181
237
|
}),
|
|
182
|
-
/* @__PURE__ */
|
|
238
|
+
/* @__PURE__ */ T(r, {
|
|
183
239
|
label: "Rating",
|
|
184
|
-
value:
|
|
185
|
-
icon:
|
|
240
|
+
value: O.ratingAvg > 0 ? O.ratingAvg.toFixed(1) : "New",
|
|
241
|
+
icon: S,
|
|
242
|
+
tone: "amber"
|
|
186
243
|
}),
|
|
187
|
-
/* @__PURE__ */
|
|
244
|
+
/* @__PURE__ */ T(r, {
|
|
188
245
|
label: "Sessions",
|
|
189
|
-
value:
|
|
190
|
-
icon:
|
|
246
|
+
value: O.sessionsCount,
|
|
247
|
+
icon: x,
|
|
248
|
+
tone: "purple"
|
|
191
249
|
}),
|
|
192
|
-
/* @__PURE__ */
|
|
250
|
+
/* @__PURE__ */ T(r, {
|
|
193
251
|
label: "Status",
|
|
194
|
-
value:
|
|
195
|
-
icon:
|
|
252
|
+
value: O.status === "ACTIVE" ? "Active" : "Pending",
|
|
253
|
+
icon: v,
|
|
254
|
+
tone: "teal"
|
|
196
255
|
})
|
|
197
256
|
]
|
|
198
257
|
}),
|
|
199
|
-
/* @__PURE__ */
|
|
258
|
+
/* @__PURE__ */ E("div", {
|
|
200
259
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
|
|
201
|
-
children: [/* @__PURE__ */
|
|
202
|
-
mentorId:
|
|
203
|
-
disabled: !
|
|
204
|
-
onBooked: () => void
|
|
205
|
-
|
|
260
|
+
children: [/* @__PURE__ */ T(N, {
|
|
261
|
+
mentorId: O.id,
|
|
262
|
+
disabled: !O.isAcceptingMentees,
|
|
263
|
+
onBooked: () => void C(),
|
|
264
|
+
workspaceId: f
|
|
265
|
+
}), /* @__PURE__ */ E(k, {
|
|
206
266
|
className: "p-5",
|
|
207
|
-
children: [/* @__PURE__ */
|
|
208
|
-
className: "mb-
|
|
209
|
-
children:
|
|
210
|
-
|
|
267
|
+
children: [/* @__PURE__ */ E("div", {
|
|
268
|
+
className: "mb-3 flex items-center gap-2",
|
|
269
|
+
children: [/* @__PURE__ */ T(y, {
|
|
270
|
+
size: 18,
|
|
271
|
+
className: "text-accent-teal"
|
|
272
|
+
}), /* @__PURE__ */ T("h2", {
|
|
273
|
+
className: "text-base font-semibold text-text-primary",
|
|
274
|
+
children: "Recent sessions"
|
|
275
|
+
})]
|
|
276
|
+
}), A.length === 0 ? /* @__PURE__ */ T("p", {
|
|
211
277
|
className: "py-6 text-center text-sm text-text-muted",
|
|
212
278
|
children: "No sessions booked yet. Be the first to request time with this mentor."
|
|
213
|
-
}) : /* @__PURE__ */
|
|
279
|
+
}) : /* @__PURE__ */ T("div", {
|
|
280
|
+
className: "divide-y divide-border-seam",
|
|
281
|
+
children: A.map((e) => /* @__PURE__ */ T(P, { session: e }, e.id))
|
|
282
|
+
})]
|
|
214
283
|
})]
|
|
215
284
|
})
|
|
216
285
|
]
|
|
217
286
|
});
|
|
218
287
|
}
|
|
219
288
|
//#endregion
|
|
220
|
-
export {
|
|
289
|
+
export { F as MentorshipMentorProfilePagePage };
|
|
221
290
|
|
|
222
291
|
//# sourceMappingURL=MentorshipMentorProfilePagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MentorshipMentorProfilePagePage.js","names":[],"sources":["../../../src/technospam/pages/MentorshipMentorProfilePagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Award, CalendarClock, DollarSign, MessageSquare, Star, Video } from 'lucide-react';\nimport { Badge, Button, GlassCard, Input, Skeleton, Textarea } from '@burdenoff/fe-libs/ui';\nimport { EmptyView, ErrorView, PageLayout, StatCard, StatusBadge } from '../components';\nimport { useBookSession, useMentorQuery, type TecMentorSession } from '../api/technospamApi';\nimport { formatDateTime, formatDuration, formatMoney } from '../utils/format';\nimport { notify } from '../lib/toast';\n\nfunction BookSessionForm({\n mentorId,\n disabled,\n onBooked,\n}: {\n mentorId: string;\n disabled: boolean;\n onBooked?: () => void;\n}) {\n const [topic, setTopic] = useState('');\n const [agenda, setAgenda] = useState('');\n const [scheduledAt, setScheduledAt] = useState('');\n const [durationMinutes, setDurationMinutes] = useState('60');\n const [bookSession, { loading }] = useBookSession();\n\n const parsedDate = scheduledAt ? new Date(scheduledAt) : null;\n const validDate = parsedDate != null && !Number.isNaN(parsedDate.getTime());\n const canSubmit = topic.trim().length > 0 && validDate && !loading && !disabled;\n\n const handleSubmit = async () => {\n if (!canSubmit || !parsedDate) return;\n const input: {\n mentorId: string;\n topic: string;\n agenda?: string;\n scheduledAt: string;\n durationMinutes?: number;\n } = {\n mentorId,\n topic: topic.trim(),\n scheduledAt: parsedDate.toISOString(),\n };\n if (agenda.trim()) input.agenda = agenda.trim();\n const dur = Number.parseInt(durationMinutes, 10);\n if (!Number.isNaN(dur) && dur > 0) input.durationMinutes = dur;\n\n const res = await bookSession({ variables: { input } });\n if (res.data?.tecBookSession) {\n notify.success('Session requested', 'Your mentor will confirm the booking soon.');\n setTopic('');\n setAgenda('');\n setScheduledAt('');\n setDurationMinutes('60');\n onBooked?.();\n }\n };\n\n return (\n <GlassCard className=\"p-5\">\n <div className=\"mb-4 flex items-center gap-2\">\n <CalendarClock size={18} className=\"text-accent-teal\" />\n <h2 className=\"text-base font-semibold text-text-primary\">Book a session</h2>\n </div>\n\n {disabled ? (\n <p className=\"rounded-lg border border-border-seam bg-bg-sunken px-3 py-2 text-sm text-text-secondary\">\n This mentor isn't accepting new mentees right now.\n </p>\n ) : null}\n\n <div className=\"mt-4 grid grid-cols-1 gap-4\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Topic <span className=\"text-status-error-text\">*</span>\n </label>\n <Input\n placeholder=\"e.g. System design interview prep\"\n value={topic}\n onChange={(e) => setTopic(e.target.value)}\n disabled={disabled}\n />\n </div>\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Agenda</label>\n <Textarea\n rows={3}\n placeholder=\"What would you like to cover? Share context so your mentor can prepare.\"\n value={agenda}\n onChange={(e) => setAgenda(e.target.value)}\n disabled={disabled}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n When <span className=\"text-status-error-text\">*</span>\n </label>\n <Input\n type=\"datetime-local\"\n value={scheduledAt}\n onChange={(e) => setScheduledAt(e.target.value)}\n disabled={disabled}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Duration (min)\n </label>\n <Input\n type=\"number\"\n min={15}\n step={15}\n value={durationMinutes}\n onChange={(e) => setDurationMinutes(e.target.value)}\n disabled={disabled}\n />\n </div>\n </div>\n\n <div>\n <Button onClick={handleSubmit} disabled={!canSubmit}>\n <CalendarClock size={16} /> {loading ? 'Requesting…' : 'Request session'}\n </Button>\n </div>\n </div>\n </GlassCard>\n );\n}\n\nfunction SessionSummaryRow({ session }: { session: TecMentorSession }) {\n return (\n <div className=\"flex items-center gap-3 border-b border-border-seam py-3 last:border-0\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-bg-sunken text-text-secondary\">\n <Video size={15} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium text-text-primary\">{session.topic}</div>\n <div className=\"text-xs text-text-muted\">\n {formatDateTime(session.scheduledAt)} · {formatDuration(session.durationMinutes)}\n </div>\n </div>\n <StatusBadge status={session.status} />\n </div>\n );\n}\n\nexport function MentorshipMentorProfilePagePage() {\n const [params] = useSearchParams();\n const id = params.get('id') ?? '';\n const { data, loading, error, refetch } = useMentorQuery(id);\n\n const mentor = data?.tecMentor ?? null;\n\n if (loading && !mentor) {\n return (\n <PageLayout title=\"Mentor\" backPath=\"/mentorship/mentors-page\">\n <Skeleton className=\"mb-4 h-40 w-full rounded-xl\" />\n <Skeleton className=\"h-64 w-full rounded-xl\" />\n </PageLayout>\n );\n }\n\n if (error || !mentor) {\n return (\n <PageLayout title=\"Mentor\" backPath=\"/mentorship/mentors-page\">\n {error ? (\n <ErrorView title=\"Couldn't load mentor\" error={error} />\n ) : (\n <EmptyView\n title=\"Mentor not found\"\n description=\"This mentor profile may no longer be available.\"\n />\n )}\n </PageLayout>\n );\n }\n\n const sessions = mentor.sessions ?? [];\n const recentSessions = [...sessions]\n .sort((a, b) => new Date(b.scheduledAt).getTime() - new Date(a.scheduledAt).getTime())\n .slice(0, 5);\n\n return (\n <PageLayout\n hero\n backPath=\"/mentorship/mentors-page\"\n title={mentor.headline}\n description={mentor.bio ?? undefined}\n >\n <div className=\"mb-5 flex flex-wrap items-center gap-2\">\n <StatusBadge status={mentor.status} />\n {mentor.isAcceptingMentees ? (\n <Badge\n variant=\"outline\"\n className=\"border-status-success-border bg-status-success-bg-subtle text-status-success-text\"\n >\n Accepting mentees\n </Badge>\n ) : null}\n {mentor.expertise.map((skill) => (\n <Badge key={skill} variant=\"secondary\">\n {skill}\n </Badge>\n ))}\n </div>\n\n <div className=\"mb-6 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <StatCard\n label=\"Rate\"\n value={`${formatMoney(mentor.hourlyRate, mentor.currency)}/hr`}\n icon={DollarSign}\n />\n <StatCard\n label=\"Rating\"\n value={mentor.ratingAvg > 0 ? mentor.ratingAvg.toFixed(1) : 'New'}\n icon={Star}\n />\n <StatCard label=\"Sessions\" value={mentor.sessionsCount} icon={MessageSquare} />\n <StatCard\n label=\"Status\"\n value={mentor.status === 'ACTIVE' ? 'Active' : 'Pending'}\n icon={Award}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <BookSessionForm\n mentorId={mentor.id}\n disabled={!mentor.isAcceptingMentees}\n onBooked={() => void refetch()}\n />\n\n <GlassCard className=\"p-5\">\n <h2 className=\"mb-2 text-base font-semibold text-text-primary\">Recent sessions</h2>\n {recentSessions.length === 0 ? (\n <p className=\"py-6 text-center text-sm text-text-muted\">\n No sessions booked yet. Be the first to request time with this mentor.\n </p>\n ) : (\n <div>\n {recentSessions.map((session) => (\n <SessionSummaryRow key={session.id} session={session} />\n ))}\n </div>\n )}\n </GlassCard>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MentorshipMentorProfilePagePage.js","names":[],"sources":["../../../src/technospam/pages/MentorshipMentorProfilePagePage.tsx"],"sourcesContent":["import { createElement, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Award, CalendarClock, DollarSign, MessageSquare, Star, Video } from 'lucide-react';\nimport { Badge, Button, GlassCard, Input, Skeleton, Textarea } from '@burdenoff/fe-libs/ui';\nimport {\n EmptyView,\n ErrorView,\n PageLayout,\n StatCard,\n StatusBadge,\n coverGradient,\n topicIcon,\n} from '../components';\nimport { useTechnoSpam } from '../providers/TechnoSpamProvider';\nimport { useBookSession, useMentorQuery, type TecMentorSession } from '../api/technospamApi';\nimport { formatDateTime, formatDuration, formatMoney } from '../utils/format';\nimport { cn } from '../utils/cn';\nimport { notify } from '../lib/toast';\nimport { useTechnoSpamAnalytics } from '../hooks/useTechnoSpamAnalytics';\n\nfunction BookSessionForm({\n mentorId,\n disabled,\n onBooked,\n workspaceId,\n}: {\n mentorId: string;\n disabled: boolean;\n onBooked?: () => void;\n workspaceId?: string;\n}) {\n const [topic, setTopic] = useState('');\n const [agenda, setAgenda] = useState('');\n const [scheduledAt, setScheduledAt] = useState('');\n const [durationMinutes, setDurationMinutes] = useState('60');\n const [bookSession, { loading }] = useBookSession();\n const { emit } = useTechnoSpamAnalytics();\n\n const parsedDate = scheduledAt ? new Date(scheduledAt) : null;\n const validDate = parsedDate != null && !Number.isNaN(parsedDate.getTime());\n const canSubmit = topic.trim().length > 0 && validDate && !loading && !disabled;\n\n const handleSubmit = async () => {\n if (!canSubmit || !parsedDate) return;\n const input: {\n mentorId: string;\n topic: string;\n agenda?: string;\n scheduledAt: string;\n durationMinutes?: number;\n } = {\n mentorId,\n topic: topic.trim(),\n scheduledAt: parsedDate.toISOString(),\n };\n if (agenda.trim()) input.agenda = agenda.trim();\n const dur = Number.parseInt(durationMinutes, 10);\n if (!Number.isNaN(dur) && dur > 0) input.durationMinutes = dur;\n\n emit('technospam.mentor.book_clicked', {\n workspaceId,\n entityId: mentorId,\n entityType: 'TEC_MENTOR',\n });\n const res = await bookSession({ variables: { input } });\n if (res.data?.tecBookSession) {\n emit('technospam.mentor.booked', {\n workspaceId,\n entityId: mentorId,\n entityType: 'TEC_MENTOR',\n sessionId: res.data.tecBookSession.id,\n });\n notify.success('Session requested', 'Your mentor will confirm the booking soon.');\n setTopic('');\n setAgenda('');\n setScheduledAt('');\n setDurationMinutes('60');\n onBooked?.();\n }\n };\n\n return (\n <GlassCard className=\"p-5\">\n <div className=\"mb-4 flex items-start gap-3\">\n <span className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-gradient-to-br from-accent-primary to-accent-purple text-white shadow-sm\">\n <CalendarClock size={20} />\n </span>\n <div>\n <h2 className=\"text-base font-semibold text-text-primary\">Book a session</h2>\n <p className=\"text-sm text-text-secondary\">Schedule 1:1 time with your mentor.</p>\n </div>\n </div>\n\n {disabled ? (\n <p className=\"rounded-lg border border-border-seam bg-bg-sunken px-3 py-2 text-sm text-text-secondary\">\n This mentor isn't accepting new mentees right now.\n </p>\n ) : null}\n\n <div className=\"mt-4 grid grid-cols-1 gap-4\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Topic <span className=\"text-status-error-text\">*</span>\n </label>\n <Input\n placeholder=\"e.g. System design interview prep\"\n value={topic}\n onChange={(e) => setTopic(e.target.value)}\n disabled={disabled}\n />\n </div>\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Agenda</label>\n <Textarea\n rows={3}\n placeholder=\"What would you like to cover? Share context so your mentor can prepare.\"\n value={agenda}\n onChange={(e) => setAgenda(e.target.value)}\n disabled={disabled}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n When <span className=\"text-status-error-text\">*</span>\n </label>\n <Input\n type=\"datetime-local\"\n value={scheduledAt}\n onChange={(e) => setScheduledAt(e.target.value)}\n disabled={disabled}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Duration (min)\n </label>\n <Input\n type=\"number\"\n min={15}\n step={15}\n value={durationMinutes}\n onChange={(e) => setDurationMinutes(e.target.value)}\n disabled={disabled}\n />\n </div>\n </div>\n\n <Button\n className=\"w-full bg-gradient-to-r from-accent-primary to-accent-purple\"\n onClick={handleSubmit}\n disabled={!canSubmit}\n >\n <CalendarClock size={16} /> {loading ? 'Requesting…' : 'Request session'}\n </Button>\n </div>\n </GlassCard>\n );\n}\n\nfunction SessionSummaryRow({ session }: { session: TecMentorSession }) {\n return (\n <div className=\"flex items-center gap-3 rounded-lg px-1 py-3 transition-colors hover:bg-bg-sunken\">\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-accent-purple/12 text-accent-purple\">\n <Video size={16} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium text-text-primary\">{session.topic}</div>\n <div className=\"text-xs text-text-muted\">\n {formatDateTime(session.scheduledAt)} · {formatDuration(session.durationMinutes)}\n </div>\n </div>\n <StatusBadge status={session.status} />\n </div>\n );\n}\n\nexport function MentorshipMentorProfilePagePage() {\n const [params] = useSearchParams();\n const id = params.get('id') ?? '';\n const { workspaceId } = useTechnoSpam();\n const { data, loading, error, refetch } = useMentorQuery(id);\n\n const mentor = data?.tecMentor ?? null;\n\n if (loading && !mentor) {\n return (\n <PageLayout title=\"Mentor\" backPath=\"/mentorship/mentors-page\">\n <Skeleton className=\"mb-4 h-40 w-full rounded-xl\" />\n <Skeleton className=\"h-64 w-full rounded-xl\" />\n </PageLayout>\n );\n }\n\n if (error || !mentor) {\n return (\n <PageLayout title=\"Mentor\" backPath=\"/mentorship/mentors-page\">\n {error ? (\n <ErrorView title=\"Couldn't load mentor\" error={error} />\n ) : (\n <EmptyView\n title=\"Mentor not found\"\n description=\"This mentor profile may no longer be available.\"\n />\n )}\n </PageLayout>\n );\n }\n\n const sessions = mentor.sessions ?? [];\n const recentSessions = [...sessions]\n .sort((a, b) => new Date(b.scheduledAt).getTime() - new Date(a.scheduledAt).getTime())\n .slice(0, 5);\n\n const HeroIcon = topicIcon(mentor.expertise.join(' ') || mentor.headline);\n\n return (\n <PageLayout hero backPath=\"/mentorship/mentors-page\" title=\"Mentor Profile\">\n <GlassCard className=\"mb-6 overflow-hidden p-0\">\n <div\n className={cn(\n 'relative h-24 overflow-hidden bg-gradient-to-br',\n coverGradient(mentor.headline)\n )}\n >\n {createElement(HeroIcon, {\n className: 'pointer-events-none absolute -right-3 -top-4 text-white/15',\n size: 120,\n strokeWidth: 1.3,\n })}\n <div className=\"pointer-events-none absolute inset-0 bg-gradient-to-t from-black/25 to-transparent\" />\n </div>\n <div className=\"px-6 pb-6\">\n <div className=\"-mt-10 flex flex-col gap-4 sm:flex-row sm:items-end\">\n <div className=\"relative shrink-0\">\n <span\n className={cn(\n 'flex h-20 w-20 items-center justify-center rounded-full bg-gradient-to-br text-white shadow-lg ring-4 ring-bg-surface',\n coverGradient(mentor.headline)\n )}\n >\n {createElement(HeroIcon, { size: 34, strokeWidth: 1.6 })}\n </span>\n {mentor.isAcceptingMentees ? (\n <span className=\"absolute bottom-1 right-1 h-4 w-4 rounded-full border-2 border-bg-surface bg-status-success-text\" />\n ) : null}\n </div>\n <div className=\"min-w-0 flex-1 sm:pb-1\">\n <h1 className=\"text-xl font-semibold text-text-primary sm:text-2xl\">\n {mentor.headline}\n </h1>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <StatusBadge status={mentor.status} />\n {mentor.isAcceptingMentees ? (\n <Badge\n variant=\"outline\"\n className=\"inline-flex items-center gap-1.5 border-status-success-border bg-status-success-bg-subtle text-status-success-text\"\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-status-success-text\" /> Accepting\n mentees\n </Badge>\n ) : null}\n </div>\n </div>\n </div>\n\n {mentor.bio ? (\n <p className=\"mt-4 max-w-2xl text-sm leading-relaxed text-text-secondary\">\n {mentor.bio}\n </p>\n ) : null}\n\n {mentor.expertise.length ? (\n <div className=\"mt-4 flex flex-wrap gap-1.5\">\n {mentor.expertise.map((skill) => (\n <Badge key={skill} variant=\"secondary\">\n {skill}\n </Badge>\n ))}\n </div>\n ) : null}\n </div>\n </GlassCard>\n\n <div className=\"mb-6 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <StatCard\n label=\"Rate\"\n value={`${formatMoney(mentor.hourlyRate, mentor.currency)}/hr`}\n icon={DollarSign}\n tone=\"blue\"\n />\n <StatCard\n label=\"Rating\"\n value={mentor.ratingAvg > 0 ? mentor.ratingAvg.toFixed(1) : 'New'}\n icon={Star}\n tone=\"amber\"\n />\n <StatCard\n label=\"Sessions\"\n value={mentor.sessionsCount}\n icon={MessageSquare}\n tone=\"purple\"\n />\n <StatCard\n label=\"Status\"\n value={mentor.status === 'ACTIVE' ? 'Active' : 'Pending'}\n icon={Award}\n tone=\"teal\"\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <BookSessionForm\n mentorId={mentor.id}\n disabled={!mentor.isAcceptingMentees}\n onBooked={() => void refetch()}\n workspaceId={workspaceId}\n />\n\n <GlassCard className=\"p-5\">\n <div className=\"mb-3 flex items-center gap-2\">\n <CalendarClock size={18} className=\"text-accent-teal\" />\n <h2 className=\"text-base font-semibold text-text-primary\">Recent sessions</h2>\n </div>\n {recentSessions.length === 0 ? (\n <p className=\"py-6 text-center text-sm text-text-muted\">\n No sessions booked yet. Be the first to request time with this mentor.\n </p>\n ) : (\n <div className=\"divide-y divide-border-seam\">\n {recentSessions.map((session) => (\n <SessionSummaryRow key={session.id} session={session} />\n ))}\n </div>\n )}\n </GlassCard>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|