@burdenoff/microfe-technospam 2026.705.2 → 2026.709.2

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