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