@burdenoff/microfe-buildmyiq 2026.705.13 → 2026.706.10
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/buildmyiq/BuildmyiqRoot.d.ts.map +1 -1
- package/dist/buildmyiq/BuildmyiqRoot.js +57 -49
- package/dist/buildmyiq/BuildmyiqRoot.js.map +1 -1
- package/dist/buildmyiq/BuildmyiqRoutes.d.ts.map +1 -1
- package/dist/buildmyiq/BuildmyiqRoutes.js +15 -11
- package/dist/buildmyiq/BuildmyiqRoutes.js.map +1 -1
- package/dist/buildmyiq/components/Avatar.d.ts +15 -0
- package/dist/buildmyiq/components/Avatar.d.ts.map +1 -0
- package/dist/buildmyiq/components/Avatar.js +42 -0
- package/dist/buildmyiq/components/Avatar.js.map +1 -0
- package/dist/buildmyiq/components/Viz.d.ts +25 -0
- package/dist/buildmyiq/components/Viz.d.ts.map +1 -0
- package/dist/buildmyiq/components/Viz.js +78 -0
- package/dist/buildmyiq/components/Viz.js.map +1 -0
- package/dist/buildmyiq/components/index.d.ts +2 -0
- package/dist/buildmyiq/components/index.d.ts.map +1 -1
- package/dist/buildmyiq/components/index.js +2 -0
- package/dist/buildmyiq/pages/DashboardPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/DashboardPage.js +200 -98
- package/dist/buildmyiq/pages/DashboardPage.js.map +1 -1
- package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.js +262 -241
- package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.js.map +1 -1
- package/dist/buildmyiq/pages/assessments/AssessmentsPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/assessments/AssessmentsPage.js +142 -115
- package/dist/buildmyiq/pages/assessments/AssessmentsPage.js.map +1 -1
- package/dist/buildmyiq/pages/assessments/TakeAssessmentPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/assessments/TakeAssessmentPage.js +220 -156
- package/dist/buildmyiq/pages/assessments/TakeAssessmentPage.js.map +1 -1
- package/dist/buildmyiq/pages/authoring/AuthoringPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/authoring/AuthoringPage.js +51 -46
- package/dist/buildmyiq/pages/authoring/AuthoringPage.js.map +1 -1
- package/dist/buildmyiq/pages/authoring/CourseBuilderPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/authoring/CourseBuilderPage.js +581 -448
- package/dist/buildmyiq/pages/authoring/CourseBuilderPage.js.map +1 -1
- package/dist/buildmyiq/pages/catalog/CatalogPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/catalog/CatalogPage.js +52 -42
- package/dist/buildmyiq/pages/catalog/CatalogPage.js.map +1 -1
- package/dist/buildmyiq/pages/catalog/CourseDetailPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/catalog/CourseDetailPage.js +422 -301
- package/dist/buildmyiq/pages/catalog/CourseDetailPage.js.map +1 -1
- package/dist/buildmyiq/pages/certificates/CertificatesPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/certificates/CertificatesPage.js +237 -151
- package/dist/buildmyiq/pages/certificates/CertificatesPage.js.map +1 -1
- package/dist/buildmyiq/pages/cohorts/CohortsPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/cohorts/CohortsPage.js +219 -138
- package/dist/buildmyiq/pages/cohorts/CohortsPage.js.map +1 -1
- package/dist/buildmyiq/pages/insights/InsightsPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/insights/InsightsPage.js +276 -152
- package/dist/buildmyiq/pages/insights/InsightsPage.js.map +1 -1
- package/dist/buildmyiq/pages/learning/LessonPlayerPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/learning/LessonPlayerPage.js +237 -174
- package/dist/buildmyiq/pages/learning/LessonPlayerPage.js.map +1 -1
- package/dist/buildmyiq/pages/learning/MyLearningPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/learning/MyLearningPage.js +307 -169
- package/dist/buildmyiq/pages/learning/MyLearningPage.js.map +1 -1
- package/dist/buildmyiq/pages/paths/PathsPage.d.ts +4 -0
- package/dist/buildmyiq/pages/paths/PathsPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/paths/PathsPage.js +187 -0
- package/dist/buildmyiq/pages/paths/PathsPage.js.map +1 -0
- package/dist/buildmyiq/pages/skills/SkillsPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/skills/SkillsPage.js +233 -140
- package/dist/buildmyiq/pages/skills/SkillsPage.js.map +1 -1
- package/dist/buildmyiq/pages/submissions/SubmissionsPage.d.ts.map +1 -1
- package/dist/buildmyiq/pages/submissions/SubmissionsPage.js +379 -275
- package/dist/buildmyiq/pages/submissions/SubmissionsPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,292 +1,355 @@
|
|
|
1
1
|
import { useBuildmyiq as e } from "../../context/BuildmyiqContext.js";
|
|
2
2
|
import { cn as t } from "../../utils/cn.js";
|
|
3
3
|
import { PageLayout as n } from "../../components/PageLayout.js";
|
|
4
|
-
import { formatDuration as r } from "../../utils/formatters.js";
|
|
5
|
-
import { StatusBadge as
|
|
6
|
-
import { EmptyState as
|
|
7
|
-
import { ErrorView as
|
|
8
|
-
import { MiniBar as
|
|
4
|
+
import { formatDuration as r, formatEnumLabel as i } from "../../utils/formatters.js";
|
|
5
|
+
import { StatusBadge as a } from "../../components/StatusBadge.js";
|
|
6
|
+
import { EmptyState as o } from "../../components/EmptyState.js";
|
|
7
|
+
import { ErrorView as s, LoadingView as c } from "../../components/StateViews.js";
|
|
8
|
+
import { MiniBar as l } from "../../components/MiniBar.js";
|
|
9
|
+
import { ProgressRing as u } from "../../components/Viz.js";
|
|
9
10
|
import "../../context/index.js";
|
|
10
|
-
import { useBuiCourse as ee, useBuiEnrollment as
|
|
11
|
+
import { useBuiCourse as ee, useBuiEnrollment as te, useBuiRecordLessonProgress as ne, useBuiTransitionEnrollment as re } from "../../hooks/useBuildmyiqApi.js";
|
|
11
12
|
import "../../hooks/index.js";
|
|
12
|
-
import { FileLink as
|
|
13
|
+
import { FileLink as d } from "../../components/FileLink.js";
|
|
13
14
|
import "../../components/index.js";
|
|
14
|
-
import { useEffect as
|
|
15
|
-
import { ArrowLeft as
|
|
16
|
-
import { useParams as
|
|
17
|
-
import { jsx as
|
|
18
|
-
import { Button as
|
|
15
|
+
import { useEffect as ie, useMemo as f, useRef as p, useState as m } from "react";
|
|
16
|
+
import { ArrowLeft as ae, BookOpen as h, Check as g, CheckCircle2 as _, ChevronLeft as oe, ChevronRight as se, FileText as v, HelpCircle as y, ListChecks as b, Loader2 as x, MousePointerClick as S, PenLine as C, PlayCircle as w, Radio as T, Trophy as ce } from "lucide-react";
|
|
17
|
+
import { useParams as le } from "react-router-dom";
|
|
18
|
+
import { Fragment as ue, jsx as E, jsxs as D } from "react/jsx-runtime";
|
|
19
|
+
import { Button as O, GlassCard as k } from "@burdenoff/fe-libs/ui";
|
|
19
20
|
//#region src/buildmyiq/pages/learning/LessonPlayerPage.tsx
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
var A = {
|
|
22
|
+
ARTICLE: v,
|
|
23
|
+
VIDEO: w,
|
|
24
|
+
QUIZ: y,
|
|
25
|
+
ASSIGNMENT: C,
|
|
26
|
+
INTERACTIVE: S,
|
|
27
|
+
LIVE_SESSION: T
|
|
28
|
+
}, j = (e) => [...e].sort((e, t) => e.position - t.position), M = () => {
|
|
29
|
+
let { enrollmentId: y } = le(), { navigateTo: S } = e(), C = te(y), w = C.data ?? null, T = w?.courseId, M = ee(T), N = M.data ?? null, P = ne(), F = re(), I = P.mutate, L = p(/* @__PURE__ */ new Set()), [R, z] = m(null), [B, V] = m(!1), H = f(() => {
|
|
30
|
+
if (!N) return [];
|
|
31
|
+
let e = /* @__PURE__ */ new Set(), t = j(N.modules ?? []), n = [];
|
|
24
32
|
for (let r of t) {
|
|
25
|
-
let t =
|
|
33
|
+
let t = j(r.lessons ?? []).filter((t) => e.has(t.id) ? !1 : (e.add(t.id), !0));
|
|
26
34
|
t.length > 0 && n.push({
|
|
27
35
|
id: r.id,
|
|
28
36
|
title: r.title,
|
|
29
37
|
lessons: t
|
|
30
38
|
});
|
|
31
39
|
}
|
|
32
|
-
let r =
|
|
40
|
+
let r = j(N.lessons ?? []).filter((t) => e.has(t.id) ? !1 : (e.add(t.id), !0));
|
|
33
41
|
return r.length > 0 && n.push({
|
|
34
42
|
id: "__standalone",
|
|
35
43
|
title: "Lessons",
|
|
36
44
|
lessons: r
|
|
37
45
|
}), n;
|
|
38
|
-
}, [
|
|
46
|
+
}, [N]), U = f(() => H.flatMap((e) => e.lessons), [H]), W = f(() => {
|
|
39
47
|
let e = /* @__PURE__ */ new Map();
|
|
40
|
-
for (let t of
|
|
48
|
+
for (let t of w?.lessonProgress ?? []) e.set(t.lessonId, t.status);
|
|
41
49
|
return e;
|
|
42
|
-
}, [
|
|
43
|
-
|
|
44
|
-
if (!
|
|
45
|
-
let e =
|
|
46
|
-
e === "COMPLETED" || e === "IN_PROGRESS" ||
|
|
47
|
-
enrollmentId:
|
|
48
|
-
lessonId:
|
|
50
|
+
}, [w]), G = f(() => U.length === 0 ? null : R && U.some((e) => e.id === R) ? R : U[0].id, [U, R]);
|
|
51
|
+
ie(() => {
|
|
52
|
+
if (!y || !G) return;
|
|
53
|
+
let e = W.get(G);
|
|
54
|
+
e === "COMPLETED" || e === "IN_PROGRESS" || L.current.has(G) || (L.current.add(G), I({
|
|
55
|
+
enrollmentId: y,
|
|
56
|
+
lessonId: G,
|
|
49
57
|
status: "IN_PROGRESS"
|
|
50
58
|
}));
|
|
51
59
|
}, [
|
|
52
|
-
|
|
53
|
-
K,
|
|
60
|
+
y,
|
|
54
61
|
G,
|
|
55
|
-
|
|
62
|
+
W,
|
|
63
|
+
I
|
|
56
64
|
]);
|
|
57
|
-
let
|
|
58
|
-
|
|
65
|
+
let K = U.findIndex((e) => e.id === G), q = K >= 0 ? U[K] : null, J = (q ? W.get(q.id) : void 0) === "COMPLETED", Y = U.filter((e) => W.get(e.id) === "COMPLETED").length, de = U.length > 0 && Y === U.length, fe = w?.status === "COMPLETED", X = (e) => {
|
|
66
|
+
z(e), V(!1);
|
|
59
67
|
}, Z = (e) => {
|
|
60
|
-
if (
|
|
61
|
-
let t =
|
|
68
|
+
if (K < 0) return;
|
|
69
|
+
let t = U[K + e];
|
|
62
70
|
t && X(t.id);
|
|
63
|
-
},
|
|
64
|
-
if (!
|
|
65
|
-
await
|
|
66
|
-
enrollmentId:
|
|
67
|
-
lessonId:
|
|
71
|
+
}, pe = async () => {
|
|
72
|
+
if (!y || !q) return;
|
|
73
|
+
await P.mutateAsync({
|
|
74
|
+
enrollmentId: y,
|
|
75
|
+
lessonId: q.id,
|
|
68
76
|
status: "COMPLETED"
|
|
69
77
|
});
|
|
70
|
-
let e =
|
|
71
|
-
e &&
|
|
72
|
-
},
|
|
73
|
-
|
|
74
|
-
id:
|
|
78
|
+
let e = U[K + 1];
|
|
79
|
+
e && z(e.id);
|
|
80
|
+
}, me = async () => {
|
|
81
|
+
y && await F.mutateAsync({
|
|
82
|
+
id: y,
|
|
75
83
|
status: "COMPLETED"
|
|
76
84
|
});
|
|
77
85
|
};
|
|
78
|
-
if (!
|
|
86
|
+
if (!y) return /* @__PURE__ */ E(n, {
|
|
79
87
|
title: "Lesson",
|
|
80
|
-
children: /* @__PURE__ */
|
|
88
|
+
children: /* @__PURE__ */ E(o, {
|
|
81
89
|
illustration: "empty-data",
|
|
82
90
|
title: "No enrollment selected",
|
|
83
91
|
description: "Open a course from My Learning to start the lesson player.",
|
|
84
|
-
action: /* @__PURE__ */
|
|
85
|
-
onClick: () =>
|
|
92
|
+
action: /* @__PURE__ */ E(O, {
|
|
93
|
+
onClick: () => S("learning"),
|
|
86
94
|
children: "Back to My Learning"
|
|
87
95
|
})
|
|
88
96
|
})
|
|
89
97
|
});
|
|
90
|
-
let
|
|
98
|
+
let he = C.isLoading || !!T && M.isLoading, Q = /* @__PURE__ */ D(O, {
|
|
91
99
|
variant: "ghost",
|
|
92
100
|
size: "sm",
|
|
93
|
-
onClick: () =>
|
|
94
|
-
children: [/* @__PURE__ */
|
|
101
|
+
onClick: () => S("learning"),
|
|
102
|
+
children: [/* @__PURE__ */ E(ae, { className: "mr-1 h-4 w-4" }), " My Learning"]
|
|
95
103
|
});
|
|
96
|
-
if (
|
|
104
|
+
if (he) return /* @__PURE__ */ E(n, {
|
|
97
105
|
title: "Lesson",
|
|
98
106
|
actions: Q,
|
|
99
|
-
children: /* @__PURE__ */
|
|
107
|
+
children: /* @__PURE__ */ E(c, { label: "Loading your lesson…" })
|
|
100
108
|
});
|
|
101
|
-
if (
|
|
109
|
+
if (C.isError) return /* @__PURE__ */ E(n, {
|
|
102
110
|
title: "Lesson",
|
|
103
111
|
actions: Q,
|
|
104
|
-
children: /* @__PURE__ */
|
|
112
|
+
children: /* @__PURE__ */ E(s, {
|
|
105
113
|
title: "Couldn't load this enrollment",
|
|
106
|
-
message:
|
|
107
|
-
onRetry: () =>
|
|
114
|
+
message: C.error instanceof Error ? C.error.message : void 0,
|
|
115
|
+
onRetry: () => C.refetch()
|
|
108
116
|
})
|
|
109
117
|
});
|
|
110
|
-
if (!
|
|
118
|
+
if (!w) return /* @__PURE__ */ E(n, {
|
|
111
119
|
title: "Lesson",
|
|
112
120
|
actions: Q,
|
|
113
|
-
children: /* @__PURE__ */
|
|
121
|
+
children: /* @__PURE__ */ E(o, {
|
|
114
122
|
illustration: "empty-data",
|
|
115
123
|
title: "Enrollment not found",
|
|
116
124
|
description: "This enrollment may have been removed or is not available to you.",
|
|
117
|
-
action: /* @__PURE__ */
|
|
118
|
-
onClick: () =>
|
|
125
|
+
action: /* @__PURE__ */ E(O, {
|
|
126
|
+
onClick: () => S("learning"),
|
|
119
127
|
children: "Back to My Learning"
|
|
120
128
|
})
|
|
121
129
|
})
|
|
122
130
|
});
|
|
123
|
-
if (
|
|
131
|
+
if (M.isError) return /* @__PURE__ */ E(n, {
|
|
124
132
|
title: "Lesson",
|
|
125
133
|
actions: Q,
|
|
126
|
-
children: /* @__PURE__ */
|
|
134
|
+
children: /* @__PURE__ */ E(s, {
|
|
127
135
|
title: "Couldn't load the course",
|
|
128
|
-
message:
|
|
129
|
-
onRetry: () =>
|
|
136
|
+
message: M.error instanceof Error ? M.error.message : void 0,
|
|
137
|
+
onRetry: () => M.refetch()
|
|
130
138
|
})
|
|
131
139
|
});
|
|
132
|
-
let $ = Math.round(
|
|
133
|
-
return /* @__PURE__ */
|
|
134
|
-
title:
|
|
140
|
+
let $ = Math.round(w.progressPct ?? 0), ge = q ? A[q.type] : v;
|
|
141
|
+
return /* @__PURE__ */ E(n, {
|
|
142
|
+
title: N?.title ?? "Lesson",
|
|
135
143
|
actions: Q,
|
|
136
|
-
children: /* @__PURE__ */
|
|
144
|
+
children: /* @__PURE__ */ D("div", {
|
|
137
145
|
className: "flex flex-col gap-5",
|
|
138
146
|
children: [
|
|
139
|
-
/* @__PURE__ */
|
|
140
|
-
|
|
147
|
+
/* @__PURE__ */ D(k, {
|
|
148
|
+
treatment: "glass",
|
|
149
|
+
glow: $ > 0,
|
|
150
|
+
className: "flex flex-col gap-4 p-4 sm:flex-row sm:items-center sm:gap-5",
|
|
141
151
|
children: [
|
|
142
|
-
/* @__PURE__ */
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
children: [
|
|
147
|
-
W.filter((e) => G.get(e.id) === "COMPLETED").length,
|
|
148
|
-
" /",
|
|
149
|
-
" ",
|
|
150
|
-
W.length,
|
|
151
|
-
" lessons complete"
|
|
152
|
-
]
|
|
153
|
-
})]
|
|
152
|
+
/* @__PURE__ */ E(u, {
|
|
153
|
+
value: $,
|
|
154
|
+
size: 64,
|
|
155
|
+
className: "shrink-0"
|
|
154
156
|
}),
|
|
155
|
-
/* @__PURE__ */
|
|
156
|
-
className: "
|
|
157
|
-
children: [/* @__PURE__ */
|
|
157
|
+
/* @__PURE__ */ D("div", {
|
|
158
|
+
className: "min-w-0 flex-1",
|
|
159
|
+
children: [/* @__PURE__ */ D("div", {
|
|
160
|
+
className: "flex flex-wrap items-center gap-2",
|
|
161
|
+
children: [/* @__PURE__ */ E(a, { status: w.status }), /* @__PURE__ */ D("span", {
|
|
162
|
+
className: "text-sm text-text-secondary tabular-nums",
|
|
163
|
+
children: [
|
|
164
|
+
Y,
|
|
165
|
+
" of ",
|
|
166
|
+
U.length,
|
|
167
|
+
" lessons complete"
|
|
168
|
+
]
|
|
169
|
+
})]
|
|
170
|
+
}), /* @__PURE__ */ E(l, {
|
|
158
171
|
value: $,
|
|
159
|
-
className: "
|
|
160
|
-
}), /* @__PURE__ */ w("span", {
|
|
161
|
-
className: "shrink-0 text-sm font-medium tabular-nums text-text-primary",
|
|
162
|
-
children: [$, "%"]
|
|
172
|
+
className: "mt-3"
|
|
163
173
|
})]
|
|
164
174
|
}),
|
|
165
|
-
|
|
166
|
-
size: "sm",
|
|
175
|
+
de && !fe && /* @__PURE__ */ D(O, {
|
|
167
176
|
className: "shrink-0 max-sm:w-full",
|
|
168
|
-
onClick:
|
|
169
|
-
disabled:
|
|
170
|
-
children: [
|
|
177
|
+
onClick: me,
|
|
178
|
+
disabled: F.isPending,
|
|
179
|
+
children: [F.isPending ? /* @__PURE__ */ E(x, { className: "mr-1 h-4 w-4 animate-spin" }) : /* @__PURE__ */ E(ce, { className: "mr-1 h-4 w-4" }), "Finish course"]
|
|
171
180
|
})
|
|
172
181
|
]
|
|
173
182
|
}),
|
|
174
|
-
/* @__PURE__ */
|
|
183
|
+
/* @__PURE__ */ D(O, {
|
|
175
184
|
variant: "secondary",
|
|
176
185
|
size: "sm",
|
|
177
186
|
className: "w-full lg:hidden",
|
|
178
|
-
onClick: () =>
|
|
179
|
-
children: [/* @__PURE__ */
|
|
187
|
+
onClick: () => V((e) => !e),
|
|
188
|
+
children: [/* @__PURE__ */ E(b, { className: "mr-1 h-4 w-4" }), B ? "Hide lessons" : `Lessons (${Y}/${U.length})`]
|
|
180
189
|
}),
|
|
181
|
-
/* @__PURE__ */
|
|
190
|
+
/* @__PURE__ */ D("div", {
|
|
182
191
|
className: "flex flex-col gap-5 lg:flex-row",
|
|
183
|
-
children: [/* @__PURE__ */
|
|
184
|
-
className: t("lg:block lg:w-80 lg:shrink-0",
|
|
185
|
-
children: /* @__PURE__ */
|
|
192
|
+
children: [/* @__PURE__ */ E("aside", {
|
|
193
|
+
className: t("lg:block lg:w-80 lg:shrink-0", B ? "block" : "hidden"),
|
|
194
|
+
children: /* @__PURE__ */ E(k, {
|
|
186
195
|
treatment: "plain",
|
|
187
196
|
className: "overflow-hidden p-0 lg:sticky lg:top-4",
|
|
188
|
-
children:
|
|
197
|
+
children: U.length === 0 ? /* @__PURE__ */ E("div", {
|
|
189
198
|
className: "p-4 text-sm text-text-secondary",
|
|
190
199
|
children: "This course has no lessons yet."
|
|
191
|
-
}) : /* @__PURE__ */
|
|
192
|
-
className: "max-h-[
|
|
193
|
-
children:
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
className: "
|
|
197
|
-
children:
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
onClick: () => X(e.id),
|
|
205
|
-
className: t("flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-left text-sm transition-colors", i ? "bg-[var(--color-accent-soft)] text-text-primary" : "text-text-secondary hover:bg-bg-sunken hover:text-text-primary"),
|
|
206
|
-
"aria-current": i ? "true" : void 0,
|
|
200
|
+
}) : /* @__PURE__ */ D(ue, { children: [/* @__PURE__ */ E("nav", {
|
|
201
|
+
className: "max-h-[68vh] overflow-auto p-3",
|
|
202
|
+
children: H.map((e) => {
|
|
203
|
+
let n = e.lessons.filter((e) => W.get(e.id) === "COMPLETED").length;
|
|
204
|
+
return /* @__PURE__ */ D("div", {
|
|
205
|
+
className: "mb-4 last:mb-0",
|
|
206
|
+
children: [/* @__PURE__ */ D("div", {
|
|
207
|
+
className: "mb-2 flex items-center justify-between gap-2 px-1",
|
|
208
|
+
children: [/* @__PURE__ */ E("p", {
|
|
209
|
+
className: "min-w-0 truncate text-sm font-semibold text-text-primary",
|
|
210
|
+
children: e.title
|
|
211
|
+
}), /* @__PURE__ */ D("span", {
|
|
212
|
+
className: "shrink-0 text-xs font-medium tabular-nums text-text-secondary",
|
|
207
213
|
children: [
|
|
208
|
-
n
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
children: e.title
|
|
212
|
-
}),
|
|
213
|
-
e.durationMin > 0 && /* @__PURE__ */ C("span", {
|
|
214
|
-
className: "shrink-0 text-xs tabular-nums text-text-secondary",
|
|
215
|
-
children: r(e.durationMin)
|
|
216
|
-
})
|
|
214
|
+
n,
|
|
215
|
+
" / ",
|
|
216
|
+
e.lessons.length
|
|
217
217
|
]
|
|
218
|
-
})
|
|
219
|
-
})
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
218
|
+
})]
|
|
219
|
+
}), /* @__PURE__ */ E("ul", {
|
|
220
|
+
className: "flex flex-col",
|
|
221
|
+
children: e.lessons.map((n, a) => {
|
|
222
|
+
let o = W.get(n.id) === "COMPLETED", s = n.id === G, c = a === e.lessons.length - 1, l = A[n.type];
|
|
223
|
+
return /* @__PURE__ */ D("li", {
|
|
224
|
+
className: "flex gap-3",
|
|
225
|
+
children: [/* @__PURE__ */ D("div", {
|
|
226
|
+
className: "flex flex-col items-center pt-1.5",
|
|
227
|
+
children: [o ? /* @__PURE__ */ E("span", {
|
|
228
|
+
className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-[var(--color-status-success-text)]",
|
|
229
|
+
children: /* @__PURE__ */ E(g, { className: "h-3.5 w-3.5 text-status-success-bg-subtle" })
|
|
230
|
+
}) : s ? /* @__PURE__ */ E("span", {
|
|
231
|
+
className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-[var(--color-accent-soft)] ring-2 ring-[var(--color-accent-teal)]",
|
|
232
|
+
children: /* @__PURE__ */ E(l, { className: "h-3.5 w-3.5 text-[var(--color-accent-teal)]" })
|
|
233
|
+
}) : /* @__PURE__ */ E("span", {
|
|
234
|
+
className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full border border-border-seam bg-bg-sunken",
|
|
235
|
+
children: /* @__PURE__ */ E(l, { className: "h-3.5 w-3.5 text-text-secondary opacity-70" })
|
|
236
|
+
}), !c && /* @__PURE__ */ E("span", { className: t("my-1 w-px flex-1", o ? "bg-[color-mix(in_srgb,var(--color-status-success-text)_45%,transparent)]" : "bg-border-seam") })]
|
|
237
|
+
}), /* @__PURE__ */ D("button", {
|
|
238
|
+
type: "button",
|
|
239
|
+
onClick: () => X(n.id),
|
|
240
|
+
className: t("mb-1 min-w-0 flex-1 rounded-lg px-3 py-2 text-left transition-colors", s ? "bg-[var(--color-accent-soft)]" : "hover:bg-bg-sunken"),
|
|
241
|
+
"aria-current": s ? "true" : void 0,
|
|
242
|
+
children: [/* @__PURE__ */ E("span", {
|
|
243
|
+
className: t("block truncate text-sm", s ? "font-medium text-text-primary" : o ? "text-text-secondary" : "text-text-primary"),
|
|
244
|
+
children: n.title
|
|
245
|
+
}), /* @__PURE__ */ D("span", {
|
|
246
|
+
className: "mt-0.5 block truncate text-xs text-text-secondary",
|
|
247
|
+
children: [i(n.type), n.durationMin > 0 ? ` · ${r(n.durationMin)}` : ""]
|
|
248
|
+
})]
|
|
249
|
+
})]
|
|
250
|
+
}, n.id);
|
|
251
|
+
})
|
|
252
|
+
})]
|
|
253
|
+
}, e.id);
|
|
254
|
+
})
|
|
255
|
+
}), T && /* @__PURE__ */ E("div", {
|
|
256
|
+
className: "border-t border-border-seam p-3",
|
|
257
|
+
children: /* @__PURE__ */ D(O, {
|
|
258
|
+
variant: "outline",
|
|
259
|
+
size: "sm",
|
|
260
|
+
className: "w-full",
|
|
261
|
+
onClick: () => S(`catalog/${T}`),
|
|
262
|
+
children: [/* @__PURE__ */ E(h, { className: "mr-1.5 h-4 w-4" }), " Course overview"]
|
|
263
|
+
})
|
|
264
|
+
})] })
|
|
223
265
|
})
|
|
224
|
-
}), /* @__PURE__ */
|
|
266
|
+
}), /* @__PURE__ */ E("main", {
|
|
225
267
|
className: "min-w-0 flex-1",
|
|
226
|
-
children:
|
|
268
|
+
children: q ? /* @__PURE__ */ D(k, {
|
|
227
269
|
treatment: "plain",
|
|
228
|
-
className: "flex flex-col gap-4 p-5 sm:p-
|
|
270
|
+
className: "flex flex-col gap-4 p-5 sm:p-7",
|
|
229
271
|
children: [
|
|
230
|
-
/* @__PURE__ */
|
|
272
|
+
/* @__PURE__ */ D("div", {
|
|
231
273
|
className: "flex flex-wrap items-center gap-2",
|
|
232
274
|
children: [
|
|
233
|
-
/* @__PURE__ */
|
|
234
|
-
|
|
275
|
+
/* @__PURE__ */ D("span", {
|
|
276
|
+
className: "inline-flex items-center gap-1.5 rounded-full bg-[var(--color-accent-soft)] px-2.5 py-1 text-xs font-medium text-text-primary",
|
|
277
|
+
children: [/* @__PURE__ */ E(ge, { className: "h-3.5 w-3.5 text-[var(--color-accent-teal)]" }), i(q.type)]
|
|
278
|
+
}),
|
|
279
|
+
q.durationMin > 0 && /* @__PURE__ */ E("span", {
|
|
235
280
|
className: "text-xs text-text-secondary",
|
|
236
|
-
children: r(
|
|
281
|
+
children: r(q.durationMin)
|
|
237
282
|
}),
|
|
238
|
-
|
|
283
|
+
J && /* @__PURE__ */ D("span", {
|
|
239
284
|
className: "inline-flex items-center gap-1 text-xs font-medium text-status-success-text",
|
|
240
|
-
children: [/* @__PURE__ */
|
|
285
|
+
children: [/* @__PURE__ */ E(_, { className: "h-3.5 w-3.5" }), " Completed"]
|
|
286
|
+
}),
|
|
287
|
+
/* @__PURE__ */ D("span", {
|
|
288
|
+
className: "ml-auto text-xs tabular-nums text-text-secondary",
|
|
289
|
+
children: [
|
|
290
|
+
"Lesson ",
|
|
291
|
+
K + 1,
|
|
292
|
+
" of ",
|
|
293
|
+
U.length
|
|
294
|
+
]
|
|
241
295
|
})
|
|
242
296
|
]
|
|
243
297
|
}),
|
|
244
|
-
/* @__PURE__ */
|
|
245
|
-
className: "text-
|
|
246
|
-
children:
|
|
298
|
+
/* @__PURE__ */ E("h2", {
|
|
299
|
+
className: "text-2xl font-semibold tracking-tight text-text-primary",
|
|
300
|
+
children: q.title
|
|
247
301
|
}),
|
|
248
|
-
|
|
302
|
+
q.media ? /* @__PURE__ */ D("div", {
|
|
249
303
|
className: "rounded-xl border border-border-seam bg-bg-sunken p-3",
|
|
250
|
-
children: /* @__PURE__ */
|
|
304
|
+
children: [/* @__PURE__ */ E("p", {
|
|
305
|
+
className: "mb-2 text-xs font-semibold uppercase tracking-wide text-text-secondary",
|
|
306
|
+
children: "Resources"
|
|
307
|
+
}), /* @__PURE__ */ E(d, { fileId: q.media.id })]
|
|
251
308
|
}) : null,
|
|
252
|
-
|
|
253
|
-
className: "whitespace-pre-wrap text-
|
|
254
|
-
children:
|
|
255
|
-
}) : /* @__PURE__ */
|
|
309
|
+
q.content ? /* @__PURE__ */ E("p", {
|
|
310
|
+
className: "max-w-prose whitespace-pre-wrap text-[15px] leading-7 text-text-primary",
|
|
311
|
+
children: q.content
|
|
312
|
+
}) : /* @__PURE__ */ D("p", {
|
|
256
313
|
className: "text-sm text-text-secondary",
|
|
257
314
|
children: [
|
|
258
315
|
"This lesson has no written content",
|
|
259
|
-
|
|
316
|
+
q.media ? " beyond the attached media" : "",
|
|
260
317
|
"."
|
|
261
318
|
]
|
|
262
319
|
}),
|
|
263
|
-
/* @__PURE__ */
|
|
264
|
-
className: "mt-2 flex flex-col gap-3 border-t border-border-seam pt-
|
|
265
|
-
children: [
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
variant: "secondary",
|
|
320
|
+
/* @__PURE__ */ D("div", {
|
|
321
|
+
className: "mt-2 flex flex-col gap-3 border-t border-border-seam pt-5 sm:flex-row sm:items-center sm:justify-between",
|
|
322
|
+
children: [
|
|
323
|
+
/* @__PURE__ */ D(O, {
|
|
324
|
+
variant: "outline",
|
|
269
325
|
size: "sm",
|
|
326
|
+
className: "max-sm:w-full",
|
|
270
327
|
onClick: () => Z(-1),
|
|
271
|
-
disabled:
|
|
272
|
-
children: [/* @__PURE__ */
|
|
273
|
-
}),
|
|
274
|
-
|
|
328
|
+
disabled: K <= 0,
|
|
329
|
+
children: [/* @__PURE__ */ E(oe, { className: "mr-1 h-4 w-4" }), " Previous"]
|
|
330
|
+
}),
|
|
331
|
+
J ? /* @__PURE__ */ D("span", {
|
|
332
|
+
className: "inline-flex items-center justify-center gap-2 rounded-lg bg-status-success-bg-subtle px-4 py-2 text-sm font-medium text-status-success-text max-sm:w-full",
|
|
333
|
+
children: [/* @__PURE__ */ E(_, { className: "h-4 w-4" }), " Lesson complete"]
|
|
334
|
+
}) : /* @__PURE__ */ D(O, {
|
|
335
|
+
size: "lg",
|
|
336
|
+
className: "max-sm:w-full",
|
|
337
|
+
onClick: pe,
|
|
338
|
+
disabled: P.isPending,
|
|
339
|
+
children: [P.isPending ? /* @__PURE__ */ E(x, { className: "mr-1.5 h-4 w-4 animate-spin" }) : /* @__PURE__ */ E(_, { className: "mr-1.5 h-4 w-4" }), "Mark complete"]
|
|
340
|
+
}),
|
|
341
|
+
/* @__PURE__ */ D(O, {
|
|
342
|
+
variant: "outline",
|
|
275
343
|
size: "sm",
|
|
344
|
+
className: "max-sm:w-full",
|
|
276
345
|
onClick: () => Z(1),
|
|
277
|
-
disabled:
|
|
278
|
-
children: ["Next ", /* @__PURE__ */
|
|
279
|
-
})
|
|
280
|
-
|
|
281
|
-
size: "sm",
|
|
282
|
-
className: "max-sm:w-full",
|
|
283
|
-
onClick: oe,
|
|
284
|
-
disabled: F.isPending,
|
|
285
|
-
children: [F.isPending ? /* @__PURE__ */ C(S, { className: "mr-1 h-4 w-4 animate-spin" }) : /* @__PURE__ */ C(v, { className: "mr-1 h-4 w-4" }), "Mark complete"]
|
|
286
|
-
})]
|
|
346
|
+
disabled: K >= U.length - 1,
|
|
347
|
+
children: ["Next ", /* @__PURE__ */ E(se, { className: "ml-1 h-4 w-4" })]
|
|
348
|
+
})
|
|
349
|
+
]
|
|
287
350
|
})
|
|
288
351
|
]
|
|
289
|
-
}) : /* @__PURE__ */
|
|
352
|
+
}) : /* @__PURE__ */ E(o, {
|
|
290
353
|
illustration: "empty-data",
|
|
291
354
|
title: "No lesson to show",
|
|
292
355
|
description: "This course doesn't have any lessons yet. Check back once the author adds content."
|
|
@@ -298,6 +361,6 @@ var D = (e) => [...e].sort((e, t) => e.position - t.position), O = () => {
|
|
|
298
361
|
});
|
|
299
362
|
};
|
|
300
363
|
//#endregion
|
|
301
|
-
export {
|
|
364
|
+
export { M as LessonPlayerPage };
|
|
302
365
|
|
|
303
366
|
//# sourceMappingURL=LessonPlayerPage.js.map
|