@burdenoff/microfe-technospam 2026.1031.6 → 2026.1031.8

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 (27) hide show
  1. package/dist/generated/wspace-types.d.ts +1100 -147
  2. package/dist/generated/wspace-types.d.ts.map +1 -1
  3. package/dist/stories/fixtures/technospamFixtures.d.ts.map +1 -1
  4. package/dist/technospam/api/canonicalLearning.d.ts +53 -0
  5. package/dist/technospam/api/canonicalLearning.d.ts.map +1 -0
  6. package/dist/technospam/api/canonicalLearning.js +57 -0
  7. package/dist/technospam/api/canonicalLearning.js.map +1 -0
  8. package/dist/technospam/api/technospamApi.d.ts +392 -16
  9. package/dist/technospam/api/technospamApi.d.ts.map +1 -1
  10. package/dist/technospam/api/technospamApi.js +367 -304
  11. package/dist/technospam/api/technospamApi.js.map +1 -1
  12. package/dist/technospam/pages/ApplicationsPortfolioPagePage.d.ts.map +1 -1
  13. package/dist/technospam/pages/ApplicationsPortfolioPagePage.js +26 -26
  14. package/dist/technospam/pages/ApplicationsPortfolioPagePage.js.map +1 -1
  15. package/dist/technospam/pages/CoursesCourseDetailsPagePage.d.ts.map +1 -1
  16. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +196 -192
  17. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -1
  18. package/dist/technospam/pages/CoursesLessonPlayerPagePage.d.ts.map +1 -1
  19. package/dist/technospam/pages/CoursesLessonPlayerPagePage.js +125 -121
  20. package/dist/technospam/pages/CoursesLessonPlayerPagePage.js.map +1 -1
  21. package/dist/technospam/pages/CoursesMyLearningPagePage.d.ts.map +1 -1
  22. package/dist/technospam/pages/CoursesMyLearningPagePage.js +95 -95
  23. package/dist/technospam/pages/CoursesMyLearningPagePage.js.map +1 -1
  24. package/dist/technospam/pages/DashboardDashboardPagePage.d.ts.map +1 -1
  25. package/dist/technospam/pages/DashboardDashboardPagePage.js +30 -30
  26. package/dist/technospam/pages/DashboardDashboardPagePage.js.map +1 -1
  27. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"technospamFixtures.d.ts","sourceRoot":"","sources":["../../../src/stories/fixtures/technospamFixtures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAEV,SAAS,EACT,aAAa,EACb,YAAY,EAEZ,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,aAAa,EACd,MAAM,oCAAoC,CAAC;AAE5C,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;CAMd,CAAC;AASX,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACpC,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;AAmJxC,MAAM,WAAW,wBAAwB;IACvC,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,wBAA6B;;;;;;;;;;;;;;;EA0c9E;AAED,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
1
+ {"version":3,"file":"technospamFixtures.d.ts","sourceRoot":"","sources":["../../../src/stories/fixtures/technospamFixtures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAEV,SAAS,EACT,aAAa,EACb,YAAY,EAEZ,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,aAAa,EACd,MAAM,oCAAoC,CAAC;AAE5C,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;CAMd,CAAC;AASX,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACpC,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;AA0JxC,MAAM,WAAW,wBAAwB;IACvC,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,wBAA6B;;;;;;;;;;;;;;;EA8f9E;AAED,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { TecCertificate, TecCourse, TecEnrollment } from './technospamApi';
2
+
3
+ export type BuiEnrollmentStatus = 'ENROLLED' | 'IN_PROGRESS' | 'COMPLETED' | 'DROPPED' | 'EXPIRED';
4
+ export type BuiCertificateStatus = 'ISSUED' | 'REVOKED' | 'EXPIRED';
5
+ export interface BuiMyEnrollmentRow {
6
+ id: string;
7
+ status: BuiEnrollmentStatus;
8
+ progressPct: number;
9
+ enrolledAt: string;
10
+ startedAt?: string | null;
11
+ lastActiveAt?: string | null;
12
+ completedAt?: string | null;
13
+ createdAt: string;
14
+ updatedAt: string;
15
+ technospamNextLessonId?: string | null;
16
+ technospamEnrollment?: {
17
+ id: string;
18
+ courseId: string;
19
+ learnerId: string;
20
+ lessonsCompleted: number;
21
+ course?: TecCourse | null;
22
+ } | null;
23
+ }
24
+ export interface BuiMyCertificateRow {
25
+ id: string;
26
+ serial: string;
27
+ status: BuiCertificateStatus;
28
+ issuedAt: string;
29
+ revokedAt?: string | null;
30
+ finalScore?: number | null;
31
+ createdAt: string;
32
+ technospamRevokeReason?: string | null;
33
+ technospamCertificate?: {
34
+ id: string;
35
+ courseId: string;
36
+ learnerId: string;
37
+ score: number;
38
+ course?: TecCourse | null;
39
+ } | null;
40
+ }
41
+ export declare function toTecEnrollment(row: BuiMyEnrollmentRow): TecEnrollment | null;
42
+ export declare function toTecCertificate(row: BuiMyCertificateRow): TecCertificate | null;
43
+ /** Map a page of canonical rows, dropping any whose Technospam overlay is missing. */
44
+ export declare function mapRows<Row, Out>(rows: readonly Row[] | null | undefined, map: (row: Row) => Out | null): Out[];
45
+ /**
46
+ * Narrow to one Technospam course. Applied on top of the server-side
47
+ * `courseId` filter (which takes the canonical course id) so the result is
48
+ * right even before the course's canonical id is known.
49
+ */
50
+ export declare function forTechnospamCourse<T extends {
51
+ courseId: string;
52
+ }>(rows: T[], technospamCourseId?: string): T[];
53
+ //# sourceMappingURL=canonicalLearning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonicalLearning.d.ts","sourceRoot":"","sources":["../../../src/technospam/api/canonicalLearning.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EACV,cAAc,EAEd,SAAS,EACT,aAAa,EAEd,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AACnG,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,oBAAoB,CAAC,EAAE;QACrB,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;QACzB,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;KAC3B,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,qBAAqB,CAAC,EAAE;QACtB,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;KAC3B,GAAG,IAAI,CAAC;CACV;AAWD,wBAAgB,eAAe,CAAC,GAAG,EAAE,kBAAkB,GAAG,aAAa,GAAG,IAAI,CAmB7E;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,GAAG,cAAc,GAAG,IAAI,CAkBhF;AAED,sFAAsF;AACtF,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,EAC9B,IAAI,EAAE,SAAS,GAAG,EAAE,GAAG,IAAI,GAAG,SAAS,EACvC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,IAAI,GAC5B,GAAG,EAAE,CAOP;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EAChE,IAAI,EAAE,CAAC,EAAE,EACT,kBAAkB,CAAC,EAAE,MAAM,GAC1B,CAAC,EAAE,CAEL"}
@@ -0,0 +1,57 @@
1
+ //#region src/technospam/api/canonicalLearning.ts
2
+ function e(e) {
3
+ return e === "EXPIRED" ? "DROPPED" : e;
4
+ }
5
+ function t(t) {
6
+ let n = t.technospamEnrollment;
7
+ return n ? {
8
+ id: n.id,
9
+ courseId: n.courseId,
10
+ learnerId: n.learnerId,
11
+ status: e(t.status),
12
+ progressPct: t.progressPct,
13
+ lessonsCompleted: n.lessonsCompleted,
14
+ startedAt: t.startedAt ?? t.enrolledAt,
15
+ lastActiveAt: t.lastActiveAt ?? null,
16
+ completedAt: t.completedAt ?? null,
17
+ createdAt: t.createdAt,
18
+ updatedAt: t.updatedAt,
19
+ course: n.course ?? null,
20
+ nextLessonId: t.technospamNextLessonId ?? null,
21
+ buiEnrollmentId: t.id
22
+ } : null;
23
+ }
24
+ function n(e) {
25
+ let t = e.technospamCertificate;
26
+ if (!t) return null;
27
+ let n = e.status;
28
+ return {
29
+ id: t.id,
30
+ courseId: t.courseId,
31
+ learnerId: t.learnerId,
32
+ serial: e.serial,
33
+ score: e.finalScore ?? t.score,
34
+ status: n,
35
+ issuedAt: e.issuedAt,
36
+ revokedAt: e.revokedAt ?? null,
37
+ revokeReason: e.technospamRevokeReason ?? null,
38
+ createdAt: e.createdAt,
39
+ course: t.course ?? null,
40
+ buiCertificateId: e.id
41
+ };
42
+ }
43
+ function r(e, t) {
44
+ let n = [];
45
+ for (let r of e ?? []) {
46
+ let e = t(r);
47
+ e && n.push(e);
48
+ }
49
+ return n;
50
+ }
51
+ function i(e, t) {
52
+ return t ? e.filter((e) => e.courseId === t) : e;
53
+ }
54
+ //#endregion
55
+ export { i as forTechnospamCourse, r as mapRows, n as toTecCertificate, t as toTecEnrollment };
56
+
57
+ //# sourceMappingURL=canonicalLearning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonicalLearning.js","names":[],"sources":["../../../src/technospam/api/canonicalLearning.ts"],"sourcesContent":["/**\n * Canonical (Buildmyiq) learning records seen through the Technospam overlays\n * (BOFF-10481, OVL-24 phase 2c).\n *\n * Buildmyiq is the system of record for a learner's enrollments and\n * certificates. The learner's own records are read from its self-scoped root\n * fields (`buiMyEnrollments` / `buiMyCertificates`, filtered to\n * `source: TECHNOSPAM`), and the Technospam-only data rides on the overlay\n * fields Technospam contributes to those types:\n *\n * BuiEnrollment.technospamEnrollment the Technospam row (its id, course, counts)\n * BuiEnrollment.technospamNextLessonId where \"Resume\" lands\n * BuiCertificate.technospamCertificate the Technospam row (its id, course)\n * BuiCertificate.technospamRevokeReason why Technospam revoked it\n *\n * The pages keep working with the `TecEnrollment` / `TecCertificate` view\n * models, so these mappers fold one canonical row into that shape: the\n * canonical state (status, progress, dates, serial) comes from Buildmyiq, and\n * the ids come from the Technospam row because every Technospam route and\n * mutation (`tecCompleteLesson`, `tecIssueCertificate`, portfolio items, …)\n * is keyed by the Technospam id. A canonical row whose Technospam overlay did\n * not resolve is dropped rather than rendered with an id no Technospam\n * mutation accepts.\n */\nimport type {\n TecCertificate,\n TecCertificateStatus,\n TecCourse,\n TecEnrollment,\n TecEnrollmentStatus,\n} from './technospamApi';\n\nexport type BuiEnrollmentStatus = 'ENROLLED' | 'IN_PROGRESS' | 'COMPLETED' | 'DROPPED' | 'EXPIRED';\nexport type BuiCertificateStatus = 'ISSUED' | 'REVOKED' | 'EXPIRED';\n\nexport interface BuiMyEnrollmentRow {\n id: string;\n status: BuiEnrollmentStatus;\n progressPct: number;\n enrolledAt: string;\n startedAt?: string | null;\n lastActiveAt?: string | null;\n completedAt?: string | null;\n createdAt: string;\n updatedAt: string;\n technospamNextLessonId?: string | null;\n technospamEnrollment?: {\n id: string;\n courseId: string;\n learnerId: string;\n lessonsCompleted: number;\n course?: TecCourse | null;\n } | null;\n}\n\nexport interface BuiMyCertificateRow {\n id: string;\n serial: string;\n status: BuiCertificateStatus;\n issuedAt: string;\n revokedAt?: string | null;\n finalScore?: number | null;\n createdAt: string;\n technospamRevokeReason?: string | null;\n technospamCertificate?: {\n id: string;\n courseId: string;\n learnerId: string;\n score: number;\n course?: TecCourse | null;\n } | null;\n}\n\n/**\n * Technospam has no access-end concept, so a canonical EXPIRED enrollment\n * (access ended in Buildmyiq) is shown as DROPPED: no longer active, not\n * completed.\n */\nfunction toTecEnrollmentStatus(status: BuiEnrollmentStatus): TecEnrollmentStatus {\n return status === 'EXPIRED' ? 'DROPPED' : status;\n}\n\nexport function toTecEnrollment(row: BuiMyEnrollmentRow): TecEnrollment | null {\n const tec = row.technospamEnrollment;\n if (!tec) return null;\n return {\n id: tec.id,\n courseId: tec.courseId,\n learnerId: tec.learnerId,\n status: toTecEnrollmentStatus(row.status),\n progressPct: row.progressPct,\n lessonsCompleted: tec.lessonsCompleted,\n startedAt: row.startedAt ?? row.enrolledAt,\n lastActiveAt: row.lastActiveAt ?? null,\n completedAt: row.completedAt ?? null,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n course: tec.course ?? null,\n nextLessonId: row.technospamNextLessonId ?? null,\n buiEnrollmentId: row.id,\n };\n}\n\nexport function toTecCertificate(row: BuiMyCertificateRow): TecCertificate | null {\n const tec = row.technospamCertificate;\n if (!tec) return null;\n const status: TecCertificateStatus = row.status;\n return {\n id: tec.id,\n courseId: tec.courseId,\n learnerId: tec.learnerId,\n serial: row.serial,\n score: row.finalScore ?? tec.score,\n status,\n issuedAt: row.issuedAt,\n revokedAt: row.revokedAt ?? null,\n revokeReason: row.technospamRevokeReason ?? null,\n createdAt: row.createdAt,\n course: tec.course ?? null,\n buiCertificateId: row.id,\n };\n}\n\n/** Map a page of canonical rows, dropping any whose Technospam overlay is missing. */\nexport function mapRows<Row, Out>(\n rows: readonly Row[] | null | undefined,\n map: (row: Row) => Out | null\n): Out[] {\n const out: Out[] = [];\n for (const row of rows ?? []) {\n const mapped = map(row);\n if (mapped) out.push(mapped);\n }\n return out;\n}\n\n/**\n * Narrow to one Technospam course. Applied on top of the server-side\n * `courseId` filter (which takes the canonical course id) so the result is\n * right even before the course's canonical id is known.\n */\nexport function forTechnospamCourse<T extends { courseId: string }>(\n rows: T[],\n technospamCourseId?: string\n): T[] {\n return technospamCourseId ? rows.filter((row) => row.courseId === technospamCourseId) : rows;\n}\n"],"mappings":";AA8EA,SAAS,EAAsB,GAAkD;AAC/E,QAAO,MAAW,YAAY,YAAY;;AAG5C,SAAgB,EAAgB,GAA+C;CAC7E,IAAM,IAAM,EAAI;AAEhB,QADK,IACE;EACL,IAAI,EAAI;EACR,UAAU,EAAI;EACd,WAAW,EAAI;EACf,QAAQ,EAAsB,EAAI,OAAO;EACzC,aAAa,EAAI;EACjB,kBAAkB,EAAI;EACtB,WAAW,EAAI,aAAa,EAAI;EAChC,cAAc,EAAI,gBAAgB;EAClC,aAAa,EAAI,eAAe;EAChC,WAAW,EAAI;EACf,WAAW,EAAI;EACf,QAAQ,EAAI,UAAU;EACtB,cAAc,EAAI,0BAA0B;EAC5C,iBAAiB,EAAI;EACtB,GAhBgB;;AAmBnB,SAAgB,EAAiB,GAAiD;CAChF,IAAM,IAAM,EAAI;AAChB,KAAI,CAAC,EAAK,QAAO;CACjB,IAAM,IAA+B,EAAI;AACzC,QAAO;EACL,IAAI,EAAI;EACR,UAAU,EAAI;EACd,WAAW,EAAI;EACf,QAAQ,EAAI;EACZ,OAAO,EAAI,cAAc,EAAI;EAC7B;EACA,UAAU,EAAI;EACd,WAAW,EAAI,aAAa;EAC5B,cAAc,EAAI,0BAA0B;EAC5C,WAAW,EAAI;EACf,QAAQ,EAAI,UAAU;EACtB,kBAAkB,EAAI;EACvB;;AAIH,SAAgB,EACd,GACA,GACO;CACP,IAAM,IAAa,EAAE;AACrB,MAAK,IAAM,KAAO,KAAQ,EAAE,EAAE;EAC5B,IAAM,IAAS,EAAI,EAAI;AACvB,EAAI,KAAQ,EAAI,KAAK,EAAO;;AAE9B,QAAO;;AAQT,SAAgB,EACd,GACA,GACK;AACL,QAAO,IAAqB,EAAK,QAAQ,MAAQ,EAAI,aAAa,EAAmB,GAAG"}
@@ -1,11 +1,13 @@
1
1
  import { ErrorLike } from '@apollo/client';
2
2
  import { useMutation, useQuery } from '@apollo/client/react';
3
+ import { BuiMyCertificateRow, BuiMyEnrollmentRow } from './canonicalLearning';
3
4
 
4
5
  export type TecCourseLevel = 'BEGINNER' | 'INTERMEDIATE' | 'ADVANCED' | 'EXPERT';
5
6
  export type TecCourseStatus = 'DRAFT' | 'PUBLISHED' | 'ARCHIVED';
6
7
  export type TecLessonKind = 'VIDEO' | 'ARTICLE' | 'INTERACTIVE' | 'QUIZ' | 'PROJECT';
7
8
  export type TecEnrollmentStatus = 'ENROLLED' | 'IN_PROGRESS' | 'COMPLETED' | 'DROPPED';
8
- export type TecCertificateStatus = 'ISSUED' | 'REVOKED';
9
+ /** EXPIRED only arrives from the canonical Buildmyiq certificate (BOFF-10481). */
10
+ export type TecCertificateStatus = 'ISSUED' | 'REVOKED' | 'EXPIRED';
9
11
  export type TecProblemDifficulty = 'EASY' | 'MEDIUM' | 'HARD';
10
12
  export type TecProblemStatus = 'DRAFT' | 'PUBLISHED' | 'ARCHIVED';
11
13
  export type TecInterviewFrequency = 'LOW' | 'MEDIUM' | 'HIGH';
@@ -33,6 +35,8 @@ export interface TecCourse {
33
35
  * non-preview lesson's `content` is already null in the API response.
34
36
  */
35
37
  isLocked: boolean;
38
+ /** BOFF-10481: the canonical Buildmyiq course id; null until the course is mirrored. */
39
+ buiCourseId?: string | null;
36
40
  publishedAt?: string | null;
37
41
  createdAt: string;
38
42
  updatedAt: string;
@@ -134,6 +138,8 @@ export interface TecEnrollment {
134
138
  course?: TecCourse | null;
135
139
  /** BOFF-4107: first lesson not yet completed; null when every lesson is done. */
136
140
  nextLessonId?: string | null;
141
+ /** BOFF-10481: the canonical Buildmyiq enrollment this view was read from. */
142
+ buiEnrollmentId?: string | null;
137
143
  }
138
144
  export interface TecCertificate {
139
145
  id: string;
@@ -147,6 +153,8 @@ export interface TecCertificate {
147
153
  revokeReason?: string | null;
148
154
  createdAt: string;
149
155
  course?: TecCourse | null;
156
+ /** BOFF-10481: the canonical Buildmyiq certificate this view was read from. */
157
+ buiCertificateId?: string | null;
150
158
  }
151
159
  export interface TecProblem {
152
160
  id: string;
@@ -372,12 +380,389 @@ export declare const useCertificatesQuery: (vars: {
372
380
  }) => useQuery.Result<{
373
381
  tecListCertificates: TecCertificate[];
374
382
  }, import('@apollo/client').OperationVariables, "empty" | "complete" | "streaming", import('@apollo/client').OperationVariables>;
375
- /** The signed-in learner's own certificates (self-scoped; no learnerId sent). */
376
- export declare const useMyCertificatesQuery: (vars?: {
377
- courseId?: string;
378
- }) => useQuery.Result<{
379
- tecMyCertificates: TecCertificate[];
380
- }, import('@apollo/client').OperationVariables, "empty" | "complete" | "streaming", import('@apollo/client').OperationVariables>;
383
+ /**
384
+ * Which of the learner's own records to read. `buiCourseId` narrows on the
385
+ * server (canonical id); `technospamCourseId` narrows on the client, so a
386
+ * course page gets the right rows even before its canonical id is known.
387
+ */
388
+ export interface MyLearningScope {
389
+ buiCourseId?: string | null;
390
+ technospamCourseId?: string;
391
+ limit?: number;
392
+ skip?: boolean;
393
+ }
394
+ /** The signed-in learner's own TechnoSpam enrollments (canonical, self-scoped). */
395
+ export declare function useMyEnrollmentsQuery(scope?: MyLearningScope): {
396
+ enrollments: TecEnrollment[];
397
+ client: import('@apollo/client').ApolloClient;
398
+ observable: import('@apollo/client').ObservableQuery<{
399
+ buiMyEnrollments: {
400
+ items: BuiMyEnrollmentRow[];
401
+ pageInfo: TecPageInfo;
402
+ };
403
+ }, import('@apollo/client').OperationVariables>;
404
+ previousData?: {
405
+ buiMyEnrollments: {
406
+ items: BuiMyEnrollmentRow[];
407
+ pageInfo: TecPageInfo;
408
+ };
409
+ } | undefined;
410
+ error?: ErrorLike;
411
+ loading: boolean;
412
+ networkStatus: import('@apollo/client').NetworkStatus;
413
+ startPolling: (pollInterval: number) => void;
414
+ stopPolling: () => void;
415
+ subscribeToMore: import('@apollo/client').SubscribeToMoreFunction<{
416
+ buiMyEnrollments: {
417
+ items: BuiMyEnrollmentRow[];
418
+ pageInfo: TecPageInfo;
419
+ };
420
+ }, import('@apollo/client').OperationVariables>;
421
+ updateQuery: (mapFn: import('@apollo/client').UpdateQueryMapFn<{
422
+ buiMyEnrollments: {
423
+ items: BuiMyEnrollmentRow[];
424
+ pageInfo: TecPageInfo;
425
+ };
426
+ }, import('@apollo/client').OperationVariables>) => void;
427
+ refetch: (variables?: Partial<import('@apollo/client').OperationVariables> | undefined) => Promise<{
428
+ data: {
429
+ buiMyEnrollments: {
430
+ items: BuiMyEnrollmentRow[];
431
+ pageInfo: TecPageInfo;
432
+ };
433
+ } | undefined;
434
+ error?: ErrorLike;
435
+ }>;
436
+ variables: import('@apollo/client').OperationVariables;
437
+ fetchMore: <TFetchData = {
438
+ buiMyEnrollments: {
439
+ items: BuiMyEnrollmentRow[];
440
+ pageInfo: TecPageInfo;
441
+ };
442
+ }, TFetchVars extends import('@apollo/client').OperationVariables = import('@apollo/client').OperationVariables>(fetchMoreOptions: import("@apollo/client").ObservableQuery.FetchMoreOptions<{
443
+ buiMyEnrollments: {
444
+ items: BuiMyEnrollmentRow[];
445
+ pageInfo: TecPageInfo;
446
+ };
447
+ }, import('@apollo/client').OperationVariables, TFetchData, TFetchVars>) => Promise<{
448
+ data: TFetchData | undefined;
449
+ error?: ErrorLike;
450
+ }>;
451
+ data: undefined;
452
+ dataState: "empty";
453
+ } | {
454
+ enrollments: TecEnrollment[];
455
+ client: import('@apollo/client').ApolloClient;
456
+ observable: import('@apollo/client').ObservableQuery<{
457
+ buiMyEnrollments: {
458
+ items: BuiMyEnrollmentRow[];
459
+ pageInfo: TecPageInfo;
460
+ };
461
+ }, import('@apollo/client').OperationVariables>;
462
+ previousData?: {
463
+ buiMyEnrollments: {
464
+ items: BuiMyEnrollmentRow[];
465
+ pageInfo: TecPageInfo;
466
+ };
467
+ } | undefined;
468
+ error?: ErrorLike;
469
+ loading: boolean;
470
+ networkStatus: import('@apollo/client').NetworkStatus;
471
+ startPolling: (pollInterval: number) => void;
472
+ stopPolling: () => void;
473
+ subscribeToMore: import('@apollo/client').SubscribeToMoreFunction<{
474
+ buiMyEnrollments: {
475
+ items: BuiMyEnrollmentRow[];
476
+ pageInfo: TecPageInfo;
477
+ };
478
+ }, import('@apollo/client').OperationVariables>;
479
+ updateQuery: (mapFn: import('@apollo/client').UpdateQueryMapFn<{
480
+ buiMyEnrollments: {
481
+ items: BuiMyEnrollmentRow[];
482
+ pageInfo: TecPageInfo;
483
+ };
484
+ }, import('@apollo/client').OperationVariables>) => void;
485
+ refetch: (variables?: Partial<import('@apollo/client').OperationVariables> | undefined) => Promise<{
486
+ data: {
487
+ buiMyEnrollments: {
488
+ items: BuiMyEnrollmentRow[];
489
+ pageInfo: TecPageInfo;
490
+ };
491
+ } | undefined;
492
+ error?: ErrorLike;
493
+ }>;
494
+ variables: import('@apollo/client').OperationVariables;
495
+ fetchMore: <TFetchData = {
496
+ buiMyEnrollments: {
497
+ items: BuiMyEnrollmentRow[];
498
+ pageInfo: TecPageInfo;
499
+ };
500
+ }, TFetchVars extends import('@apollo/client').OperationVariables = import('@apollo/client').OperationVariables>(fetchMoreOptions: import("@apollo/client").ObservableQuery.FetchMoreOptions<{
501
+ buiMyEnrollments: {
502
+ items: BuiMyEnrollmentRow[];
503
+ pageInfo: TecPageInfo;
504
+ };
505
+ }, import('@apollo/client').OperationVariables, TFetchData, TFetchVars>) => Promise<{
506
+ data: TFetchData | undefined;
507
+ error?: ErrorLike;
508
+ }>;
509
+ data: {
510
+ buiMyEnrollments: {
511
+ items: BuiMyEnrollmentRow[];
512
+ pageInfo: TecPageInfo;
513
+ };
514
+ };
515
+ dataState: "complete";
516
+ } | {
517
+ enrollments: TecEnrollment[];
518
+ client: import('@apollo/client').ApolloClient;
519
+ observable: import('@apollo/client').ObservableQuery<{
520
+ buiMyEnrollments: {
521
+ items: BuiMyEnrollmentRow[];
522
+ pageInfo: TecPageInfo;
523
+ };
524
+ }, import('@apollo/client').OperationVariables>;
525
+ previousData?: {
526
+ buiMyEnrollments: {
527
+ items: BuiMyEnrollmentRow[];
528
+ pageInfo: TecPageInfo;
529
+ };
530
+ } | undefined;
531
+ error?: ErrorLike;
532
+ loading: boolean;
533
+ networkStatus: import('@apollo/client').NetworkStatus;
534
+ startPolling: (pollInterval: number) => void;
535
+ stopPolling: () => void;
536
+ subscribeToMore: import('@apollo/client').SubscribeToMoreFunction<{
537
+ buiMyEnrollments: {
538
+ items: BuiMyEnrollmentRow[];
539
+ pageInfo: TecPageInfo;
540
+ };
541
+ }, import('@apollo/client').OperationVariables>;
542
+ updateQuery: (mapFn: import('@apollo/client').UpdateQueryMapFn<{
543
+ buiMyEnrollments: {
544
+ items: BuiMyEnrollmentRow[];
545
+ pageInfo: TecPageInfo;
546
+ };
547
+ }, import('@apollo/client').OperationVariables>) => void;
548
+ refetch: (variables?: Partial<import('@apollo/client').OperationVariables> | undefined) => Promise<{
549
+ data: {
550
+ buiMyEnrollments: {
551
+ items: BuiMyEnrollmentRow[];
552
+ pageInfo: TecPageInfo;
553
+ };
554
+ } | undefined;
555
+ error?: ErrorLike;
556
+ }>;
557
+ variables: import('@apollo/client').OperationVariables;
558
+ fetchMore: <TFetchData = {
559
+ buiMyEnrollments: {
560
+ items: BuiMyEnrollmentRow[];
561
+ pageInfo: TecPageInfo;
562
+ };
563
+ }, TFetchVars extends import('@apollo/client').OperationVariables = import('@apollo/client').OperationVariables>(fetchMoreOptions: import("@apollo/client").ObservableQuery.FetchMoreOptions<{
564
+ buiMyEnrollments: {
565
+ items: BuiMyEnrollmentRow[];
566
+ pageInfo: TecPageInfo;
567
+ };
568
+ }, import('@apollo/client').OperationVariables, TFetchData, TFetchVars>) => Promise<{
569
+ data: TFetchData | undefined;
570
+ error?: ErrorLike;
571
+ }>;
572
+ data: {
573
+ buiMyEnrollments: {
574
+ items: BuiMyEnrollmentRow[];
575
+ pageInfo: TecPageInfo;
576
+ };
577
+ };
578
+ dataState: "streaming";
579
+ };
580
+ /** The signed-in learner's own TechnoSpam certificates (canonical, self-scoped). */
581
+ export declare function useMyCertificatesQuery(scope?: MyLearningScope): {
582
+ certificates: TecCertificate[];
583
+ client: import('@apollo/client').ApolloClient;
584
+ observable: import('@apollo/client').ObservableQuery<{
585
+ buiMyCertificates: {
586
+ items: BuiMyCertificateRow[];
587
+ pageInfo: TecPageInfo;
588
+ };
589
+ }, import('@apollo/client').OperationVariables>;
590
+ previousData?: {
591
+ buiMyCertificates: {
592
+ items: BuiMyCertificateRow[];
593
+ pageInfo: TecPageInfo;
594
+ };
595
+ } | undefined;
596
+ error?: ErrorLike;
597
+ loading: boolean;
598
+ networkStatus: import('@apollo/client').NetworkStatus;
599
+ startPolling: (pollInterval: number) => void;
600
+ stopPolling: () => void;
601
+ subscribeToMore: import('@apollo/client').SubscribeToMoreFunction<{
602
+ buiMyCertificates: {
603
+ items: BuiMyCertificateRow[];
604
+ pageInfo: TecPageInfo;
605
+ };
606
+ }, import('@apollo/client').OperationVariables>;
607
+ updateQuery: (mapFn: import('@apollo/client').UpdateQueryMapFn<{
608
+ buiMyCertificates: {
609
+ items: BuiMyCertificateRow[];
610
+ pageInfo: TecPageInfo;
611
+ };
612
+ }, import('@apollo/client').OperationVariables>) => void;
613
+ refetch: (variables?: Partial<import('@apollo/client').OperationVariables> | undefined) => Promise<{
614
+ data: {
615
+ buiMyCertificates: {
616
+ items: BuiMyCertificateRow[];
617
+ pageInfo: TecPageInfo;
618
+ };
619
+ } | undefined;
620
+ error?: ErrorLike;
621
+ }>;
622
+ variables: import('@apollo/client').OperationVariables;
623
+ fetchMore: <TFetchData = {
624
+ buiMyCertificates: {
625
+ items: BuiMyCertificateRow[];
626
+ pageInfo: TecPageInfo;
627
+ };
628
+ }, TFetchVars extends import('@apollo/client').OperationVariables = import('@apollo/client').OperationVariables>(fetchMoreOptions: import("@apollo/client").ObservableQuery.FetchMoreOptions<{
629
+ buiMyCertificates: {
630
+ items: BuiMyCertificateRow[];
631
+ pageInfo: TecPageInfo;
632
+ };
633
+ }, import('@apollo/client').OperationVariables, TFetchData, TFetchVars>) => Promise<{
634
+ data: TFetchData | undefined;
635
+ error?: ErrorLike;
636
+ }>;
637
+ data: undefined;
638
+ dataState: "empty";
639
+ } | {
640
+ certificates: TecCertificate[];
641
+ client: import('@apollo/client').ApolloClient;
642
+ observable: import('@apollo/client').ObservableQuery<{
643
+ buiMyCertificates: {
644
+ items: BuiMyCertificateRow[];
645
+ pageInfo: TecPageInfo;
646
+ };
647
+ }, import('@apollo/client').OperationVariables>;
648
+ previousData?: {
649
+ buiMyCertificates: {
650
+ items: BuiMyCertificateRow[];
651
+ pageInfo: TecPageInfo;
652
+ };
653
+ } | undefined;
654
+ error?: ErrorLike;
655
+ loading: boolean;
656
+ networkStatus: import('@apollo/client').NetworkStatus;
657
+ startPolling: (pollInterval: number) => void;
658
+ stopPolling: () => void;
659
+ subscribeToMore: import('@apollo/client').SubscribeToMoreFunction<{
660
+ buiMyCertificates: {
661
+ items: BuiMyCertificateRow[];
662
+ pageInfo: TecPageInfo;
663
+ };
664
+ }, import('@apollo/client').OperationVariables>;
665
+ updateQuery: (mapFn: import('@apollo/client').UpdateQueryMapFn<{
666
+ buiMyCertificates: {
667
+ items: BuiMyCertificateRow[];
668
+ pageInfo: TecPageInfo;
669
+ };
670
+ }, import('@apollo/client').OperationVariables>) => void;
671
+ refetch: (variables?: Partial<import('@apollo/client').OperationVariables> | undefined) => Promise<{
672
+ data: {
673
+ buiMyCertificates: {
674
+ items: BuiMyCertificateRow[];
675
+ pageInfo: TecPageInfo;
676
+ };
677
+ } | undefined;
678
+ error?: ErrorLike;
679
+ }>;
680
+ variables: import('@apollo/client').OperationVariables;
681
+ fetchMore: <TFetchData = {
682
+ buiMyCertificates: {
683
+ items: BuiMyCertificateRow[];
684
+ pageInfo: TecPageInfo;
685
+ };
686
+ }, TFetchVars extends import('@apollo/client').OperationVariables = import('@apollo/client').OperationVariables>(fetchMoreOptions: import("@apollo/client").ObservableQuery.FetchMoreOptions<{
687
+ buiMyCertificates: {
688
+ items: BuiMyCertificateRow[];
689
+ pageInfo: TecPageInfo;
690
+ };
691
+ }, import('@apollo/client').OperationVariables, TFetchData, TFetchVars>) => Promise<{
692
+ data: TFetchData | undefined;
693
+ error?: ErrorLike;
694
+ }>;
695
+ data: {
696
+ buiMyCertificates: {
697
+ items: BuiMyCertificateRow[];
698
+ pageInfo: TecPageInfo;
699
+ };
700
+ };
701
+ dataState: "complete";
702
+ } | {
703
+ certificates: TecCertificate[];
704
+ client: import('@apollo/client').ApolloClient;
705
+ observable: import('@apollo/client').ObservableQuery<{
706
+ buiMyCertificates: {
707
+ items: BuiMyCertificateRow[];
708
+ pageInfo: TecPageInfo;
709
+ };
710
+ }, import('@apollo/client').OperationVariables>;
711
+ previousData?: {
712
+ buiMyCertificates: {
713
+ items: BuiMyCertificateRow[];
714
+ pageInfo: TecPageInfo;
715
+ };
716
+ } | undefined;
717
+ error?: ErrorLike;
718
+ loading: boolean;
719
+ networkStatus: import('@apollo/client').NetworkStatus;
720
+ startPolling: (pollInterval: number) => void;
721
+ stopPolling: () => void;
722
+ subscribeToMore: import('@apollo/client').SubscribeToMoreFunction<{
723
+ buiMyCertificates: {
724
+ items: BuiMyCertificateRow[];
725
+ pageInfo: TecPageInfo;
726
+ };
727
+ }, import('@apollo/client').OperationVariables>;
728
+ updateQuery: (mapFn: import('@apollo/client').UpdateQueryMapFn<{
729
+ buiMyCertificates: {
730
+ items: BuiMyCertificateRow[];
731
+ pageInfo: TecPageInfo;
732
+ };
733
+ }, import('@apollo/client').OperationVariables>) => void;
734
+ refetch: (variables?: Partial<import('@apollo/client').OperationVariables> | undefined) => Promise<{
735
+ data: {
736
+ buiMyCertificates: {
737
+ items: BuiMyCertificateRow[];
738
+ pageInfo: TecPageInfo;
739
+ };
740
+ } | undefined;
741
+ error?: ErrorLike;
742
+ }>;
743
+ variables: import('@apollo/client').OperationVariables;
744
+ fetchMore: <TFetchData = {
745
+ buiMyCertificates: {
746
+ items: BuiMyCertificateRow[];
747
+ pageInfo: TecPageInfo;
748
+ };
749
+ }, TFetchVars extends import('@apollo/client').OperationVariables = import('@apollo/client').OperationVariables>(fetchMoreOptions: import("@apollo/client").ObservableQuery.FetchMoreOptions<{
750
+ buiMyCertificates: {
751
+ items: BuiMyCertificateRow[];
752
+ pageInfo: TecPageInfo;
753
+ };
754
+ }, import('@apollo/client').OperationVariables, TFetchData, TFetchVars>) => Promise<{
755
+ data: TFetchData | undefined;
756
+ error?: ErrorLike;
757
+ }>;
758
+ data: {
759
+ buiMyCertificates: {
760
+ items: BuiMyCertificateRow[];
761
+ pageInfo: TecPageInfo;
762
+ };
763
+ };
764
+ dataState: "streaming";
765
+ };
381
766
  export declare const useProblemsQuery: (vars: {
382
767
  difficulty?: TecProblemDifficulty;
383
768
  status?: TecProblemStatus;
@@ -736,17 +1121,8 @@ export declare function usePageLimit(step?: number, initial?: number): PageLimit
736
1121
  export interface LessonPlayerData {
737
1122
  tecLesson: TecLesson | null;
738
1123
  tecCourse: TecCourse | null;
739
- tecMyEnrollments: {
740
- items: TecEnrollment[];
741
- };
742
1124
  }
743
1125
  export declare const useLessonPlayerQuery: (courseId: string, lessonId: string) => useQuery.Result<LessonPlayerData, import('@apollo/client').OperationVariables, "empty" | "complete" | "streaming", import('@apollo/client').OperationVariables>;
744
- /** courseId → next lesson id for the signed-in learner's enrollments. */
745
- export declare const useMyNextLessonsQuery: () => useQuery.Result<{
746
- tecMyEnrollments: {
747
- items: Pick<TecEnrollment, "id" | "courseId" | "nextLessonId">[];
748
- };
749
- }, import('@apollo/client').OperationVariables, "empty" | "complete" | "streaming", import('@apollo/client').OperationVariables>;
750
1126
  export declare const useLessonQuizKeyQuery: (lessonId: string, skip?: boolean) => useQuery.Result<{
751
1127
  tecLessonQuizKey: TecQuizQuestionKey[];
752
1128
  }, import('@apollo/client').OperationVariables, "empty" | "complete" | "streaming", import('@apollo/client').OperationVariables>;