@burdenoff/microfe-technospam 2026.705.1 → 2026.705.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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 -125
- package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js.map +1 -1
- package/dist/technospam/pages/ApplicationsProblemsPagePage.js +77 -88
- package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -1
- package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +287 -186
- package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -1
- package/dist/technospam/pages/CoursesCoursesPagePage.js +76 -83
- 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 +71 -78
- package/dist/technospam/pages/HackathonsHackathonsPagePage.js.map +1 -1
- package/dist/technospam/pages/MentorshipMentorProfilePagePage.js +165 -110
- package/dist/technospam/pages/MentorshipMentorProfilePagePage.js.map +1 -1
- package/dist/technospam/pages/MentorshipMentorsPagePage.js +210 -156
- package/dist/technospam/pages/MentorshipMentorsPagePage.js.map +1 -1
- package/dist/technospam/pages/MentorshipSessionsPagePage.js +59 -43
- package/dist/technospam/pages/MentorshipSessionsPagePage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,192 +1,229 @@
|
|
|
1
1
|
import { useTechnoSpam as e, useTechnoSpamNavigate as t } from "../providers/TechnoSpamProvider.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
2
|
+
import { cn as n } from "../utils/cn.js";
|
|
3
|
+
import { PageLayout as r } from "../components/PageLayout.js";
|
|
4
|
+
import { StatCard as i } from "../components/StatCard.js";
|
|
5
|
+
import { coverGradient as a, topicIcon as o } from "../components/MediaCover.js";
|
|
6
|
+
import { formatMoney as s } from "../utils/format.js";
|
|
7
|
+
import { LoadMore as c } from "../components/LoadMore.js";
|
|
8
|
+
import { EmptyView as l, ErrorView as u, LoadingGrid as d } from "../components/StateViews.js";
|
|
7
9
|
import "../components/index.js";
|
|
8
|
-
import { notify as
|
|
9
|
-
import { pageArg as
|
|
10
|
-
import { useMemo as
|
|
11
|
-
import { Award as
|
|
12
|
-
import { jsx as
|
|
13
|
-
import { Badge as
|
|
10
|
+
import { notify as f } from "../lib/toast.js";
|
|
11
|
+
import { pageArg as p, useBecomeMentor as m, useMentorsQuery as h, usePageLimit as g } from "../api/technospamApi.js";
|
|
12
|
+
import { createElement as _, useMemo as v, useState as y } from "react";
|
|
13
|
+
import { Award as b, MessageSquare as x, Search as S, Sparkles as C, Star as w, UserPlus as T, Users as E, X as D } from "lucide-react";
|
|
14
|
+
import { jsx as O, jsxs as k } from "react/jsx-runtime";
|
|
15
|
+
import { Badge as A, Button as j, GlassCard as M, Input as N, Textarea as P } from "@burdenoff/fe-libs/ui";
|
|
14
16
|
//#region src/technospam/pages/MentorshipMentorsPagePage.tsx
|
|
15
|
-
function
|
|
16
|
-
return /* @__PURE__ */
|
|
17
|
-
className: "
|
|
17
|
+
function F({ mentor: e, size: t = "md" }) {
|
|
18
|
+
return /* @__PURE__ */ k("div", {
|
|
19
|
+
className: "relative shrink-0",
|
|
20
|
+
children: [/* @__PURE__ */ O("span", {
|
|
21
|
+
className: n("flex items-center justify-center rounded-full bg-gradient-to-br text-white shadow-md ring-1 ring-white/15", t === "lg" ? "h-20 w-20" : "h-16 w-16", a(e.headline)),
|
|
22
|
+
children: _(o(e.expertise.join(" ") || e.headline), {
|
|
23
|
+
size: t === "lg" ? 32 : 26,
|
|
24
|
+
strokeWidth: 1.7
|
|
25
|
+
})
|
|
26
|
+
}), e.isAcceptingMentees ? /* @__PURE__ */ O("span", { className: "absolute -bottom-0.5 -right-0.5 h-4 w-4 rounded-full border-2 border-bg-surface bg-status-success-text" }) : null]
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function I({ mentor: e, onOpen: t }) {
|
|
30
|
+
return /* @__PURE__ */ k(M, {
|
|
31
|
+
className: "group flex cursor-pointer flex-col gap-4 p-5 transition-all duration-200 hover:-translate-y-1 hover:shadow-lg",
|
|
18
32
|
onClick: t,
|
|
19
33
|
children: [
|
|
20
|
-
/* @__PURE__ */
|
|
21
|
-
className: "flex items-start
|
|
22
|
-
children: [/* @__PURE__ */
|
|
23
|
-
className: "min-w-0",
|
|
24
|
-
children: [/* @__PURE__ */
|
|
34
|
+
/* @__PURE__ */ k("div", {
|
|
35
|
+
className: "flex items-start gap-4",
|
|
36
|
+
children: [/* @__PURE__ */ O(F, { mentor: e }), /* @__PURE__ */ k("div", {
|
|
37
|
+
className: "min-w-0 flex-1",
|
|
38
|
+
children: [/* @__PURE__ */ O("h3", {
|
|
25
39
|
className: "truncate text-base font-semibold text-text-primary group-hover:text-accent-primary",
|
|
26
40
|
children: e.headline
|
|
27
|
-
}), /* @__PURE__ */
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
41
|
+
}), e.isAcceptingMentees ? /* @__PURE__ */ k(A, {
|
|
42
|
+
variant: "outline",
|
|
43
|
+
className: "mt-1.5 inline-flex items-center gap-1.5 border-status-success-border bg-status-success-bg-subtle text-status-success-text",
|
|
44
|
+
children: [/* @__PURE__ */ O("span", { className: "h-1.5 w-1.5 rounded-full bg-status-success-text" }), " Accepting mentees"]
|
|
45
|
+
}) : /* @__PURE__ */ O(A, {
|
|
46
|
+
variant: "outline",
|
|
47
|
+
className: "mt-1.5 border-border-seam bg-bg-sunken text-text-secondary",
|
|
48
|
+
children: "Not accepting"
|
|
33
49
|
})]
|
|
34
|
-
}), e.isAcceptingMentees ? /* @__PURE__ */ w(E, {
|
|
35
|
-
variant: "outline",
|
|
36
|
-
className: "shrink-0 border-status-success-border bg-status-success-bg-subtle text-status-success-text",
|
|
37
|
-
children: "Accepting mentees"
|
|
38
|
-
}) : /* @__PURE__ */ w(E, {
|
|
39
|
-
variant: "outline",
|
|
40
|
-
className: "shrink-0 border-border-seam bg-bg-sunken text-text-secondary",
|
|
41
|
-
children: "Not accepting"
|
|
42
50
|
})]
|
|
43
51
|
}),
|
|
44
|
-
e.bio ? /* @__PURE__ */
|
|
52
|
+
e.bio ? /* @__PURE__ */ O("p", {
|
|
45
53
|
className: "line-clamp-2 text-sm text-text-secondary",
|
|
46
54
|
children: e.bio
|
|
47
55
|
}) : null,
|
|
48
|
-
e.expertise.length ? /* @__PURE__ */
|
|
56
|
+
e.expertise.length ? /* @__PURE__ */ k("div", {
|
|
49
57
|
className: "flex flex-wrap gap-1.5",
|
|
50
|
-
children: [e.expertise.slice(0, 4).map((e) => /* @__PURE__ */
|
|
58
|
+
children: [e.expertise.slice(0, 4).map((e) => /* @__PURE__ */ O(A, {
|
|
51
59
|
variant: "secondary",
|
|
52
60
|
className: "text-[11px]",
|
|
53
61
|
children: e
|
|
54
|
-
}, e)), e.expertise.length > 4 ? /* @__PURE__ */
|
|
55
|
-
className: "text-xs text-text-muted",
|
|
56
|
-
children: [
|
|
57
|
-
"+",
|
|
58
|
-
e.expertise.length - 4,
|
|
59
|
-
" more"
|
|
60
|
-
]
|
|
62
|
+
}, e)), e.expertise.length > 4 ? /* @__PURE__ */ k("span", {
|
|
63
|
+
className: "self-center text-xs text-text-muted",
|
|
64
|
+
children: ["+", e.expertise.length - 4]
|
|
61
65
|
}) : null]
|
|
62
66
|
}) : null,
|
|
63
|
-
/* @__PURE__ */
|
|
64
|
-
className: "mt-auto
|
|
65
|
-
children: [
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
/* @__PURE__ */
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
67
|
+
/* @__PURE__ */ k("div", {
|
|
68
|
+
className: "mt-auto grid grid-cols-3 divide-x divide-border-seam rounded-xl border border-border-seam bg-bg-sunken text-center",
|
|
69
|
+
children: [
|
|
70
|
+
/* @__PURE__ */ k("div", {
|
|
71
|
+
className: "px-2 py-2.5",
|
|
72
|
+
children: [/* @__PURE__ */ k("div", {
|
|
73
|
+
className: "flex items-center justify-center gap-1 text-sm font-semibold text-text-primary",
|
|
74
|
+
children: [/* @__PURE__ */ O(w, {
|
|
75
|
+
size: 13,
|
|
76
|
+
className: "text-accent-teal"
|
|
77
|
+
}), e.ratingAvg > 0 ? e.ratingAvg.toFixed(1) : "New"]
|
|
78
|
+
}), /* @__PURE__ */ O("div", {
|
|
79
|
+
className: "text-[11px] text-text-muted",
|
|
80
|
+
children: "rating"
|
|
81
|
+
})]
|
|
82
|
+
}),
|
|
83
|
+
/* @__PURE__ */ k("div", {
|
|
84
|
+
className: "px-2 py-2.5",
|
|
85
|
+
children: [/* @__PURE__ */ O("div", {
|
|
86
|
+
className: "text-sm font-semibold text-text-primary",
|
|
87
|
+
children: e.sessionsCount
|
|
88
|
+
}), /* @__PURE__ */ O("div", {
|
|
89
|
+
className: "text-[11px] text-text-muted",
|
|
90
|
+
children: "sessions"
|
|
91
|
+
})]
|
|
92
|
+
}),
|
|
93
|
+
/* @__PURE__ */ k("div", {
|
|
94
|
+
className: "px-2 py-2.5",
|
|
95
|
+
children: [/* @__PURE__ */ O("div", {
|
|
96
|
+
className: "text-sm font-semibold text-text-primary",
|
|
97
|
+
children: s(e.hourlyRate, e.currency)
|
|
98
|
+
}), /* @__PURE__ */ O("div", {
|
|
99
|
+
className: "text-[11px] text-text-muted",
|
|
100
|
+
children: "/ hr"
|
|
101
|
+
})]
|
|
102
|
+
})
|
|
103
|
+
]
|
|
104
|
+
}),
|
|
105
|
+
/* @__PURE__ */ O(j, {
|
|
106
|
+
className: "w-full",
|
|
107
|
+
onClick: (e) => {
|
|
108
|
+
e.stopPropagation(), t();
|
|
109
|
+
},
|
|
110
|
+
children: "View profile"
|
|
80
111
|
})
|
|
81
112
|
]
|
|
82
113
|
});
|
|
83
114
|
}
|
|
84
|
-
function
|
|
85
|
-
let [n, r] =
|
|
86
|
-
return /* @__PURE__ */
|
|
115
|
+
function L({ onClose: e, onDone: t }) {
|
|
116
|
+
let [n, r] = y(""), [i, a] = y(""), [o, s] = y(""), [c, l] = y(""), [u, d] = y("USD"), [p, { loading: h }] = m(), g = n.trim().length > 0 && !h;
|
|
117
|
+
return /* @__PURE__ */ k(M, {
|
|
87
118
|
className: "mb-6 p-5",
|
|
88
|
-
children: [/* @__PURE__ */
|
|
89
|
-
className: "mb-4 flex items-
|
|
90
|
-
children: [/* @__PURE__ */
|
|
91
|
-
className: "
|
|
92
|
-
children:
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
119
|
+
children: [/* @__PURE__ */ k("div", {
|
|
120
|
+
className: "mb-4 flex items-start justify-between gap-3",
|
|
121
|
+
children: [/* @__PURE__ */ k("div", {
|
|
122
|
+
className: "flex items-center gap-3",
|
|
123
|
+
children: [/* @__PURE__ */ O("span", {
|
|
124
|
+
className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-gradient-to-br from-accent-primary to-accent-indigo text-white shadow-sm",
|
|
125
|
+
children: /* @__PURE__ */ O(T, { size: 20 })
|
|
126
|
+
}), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("h2", {
|
|
127
|
+
className: "text-base font-semibold text-text-primary",
|
|
128
|
+
children: "Become a mentor"
|
|
129
|
+
}), /* @__PURE__ */ O("p", {
|
|
130
|
+
className: "text-sm text-text-secondary",
|
|
131
|
+
children: "Share your expertise and start mentoring builders in the community."
|
|
132
|
+
})] })]
|
|
133
|
+
}), /* @__PURE__ */ O(j, {
|
|
97
134
|
variant: "ghost",
|
|
98
135
|
size: "sm",
|
|
99
136
|
onClick: e,
|
|
100
137
|
"aria-label": "Close",
|
|
101
|
-
children: /* @__PURE__ */
|
|
138
|
+
children: /* @__PURE__ */ O(D, { size: 16 })
|
|
102
139
|
})]
|
|
103
|
-
}), /* @__PURE__ */
|
|
140
|
+
}), /* @__PURE__ */ k("div", {
|
|
104
141
|
className: "grid grid-cols-1 gap-4",
|
|
105
142
|
children: [
|
|
106
|
-
/* @__PURE__ */
|
|
143
|
+
/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ k("label", {
|
|
107
144
|
className: "mb-1.5 block text-sm font-medium text-text-primary",
|
|
108
|
-
children: ["Headline ", /* @__PURE__ */
|
|
145
|
+
children: ["Headline ", /* @__PURE__ */ O("span", {
|
|
109
146
|
className: "text-status-error-text",
|
|
110
147
|
children: "*"
|
|
111
148
|
})]
|
|
112
|
-
}), /* @__PURE__ */
|
|
149
|
+
}), /* @__PURE__ */ O(N, {
|
|
113
150
|
placeholder: "e.g. Staff Engineer · Distributed systems & career growth",
|
|
114
151
|
value: n,
|
|
115
152
|
onChange: (e) => r(e.target.value)
|
|
116
153
|
})] }),
|
|
117
|
-
/* @__PURE__ */
|
|
154
|
+
/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("label", {
|
|
118
155
|
className: "mb-1.5 block text-sm font-medium text-text-primary",
|
|
119
156
|
children: "Bio"
|
|
120
|
-
}), /* @__PURE__ */
|
|
157
|
+
}), /* @__PURE__ */ O(P, {
|
|
121
158
|
rows: 3,
|
|
122
159
|
placeholder: "Tell mentees about your experience and how you can help.",
|
|
123
160
|
value: i,
|
|
124
161
|
onChange: (e) => a(e.target.value)
|
|
125
162
|
})] }),
|
|
126
|
-
/* @__PURE__ */
|
|
127
|
-
/* @__PURE__ */
|
|
163
|
+
/* @__PURE__ */ k("div", { children: [
|
|
164
|
+
/* @__PURE__ */ O("label", {
|
|
128
165
|
className: "mb-1.5 block text-sm font-medium text-text-primary",
|
|
129
166
|
children: "Expertise"
|
|
130
167
|
}),
|
|
131
|
-
/* @__PURE__ */
|
|
168
|
+
/* @__PURE__ */ O(N, {
|
|
132
169
|
placeholder: "React, System design, Career coaching",
|
|
133
170
|
value: o,
|
|
134
171
|
onChange: (e) => s(e.target.value)
|
|
135
172
|
}),
|
|
136
|
-
/* @__PURE__ */
|
|
173
|
+
/* @__PURE__ */ O("p", {
|
|
137
174
|
className: "mt-1 text-xs text-text-muted",
|
|
138
175
|
children: "Comma-separated topics."
|
|
139
176
|
})
|
|
140
177
|
] }),
|
|
141
|
-
/* @__PURE__ */
|
|
178
|
+
/* @__PURE__ */ k("div", {
|
|
142
179
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
|
|
143
|
-
children: [/* @__PURE__ */
|
|
144
|
-
/* @__PURE__ */
|
|
180
|
+
children: [/* @__PURE__ */ k("div", { children: [
|
|
181
|
+
/* @__PURE__ */ O("label", {
|
|
145
182
|
className: "mb-1.5 block text-sm font-medium text-text-primary",
|
|
146
183
|
children: "Hourly rate"
|
|
147
184
|
}),
|
|
148
|
-
/* @__PURE__ */
|
|
185
|
+
/* @__PURE__ */ O(N, {
|
|
149
186
|
type: "number",
|
|
150
187
|
min: 0,
|
|
151
188
|
placeholder: "0",
|
|
152
189
|
value: c,
|
|
153
|
-
onChange: (e) =>
|
|
190
|
+
onChange: (e) => l(e.target.value)
|
|
154
191
|
}),
|
|
155
|
-
/* @__PURE__ */
|
|
192
|
+
/* @__PURE__ */ O("p", {
|
|
156
193
|
className: "mt-1 text-xs text-text-muted",
|
|
157
194
|
children: "Whole number. Leave 0 for free."
|
|
158
195
|
})
|
|
159
|
-
] }), /* @__PURE__ */
|
|
196
|
+
] }), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("label", {
|
|
160
197
|
className: "mb-1.5 block text-sm font-medium text-text-primary",
|
|
161
198
|
children: "Currency"
|
|
162
|
-
}), /* @__PURE__ */
|
|
199
|
+
}), /* @__PURE__ */ O(N, {
|
|
163
200
|
placeholder: "USD",
|
|
164
|
-
value:
|
|
165
|
-
onChange: (e) =>
|
|
201
|
+
value: u,
|
|
202
|
+
onChange: (e) => d(e.target.value)
|
|
166
203
|
})] })]
|
|
167
204
|
}),
|
|
168
|
-
/* @__PURE__ */
|
|
205
|
+
/* @__PURE__ */ k("div", {
|
|
169
206
|
className: "flex flex-wrap items-center gap-2",
|
|
170
|
-
children: [/* @__PURE__ */
|
|
207
|
+
children: [/* @__PURE__ */ k(j, {
|
|
171
208
|
onClick: async () => {
|
|
172
|
-
if (!
|
|
209
|
+
if (!g) return;
|
|
173
210
|
let e = { headline: n.trim() };
|
|
174
211
|
i.trim() && (e.bio = i.trim());
|
|
175
212
|
let r = o.split(",").map((e) => e.trim()).filter(Boolean);
|
|
176
213
|
r.length && (e.expertise = r);
|
|
177
214
|
let a = Number.parseInt(c, 10);
|
|
178
|
-
!Number.isNaN(a) && a >= 0 && (e.hourlyRate = a),
|
|
215
|
+
!Number.isNaN(a) && a >= 0 && (e.hourlyRate = a), u.trim() && (e.currency = u.trim().toUpperCase()), (await p({ variables: { input: e } })).data?.tecBecomeMentor && (f.success("Mentor profile created", "Your profile is pending review."), t());
|
|
179
216
|
},
|
|
180
|
-
disabled: !
|
|
217
|
+
disabled: !g,
|
|
181
218
|
children: [
|
|
182
|
-
/* @__PURE__ */
|
|
219
|
+
/* @__PURE__ */ O(T, { size: 16 }),
|
|
183
220
|
" ",
|
|
184
|
-
|
|
221
|
+
h ? "Submitting…" : "Submit profile"
|
|
185
222
|
]
|
|
186
|
-
}), /* @__PURE__ */
|
|
223
|
+
}), /* @__PURE__ */ O(j, {
|
|
187
224
|
variant: "outline",
|
|
188
225
|
onClick: e,
|
|
189
|
-
disabled:
|
|
226
|
+
disabled: h,
|
|
190
227
|
children: "Cancel"
|
|
191
228
|
})]
|
|
192
229
|
})
|
|
@@ -194,99 +231,116 @@ function M({ onClose: e, onDone: t }) {
|
|
|
194
231
|
})]
|
|
195
232
|
});
|
|
196
233
|
}
|
|
197
|
-
function
|
|
198
|
-
let
|
|
234
|
+
function R() {
|
|
235
|
+
let n = t(), { currentUser: a } = e(), [o, s] = y(""), [f, m] = y(!1), { limit: _, more: D } = g(), { data: A, loading: P, error: F, refetch: R } = h({
|
|
199
236
|
status: "ACTIVE",
|
|
200
|
-
pagination:
|
|
201
|
-
}),
|
|
202
|
-
let e =
|
|
203
|
-
return e ?
|
|
204
|
-
}, [
|
|
205
|
-
return /* @__PURE__ */
|
|
237
|
+
pagination: p(_)
|
|
238
|
+
}), z = A?.tecListMentors.items ?? [], B = A?.tecListMentors.pageInfo.hasMore ?? !1, V = a?.id, H = !!(V && z.some((e) => e.userId === V)), U = v(() => {
|
|
239
|
+
let e = o.trim().toLowerCase();
|
|
240
|
+
return e ? z.filter((t) => t.headline.toLowerCase().includes(e) || t.expertise.some((t) => t.toLowerCase().includes(e))) : z;
|
|
241
|
+
}, [z, o]), W = z.filter((e) => e.isAcceptingMentees).length, G = z.reduce((e, t) => e + t.sessionsCount, 0), K = z.filter((e) => e.ratingAvg > 0), q = K.length ? (K.reduce((e, t) => e + t.ratingAvg, 0) / K.length).toFixed(1) : "—";
|
|
242
|
+
return /* @__PURE__ */ k(r, {
|
|
206
243
|
hero: !0,
|
|
207
244
|
title: "Find a Mentor",
|
|
208
245
|
description: "Connect with experienced builders for 1:1 guidance, code review, and career coaching.",
|
|
209
|
-
actions: /* @__PURE__ */
|
|
246
|
+
actions: /* @__PURE__ */ k(j, {
|
|
210
247
|
variant: "outline",
|
|
211
|
-
onClick: () =>
|
|
212
|
-
children: [/* @__PURE__ */
|
|
248
|
+
onClick: () => n("/mentorship/sessions-page"),
|
|
249
|
+
children: [/* @__PURE__ */ O(x, { size: 16 }), " My sessions"]
|
|
213
250
|
}),
|
|
214
251
|
children: [
|
|
215
|
-
|
|
252
|
+
H ? /* @__PURE__ */ k(M, {
|
|
216
253
|
className: "mb-6 flex items-center gap-3 p-4",
|
|
217
|
-
children: [/* @__PURE__ */
|
|
254
|
+
children: [/* @__PURE__ */ O("span", {
|
|
218
255
|
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-status-success-bg-subtle text-status-success-text",
|
|
219
|
-
children: /* @__PURE__ */
|
|
220
|
-
}), /* @__PURE__ */
|
|
256
|
+
children: /* @__PURE__ */ O(b, { size: 20 })
|
|
257
|
+
}), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("div", {
|
|
221
258
|
className: "text-sm font-semibold text-text-primary",
|
|
222
259
|
children: "You're a mentor"
|
|
223
|
-
}), /* @__PURE__ */
|
|
260
|
+
}), /* @__PURE__ */ O("div", {
|
|
224
261
|
className: "text-xs text-text-secondary",
|
|
225
262
|
children: "Your mentor profile is live. Mentees can request sessions with you."
|
|
226
263
|
})] })]
|
|
227
|
-
}) :
|
|
228
|
-
onClose: () =>
|
|
264
|
+
}) : f ? /* @__PURE__ */ O(L, {
|
|
265
|
+
onClose: () => m(!1),
|
|
229
266
|
onDone: () => {
|
|
230
|
-
|
|
267
|
+
m(!1), R();
|
|
231
268
|
}
|
|
232
269
|
}) : null,
|
|
233
|
-
/* @__PURE__ */
|
|
270
|
+
/* @__PURE__ */ k("div", {
|
|
234
271
|
className: "mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4",
|
|
235
|
-
children: [
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
272
|
+
children: [
|
|
273
|
+
/* @__PURE__ */ O(i, {
|
|
274
|
+
label: "Mentors",
|
|
275
|
+
value: z.length,
|
|
276
|
+
icon: E,
|
|
277
|
+
tone: "blue"
|
|
278
|
+
}),
|
|
279
|
+
/* @__PURE__ */ O(i, {
|
|
280
|
+
label: "Accepting mentees",
|
|
281
|
+
value: W,
|
|
282
|
+
icon: C,
|
|
283
|
+
tone: "green"
|
|
284
|
+
}),
|
|
285
|
+
/* @__PURE__ */ O(i, {
|
|
286
|
+
label: "Avg rating",
|
|
287
|
+
value: q,
|
|
288
|
+
icon: w,
|
|
289
|
+
tone: "amber"
|
|
290
|
+
}),
|
|
291
|
+
/* @__PURE__ */ O(i, {
|
|
292
|
+
label: "Total sessions",
|
|
293
|
+
value: G,
|
|
294
|
+
icon: x,
|
|
295
|
+
tone: "purple"
|
|
296
|
+
})
|
|
297
|
+
]
|
|
244
298
|
}),
|
|
245
|
-
/* @__PURE__ */
|
|
299
|
+
/* @__PURE__ */ k("div", {
|
|
246
300
|
className: "mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
|
|
247
|
-
children: [/* @__PURE__ */
|
|
301
|
+
children: [/* @__PURE__ */ k("div", {
|
|
248
302
|
className: "relative w-full sm:w-80",
|
|
249
|
-
children: [/* @__PURE__ */
|
|
303
|
+
children: [/* @__PURE__ */ O(S, {
|
|
250
304
|
className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-text-muted",
|
|
251
305
|
size: 16
|
|
252
|
-
}), /* @__PURE__ */
|
|
306
|
+
}), /* @__PURE__ */ O(N, {
|
|
253
307
|
className: "pl-9",
|
|
254
308
|
placeholder: "Search by headline or expertise…",
|
|
255
|
-
value:
|
|
256
|
-
onChange: (e) =>
|
|
309
|
+
value: o,
|
|
310
|
+
onChange: (e) => s(e.target.value)
|
|
257
311
|
})]
|
|
258
|
-
}), !
|
|
259
|
-
onClick: () =>
|
|
260
|
-
children: [/* @__PURE__ */
|
|
312
|
+
}), !H && !f ? /* @__PURE__ */ k(j, {
|
|
313
|
+
onClick: () => m(!0),
|
|
314
|
+
children: [/* @__PURE__ */ O(T, { size: 16 }), " Become a mentor"]
|
|
261
315
|
}) : null]
|
|
262
316
|
}),
|
|
263
|
-
|
|
317
|
+
P && !z.length ? /* @__PURE__ */ O(d, {}) : F ? /* @__PURE__ */ O(u, {
|
|
264
318
|
title: "Couldn't load mentors",
|
|
265
|
-
error:
|
|
266
|
-
}) :
|
|
267
|
-
icon: /* @__PURE__ */
|
|
268
|
-
title:
|
|
269
|
-
description:
|
|
270
|
-
action: !
|
|
271
|
-
onClick: () =>
|
|
319
|
+
error: F
|
|
320
|
+
}) : U.length === 0 ? /* @__PURE__ */ O(l, {
|
|
321
|
+
icon: /* @__PURE__ */ O(E, { size: 26 }),
|
|
322
|
+
title: o ? "No matching mentors" : "No mentors yet",
|
|
323
|
+
description: o ? "Try a different search term." : "Active mentors will appear here. TechnoSpam is pre-launch — be one of the first to sign up.",
|
|
324
|
+
action: !o && !H ? /* @__PURE__ */ O(j, {
|
|
325
|
+
onClick: () => m(!0),
|
|
272
326
|
children: "Become a mentor"
|
|
273
327
|
}) : void 0
|
|
274
|
-
}) : /* @__PURE__ */
|
|
328
|
+
}) : /* @__PURE__ */ O("div", {
|
|
275
329
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
276
|
-
children:
|
|
330
|
+
children: U.map((e) => /* @__PURE__ */ O(I, {
|
|
277
331
|
mentor: e,
|
|
278
|
-
onOpen: () =>
|
|
332
|
+
onOpen: () => n(`/mentorship/mentor-profile-page?id=${e.id}`)
|
|
279
333
|
}, e.id))
|
|
280
334
|
}),
|
|
281
|
-
/* @__PURE__ */
|
|
282
|
-
hasMore:
|
|
283
|
-
loading:
|
|
284
|
-
onClick:
|
|
335
|
+
/* @__PURE__ */ O(c, {
|
|
336
|
+
hasMore: B,
|
|
337
|
+
loading: P,
|
|
338
|
+
onClick: D
|
|
285
339
|
})
|
|
286
340
|
]
|
|
287
341
|
});
|
|
288
342
|
}
|
|
289
343
|
//#endregion
|
|
290
|
-
export {
|
|
344
|
+
export { R as MentorshipMentorsPagePage };
|
|
291
345
|
|
|
292
346
|
//# sourceMappingURL=MentorshipMentorsPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MentorshipMentorsPagePage.js","names":[],"sources":["../../../src/technospam/pages/MentorshipMentorsPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { Award, MessageSquare, Search, Sparkles, Star, UserPlus, Users, X } from 'lucide-react';\nimport { Badge, Button, GlassCard, Input, Textarea } from '@burdenoff/fe-libs/ui';\nimport { EmptyView, ErrorView, LoadMore, LoadingGrid, PageLayout, StatCard } from '../components';\nimport { useTechnoSpam, useTechnoSpamNavigate } from '../providers/TechnoSpamProvider';\nimport {\n pageArg,\n useBecomeMentor,\n useMentorsQuery,\n usePageLimit,\n type TecMentor,\n} from '../api/technospamApi';\nimport { formatMoney } from '../utils/format';\nimport { notify } from '../lib/toast';\n\nfunction MentorCard({ mentor, onOpen }: { mentor: TecMentor; onOpen: () => void }) {\n return (\n <GlassCard\n className=\"group flex cursor-pointer flex-col gap-3 p-5 transition-shadow hover:shadow-md\"\n onClick={onOpen}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary group-hover:text-accent-primary\">\n {mentor.headline}\n </h3>\n <div className=\"mt-1 text-sm font-medium text-text-secondary\">\n {formatMoney(mentor.hourlyRate, mentor.currency)}\n <span className=\"text-text-muted\"> / hr</span>\n </div>\n </div>\n {mentor.isAcceptingMentees ? (\n <Badge\n variant=\"outline\"\n className=\"shrink-0 border-status-success-border bg-status-success-bg-subtle text-status-success-text\"\n >\n Accepting mentees\n </Badge>\n ) : (\n <Badge\n variant=\"outline\"\n className=\"shrink-0 border-border-seam bg-bg-sunken text-text-secondary\"\n >\n Not accepting\n </Badge>\n )}\n </div>\n\n {mentor.bio ? <p className=\"line-clamp-2 text-sm text-text-secondary\">{mentor.bio}</p> : null}\n\n {mentor.expertise.length ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {mentor.expertise.slice(0, 4).map((skill) => (\n <Badge key={skill} variant=\"secondary\" className=\"text-[11px]\">\n {skill}\n </Badge>\n ))}\n {mentor.expertise.length > 4 ? (\n <span className=\"text-xs text-text-muted\">+{mentor.expertise.length - 4} more</span>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"mt-auto flex items-center gap-4 pt-1 text-xs text-text-muted\">\n <span className=\"inline-flex items-center gap-1\">\n <Star size={13} className=\"text-accent-teal\" />\n {mentor.ratingAvg > 0 ? mentor.ratingAvg.toFixed(1) : 'New'}\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <MessageSquare size={13} /> {mentor.sessionsCount} sessions\n </span>\n </div>\n </GlassCard>\n );\n}\n\nfunction BecomeMentorForm({ onClose, onDone }: { onClose: () => void; onDone: () => void }) {\n const [headline, setHeadline] = useState('');\n const [bio, setBio] = useState('');\n const [expertise, setExpertise] = useState('');\n const [hourlyRate, setHourlyRate] = useState('');\n const [currency, setCurrency] = useState('USD');\n const [becomeMentor, { loading }] = useBecomeMentor();\n\n const canSubmit = headline.trim().length > 0 && !loading;\n\n const handleSubmit = async () => {\n if (!canSubmit) return;\n const input: {\n headline: string;\n bio?: string;\n expertise?: string[];\n hourlyRate?: number;\n currency?: string;\n } = { headline: headline.trim() };\n if (bio.trim()) input.bio = bio.trim();\n const exp = expertise\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n if (exp.length) input.expertise = exp;\n const rate = Number.parseInt(hourlyRate, 10);\n if (!Number.isNaN(rate) && rate >= 0) input.hourlyRate = rate;\n if (currency.trim()) input.currency = currency.trim().toUpperCase();\n\n const res = await becomeMentor({ variables: { input } });\n if (res.data?.tecBecomeMentor) {\n notify.success('Mentor profile created', 'Your profile is pending review.');\n onDone();\n }\n };\n\n return (\n <GlassCard className=\"mb-6 p-5\">\n <div className=\"mb-4 flex items-center justify-between\">\n <div>\n <h2 className=\"text-base font-semibold text-text-primary\">Become a mentor</h2>\n <p className=\"text-sm text-text-secondary\">\n Share your expertise and start mentoring builders in the community.\n </p>\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={onClose} aria-label=\"Close\">\n <X size={16} />\n </Button>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Headline <span className=\"text-status-error-text\">*</span>\n </label>\n <Input\n placeholder=\"e.g. Staff Engineer · Distributed systems & career growth\"\n value={headline}\n onChange={(e) => setHeadline(e.target.value)}\n />\n </div>\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Bio</label>\n <Textarea\n rows={3}\n placeholder=\"Tell mentees about your experience and how you can help.\"\n value={bio}\n onChange={(e) => setBio(e.target.value)}\n />\n </div>\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Expertise</label>\n <Input\n placeholder=\"React, System design, Career coaching\"\n value={expertise}\n onChange={(e) => setExpertise(e.target.value)}\n />\n <p className=\"mt-1 text-xs text-text-muted\">Comma-separated topics.</p>\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 Hourly rate\n </label>\n <Input\n type=\"number\"\n min={0}\n placeholder=\"0\"\n value={hourlyRate}\n onChange={(e) => setHourlyRate(e.target.value)}\n />\n <p className=\"mt-1 text-xs text-text-muted\">Whole number. Leave 0 for free.</p>\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Currency</label>\n <Input\n placeholder=\"USD\"\n value={currency}\n onChange={(e) => setCurrency(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button onClick={handleSubmit} disabled={!canSubmit}>\n <UserPlus size={16} /> {loading ? 'Submitting…' : 'Submit profile'}\n </Button>\n <Button variant=\"outline\" onClick={onClose} disabled={loading}>\n Cancel\n </Button>\n </div>\n </div>\n </GlassCard>\n );\n}\n\nexport function MentorshipMentorsPagePage() {\n const navigate = useTechnoSpamNavigate();\n const { currentUser } = useTechnoSpam();\n const [search, setSearch] = useState('');\n const [showForm, setShowForm] = useState(false);\n\n const { limit, more } = usePageLimit();\n const { data, loading, error, refetch } = useMentorsQuery({\n status: 'ACTIVE',\n pagination: pageArg(limit),\n });\n\n const mentors = data?.tecListMentors.items ?? [];\n const hasMore = data?.tecListMentors.pageInfo.hasMore ?? false;\n const userId = currentUser?.id;\n const alreadyMentor = Boolean(userId && mentors.some((m) => m.userId === userId));\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return mentors;\n return mentors.filter(\n (m) =>\n m.headline.toLowerCase().includes(q) ||\n m.expertise.some((skill) => skill.toLowerCase().includes(q))\n );\n }, [mentors, search]);\n\n const accepting = mentors.filter((m) => m.isAcceptingMentees).length;\n\n return (\n <PageLayout\n hero\n title=\"Find a Mentor\"\n description=\"Connect with experienced builders for 1:1 guidance, code review, and career coaching.\"\n actions={\n <Button variant=\"outline\" onClick={() => navigate('/mentorship/sessions-page')}>\n <MessageSquare size={16} /> My sessions\n </Button>\n }\n >\n {alreadyMentor ? (\n <GlassCard className=\"mb-6 flex items-center gap-3 p-4\">\n <span className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-status-success-bg-subtle text-status-success-text\">\n <Award size={20} />\n </span>\n <div>\n <div className=\"text-sm font-semibold text-text-primary\">You're a mentor</div>\n <div className=\"text-xs text-text-secondary\">\n Your mentor profile is live. Mentees can request sessions with you.\n </div>\n </div>\n </GlassCard>\n ) : showForm ? (\n <BecomeMentorForm\n onClose={() => setShowForm(false)}\n onDone={() => {\n setShowForm(false);\n void refetch();\n }}\n />\n ) : null}\n\n <div className=\"mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <StatCard label=\"Mentors\" value={mentors.length} icon={Users} />\n <StatCard label=\"Accepting mentees\" value={accepting} icon={Sparkles} />\n </div>\n\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"relative w-full sm:w-80\">\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 by headline or expertise…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n {!alreadyMentor && !showForm ? (\n <Button onClick={() => setShowForm(true)}>\n <UserPlus size={16} /> Become a mentor\n </Button>\n ) : null}\n </div>\n\n {loading && !mentors.length ? (\n <LoadingGrid />\n ) : error ? (\n <ErrorView title=\"Couldn't load mentors\" error={error} />\n ) : filtered.length === 0 ? (\n <EmptyView\n icon={<Users size={26} />}\n title={search ? 'No matching mentors' : 'No mentors yet'}\n description={\n search\n ? 'Try a different search term.'\n : 'Active mentors will appear here. TechnoSpam is pre-launch — be one of the first to sign up.'\n }\n action={\n !search && !alreadyMentor ? (\n <Button onClick={() => setShowForm(true)}>Become a mentor</Button>\n ) : undefined\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filtered.map((mentor) => (\n <MentorCard\n key={mentor.id}\n mentor={mentor}\n onOpen={() => navigate(`/mentorship/mentor-profile-page?id=${mentor.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":"MentorshipMentorsPagePage.js","names":[],"sources":["../../../src/technospam/pages/MentorshipMentorsPagePage.tsx"],"sourcesContent":["import { createElement, useMemo, useState } from 'react';\nimport { Award, MessageSquare, Search, Sparkles, Star, UserPlus, Users, X } from 'lucide-react';\nimport { Badge, Button, GlassCard, Input, Textarea } from '@burdenoff/fe-libs/ui';\nimport {\n EmptyView,\n ErrorView,\n LoadMore,\n LoadingGrid,\n PageLayout,\n StatCard,\n coverGradient,\n topicIcon,\n} from '../components';\nimport { useTechnoSpam, useTechnoSpamNavigate } from '../providers/TechnoSpamProvider';\nimport {\n pageArg,\n useBecomeMentor,\n useMentorsQuery,\n usePageLimit,\n type TecMentor,\n} from '../api/technospamApi';\nimport { formatMoney } from '../utils/format';\nimport { cn } from '../utils/cn';\nimport { notify } from '../lib/toast';\n\n/** Circular gradient medallion standing in for a mentor avatar, with a live\n * \"accepting\" presence dot — mirrors the directory mockup within the dark theme. */\nfunction MentorMedallion({ mentor, size = 'md' }: { mentor: TecMentor; size?: 'md' | 'lg' }) {\n const box = size === 'lg' ? 'h-20 w-20' : 'h-16 w-16';\n return (\n <div className=\"relative shrink-0\">\n <span\n className={cn(\n 'flex items-center justify-center rounded-full bg-gradient-to-br text-white shadow-md ring-1 ring-white/15',\n box,\n coverGradient(mentor.headline)\n )}\n >\n {createElement(topicIcon(mentor.expertise.join(' ') || mentor.headline), {\n size: size === 'lg' ? 32 : 26,\n strokeWidth: 1.7,\n })}\n </span>\n {mentor.isAcceptingMentees ? (\n <span className=\"absolute -bottom-0.5 -right-0.5 h-4 w-4 rounded-full border-2 border-bg-surface bg-status-success-text\" />\n ) : null}\n </div>\n );\n}\n\nfunction MentorCard({ mentor, onOpen }: { mentor: TecMentor; onOpen: () => void }) {\n return (\n <GlassCard\n className=\"group flex cursor-pointer flex-col gap-4 p-5 transition-all duration-200 hover:-translate-y-1 hover:shadow-lg\"\n onClick={onOpen}\n >\n <div className=\"flex items-start gap-4\">\n <MentorMedallion mentor={mentor} />\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"truncate text-base font-semibold text-text-primary group-hover:text-accent-primary\">\n {mentor.headline}\n </h3>\n {mentor.isAcceptingMentees ? (\n <Badge\n variant=\"outline\"\n className=\"mt-1.5 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 mentees\n </Badge>\n ) : (\n <Badge\n variant=\"outline\"\n className=\"mt-1.5 border-border-seam bg-bg-sunken text-text-secondary\"\n >\n Not accepting\n </Badge>\n )}\n </div>\n </div>\n\n {mentor.bio ? <p className=\"line-clamp-2 text-sm text-text-secondary\">{mentor.bio}</p> : null}\n\n {mentor.expertise.length ? (\n <div className=\"flex flex-wrap gap-1.5\">\n {mentor.expertise.slice(0, 4).map((skill) => (\n <Badge key={skill} variant=\"secondary\" className=\"text-[11px]\">\n {skill}\n </Badge>\n ))}\n {mentor.expertise.length > 4 ? (\n <span className=\"self-center text-xs text-text-muted\">\n +{mentor.expertise.length - 4}\n </span>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"mt-auto grid grid-cols-3 divide-x divide-border-seam rounded-xl border border-border-seam bg-bg-sunken text-center\">\n <div className=\"px-2 py-2.5\">\n <div className=\"flex items-center justify-center gap-1 text-sm font-semibold text-text-primary\">\n <Star size={13} className=\"text-accent-teal\" />\n {mentor.ratingAvg > 0 ? mentor.ratingAvg.toFixed(1) : 'New'}\n </div>\n <div className=\"text-[11px] text-text-muted\">rating</div>\n </div>\n <div className=\"px-2 py-2.5\">\n <div className=\"text-sm font-semibold text-text-primary\">{mentor.sessionsCount}</div>\n <div className=\"text-[11px] text-text-muted\">sessions</div>\n </div>\n <div className=\"px-2 py-2.5\">\n <div className=\"text-sm font-semibold text-text-primary\">\n {formatMoney(mentor.hourlyRate, mentor.currency)}\n </div>\n <div className=\"text-[11px] text-text-muted\">/ hr</div>\n </div>\n </div>\n\n <Button\n className=\"w-full\"\n onClick={(e) => {\n e.stopPropagation();\n onOpen();\n }}\n >\n View profile\n </Button>\n </GlassCard>\n );\n}\n\nfunction BecomeMentorForm({ onClose, onDone }: { onClose: () => void; onDone: () => void }) {\n const [headline, setHeadline] = useState('');\n const [bio, setBio] = useState('');\n const [expertise, setExpertise] = useState('');\n const [hourlyRate, setHourlyRate] = useState('');\n const [currency, setCurrency] = useState('USD');\n const [becomeMentor, { loading }] = useBecomeMentor();\n\n const canSubmit = headline.trim().length > 0 && !loading;\n\n const handleSubmit = async () => {\n if (!canSubmit) return;\n const input: {\n headline: string;\n bio?: string;\n expertise?: string[];\n hourlyRate?: number;\n currency?: string;\n } = { headline: headline.trim() };\n if (bio.trim()) input.bio = bio.trim();\n const exp = expertise\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n if (exp.length) input.expertise = exp;\n const rate = Number.parseInt(hourlyRate, 10);\n if (!Number.isNaN(rate) && rate >= 0) input.hourlyRate = rate;\n if (currency.trim()) input.currency = currency.trim().toUpperCase();\n\n const res = await becomeMentor({ variables: { input } });\n if (res.data?.tecBecomeMentor) {\n notify.success('Mentor profile created', 'Your profile is pending review.');\n onDone();\n }\n };\n\n return (\n <GlassCard className=\"mb-6 p-5\">\n <div className=\"mb-4 flex items-start justify-between gap-3\">\n <div className=\"flex items-center 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-indigo text-white shadow-sm\">\n <UserPlus size={20} />\n </span>\n <div>\n <h2 className=\"text-base font-semibold text-text-primary\">Become a mentor</h2>\n <p className=\"text-sm text-text-secondary\">\n Share your expertise and start mentoring builders in the community.\n </p>\n </div>\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={onClose} aria-label=\"Close\">\n <X size={16} />\n </Button>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Headline <span className=\"text-status-error-text\">*</span>\n </label>\n <Input\n placeholder=\"e.g. Staff Engineer · Distributed systems & career growth\"\n value={headline}\n onChange={(e) => setHeadline(e.target.value)}\n />\n </div>\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Bio</label>\n <Textarea\n rows={3}\n placeholder=\"Tell mentees about your experience and how you can help.\"\n value={bio}\n onChange={(e) => setBio(e.target.value)}\n />\n </div>\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Expertise</label>\n <Input\n placeholder=\"React, System design, Career coaching\"\n value={expertise}\n onChange={(e) => setExpertise(e.target.value)}\n />\n <p className=\"mt-1 text-xs text-text-muted\">Comma-separated topics.</p>\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 Hourly rate\n </label>\n <Input\n type=\"number\"\n min={0}\n placeholder=\"0\"\n value={hourlyRate}\n onChange={(e) => setHourlyRate(e.target.value)}\n />\n <p className=\"mt-1 text-xs text-text-muted\">Whole number. Leave 0 for free.</p>\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Currency</label>\n <Input\n placeholder=\"USD\"\n value={currency}\n onChange={(e) => setCurrency(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button onClick={handleSubmit} disabled={!canSubmit}>\n <UserPlus size={16} /> {loading ? 'Submitting…' : 'Submit profile'}\n </Button>\n <Button variant=\"outline\" onClick={onClose} disabled={loading}>\n Cancel\n </Button>\n </div>\n </div>\n </GlassCard>\n );\n}\n\nexport function MentorshipMentorsPagePage() {\n const navigate = useTechnoSpamNavigate();\n const { currentUser } = useTechnoSpam();\n const [search, setSearch] = useState('');\n const [showForm, setShowForm] = useState(false);\n\n const { limit, more } = usePageLimit();\n const { data, loading, error, refetch } = useMentorsQuery({\n status: 'ACTIVE',\n pagination: pageArg(limit),\n });\n\n const mentors = data?.tecListMentors.items ?? [];\n const hasMore = data?.tecListMentors.pageInfo.hasMore ?? false;\n const userId = currentUser?.id;\n const alreadyMentor = Boolean(userId && mentors.some((m) => m.userId === userId));\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return mentors;\n return mentors.filter(\n (m) =>\n m.headline.toLowerCase().includes(q) ||\n m.expertise.some((skill) => skill.toLowerCase().includes(q))\n );\n }, [mentors, search]);\n\n const accepting = mentors.filter((m) => m.isAcceptingMentees).length;\n const totalSessions = mentors.reduce((s, m) => s + m.sessionsCount, 0);\n const rated = mentors.filter((m) => m.ratingAvg > 0);\n const avgRating = rated.length\n ? (rated.reduce((s, m) => s + m.ratingAvg, 0) / rated.length).toFixed(1)\n : '—';\n\n return (\n <PageLayout\n hero\n title=\"Find a Mentor\"\n description=\"Connect with experienced builders for 1:1 guidance, code review, and career coaching.\"\n actions={\n <Button variant=\"outline\" onClick={() => navigate('/mentorship/sessions-page')}>\n <MessageSquare size={16} /> My sessions\n </Button>\n }\n >\n {alreadyMentor ? (\n <GlassCard className=\"mb-6 flex items-center gap-3 p-4\">\n <span className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-status-success-bg-subtle text-status-success-text\">\n <Award size={20} />\n </span>\n <div>\n <div className=\"text-sm font-semibold text-text-primary\">You're a mentor</div>\n <div className=\"text-xs text-text-secondary\">\n Your mentor profile is live. Mentees can request sessions with you.\n </div>\n </div>\n </GlassCard>\n ) : showForm ? (\n <BecomeMentorForm\n onClose={() => setShowForm(false)}\n onDone={() => {\n setShowForm(false);\n void refetch();\n }}\n />\n ) : null}\n\n <div className=\"mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <StatCard label=\"Mentors\" value={mentors.length} icon={Users} tone=\"blue\" />\n <StatCard label=\"Accepting mentees\" value={accepting} icon={Sparkles} tone=\"green\" />\n <StatCard label=\"Avg rating\" value={avgRating} icon={Star} tone=\"amber\" />\n <StatCard label=\"Total sessions\" value={totalSessions} icon={MessageSquare} tone=\"purple\" />\n </div>\n\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"relative w-full sm:w-80\">\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 by headline or expertise…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n {!alreadyMentor && !showForm ? (\n <Button onClick={() => setShowForm(true)}>\n <UserPlus size={16} /> Become a mentor\n </Button>\n ) : null}\n </div>\n\n {loading && !mentors.length ? (\n <LoadingGrid />\n ) : error ? (\n <ErrorView title=\"Couldn't load mentors\" error={error} />\n ) : filtered.length === 0 ? (\n <EmptyView\n icon={<Users size={26} />}\n title={search ? 'No matching mentors' : 'No mentors yet'}\n description={\n search\n ? 'Try a different search term.'\n : 'Active mentors will appear here. TechnoSpam is pre-launch — be one of the first to sign up.'\n }\n action={\n !search && !alreadyMentor ? (\n <Button onClick={() => setShowForm(true)}>Become a mentor</Button>\n ) : undefined\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filtered.map((mentor) => (\n <MentorCard\n key={mentor.id}\n mentor={mentor}\n onOpen={() => navigate(`/mentorship/mentor-profile-page?id=${mentor.id}`)}\n />\n ))}\n </div>\n )}\n <LoadMore hasMore={hasMore} loading={loading} onClick={more} />\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|