@burdenoff/microfe-buildmyiq 2026.720.3 → 2026.720.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"BuildmyiqRoutes.d.ts","sourceRoot":"","sources":["../../src/buildmyiq/BuildmyiqRoutes.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAc,EAAE,KAAK,EAAE,EAAkB,MAAM,OAAO,CAAC;AAwGvD,eAAO,MAAM,eAAe,EAAE,EAmE7B,CAAC"}
1
+ {"version":3,"file":"BuildmyiqRoutes.d.ts","sourceRoot":"","sources":["../../src/buildmyiq/BuildmyiqRoutes.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAc,EAAE,KAAK,EAAE,EAAkB,MAAM,OAAO,CAAC;AAwGvD,eAAO,MAAM,eAAe,EAAE,EAuE7B,CAAC"}
@@ -85,6 +85,10 @@ var j = () => {
85
85
  path: "submissions",
86
86
  element: A("buildmyiq.submissions", /* @__PURE__ */ u(w, {}))
87
87
  }),
88
+ /* @__PURE__ */ u(s, {
89
+ path: "submissions/:submissionId",
90
+ element: A("buildmyiq.submissions", /* @__PURE__ */ u(w, {}))
91
+ }),
88
92
  /* @__PURE__ */ u(s, {
89
93
  path: "cohorts",
90
94
  element: A("buildmyiq.cohorts", /* @__PURE__ */ u(T, {}))
@@ -1 +1 @@
1
- {"version":3,"file":"BuildmyiqRoutes.js","names":[],"sources":["../../src/buildmyiq/BuildmyiqRoutes.tsx"],"sourcesContent":["/**\n * Buildmyiq Routes\n * @module buildmyiq\n *\n * Domain routes. The dashboard is eager-loaded (primary landing); all other\n * pages are lazy-loaded. Every route maps to a real `bui*` backend capability.\n * All product routes are gated by feature flags that default to enabled.\n */\n\nimport React, { type FC, lazy, Suspense } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router-dom';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { useBuildmyiq } from './context';\nimport { useTr } from './shared/hooks/useTr';\n\n// Eager — primary landing\nimport { DashboardPage } from './pages/DashboardPage';\n\n// Catalog (learner-facing course discovery + detail + enrol)\nconst CatalogPage = lazy(() =>\n import('./pages/catalog/CatalogPage').then((m) => ({ default: m.CatalogPage }))\n);\nconst CourseDetailPage = lazy(() =>\n import('./pages/catalog/CourseDetailPage').then((m) => ({ default: m.CourseDetailPage }))\n);\n\n// My Learning (enrollments + progress + lesson player)\nconst MyLearningPage = lazy(() =>\n import('./pages/learning/MyLearningPage').then((m) => ({ default: m.MyLearningPage }))\n);\nconst LessonPlayerPage = lazy(() =>\n import('./pages/learning/LessonPlayerPage').then((m) => ({ default: m.LessonPlayerPage }))\n);\n\n// Authoring (instructor course management + builder)\nconst AuthoringPage = lazy(() =>\n import('./pages/authoring/AuthoringPage').then((m) => ({ default: m.AuthoringPage }))\n);\nconst CourseBuilderPage = lazy(() =>\n import('./pages/authoring/CourseBuilderPage').then((m) => ({ default: m.CourseBuilderPage }))\n);\n\n// Assessments (list + builder/questions/detail)\nconst AssessmentsPage = lazy(() =>\n import('./pages/assessments/AssessmentsPage').then((m) => ({ default: m.AssessmentsPage }))\n);\nconst AssessmentDetailPage = lazy(() =>\n import('./pages/assessments/AssessmentDetailPage').then((m) => ({\n default: m.AssessmentDetailPage,\n }))\n);\n// Learner-facing: take a published assessment (answer + submit)\nconst TakeAssessmentPage = lazy(() =>\n import('./pages/assessments/TakeAssessmentPage').then((m) => ({ default: m.TakeAssessmentPage }))\n);\n\n// Insights (educator analytics, derived from real data)\nconst InsightsPage = lazy(() =>\n import('./pages/insights/InsightsPage').then((m) => ({ default: m.InsightsPage }))\n);\n\n// Skill Journeys (derived guided paths)\nconst PathsPage = lazy(() =>\n import('./pages/paths/PathsPage').then((m) => ({ default: m.PathsPage }))\n);\n\n// Grading (submissions queue)\nconst SubmissionsPage = lazy(() =>\n import('./pages/submissions/SubmissionsPage').then((m) => ({ default: m.SubmissionsPage }))\n);\n\n// Cohorts\nconst CohortsPage = lazy(() =>\n import('./pages/cohorts/CohortsPage').then((m) => ({ default: m.CohortsPage }))\n);\n\n// Skills taxonomy\nconst SkillsPage = lazy(() =>\n import('./pages/skills/SkillsPage').then((m) => ({ default: m.SkillsPage }))\n);\n\n// Certificates\nconst CertificatesPage = lazy(() =>\n import('./pages/certificates/CertificatesPage').then((m) => ({ default: m.CertificatesPage }))\n);\n\nconst PageLoader: FC = () => (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n);\n\nfunction FeatureDisabledFallback() {\n const tr = useTr();\n return (\n <div className=\"flex h-full min-h-[200px] items-center justify-center text-sm text-text-secondary\">\n {tr(\n 'buildmyiq.pages.featureDisabled',\n 'This feature is currently disabled. You can enable it from Feature Previews.'\n )}\n </div>\n );\n}\n\nfunction gated(flag: string, element: React.ReactNode, defaultValue = true): React.ReactElement {\n return (\n <FeatureGate flag={flag} defaultValue={defaultValue} fallback={<FeatureDisabledFallback />}>\n {element}\n </FeatureGate>\n );\n}\n\nexport const BuildmyiqRoutes: FC = () => {\n const { basePath, isStandalone } = useBuildmyiq();\n const location = useLocation();\n\n const normalizedBasePath = basePath === '/' ? '' : (basePath ?? '').replace(/\\/$/, '');\n\n // Guard: only render if the current path matches basePath (integrated mode).\n if (normalizedBasePath && !isStandalone) {\n const pathMatches =\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + '/');\n if (!pathMatches) {\n return null;\n }\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={gated('buildmyiq.overview', <DashboardPage />)} />\n\n <Route path=\"catalog\" element={gated('buildmyiq.catalog', <CatalogPage />)} />\n <Route\n path=\"catalog/:courseId\"\n element={gated('buildmyiq.catalog', <CourseDetailPage />)}\n />\n\n <Route path=\"learning\" element={gated('buildmyiq.learning', <MyLearningPage />)} />\n <Route\n path=\"learning/:enrollmentId\"\n element={gated('buildmyiq.learning', <LessonPlayerPage />)}\n />\n\n <Route path=\"paths\" element={gated('buildmyiq.paths', <PathsPage />)} />\n\n <Route path=\"authoring\" element={gated('buildmyiq.authoring', <AuthoringPage />)} />\n <Route\n path=\"authoring/:courseId\"\n element={gated('buildmyiq.authoring', <CourseBuilderPage />)}\n />\n\n <Route path=\"assessments\" element={gated('buildmyiq.assessments', <AssessmentsPage />)} />\n <Route\n path=\"assessments/:assessmentId\"\n element={gated('buildmyiq.assessments', <AssessmentDetailPage />)}\n />\n <Route\n path=\"assessments/:assessmentId/take\"\n element={gated('buildmyiq.assessments', <TakeAssessmentPage />)}\n />\n\n <Route path=\"insights\" element={gated('buildmyiq.insights', <InsightsPage />)} />\n\n <Route path=\"submissions\" element={gated('buildmyiq.submissions', <SubmissionsPage />)} />\n <Route path=\"cohorts\" element={gated('buildmyiq.cohorts', <CohortsPage />)} />\n <Route path=\"skills\" element={gated('buildmyiq.skills', <SkillsPage />)} />\n <Route\n path=\"certificates\"\n element={gated('buildmyiq.certificates', <CertificatesPage />)}\n />\n\n <Route path=\"*\" element={<Navigate to={normalizedBasePath || '/'} replace />} />\n </Routes>\n </Suspense>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"BuildmyiqRoutes.js","names":[],"sources":["../../src/buildmyiq/BuildmyiqRoutes.tsx"],"sourcesContent":["/**\n * Buildmyiq Routes\n * @module buildmyiq\n *\n * Domain routes. The dashboard is eager-loaded (primary landing); all other\n * pages are lazy-loaded. Every route maps to a real `bui*` backend capability.\n * All product routes are gated by feature flags that default to enabled.\n */\n\nimport React, { type FC, lazy, Suspense } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router-dom';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { useBuildmyiq } from './context';\nimport { useTr } from './shared/hooks/useTr';\n\n// Eager — primary landing\nimport { DashboardPage } from './pages/DashboardPage';\n\n// Catalog (learner-facing course discovery + detail + enrol)\nconst CatalogPage = lazy(() =>\n import('./pages/catalog/CatalogPage').then((m) => ({ default: m.CatalogPage }))\n);\nconst CourseDetailPage = lazy(() =>\n import('./pages/catalog/CourseDetailPage').then((m) => ({ default: m.CourseDetailPage }))\n);\n\n// My Learning (enrollments + progress + lesson player)\nconst MyLearningPage = lazy(() =>\n import('./pages/learning/MyLearningPage').then((m) => ({ default: m.MyLearningPage }))\n);\nconst LessonPlayerPage = lazy(() =>\n import('./pages/learning/LessonPlayerPage').then((m) => ({ default: m.LessonPlayerPage }))\n);\n\n// Authoring (instructor course management + builder)\nconst AuthoringPage = lazy(() =>\n import('./pages/authoring/AuthoringPage').then((m) => ({ default: m.AuthoringPage }))\n);\nconst CourseBuilderPage = lazy(() =>\n import('./pages/authoring/CourseBuilderPage').then((m) => ({ default: m.CourseBuilderPage }))\n);\n\n// Assessments (list + builder/questions/detail)\nconst AssessmentsPage = lazy(() =>\n import('./pages/assessments/AssessmentsPage').then((m) => ({ default: m.AssessmentsPage }))\n);\nconst AssessmentDetailPage = lazy(() =>\n import('./pages/assessments/AssessmentDetailPage').then((m) => ({\n default: m.AssessmentDetailPage,\n }))\n);\n// Learner-facing: take a published assessment (answer + submit)\nconst TakeAssessmentPage = lazy(() =>\n import('./pages/assessments/TakeAssessmentPage').then((m) => ({ default: m.TakeAssessmentPage }))\n);\n\n// Insights (educator analytics, derived from real data)\nconst InsightsPage = lazy(() =>\n import('./pages/insights/InsightsPage').then((m) => ({ default: m.InsightsPage }))\n);\n\n// Skill Journeys (derived guided paths)\nconst PathsPage = lazy(() =>\n import('./pages/paths/PathsPage').then((m) => ({ default: m.PathsPage }))\n);\n\n// Grading (submissions queue)\nconst SubmissionsPage = lazy(() =>\n import('./pages/submissions/SubmissionsPage').then((m) => ({ default: m.SubmissionsPage }))\n);\n\n// Cohorts\nconst CohortsPage = lazy(() =>\n import('./pages/cohorts/CohortsPage').then((m) => ({ default: m.CohortsPage }))\n);\n\n// Skills taxonomy\nconst SkillsPage = lazy(() =>\n import('./pages/skills/SkillsPage').then((m) => ({ default: m.SkillsPage }))\n);\n\n// Certificates\nconst CertificatesPage = lazy(() =>\n import('./pages/certificates/CertificatesPage').then((m) => ({ default: m.CertificatesPage }))\n);\n\nconst PageLoader: FC = () => (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n);\n\nfunction FeatureDisabledFallback() {\n const tr = useTr();\n return (\n <div className=\"flex h-full min-h-[200px] items-center justify-center text-sm text-text-secondary\">\n {tr(\n 'buildmyiq.pages.featureDisabled',\n 'This feature is currently disabled. You can enable it from Feature Previews.'\n )}\n </div>\n );\n}\n\nfunction gated(flag: string, element: React.ReactNode, defaultValue = true): React.ReactElement {\n return (\n <FeatureGate flag={flag} defaultValue={defaultValue} fallback={<FeatureDisabledFallback />}>\n {element}\n </FeatureGate>\n );\n}\n\nexport const BuildmyiqRoutes: FC = () => {\n const { basePath, isStandalone } = useBuildmyiq();\n const location = useLocation();\n\n const normalizedBasePath = basePath === '/' ? '' : (basePath ?? '').replace(/\\/$/, '');\n\n // Guard: only render if the current path matches basePath (integrated mode).\n if (normalizedBasePath && !isStandalone) {\n const pathMatches =\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + '/');\n if (!pathMatches) {\n return null;\n }\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={gated('buildmyiq.overview', <DashboardPage />)} />\n\n <Route path=\"catalog\" element={gated('buildmyiq.catalog', <CatalogPage />)} />\n <Route\n path=\"catalog/:courseId\"\n element={gated('buildmyiq.catalog', <CourseDetailPage />)}\n />\n\n <Route path=\"learning\" element={gated('buildmyiq.learning', <MyLearningPage />)} />\n <Route\n path=\"learning/:enrollmentId\"\n element={gated('buildmyiq.learning', <LessonPlayerPage />)}\n />\n\n <Route path=\"paths\" element={gated('buildmyiq.paths', <PathsPage />)} />\n\n <Route path=\"authoring\" element={gated('buildmyiq.authoring', <AuthoringPage />)} />\n <Route\n path=\"authoring/:courseId\"\n element={gated('buildmyiq.authoring', <CourseBuilderPage />)}\n />\n\n <Route path=\"assessments\" element={gated('buildmyiq.assessments', <AssessmentsPage />)} />\n <Route\n path=\"assessments/:assessmentId\"\n element={gated('buildmyiq.assessments', <AssessmentDetailPage />)}\n />\n <Route\n path=\"assessments/:assessmentId/take\"\n element={gated('buildmyiq.assessments', <TakeAssessmentPage />)}\n />\n\n <Route path=\"insights\" element={gated('buildmyiq.insights', <InsightsPage />)} />\n\n <Route path=\"submissions\" element={gated('buildmyiq.submissions', <SubmissionsPage />)} />\n <Route\n path=\"submissions/:submissionId\"\n element={gated('buildmyiq.submissions', <SubmissionsPage />)}\n />\n <Route path=\"cohorts\" element={gated('buildmyiq.cohorts', <CohortsPage />)} />\n <Route path=\"skills\" element={gated('buildmyiq.skills', <SkillsPage />)} />\n <Route\n path=\"certificates\"\n element={gated('buildmyiq.certificates', <CertificatesPage />)}\n />\n\n <Route path=\"*\" element={<Navigate to={normalizedBasePath || '/'} replace />} />\n </Routes>\n </Suspense>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -31,6 +31,8 @@ export interface UseBuiPermissionsResult {
31
31
  canCreateAssessment: boolean;
32
32
  /** @rbac(action: "update", resource: "buildmyiq-assessment") — buiPublishAssessment */
33
33
  canUpdateAssessment: boolean;
34
+ /** @rbac(action: "delete", resource: "buildmyiq-assessment") — buiArchiveAssessment */
35
+ canArchiveAssessment: boolean;
34
36
  /** @rbac(action: "create", resource: "buildmyiq-question") — buiCreateQuestion */
35
37
  canCreateQuestion: boolean;
36
38
  /** @rbac(action: "create", resource: "buildmyiq-submission") — buiSubmitAssessment */
@@ -1 +1 @@
1
- {"version":3,"file":"useBuiPermissions.d.ts","sourceRoot":"","sources":["../../../src/buildmyiq/hooks/useBuiPermissions.ts"],"names":[],"mappings":"AA6BA,+EAA+E;AAC/E,MAAM,MAAM,WAAW,GACnB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,iBAAiB,GACjB,sBAAsB,GACtB,kBAAkB,GAClB,uBAAuB,GACvB,sBAAsB,GACtB,oBAAoB,GACpB,sBAAsB,CAAC;AAE3B,wDAAwD;AACxD,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAWzE,MAAM,WAAW,uBAAuB;IACtC,sDAAsD;IACtD,GAAG,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC;IAG3D,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;IACzB,iGAAiG;IACjG,eAAe,EAAE,OAAO,CAAC;IACzB,+EAA+E;IAC/E,gBAAgB,EAAE,OAAO,CAAC;IAC1B,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;IACzB,4EAA4E;IAC5E,cAAc,EAAE,OAAO,CAAC;IAGxB,4EAA4E;IAC5E,SAAS,EAAE,OAAO,CAAC;IACnB,8FAA8F;IAC9F,mBAAmB,EAAE,OAAO,CAAC;IAC7B,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;IAGzB,uFAAuF;IACvF,mBAAmB,EAAE,OAAO,CAAC;IAC7B,wFAAwF;IACxF,oBAAoB,EAAE,OAAO,CAAC;IAG9B,sFAAsF;IACtF,mBAAmB,EAAE,OAAO,CAAC;IAC7B,uFAAuF;IACvF,mBAAmB,EAAE,OAAO,CAAC;IAC7B,kFAAkF;IAClF,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,mBAAmB,EAAE,OAAO,CAAC;IAC7B,qFAAqF;IACrF,kBAAkB,EAAE,OAAO,CAAC;IAE5B,sDAAsD;IACtD,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,uBAAuB,CAmC3D;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CAE9E"}
1
+ {"version":3,"file":"useBuiPermissions.d.ts","sourceRoot":"","sources":["../../../src/buildmyiq/hooks/useBuiPermissions.ts"],"names":[],"mappings":"AA6BA,+EAA+E;AAC/E,MAAM,MAAM,WAAW,GACnB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,iBAAiB,GACjB,sBAAsB,GACtB,kBAAkB,GAClB,uBAAuB,GACvB,sBAAsB,GACtB,oBAAoB,GACpB,sBAAsB,CAAC;AAE3B,wDAAwD;AACxD,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAWzE,MAAM,WAAW,uBAAuB;IACtC,sDAAsD;IACtD,GAAG,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC;IAG3D,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;IACzB,iGAAiG;IACjG,eAAe,EAAE,OAAO,CAAC;IACzB,+EAA+E;IAC/E,gBAAgB,EAAE,OAAO,CAAC;IAC1B,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;IACzB,4EAA4E;IAC5E,cAAc,EAAE,OAAO,CAAC;IAGxB,4EAA4E;IAC5E,SAAS,EAAE,OAAO,CAAC;IACnB,8FAA8F;IAC9F,mBAAmB,EAAE,OAAO,CAAC;IAC7B,8EAA8E;IAC9E,eAAe,EAAE,OAAO,CAAC;IAGzB,uFAAuF;IACvF,mBAAmB,EAAE,OAAO,CAAC;IAC7B,wFAAwF;IACxF,oBAAoB,EAAE,OAAO,CAAC;IAG9B,sFAAsF;IACtF,mBAAmB,EAAE,OAAO,CAAC;IAC7B,uFAAuF;IACvF,mBAAmB,EAAE,OAAO,CAAC;IAC7B,uFAAuF;IACvF,oBAAoB,EAAE,OAAO,CAAC;IAC9B,kFAAkF;IAClF,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,mBAAmB,EAAE,OAAO,CAAC;IAC7B,qFAAqF;IACrF,kBAAkB,EAAE,OAAO,CAAC;IAE5B,sDAAsD;IACtD,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,uBAAuB,CAoC3D;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CAE9E"}
@@ -74,6 +74,18 @@ export declare const useBuiAssessments: (courseId: string | undefined, status?:
74
74
  export declare const useBuiAssessment: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<NoInfer<BuiAssessment | null>, Error>;
75
75
  export declare const useBuiCreateAssessment: () => import('@tanstack/react-query').UseMutationResult<BuiAssessment, Error, BuiCreateAssessmentInput, unknown>;
76
76
  export declare const useBuiPublishAssessment: () => import('@tanstack/react-query').UseMutationResult<BuiAssessment, Error, string, unknown>;
77
+ /**
78
+ * Archive an assessment (soft-delete) — releases its reusable
79
+ * `buildmyiq.assessments.count` quota slot server-side (BOFF-4722) so the
80
+ * workspace can create a replacement without hitting the plan limit.
81
+ * `buiArchiveAssessment` returns only a `Boolean!`, not the record, so the
82
+ * caller supplies `courseId` (already in hand from the loaded assessment)
83
+ * to invalidate the right list query.
84
+ */
85
+ export declare const useBuiArchiveAssessment: () => import('@tanstack/react-query').UseMutationResult<boolean, Error, {
86
+ id: string;
87
+ courseId: string;
88
+ }, unknown>;
77
89
  export declare const useBuiCreateQuestion: () => import('@tanstack/react-query').UseMutationResult<BuiQuestion, Error, BuiCreateQuestionInput, unknown>;
78
90
  export interface UseBuiSubmissionsArgs {
79
91
  assessmentId?: string;
@@ -84,6 +96,8 @@ export interface UseBuiSubmissionsArgs {
84
96
  enabled?: boolean;
85
97
  }
86
98
  export declare const useBuiSubmissions: (args?: UseBuiSubmissionsArgs) => import('@tanstack/react-query').UseQueryResult<NoInfer<BuiConnection<BuiSubmission>>, Error>;
99
+ /** Single-submission lookup — used for deep-linking to `/buildmyiq/submissions/:submissionId`. */
100
+ export declare const useBuiSubmission: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<NoInfer<BuiSubmission | null>, Error>;
87
101
  export declare const useBuiSubmitAssessment: () => import('@tanstack/react-query').UseMutationResult<BuiSubmission, Error, BuiSubmitAssessmentInput, unknown>;
88
102
  export declare const useBuiGradeSubmission: () => import('@tanstack/react-query').UseMutationResult<BuiSubmission, Error, {
89
103
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"useBuildmyiqApi.d.ts","sourceRoot":"","sources":["../../../src/buildmyiq/hooks/useBuildmyiqApi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useBuildmyiqApi.d.ts","sourceRoot":"","sources":["../../../src/buildmyiq/hooks/useBuildmyiqApi.ts"],"names":[],"mappings":"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"}
@@ -53,7 +53,12 @@ var a = () => {
53
53
  certificates: ["buildmyiq", "certificates"],
54
54
  cohorts: ["buildmyiq", "cohorts"],
55
55
  skills: ["buildmyiq", "skills"],
56
- submissions: ["buildmyiq", "submissions"]
56
+ submissions: ["buildmyiq", "submissions"],
57
+ submission: (e) => [
58
+ "buildmyiq",
59
+ "submission",
60
+ e
61
+ ]
57
62
  }, c = 24, l = (e, t = c) => e ? {
58
63
  limit: t,
59
64
  cursor: e
@@ -274,6 +279,14 @@ var a = () => {
274
279
  }
275
280
  });
276
281
  }, V = () => {
282
+ let e = O(), n = r();
283
+ return t({
284
+ mutationFn: async (t) => (await o("mutation BuiArchiveAssessment($id: ID!) { buiArchiveAssessment(id: $id) }", { id: t.id }, e)).buiArchiveAssessment,
285
+ onSuccess: (e, t) => {
286
+ n.invalidateQueries({ queryKey: s.assessment(t.id) }), n.invalidateQueries({ queryKey: s.assessments(t.courseId) });
287
+ }
288
+ });
289
+ }, H = () => {
277
290
  let e = O(), n = r();
278
291
  return t({
279
292
  mutationFn: async (t) => (await o(`mutation BuiCreateQuestion($input: BuiCreateQuestionInput!) {
@@ -281,7 +294,7 @@ var a = () => {
281
294
  }`, { input: t }, e)).buiCreateQuestion,
282
295
  onSuccess: (e) => n.invalidateQueries({ queryKey: s.assessment(e.assessmentId) })
283
296
  });
284
- }, H = (e = {}) => {
297
+ }, U = (e = {}) => {
285
298
  let t = O(), { assessmentId: r, learnerId: i, status: a, cursor: c, limit: u, enabled: d = !0 } = e;
286
299
  return n({
287
300
  queryKey: [...s.submissions, {
@@ -304,7 +317,20 @@ var a = () => {
304
317
  pagination: l(c, u)
305
318
  }, t)).buiListSubmissions
306
319
  });
307
- }, U = () => {
320
+ }, W = (e) => {
321
+ let t = O();
322
+ return n({
323
+ queryKey: e ? s.submission(e) : [
324
+ "buildmyiq",
325
+ "submission",
326
+ "nil"
327
+ ],
328
+ enabled: !!e,
329
+ queryFn: async () => (await o(`query BuiSubmission($id: ID!) {
330
+ buiSubmission(id: $id) { ${y} }
331
+ }`, { id: e }, t)).buiSubmission
332
+ });
333
+ }, G = () => {
308
334
  let e = O(), n = r();
309
335
  return t({
310
336
  mutationFn: async (t) => (await o(`mutation BuiSubmitAssessment($input: BuiSubmitAssessmentInput!) {
@@ -312,7 +338,7 @@ var a = () => {
312
338
  }`, { input: t }, e)).buiSubmitAssessment,
313
339
  onSuccess: () => n.invalidateQueries({ queryKey: s.submissions })
314
340
  });
315
- }, W = () => {
341
+ }, K = () => {
316
342
  let e = O(), n = r();
317
343
  return t({
318
344
  mutationFn: async (t) => (await o(`mutation BuiGradeSubmission($id: ID!, $input: BuiGradeSubmissionInput!) {
@@ -320,7 +346,7 @@ var a = () => {
320
346
  }`, t, e)).buiGradeSubmission,
321
347
  onSuccess: () => n.invalidateQueries({ queryKey: s.submissions })
322
348
  });
323
- }, G = (e = {}) => {
349
+ }, q = (e = {}) => {
324
350
  let t = O(), { courseId: r, learnerId: i, status: a, cursor: c, limit: u, enabled: d = !0 } = e;
325
351
  return n({
326
352
  queryKey: [...s.enrollments, {
@@ -343,7 +369,7 @@ var a = () => {
343
369
  pagination: l(c, u)
344
370
  }, t)).buiListEnrollments
345
371
  });
346
- }, K = (e) => {
372
+ }, J = (e) => {
347
373
  let t = O();
348
374
  return n({
349
375
  queryKey: e ? s.enrollment(e) : [
@@ -359,7 +385,7 @@ var a = () => {
359
385
  return n.buiEnrollment ? D(n.buiEnrollment) : null;
360
386
  }
361
387
  });
362
- }, q = () => {
388
+ }, Y = () => {
363
389
  let e = O(), n = r();
364
390
  return t({
365
391
  mutationFn: async (t) => (await o(`mutation BuiEnroll($input: BuiEnrollInput!) {
@@ -367,7 +393,7 @@ var a = () => {
367
393
  }`, { input: t }, e)).buiEnroll,
368
394
  onSuccess: () => n.invalidateQueries({ queryKey: s.enrollments })
369
395
  });
370
- }, J = () => {
396
+ }, X = () => {
371
397
  let e = O(), n = r();
372
398
  return t({
373
399
  mutationFn: async (t) => (await o(`mutation BuiTransitionEnrollment($id: ID!, $status: BuiEnrollmentStatus!) {
@@ -377,7 +403,7 @@ var a = () => {
377
403
  n.invalidateQueries({ queryKey: s.enrollments }), n.invalidateQueries({ queryKey: s.enrollment(e.id) });
378
404
  }
379
405
  });
380
- }, Y = () => {
406
+ }, Z = () => {
381
407
  let e = O(), n = r();
382
408
  return t({
383
409
  mutationFn: async (t) => (await o(`mutation BuiRecordLessonProgress($input: BuiRecordLessonProgressInput!) {
@@ -387,7 +413,7 @@ var a = () => {
387
413
  n.invalidateQueries({ queryKey: s.enrollment(e.enrollmentId) }), n.invalidateQueries({ queryKey: s.enrollments });
388
414
  }
389
415
  });
390
- }, X = (e, t) => {
416
+ }, Q = (e, t) => {
391
417
  let r = O();
392
418
  return n({
393
419
  queryKey: [...s.cohorts, {
@@ -401,7 +427,7 @@ var a = () => {
401
427
  status: t
402
428
  }, r)).buiListCohorts.items
403
429
  });
404
- }, Z = () => {
430
+ }, $ = () => {
405
431
  let e = O(), n = r();
406
432
  return t({
407
433
  mutationFn: async (t) => (await o(`mutation BuiCreateCohort($input: BuiCreateCohortInput!) {
@@ -409,7 +435,7 @@ var a = () => {
409
435
  }`, { input: t }, e)).buiCreateCohort,
410
436
  onSuccess: () => n.invalidateQueries({ queryKey: s.cohorts })
411
437
  });
412
- }, Q = (e) => {
438
+ }, te = (e) => {
413
439
  let t = O();
414
440
  return n({
415
441
  queryKey: [...s.skills, { category: e }],
@@ -417,7 +443,7 @@ var a = () => {
417
443
  buiListSkills(category: $category) { items { ${d} } }
418
444
  }`, { category: e }, t)).buiListSkills.items
419
445
  });
420
- }, $ = () => {
446
+ }, ne = () => {
421
447
  let e = O(), n = r();
422
448
  return t({
423
449
  mutationFn: async (t) => (await o(`mutation BuiCreateSkill($input: BuiCreateSkillInput!) {
@@ -425,7 +451,7 @@ var a = () => {
425
451
  }`, { input: t }, e)).buiCreateSkill,
426
452
  onSuccess: () => n.invalidateQueries({ queryKey: s.skills })
427
453
  });
428
- }, te = (e, t) => {
454
+ }, re = (e, t) => {
429
455
  let r = O();
430
456
  return n({
431
457
  queryKey: [...s.certificates, {
@@ -439,7 +465,7 @@ var a = () => {
439
465
  learnerId: t
440
466
  }, r)).buiListCertificates.items
441
467
  });
442
- }, ne = () => {
468
+ }, ie = () => {
443
469
  let e = O(), n = r();
444
470
  return t({
445
471
  mutationFn: async (t) => (await o(`mutation BuiIssueCertificate($input: BuiIssueCertificateInput!) {
@@ -447,7 +473,7 @@ var a = () => {
447
473
  }`, { input: t }, e)).buiIssueCertificate,
448
474
  onSuccess: () => n.invalidateQueries({ queryKey: s.certificates })
449
475
  });
450
- }, re = () => {
476
+ }, ae = () => {
451
477
  let e = O(), n = r();
452
478
  return t({
453
479
  mutationFn: async (t) => (await o(`mutation BuiRevokeCertificate($id: ID!) {
@@ -457,6 +483,6 @@ var a = () => {
457
483
  });
458
484
  };
459
485
  //#endregion
460
- export { P as useBuiArchiveCourse, z as useBuiAssessment, R as useBuiAssessments, te as useBuiCertificates, X as useBuiCohorts, A as useBuiCourse, k as useBuiCourses, ee as useBuiCreateAssessment, Z as useBuiCreateCohort, j as useBuiCreateCourse, L as useBuiCreateLesson, I as useBuiCreateModule, V as useBuiCreateQuestion, $ as useBuiCreateSkill, q as useBuiEnroll, K as useBuiEnrollment, G as useBuiEnrollments, W as useBuiGradeSubmission, ne as useBuiIssueCertificate, F as useBuiModules, B as useBuiPublishAssessment, N as useBuiPublishCourse, Y as useBuiRecordLessonProgress, re as useBuiRevokeCertificate, Q as useBuiSkills, H as useBuiSubmissions, U as useBuiSubmitAssessment, J as useBuiTransitionEnrollment, M as useBuiUpdateCourse };
486
+ export { V as useBuiArchiveAssessment, P as useBuiArchiveCourse, z as useBuiAssessment, R as useBuiAssessments, re as useBuiCertificates, Q as useBuiCohorts, A as useBuiCourse, k as useBuiCourses, ee as useBuiCreateAssessment, $ as useBuiCreateCohort, j as useBuiCreateCourse, L as useBuiCreateLesson, I as useBuiCreateModule, H as useBuiCreateQuestion, ne as useBuiCreateSkill, Y as useBuiEnroll, J as useBuiEnrollment, q as useBuiEnrollments, K as useBuiGradeSubmission, ie as useBuiIssueCertificate, F as useBuiModules, B as useBuiPublishAssessment, N as useBuiPublishCourse, Z as useBuiRecordLessonProgress, ae as useBuiRevokeCertificate, te as useBuiSkills, W as useBuiSubmission, U as useBuiSubmissions, G as useBuiSubmitAssessment, X as useBuiTransitionEnrollment, M as useBuiUpdateCourse };
461
487
 
462
488
  //# sourceMappingURL=useBuildmyiqApi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useBuildmyiqApi.js","names":[],"sources":["../../../src/buildmyiq/hooks/useBuildmyiqApi.ts"],"sourcesContent":["/**\n * Buildmyiq API hooks\n * @module buildmyiq/hooks\n *\n * React-Query hooks wired DIRECTLY to the real `wspace-buildmyiq-svc`\n * federated GraphQL contract (the `bui*` operations). Every query/mutation\n * below uses an inline gql string whose fields match the svc\n * `.hive-schema.graphql` exactly. No mock data, no codegen.\n *\n * Transport: `graphqlFetch({ gateway: 'workspace', workspaceToken: true })` —\n * the host shell supplies the gateway base URL + a workspace-scoped token.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\n\nimport { useBuildmyiq } from '../context';\nimport type {\n BuiConnection,\n BuiCourse,\n BuiCourseLevel,\n BuiCourseStatus,\n BuiModule,\n BuiLesson,\n BuiAssessment,\n BuiAssessmentStatus,\n BuiQuestion,\n BuiSubmission,\n BuiSubmissionStatus,\n BuiEnrollment,\n BuiEnrollmentStatus,\n BuiCohort,\n BuiCohortStatus,\n BuiSkill,\n BuiSkillCategory,\n BuiCertificate,\n BuiLessonProgress,\n BuiCreateCourseInput,\n BuiUpdateCourseInput,\n BuiCreateModuleInput,\n BuiCreateLessonInput,\n BuiCreateAssessmentInput,\n BuiCreateQuestionInput,\n BuiCreateSkillInput,\n BuiCreateCohortInput,\n BuiEnrollInput,\n BuiRecordLessonProgressInput,\n BuiSubmitAssessmentInput,\n BuiGradeSubmissionInput,\n BuiIssueCertificateInput,\n PaginationInput,\n} from '../types';\n\n// ============================================================================\n// Transport\n// ============================================================================\n\n/**\n * fe-libs `graphqlFetch` coalesces `query` responses in an in-memory cache keyed\n * by operationName+variables for ~15s (mutations are never cached). A read\n * issued right after a write (e.g. the React-Query refetch triggered by our\n * `invalidateQueries`) would otherwise return the PRE-mutation response until the\n * TTL expires — making just-created/updated rows invisible until a full reload.\n * We clear those caches after every buildmyiq mutation so every follow-up read\n * is fresh.\n */\ntype GraphqlReadCacheGlobals = {\n __graphqlFetchResponseCache?: { clear: () => void };\n __graphqlFetchPendingResponses?: { clear: () => void };\n __boffGraphQLResponseCache?: { clear: () => void };\n};\n\nconst clearGraphqlReadCaches = (): void => {\n const g = globalThis as GraphqlReadCacheGlobals;\n g.__graphqlFetchResponseCache?.clear();\n g.__graphqlFetchPendingResponses?.clear();\n g.__boffGraphQLResponseCache?.clear();\n};\n\nconst buiQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n if (/^\\s*mutation\\b/.test(query)) {\n clearGraphqlReadCaches();\n }\n return response.data;\n};\n\n// React-Query key roots (one namespace per domain entity).\nconst KEY = {\n courses: ['buildmyiq', 'courses'] as const,\n course: (id: string) => ['buildmyiq', 'course', id] as const,\n modules: (courseId: string) => ['buildmyiq', 'modules', courseId] as const,\n lessons: (courseId: string) => ['buildmyiq', 'lessons', courseId] as const,\n assessments: (courseId: string) => ['buildmyiq', 'assessments', courseId] as const,\n assessment: (id: string) => ['buildmyiq', 'assessment', id] as const,\n enrollments: ['buildmyiq', 'enrollments'] as const,\n enrollment: (id: string) => ['buildmyiq', 'enrollment', id] as const,\n certificates: ['buildmyiq', 'certificates'] as const,\n cohorts: ['buildmyiq', 'cohorts'] as const,\n skills: ['buildmyiq', 'skills'] as const,\n submissions: ['buildmyiq', 'submissions'] as const,\n};\n\nconst DEFAULT_PAGE_SIZE = 24;\n\n/**\n * Build a `PaginationInput` for a list query. The FIRST page (undefined cursor)\n * OMITS the cursor key entirely — the svc rejects an explicit `cursor: null`.\n */\nconst pageVars = (cursor?: string, limit = DEFAULT_PAGE_SIZE): PaginationInput =>\n cursor ? { limit, cursor } : { limit };\n\n// ============================================================================\n// Reusable gql field selections (codegen-free strictness)\n// ============================================================================\n\nconst FILE_FIELDS = `id name downloadUrl mimeType`;\n\nconst SKILL_FIELDS = `\n id workspaceId name category description isActive createdAt updatedAt\n`;\n\nconst COURSE_CORE_FIELDS = `\n id workspaceId title slug summary description status level language\n estimatedHours isPublic tags skillId instructorId publishedAt createdAt updatedAt\n cover { ${FILE_FIELDS} }\n skill { id name category }\n`;\n\nconst MODULE_FIELDS = `\n id workspaceId courseId title description position createdAt updatedAt\n`;\n\nconst LESSON_FIELDS = `\n id workspaceId courseId moduleId title type content durationMin position isPreview\n createdAt updatedAt\n media { ${FILE_FIELDS} }\n`;\n\n// NOTE: `modules`/`lessons` are `Bui*Connection!` on the svc schema (paginated),\n// NOT plain lists — every nested selection below must go through `items { }` or\n// the gateway rejects the whole query with GRAPHQL_VALIDATION_FAILED (BOFF-4703\n// Connection-shape drift). See `flattenCourse` for the matching unwrap.\nconst COURSE_FULL_FIELDS = `\n ${COURSE_CORE_FIELDS}\n modules { items { ${MODULE_FIELDS} lessons { items { ${LESSON_FIELDS} } } } }\n lessons { items { ${LESSON_FIELDS} } }\n`;\n\nconst ASSESSMENT_FIELDS = `\n id workspaceId courseId title description type status passingScore maxAttempts\n timeLimitMin isGraded createdAt updatedAt\n`;\n\n// NOTE: BuiQuestion has NO `answerKey` on the type (create-input only).\nconst QUESTION_FIELDS = `\n id workspaceId assessmentId prompt type options points position explanation\n createdAt updatedAt\n`;\n\n// `questions` is `BuiQuestionConnection!` — see COURSE_FULL_FIELDS note above.\nconst ASSESSMENT_FULL_FIELDS = `\n ${ASSESSMENT_FIELDS}\n questions { items { ${QUESTION_FIELDS} } }\n`;\n\nconst SUBMISSION_FIELDS = `\n id workspaceId assessmentId enrollmentId learnerId attempt answers status score\n passed feedback gradedById gradedAt submittedAt createdAt updatedAt\n`;\n\nconst COHORT_FIELDS = `\n id workspaceId courseId name capacity facilitatorId startDate endDate status\n createdAt updatedAt\n`;\n\nconst LESSON_PROGRESS_FIELDS = `\n id workspaceId enrollmentId lessonId status secondsSpent completedAt createdAt updatedAt\n`;\n\nconst ENROLLMENT_FIELDS = `\n id workspaceId courseId learnerId cohortId status progressPct enrolledAt startedAt\n completedAt lastActiveAt expiresAt createdAt updatedAt\n`;\n\n// `lessonProgress` is `BuiLessonProgressConnection!` — see COURSE_FULL_FIELDS note above.\nconst ENROLLMENT_FULL_FIELDS = `\n ${ENROLLMENT_FIELDS}\n cohort { ${COHORT_FIELDS} }\n lessonProgress { items { ${LESSON_PROGRESS_FIELDS} } }\n`;\n\nconst CERTIFICATE_FIELDS = `\n id workspaceId courseId learnerId enrollmentId serial status issuedAt expiresAt\n revokedAt finalScore createdAt updatedAt\n file { ${FILE_FIELDS} }\n`;\n\n// ============================================================================\n// Connection-shape unwrap (BOFF-4703)\n// ============================================================================\n// Every `Bui*Connection` field on the wire is `{ items: T[]; pageInfo }`, never\n// a bare list — including NESTED fields like `BuiCourse.modules` or\n// `BuiAssessment.questions`. The hooks below keep returning plain flat arrays\n// to consumers (that's the shape every page in this MFE is written against),\n// so raw wire responses are unwrapped once here rather than pushing the\n// Connection shape out to every page.\n\n/** Wire shape of a `BuiModule` fetched via `COURSE_FULL_FIELDS` (nested `lessons` is a Connection). */\ntype BuiModuleWire = Omit<BuiModule, 'lessons'> & { lessons: { items: BuiLesson[] } };\n\n/** Wire shape of a `BuiCourse` fetched via `COURSE_FULL_FIELDS`. */\ntype BuiCourseWire = Omit<BuiCourse, 'modules' | 'lessons'> & {\n modules: { items: BuiModuleWire[] };\n lessons: { items: BuiLesson[] };\n};\n\nconst flattenCourse = (c: BuiCourseWire): BuiCourse => ({\n ...c,\n modules: c.modules.items.map((m) => ({ ...m, lessons: m.lessons.items })),\n lessons: c.lessons.items,\n});\n\n/** Wire shape of a `BuiAssessment` fetched via `ASSESSMENT_FULL_FIELDS`. */\ntype BuiAssessmentWire = Omit<BuiAssessment, 'questions'> & { questions: { items: BuiQuestion[] } };\n\nconst flattenAssessment = (a: BuiAssessmentWire): BuiAssessment => ({\n ...a,\n questions: a.questions.items,\n});\n\n/** Wire shape of a `BuiEnrollment` fetched via `ENROLLMENT_FULL_FIELDS`. */\ntype BuiEnrollmentWire = Omit<BuiEnrollment, 'lessonProgress'> & {\n lessonProgress: { items: BuiLessonProgress[] };\n};\n\nconst flattenEnrollment = (e: BuiEnrollmentWire): BuiEnrollment => ({\n ...e,\n lessonProgress: e.lessonProgress.items,\n});\n\n// ============================================================================\n// Shared hook helper: resolve gateway URL from context\n// ============================================================================\n\nconst useGateway = (): string | undefined => {\n const { apiGatewayUrl } = useBuildmyiq();\n return apiGatewayUrl;\n};\n\n// ============================================================================\n// Courses\n// ============================================================================\n\nexport interface UseBuiCoursesArgs {\n level?: BuiCourseLevel;\n status?: BuiCourseStatus;\n cursor?: string;\n limit?: number;\n enabled?: boolean;\n}\n\nexport const useBuiCourses = (args: UseBuiCoursesArgs = {}) => {\n const baseUrl = useGateway();\n const { level, status, cursor, limit, enabled = true } = args;\n return useQuery({\n queryKey: [...KEY.courses, { level, status, cursor, limit }],\n enabled,\n queryFn: async () => {\n // Only `id` is needed here (list view shows module/lesson COUNTS, not\n // full records — see CourseCard.tsx) so we intentionally under-select\n // vs. the full `BuiModule`/`BuiLesson` shape; still must go through\n // `items { }` since both fields are Connections (BOFF-4703).\n const data = await buiQuery<{\n buiListCourses: {\n items: Array<\n Omit<BuiCourse, 'modules' | 'lessons'> & {\n modules: { items: Array<{ id: string }> };\n lessons: { items: Array<{ id: string }> };\n }\n >;\n pageInfo: BuiConnection<BuiCourse>['pageInfo'];\n };\n }>(\n `query BuiListCourses($level: BuiCourseLevel, $status: BuiCourseStatus, $pagination: PaginationInput) {\n buiListCourses(level: $level, status: $status, pagination: $pagination) {\n items { ${COURSE_CORE_FIELDS} modules { items { id } } lessons { items { id } } }\n pageInfo { cursor hasMore }\n }\n }`,\n { level, status, pagination: pageVars(cursor, limit) },\n baseUrl\n );\n return {\n items: data.buiListCourses.items.map((c) => ({\n ...c,\n // Partial `{ id }`-only records are cast to the full type — safe here\n // because every consumer of the list view only reads `.length`.\n modules: c.modules.items as unknown as BuiModule[],\n lessons: c.lessons.items as unknown as BuiLesson[],\n })),\n pageInfo: data.buiListCourses.pageInfo,\n };\n },\n });\n};\n\nexport const useBuiCourse = (id: string | undefined) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: id ? KEY.course(id) : ['buildmyiq', 'course', 'nil'],\n enabled: Boolean(id),\n queryFn: async () => {\n const data = await buiQuery<{ buiCourse: BuiCourseWire | null }>(\n `query BuiCourse($id: ID!) {\n buiCourse(id: $id) { ${COURSE_FULL_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiCourse ? flattenCourse(data.buiCourse) : null;\n },\n });\n};\n\nexport const useBuiCreateCourse = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiCreateCourseInput) => {\n const data = await buiQuery<{ buiCreateCourse: BuiCourse }>(\n `mutation BuiCreateCourse($input: BuiCreateCourseInput!) {\n buiCreateCourse(input: $input) { ${COURSE_CORE_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiCreateCourse;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.courses }),\n });\n};\n\nexport const useBuiUpdateCourse = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (args: { id: string; input: BuiUpdateCourseInput }) => {\n const data = await buiQuery<{ buiUpdateCourse: BuiCourse }>(\n `mutation BuiUpdateCourse($id: ID!, $input: BuiUpdateCourseInput!) {\n buiUpdateCourse(id: $id, input: $input) { ${COURSE_CORE_FIELDS} }\n }`,\n args,\n baseUrl\n );\n return data.buiUpdateCourse;\n },\n onSuccess: (course) => {\n qc.invalidateQueries({ queryKey: KEY.courses });\n qc.invalidateQueries({ queryKey: KEY.course(course.id) });\n },\n });\n};\n\nexport const useBuiPublishCourse = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await buiQuery<{ buiPublishCourse: BuiCourse }>(\n `mutation BuiPublishCourse($id: ID!) {\n buiPublishCourse(id: $id) { ${COURSE_CORE_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiPublishCourse;\n },\n onSuccess: (course) => {\n qc.invalidateQueries({ queryKey: KEY.courses });\n qc.invalidateQueries({ queryKey: KEY.course(course.id) });\n },\n });\n};\n\nexport const useBuiArchiveCourse = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await buiQuery<{ buiArchiveCourse: boolean }>(\n `mutation BuiArchiveCourse($id: ID!) { buiArchiveCourse(id: $id) }`,\n { id },\n baseUrl\n );\n return data.buiArchiveCourse;\n },\n onSuccess: (_r, id) => {\n qc.invalidateQueries({ queryKey: KEY.courses });\n qc.invalidateQueries({ queryKey: KEY.course(id) });\n },\n });\n};\n\n// ============================================================================\n// Modules & lessons\n// ============================================================================\n\nexport const useBuiModules = (courseId: string | undefined) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: courseId ? KEY.modules(courseId) : ['buildmyiq', 'modules', 'nil'],\n enabled: Boolean(courseId),\n queryFn: async () => {\n const data = await buiQuery<{ buiListModules: { items: BuiModuleWire[] } }>(\n `query BuiListModules($courseId: ID!) {\n buiListModules(courseId: $courseId) {\n items { ${MODULE_FIELDS} lessons { items { ${LESSON_FIELDS} } } }\n }\n }`,\n { courseId },\n baseUrl\n );\n return data.buiListModules.items.map((m) => ({ ...m, lessons: m.lessons.items }));\n },\n });\n};\n\nexport const useBuiLessons = (courseId: string | undefined, moduleId?: string) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: courseId ? [...KEY.lessons(courseId), { moduleId }] : ['buildmyiq', 'lessons', 'nil'],\n enabled: Boolean(courseId),\n queryFn: async () => {\n const data = await buiQuery<{ buiListLessons: { items: BuiLesson[] } }>(\n `query BuiListLessons($courseId: ID!, $moduleId: ID) {\n buiListLessons(courseId: $courseId, moduleId: $moduleId) { items { ${LESSON_FIELDS} } }\n }`,\n { courseId, moduleId },\n baseUrl\n );\n return data.buiListLessons.items;\n },\n });\n};\n\nexport const useBuiCreateModule = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiCreateModuleInput) => {\n const data = await buiQuery<{ buiCreateModule: BuiModule }>(\n `mutation BuiCreateModule($input: BuiCreateModuleInput!) {\n buiCreateModule(input: $input) { ${MODULE_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiCreateModule;\n },\n onSuccess: (m) => {\n qc.invalidateQueries({ queryKey: KEY.modules(m.courseId) });\n qc.invalidateQueries({ queryKey: KEY.course(m.courseId) });\n },\n });\n};\n\nexport const useBuiCreateLesson = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiCreateLessonInput) => {\n const data = await buiQuery<{ buiCreateLesson: BuiLesson }>(\n `mutation BuiCreateLesson($input: BuiCreateLessonInput!) {\n buiCreateLesson(input: $input) { ${LESSON_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiCreateLesson;\n },\n onSuccess: (l) => {\n qc.invalidateQueries({ queryKey: KEY.lessons(l.courseId) });\n qc.invalidateQueries({ queryKey: KEY.modules(l.courseId) });\n qc.invalidateQueries({ queryKey: KEY.course(l.courseId) });\n },\n });\n};\n\n// ============================================================================\n// Assessments & questions\n// ============================================================================\n\nexport const useBuiAssessments = (courseId: string | undefined, status?: BuiAssessmentStatus) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: courseId\n ? [...KEY.assessments(courseId), { status }]\n : ['buildmyiq', 'assessments', 'nil'],\n enabled: Boolean(courseId),\n queryFn: async () => {\n // Only `id` is needed here (list view shows a question COUNT, not full\n // records — see AssessmentsPage.tsx); still must go through `items { }`\n // since `questions` is a Connection (BOFF-4703).\n const data = await buiQuery<{\n buiListAssessments: {\n items: Array<\n Omit<BuiAssessment, 'questions'> & { questions: { items: Array<{ id: string }> } }\n >;\n };\n }>(\n `query BuiListAssessments($courseId: ID!, $status: BuiAssessmentStatus) {\n buiListAssessments(courseId: $courseId, status: $status) {\n items { ${ASSESSMENT_FIELDS} questions { items { id } } }\n }\n }`,\n { courseId, status },\n baseUrl\n );\n return data.buiListAssessments.items.map((a) => ({\n ...a,\n // Partial `{ id }`-only records are cast to the full type — safe here\n // because every consumer of the list view only reads `.length`.\n questions: a.questions.items as unknown as BuiQuestion[],\n }));\n },\n });\n};\n\nexport const useBuiAssessment = (id: string | undefined) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: id ? KEY.assessment(id) : ['buildmyiq', 'assessment', 'nil'],\n enabled: Boolean(id),\n queryFn: async () => {\n const data = await buiQuery<{ buiAssessment: BuiAssessmentWire | null }>(\n `query BuiAssessment($id: ID!) {\n buiAssessment(id: $id) { ${ASSESSMENT_FULL_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiAssessment ? flattenAssessment(data.buiAssessment) : null;\n },\n });\n};\n\nexport const useBuiCreateAssessment = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiCreateAssessmentInput) => {\n const data = await buiQuery<{ buiCreateAssessment: BuiAssessment }>(\n `mutation BuiCreateAssessment($input: BuiCreateAssessmentInput!) {\n buiCreateAssessment(input: $input) { ${ASSESSMENT_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiCreateAssessment;\n },\n onSuccess: (a) => qc.invalidateQueries({ queryKey: KEY.assessments(a.courseId) }),\n });\n};\n\nexport const useBuiPublishAssessment = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await buiQuery<{ buiPublishAssessment: BuiAssessment }>(\n `mutation BuiPublishAssessment($id: ID!) {\n buiPublishAssessment(id: $id) { ${ASSESSMENT_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiPublishAssessment;\n },\n onSuccess: (a) => {\n qc.invalidateQueries({ queryKey: KEY.assessment(a.id) });\n qc.invalidateQueries({ queryKey: KEY.assessments(a.courseId) });\n },\n });\n};\n\nexport const useBuiCreateQuestion = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiCreateQuestionInput) => {\n const data = await buiQuery<{ buiCreateQuestion: BuiQuestion }>(\n `mutation BuiCreateQuestion($input: BuiCreateQuestionInput!) {\n buiCreateQuestion(input: $input) { ${QUESTION_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiCreateQuestion;\n },\n onSuccess: (q) => qc.invalidateQueries({ queryKey: KEY.assessment(q.assessmentId) }),\n });\n};\n\n// ============================================================================\n// Submissions & grading\n// ============================================================================\n\nexport interface UseBuiSubmissionsArgs {\n assessmentId?: string;\n learnerId?: string;\n status?: BuiSubmissionStatus;\n cursor?: string;\n limit?: number;\n enabled?: boolean;\n}\n\nexport const useBuiSubmissions = (args: UseBuiSubmissionsArgs = {}) => {\n const baseUrl = useGateway();\n const { assessmentId, learnerId, status, cursor, limit, enabled = true } = args;\n return useQuery({\n queryKey: [...KEY.submissions, { assessmentId, learnerId, status, cursor, limit }],\n enabled,\n queryFn: async () => {\n const data = await buiQuery<{ buiListSubmissions: BuiConnection<BuiSubmission> }>(\n `query BuiListSubmissions($assessmentId: ID, $learnerId: ID, $status: BuiSubmissionStatus, $pagination: PaginationInput) {\n buiListSubmissions(assessmentId: $assessmentId, learnerId: $learnerId, status: $status, pagination: $pagination) {\n items { ${SUBMISSION_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { assessmentId, learnerId, status, pagination: pageVars(cursor, limit) },\n baseUrl\n );\n return data.buiListSubmissions;\n },\n });\n};\n\nexport const useBuiSubmitAssessment = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiSubmitAssessmentInput) => {\n const data = await buiQuery<{ buiSubmitAssessment: BuiSubmission }>(\n `mutation BuiSubmitAssessment($input: BuiSubmitAssessmentInput!) {\n buiSubmitAssessment(input: $input) { ${SUBMISSION_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiSubmitAssessment;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.submissions }),\n });\n};\n\nexport const useBuiGradeSubmission = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (args: { id: string; input: BuiGradeSubmissionInput }) => {\n const data = await buiQuery<{ buiGradeSubmission: BuiSubmission }>(\n `mutation BuiGradeSubmission($id: ID!, $input: BuiGradeSubmissionInput!) {\n buiGradeSubmission(id: $id, input: $input) { ${SUBMISSION_FIELDS} }\n }`,\n args,\n baseUrl\n );\n return data.buiGradeSubmission;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.submissions }),\n });\n};\n\n// ============================================================================\n// Enrollments & progress\n// ============================================================================\n\nexport interface UseBuiEnrollmentsArgs {\n courseId?: string;\n learnerId?: string;\n status?: BuiEnrollmentStatus;\n cursor?: string;\n limit?: number;\n enabled?: boolean;\n}\n\nexport const useBuiEnrollments = (args: UseBuiEnrollmentsArgs = {}) => {\n const baseUrl = useGateway();\n const { courseId, learnerId, status, cursor, limit, enabled = true } = args;\n return useQuery({\n queryKey: [...KEY.enrollments, { courseId, learnerId, status, cursor, limit }],\n enabled,\n queryFn: async () => {\n const data = await buiQuery<{ buiListEnrollments: BuiConnection<BuiEnrollment> }>(\n `query BuiListEnrollments($courseId: ID, $learnerId: ID, $status: BuiEnrollmentStatus, $pagination: PaginationInput) {\n buiListEnrollments(courseId: $courseId, learnerId: $learnerId, status: $status, pagination: $pagination) {\n items { ${ENROLLMENT_FIELDS} cohort { ${COHORT_FIELDS} } }\n pageInfo { cursor hasMore }\n }\n }`,\n { courseId, learnerId, status, pagination: pageVars(cursor, limit) },\n baseUrl\n );\n return data.buiListEnrollments;\n },\n });\n};\n\nexport const useBuiEnrollment = (id: string | undefined) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: id ? KEY.enrollment(id) : ['buildmyiq', 'enrollment', 'nil'],\n enabled: Boolean(id),\n queryFn: async () => {\n const data = await buiQuery<{ buiEnrollment: BuiEnrollmentWire | null }>(\n `query BuiEnrollment($id: ID!) {\n buiEnrollment(id: $id) { ${ENROLLMENT_FULL_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiEnrollment ? flattenEnrollment(data.buiEnrollment) : null;\n },\n });\n};\n\nexport const useBuiEnroll = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiEnrollInput) => {\n const data = await buiQuery<{ buiEnroll: BuiEnrollment }>(\n `mutation BuiEnroll($input: BuiEnrollInput!) {\n buiEnroll(input: $input) { ${ENROLLMENT_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiEnroll;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.enrollments }),\n });\n};\n\nexport const useBuiTransitionEnrollment = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (args: { id: string; status: BuiEnrollmentStatus }) => {\n const data = await buiQuery<{ buiTransitionEnrollment: BuiEnrollment }>(\n `mutation BuiTransitionEnrollment($id: ID!, $status: BuiEnrollmentStatus!) {\n buiTransitionEnrollment(id: $id, status: $status) { ${ENROLLMENT_FIELDS} }\n }`,\n args,\n baseUrl\n );\n return data.buiTransitionEnrollment;\n },\n onSuccess: (e) => {\n qc.invalidateQueries({ queryKey: KEY.enrollments });\n qc.invalidateQueries({ queryKey: KEY.enrollment(e.id) });\n },\n });\n};\n\nexport const useBuiRecordLessonProgress = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiRecordLessonProgressInput) => {\n const data = await buiQuery<{ buiRecordLessonProgress: BuiLessonProgress }>(\n `mutation BuiRecordLessonProgress($input: BuiRecordLessonProgressInput!) {\n buiRecordLessonProgress(input: $input) { ${LESSON_PROGRESS_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiRecordLessonProgress;\n },\n onSuccess: (p) => {\n qc.invalidateQueries({ queryKey: KEY.enrollment(p.enrollmentId) });\n qc.invalidateQueries({ queryKey: KEY.enrollments });\n },\n });\n};\n\n// ============================================================================\n// Cohorts\n// ============================================================================\n\nexport const useBuiCohorts = (courseId?: string, status?: BuiCohortStatus) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: [...KEY.cohorts, { courseId, status }],\n queryFn: async () => {\n const data = await buiQuery<{ buiListCohorts: { items: BuiCohort[] } }>(\n `query BuiListCohorts($courseId: ID, $status: BuiCohortStatus) {\n buiListCohorts(courseId: $courseId, status: $status) { items { ${COHORT_FIELDS} } }\n }`,\n { courseId, status },\n baseUrl\n );\n return data.buiListCohorts.items;\n },\n });\n};\n\nexport const useBuiCreateCohort = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiCreateCohortInput) => {\n const data = await buiQuery<{ buiCreateCohort: BuiCohort }>(\n `mutation BuiCreateCohort($input: BuiCreateCohortInput!) {\n buiCreateCohort(input: $input) { ${COHORT_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiCreateCohort;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.cohorts }),\n });\n};\n\n// ============================================================================\n// Skills\n// ============================================================================\n\nexport const useBuiSkills = (category?: BuiSkillCategory) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: [...KEY.skills, { category }],\n queryFn: async () => {\n const data = await buiQuery<{ buiListSkills: { items: BuiSkill[] } }>(\n `query BuiListSkills($category: BuiSkillCategory) {\n buiListSkills(category: $category) { items { ${SKILL_FIELDS} } }\n }`,\n { category },\n baseUrl\n );\n return data.buiListSkills.items;\n },\n });\n};\n\nexport const useBuiCreateSkill = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiCreateSkillInput) => {\n const data = await buiQuery<{ buiCreateSkill: BuiSkill }>(\n `mutation BuiCreateSkill($input: BuiCreateSkillInput!) {\n buiCreateSkill(input: $input) { ${SKILL_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiCreateSkill;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.skills }),\n });\n};\n\n// ============================================================================\n// Certificates\n// ============================================================================\n\nexport const useBuiCertificates = (courseId?: string, learnerId?: string) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: [...KEY.certificates, { courseId, learnerId }],\n queryFn: async () => {\n const data = await buiQuery<{ buiListCertificates: { items: BuiCertificate[] } }>(\n `query BuiListCertificates($courseId: ID, $learnerId: ID) {\n buiListCertificates(courseId: $courseId, learnerId: $learnerId) { items { ${CERTIFICATE_FIELDS} } }\n }`,\n { courseId, learnerId },\n baseUrl\n );\n return data.buiListCertificates.items;\n },\n });\n};\n\nexport const useBuiIssueCertificate = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiIssueCertificateInput) => {\n const data = await buiQuery<{ buiIssueCertificate: BuiCertificate }>(\n `mutation BuiIssueCertificate($input: BuiIssueCertificateInput!) {\n buiIssueCertificate(input: $input) { ${CERTIFICATE_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiIssueCertificate;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.certificates }),\n });\n};\n\nexport const useBuiRevokeCertificate = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await buiQuery<{ buiRevokeCertificate: BuiCertificate }>(\n `mutation BuiRevokeCertificate($id: ID!) {\n buiRevokeCertificate(id: $id) { ${CERTIFICATE_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiRevokeCertificate;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.certificates }),\n });\n};\n"],"mappings":";;;;;AAwEA,IAAM,UAAqC;CACzC,IAAM,IAAI;CAGV,AAFA,EAAE,6BAA6B,MAAM,GACrC,EAAE,gCAAgC,MAAM,GACxC,EAAE,4BAA4B,MAAM;AACtC,GAEM,IAAW,OACf,GACA,GACA,MACmB;CACnB,IAAM,IAAW,MAAM,EAAoB;EACzC,SAAS;EACT;EACA;EACA;EACA,gBAAgB;CAClB,CAAC;CAED,IAAI,EAAS,QAAQ,QACnB,MAAU,MAAM,EAAS,OAAO,IAAI,WAAW,wBAAwB;CAEzE,IAAI,CAAC,EAAS,MACZ,MAAU,MAAM,uCAAuC;CAKzD,OAHI,iBAAiB,KAAK,CAAK,KAC7B,EAAuB,GAElB,EAAS;AAClB,GAGM,IAAM;CACV,SAAS,CAAC,aAAa,SAAS;CAChC,SAAS,MAAe;EAAC;EAAa;EAAU;CAAE;CAClD,UAAU,MAAqB;EAAC;EAAa;EAAW;CAAQ;CAChE,UAAU,MAAqB;EAAC;EAAa;EAAW;CAAQ;CAChE,cAAc,MAAqB;EAAC;EAAa;EAAe;CAAQ;CACxE,aAAa,MAAe;EAAC;EAAa;EAAc;CAAE;CAC1D,aAAa,CAAC,aAAa,aAAa;CACxC,aAAa,MAAe;EAAC;EAAa;EAAc;CAAE;CAC1D,cAAc,CAAC,aAAa,cAAc;CAC1C,SAAS,CAAC,aAAa,SAAS;CAChC,QAAQ,CAAC,aAAa,QAAQ;CAC9B,aAAa,CAAC,aAAa,aAAa;AAC1C,GAEM,IAAoB,IAMpB,KAAY,GAAiB,IAAQ,MACzC,IAAS;CAAE;CAAO;AAAO,IAAI,EAAE,SAAM,GAMjC,IAAc,gCAEd,IAAe,+EAIf,IAAqB;;;YAGf,EAAY;;GAIlB,IAAgB,gFAIhB,IAAgB;;;YAGV,EAAY;GAOlB,IAAqB;IACvB,EAAmB;sBACD,EAAc,qBAAqB,EAAc;sBACjD,EAAc;GAG9B,IAAoB,qIAMpB,IAAkB,4GAMlB,IAAyB;IAC3B,EAAkB;wBACE,EAAgB;GAGlC,IAAoB,gKAKpB,IAAgB,6GAKhB,IAAyB,kGAIzB,IAAoB,sJAMpB,IAAyB;IAC3B,EAAkB;aACT,EAAc;6BACE,EAAuB;GAG9C,IAAqB;;;WAGhB,EAAY;GAsBjB,KAAiB,OAAiC;CACtD,GAAG;CACH,SAAS,EAAE,QAAQ,MAAM,KAAK,OAAO;EAAE,GAAG;EAAG,SAAS,EAAE,QAAQ;CAAM,EAAE;CACxE,SAAS,EAAE,QAAQ;AACrB,IAKM,KAAqB,OAAyC;CAClE,GAAG;CACH,WAAW,EAAE,UAAU;AACzB,IAOM,KAAqB,OAAyC;CAClE,GAAG;CACH,gBAAgB,EAAE,eAAe;AACnC,IAMM,UAAuC;CAC3C,IAAM,EAAE,qBAAkB,EAAa;CACvC,OAAO;AACT,GAca,KAAiB,IAA0B,CAAC,MAAM;CAC7D,IAAM,IAAU,EAAW,GACrB,EAAE,UAAO,WAAQ,WAAQ,UAAO,aAAU,OAAS;CACzD,OAAO,EAAS;EACd,UAAU,CAAC,GAAG,EAAI,SAAS;GAAE;GAAO;GAAQ;GAAQ;EAAM,CAAC;EAC3D;EACA,SAAS,YAAY;GAKnB,IAAM,IAAO,MAAM,EAWjB;;sBAEc,EAAmB;;;YAIjC;IAAE;IAAO;IAAQ,YAAY,EAAS,GAAQ,CAAK;GAAE,GACrD,CACF;GACA,OAAO;IACL,OAAO,EAAK,eAAe,MAAM,KAAK,OAAO;KAC3C,GAAG;KAGH,SAAS,EAAE,QAAQ;KACnB,SAAS,EAAE,QAAQ;IACrB,EAAE;IACF,UAAU,EAAK,eAAe;GAChC;EACF;CACF,CAAC;AACH,GAEa,KAAgB,MAA2B;CACtD,IAAM,IAAU,EAAW;CAC3B,OAAO,EAAS;EACd,UAAU,IAAK,EAAI,OAAO,CAAE,IAAI;GAAC;GAAa;GAAU;EAAK;EAC7D,SAAS,EAAQ;EACjB,SAAS,YAAY;GACnB,IAAM,IAAO,MAAM,EACjB;iCACyB,EAAmB;YAE5C,EAAE,MAAG,GACL,CACF;GACA,OAAO,EAAK,YAAY,EAAc,EAAK,SAAS,IAAI;EAC1D;CACF,CAAC;AACH,GAEa,UAA2B;CACtC,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;6CACqC,EAAmB;YAExD,EAAE,SAAM,GACR,CACF,GACY;EAEd,iBAAiB,EAAG,kBAAkB,EAAE,UAAU,EAAI,QAAQ,CAAC;CACjE,CAAC;AACH,GAEa,UAA2B;CACtC,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;sDAC8C,EAAmB;YAEjE,GACA,CACF,GACY;EAEd,YAAY,MAAW;GAErB,AADA,EAAG,kBAAkB,EAAE,UAAU,EAAI,QAAQ,CAAC,GAC9C,EAAG,kBAAkB,EAAE,UAAU,EAAI,OAAO,EAAO,EAAE,EAAE,CAAC;EAC1D;CACF,CAAC;AACH,GAEa,UAA4B;CACvC,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;wCACgC,EAAmB;YAEnD,EAAE,MAAG,GACL,CACF,GACY;EAEd,YAAY,MAAW;GAErB,AADA,EAAG,kBAAkB,EAAE,UAAU,EAAI,QAAQ,CAAC,GAC9C,EAAG,kBAAkB,EAAE,UAAU,EAAI,OAAO,EAAO,EAAE,EAAE,CAAC;EAC1D;CACF,CAAC;AACH,GAEa,UAA4B;CACvC,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAMV,MALY,EACjB,qEACA,EAAE,MAAG,GACL,CACF,GACY;EAEd,YAAY,GAAI,MAAO;GAErB,AADA,EAAG,kBAAkB,EAAE,UAAU,EAAI,QAAQ,CAAC,GAC9C,EAAG,kBAAkB,EAAE,UAAU,EAAI,OAAO,CAAE,EAAE,CAAC;EACnD;CACF,CAAC;AACH,GAMa,KAAiB,MAAiC;CAC7D,IAAM,IAAU,EAAW;CAC3B,OAAO,EAAS;EACd,UAAU,IAAW,EAAI,QAAQ,CAAQ,IAAI;GAAC;GAAa;GAAW;EAAK;EAC3E,SAAS,EAAQ;EACjB,SAAS,aAUA,MATY,EACjB;;sBAEc,EAAc,qBAAqB,EAAc;;YAG/D,EAAE,YAAS,GACX,CACF,GACY,eAAe,MAAM,KAAK,OAAO;GAAE,GAAG;GAAG,SAAS,EAAE,QAAQ;EAAM,EAAE;CAEpF,CAAC;AACH,GAoBa,UAA2B;CACtC,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;6CACqC,EAAc;YAEnD,EAAE,SAAM,GACR,CACF,GACY;EAEd,YAAY,MAAM;GAEhB,AADA,EAAG,kBAAkB,EAAE,UAAU,EAAI,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAC1D,EAAG,kBAAkB,EAAE,UAAU,EAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;EAC3D;CACF,CAAC;AACH,GAEa,UAA2B;CACtC,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;6CACqC,EAAc;YAEnD,EAAE,SAAM,GACR,CACF,GACY;EAEd,YAAY,MAAM;GAGhB,AAFA,EAAG,kBAAkB,EAAE,UAAU,EAAI,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAC1D,EAAG,kBAAkB,EAAE,UAAU,EAAI,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAC1D,EAAG,kBAAkB,EAAE,UAAU,EAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;EAC3D;CACF,CAAC;AACH,GAMa,KAAqB,GAA8B,MAAiC;CAC/F,IAAM,IAAU,EAAW;CAC3B,OAAO,EAAS;EACd,UAAU,IACN,CAAC,GAAG,EAAI,YAAY,CAAQ,GAAG,EAAE,UAAO,CAAC,IACzC;GAAC;GAAa;GAAe;EAAK;EACtC,SAAS,EAAQ;EACjB,SAAS,aAmBA,MAfY,EAOjB;;sBAEc,EAAkB;;YAGhC;GAAE;GAAU;EAAO,GACnB,CACF,GACY,mBAAmB,MAAM,KAAK,OAAO;GAC/C,GAAG;GAGH,WAAW,EAAE,UAAU;EACzB,EAAE;CAEN,CAAC;AACH,GAEa,KAAoB,MAA2B;CAC1D,IAAM,IAAU,EAAW;CAC3B,OAAO,EAAS;EACd,UAAU,IAAK,EAAI,WAAW,CAAE,IAAI;GAAC;GAAa;GAAc;EAAK;EACrE,SAAS,EAAQ;EACjB,SAAS,YAAY;GACnB,IAAM,IAAO,MAAM,EACjB;qCAC6B,EAAuB;YAEpD,EAAE,MAAG,GACL,CACF;GACA,OAAO,EAAK,gBAAgB,EAAkB,EAAK,aAAa,IAAI;EACtE;CACF,CAAC;AACH,GAEa,WAA+B;CAC1C,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;iDACyC,EAAkB;YAE3D,EAAE,SAAM,GACR,CACF,GACY;EAEd,YAAY,MAAM,EAAG,kBAAkB,EAAE,UAAU,EAAI,YAAY,EAAE,QAAQ,EAAE,CAAC;CAClF,CAAC;AACH,GAEa,UAAgC;CAC3C,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;4CACoC,EAAkB;YAEtD,EAAE,MAAG,GACL,CACF,GACY;EAEd,YAAY,MAAM;GAEhB,AADA,EAAG,kBAAkB,EAAE,UAAU,EAAI,WAAW,EAAE,EAAE,EAAE,CAAC,GACvD,EAAG,kBAAkB,EAAE,UAAU,EAAI,YAAY,EAAE,QAAQ,EAAE,CAAC;EAChE;CACF,CAAC;AACH,GAEa,UAA6B;CACxC,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;+CACuC,EAAgB;YAEvD,EAAE,SAAM,GACR,CACF,GACY;EAEd,YAAY,MAAM,EAAG,kBAAkB,EAAE,UAAU,EAAI,WAAW,EAAE,YAAY,EAAE,CAAC;CACrF,CAAC;AACH,GAea,KAAqB,IAA8B,CAAC,MAAM;CACrE,IAAM,IAAU,EAAW,GACrB,EAAE,iBAAc,cAAW,WAAQ,WAAQ,UAAO,aAAU,OAAS;CAC3E,OAAO,EAAS;EACd,UAAU,CAAC,GAAG,EAAI,aAAa;GAAE;GAAc;GAAW;GAAQ;GAAQ;EAAM,CAAC;EACjF;EACA,SAAS,aAWA,MAVY,EACjB;;sBAEc,EAAkB;;;YAIhC;GAAE;GAAc;GAAW;GAAQ,YAAY,EAAS,GAAQ,CAAK;EAAE,GACvE,CACF,GACY;CAEhB,CAAC;AACH,GAEa,UAA+B;CAC1C,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;iDACyC,EAAkB;YAE3D,EAAE,SAAM,GACR,CACF,GACY;EAEd,iBAAiB,EAAG,kBAAkB,EAAE,UAAU,EAAI,YAAY,CAAC;CACrE,CAAC;AACH,GAEa,UAA8B;CACzC,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;yDACiD,EAAkB;YAEnE,GACA,CACF,GACY;EAEd,iBAAiB,EAAG,kBAAkB,EAAE,UAAU,EAAI,YAAY,CAAC;CACrE,CAAC;AACH,GAea,KAAqB,IAA8B,CAAC,MAAM;CACrE,IAAM,IAAU,EAAW,GACrB,EAAE,aAAU,cAAW,WAAQ,WAAQ,UAAO,aAAU,OAAS;CACvE,OAAO,EAAS;EACd,UAAU,CAAC,GAAG,EAAI,aAAa;GAAE;GAAU;GAAW;GAAQ;GAAQ;EAAM,CAAC;EAC7E;EACA,SAAS,aAWA,MAVY,EACjB;;sBAEc,EAAkB,YAAY,EAAc;;;YAI1D;GAAE;GAAU;GAAW;GAAQ,YAAY,EAAS,GAAQ,CAAK;EAAE,GACnE,CACF,GACY;CAEhB,CAAC;AACH,GAEa,KAAoB,MAA2B;CAC1D,IAAM,IAAU,EAAW;CAC3B,OAAO,EAAS;EACd,UAAU,IAAK,EAAI,WAAW,CAAE,IAAI;GAAC;GAAa;GAAc;EAAK;EACrE,SAAS,EAAQ;EACjB,SAAS,YAAY;GACnB,IAAM,IAAO,MAAM,EACjB;qCAC6B,EAAuB;YAEpD,EAAE,MAAG,GACL,CACF;GACA,OAAO,EAAK,gBAAgB,EAAkB,EAAK,aAAa,IAAI;EACtE;CACF,CAAC;AACH,GAEa,UAAqB;CAChC,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;uCAC+B,EAAkB;YAEjD,EAAE,SAAM,GACR,CACF,GACY;EAEd,iBAAiB,EAAG,kBAAkB,EAAE,UAAU,EAAI,YAAY,CAAC;CACrE,CAAC;AACH,GAEa,UAAmC;CAC9C,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;gEACwD,EAAkB;YAE1E,GACA,CACF,GACY;EAEd,YAAY,MAAM;GAEhB,AADA,EAAG,kBAAkB,EAAE,UAAU,EAAI,YAAY,CAAC,GAClD,EAAG,kBAAkB,EAAE,UAAU,EAAI,WAAW,EAAE,EAAE,EAAE,CAAC;EACzD;CACF,CAAC;AACH,GAEa,UAAmC;CAC9C,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;qDAC6C,EAAuB;YAEpE,EAAE,SAAM,GACR,CACF,GACY;EAEd,YAAY,MAAM;GAEhB,AADA,EAAG,kBAAkB,EAAE,UAAU,EAAI,WAAW,EAAE,YAAY,EAAE,CAAC,GACjE,EAAG,kBAAkB,EAAE,UAAU,EAAI,YAAY,CAAC;EACpD;CACF,CAAC;AACH,GAMa,KAAiB,GAAmB,MAA6B;CAC5E,IAAM,IAAU,EAAW;CAC3B,OAAO,EAAS;EACd,UAAU,CAAC,GAAG,EAAI,SAAS;GAAE;GAAU;EAAO,CAAC;EAC/C,SAAS,aAQA,MAPY,EACjB;2EACmE,EAAc;YAEjF;GAAE;GAAU;EAAO,GACnB,CACF,GACY,eAAe;CAE/B,CAAC;AACH,GAEa,UAA2B;CACtC,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;6CACqC,EAAc;YAEnD,EAAE,SAAM,GACR,CACF,GACY;EAEd,iBAAiB,EAAG,kBAAkB,EAAE,UAAU,EAAI,QAAQ,CAAC;CACjE,CAAC;AACH,GAMa,KAAgB,MAAgC;CAC3D,IAAM,IAAU,EAAW;CAC3B,OAAO,EAAS;EACd,UAAU,CAAC,GAAG,EAAI,QAAQ,EAAE,YAAS,CAAC;EACtC,SAAS,aAQA,MAPY,EACjB;yDACiD,EAAa;YAE9D,EAAE,YAAS,GACX,CACF,GACY,cAAc;CAE9B,CAAC;AACH,GAEa,UAA0B;CACrC,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;4CACoC,EAAa;YAEjD,EAAE,SAAM,GACR,CACF,GACY;EAEd,iBAAiB,EAAG,kBAAkB,EAAE,UAAU,EAAI,OAAO,CAAC;CAChE,CAAC;AACH,GAMa,MAAsB,GAAmB,MAAuB;CAC3E,IAAM,IAAU,EAAW;CAC3B,OAAO,EAAS;EACd,UAAU,CAAC,GAAG,EAAI,cAAc;GAAE;GAAU;EAAU,CAAC;EACvD,SAAS,aAQA,MAPY,EACjB;sFAC8E,EAAmB;YAEjG;GAAE;GAAU;EAAU,GACtB,CACF,GACY,oBAAoB;CAEpC,CAAC;AACH,GAEa,WAA+B;CAC1C,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;iDACyC,EAAmB;YAE5D,EAAE,SAAM,GACR,CACF,GACY;EAEd,iBAAiB,EAAG,kBAAkB,EAAE,UAAU,EAAI,aAAa,CAAC;CACtE,CAAC;AACH,GAEa,WAAgC;CAC3C,IAAM,IAAU,EAAW,GACrB,IAAK,EAAe;CAC1B,OAAO,EAAY;EACjB,YAAY,OAAO,OAQV,MAPY,EACjB;4CACoC,EAAmB;YAEvD,EAAE,MAAG,GACL,CACF,GACY;EAEd,iBAAiB,EAAG,kBAAkB,EAAE,UAAU,EAAI,aAAa,CAAC;CACtE,CAAC;AACH"}
1
+ {"version":3,"file":"useBuildmyiqApi.js","names":[],"sources":["../../../src/buildmyiq/hooks/useBuildmyiqApi.ts"],"sourcesContent":["/**\n * Buildmyiq API hooks\n * @module buildmyiq/hooks\n *\n * React-Query hooks wired DIRECTLY to the real `wspace-buildmyiq-svc`\n * federated GraphQL contract (the `bui*` operations). Every query/mutation\n * below uses an inline gql string whose fields match the svc\n * `.hive-schema.graphql` exactly. No mock data, no codegen.\n *\n * Transport: `graphqlFetch({ gateway: 'workspace', workspaceToken: true })` —\n * the host shell supplies the gateway base URL + a workspace-scoped token.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\n\nimport { useBuildmyiq } from '../context';\nimport type {\n BuiConnection,\n BuiCourse,\n BuiCourseLevel,\n BuiCourseStatus,\n BuiModule,\n BuiLesson,\n BuiAssessment,\n BuiAssessmentStatus,\n BuiQuestion,\n BuiSubmission,\n BuiSubmissionStatus,\n BuiEnrollment,\n BuiEnrollmentStatus,\n BuiCohort,\n BuiCohortStatus,\n BuiSkill,\n BuiSkillCategory,\n BuiCertificate,\n BuiLessonProgress,\n BuiCreateCourseInput,\n BuiUpdateCourseInput,\n BuiCreateModuleInput,\n BuiCreateLessonInput,\n BuiCreateAssessmentInput,\n BuiCreateQuestionInput,\n BuiCreateSkillInput,\n BuiCreateCohortInput,\n BuiEnrollInput,\n BuiRecordLessonProgressInput,\n BuiSubmitAssessmentInput,\n BuiGradeSubmissionInput,\n BuiIssueCertificateInput,\n PaginationInput,\n} from '../types';\n\n// ============================================================================\n// Transport\n// ============================================================================\n\n/**\n * fe-libs `graphqlFetch` coalesces `query` responses in an in-memory cache keyed\n * by operationName+variables for ~15s (mutations are never cached). A read\n * issued right after a write (e.g. the React-Query refetch triggered by our\n * `invalidateQueries`) would otherwise return the PRE-mutation response until the\n * TTL expires — making just-created/updated rows invisible until a full reload.\n * We clear those caches after every buildmyiq mutation so every follow-up read\n * is fresh.\n */\ntype GraphqlReadCacheGlobals = {\n __graphqlFetchResponseCache?: { clear: () => void };\n __graphqlFetchPendingResponses?: { clear: () => void };\n __boffGraphQLResponseCache?: { clear: () => void };\n};\n\nconst clearGraphqlReadCaches = (): void => {\n const g = globalThis as GraphqlReadCacheGlobals;\n g.__graphqlFetchResponseCache?.clear();\n g.__graphqlFetchPendingResponses?.clear();\n g.__boffGraphQLResponseCache?.clear();\n};\n\nconst buiQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n if (/^\\s*mutation\\b/.test(query)) {\n clearGraphqlReadCaches();\n }\n return response.data;\n};\n\n// React-Query key roots (one namespace per domain entity).\nconst KEY = {\n courses: ['buildmyiq', 'courses'] as const,\n course: (id: string) => ['buildmyiq', 'course', id] as const,\n modules: (courseId: string) => ['buildmyiq', 'modules', courseId] as const,\n lessons: (courseId: string) => ['buildmyiq', 'lessons', courseId] as const,\n assessments: (courseId: string) => ['buildmyiq', 'assessments', courseId] as const,\n assessment: (id: string) => ['buildmyiq', 'assessment', id] as const,\n enrollments: ['buildmyiq', 'enrollments'] as const,\n enrollment: (id: string) => ['buildmyiq', 'enrollment', id] as const,\n certificates: ['buildmyiq', 'certificates'] as const,\n cohorts: ['buildmyiq', 'cohorts'] as const,\n skills: ['buildmyiq', 'skills'] as const,\n submissions: ['buildmyiq', 'submissions'] as const,\n submission: (id: string) => ['buildmyiq', 'submission', id] as const,\n};\n\nconst DEFAULT_PAGE_SIZE = 24;\n\n/**\n * Build a `PaginationInput` for a list query. The FIRST page (undefined cursor)\n * OMITS the cursor key entirely — the svc rejects an explicit `cursor: null`.\n */\nconst pageVars = (cursor?: string, limit = DEFAULT_PAGE_SIZE): PaginationInput =>\n cursor ? { limit, cursor } : { limit };\n\n// ============================================================================\n// Reusable gql field selections (codegen-free strictness)\n// ============================================================================\n\nconst FILE_FIELDS = `id name downloadUrl mimeType`;\n\nconst SKILL_FIELDS = `\n id workspaceId name category description isActive createdAt updatedAt\n`;\n\nconst COURSE_CORE_FIELDS = `\n id workspaceId title slug summary description status level language\n estimatedHours isPublic tags skillId instructorId publishedAt createdAt updatedAt\n cover { ${FILE_FIELDS} }\n skill { id name category }\n`;\n\nconst MODULE_FIELDS = `\n id workspaceId courseId title description position createdAt updatedAt\n`;\n\nconst LESSON_FIELDS = `\n id workspaceId courseId moduleId title type content durationMin position isPreview\n createdAt updatedAt\n media { ${FILE_FIELDS} }\n`;\n\n// NOTE: `modules`/`lessons` are `Bui*Connection!` on the svc schema (paginated),\n// NOT plain lists — every nested selection below must go through `items { }` or\n// the gateway rejects the whole query with GRAPHQL_VALIDATION_FAILED (BOFF-4703\n// Connection-shape drift). See `flattenCourse` for the matching unwrap.\nconst COURSE_FULL_FIELDS = `\n ${COURSE_CORE_FIELDS}\n modules { items { ${MODULE_FIELDS} lessons { items { ${LESSON_FIELDS} } } } }\n lessons { items { ${LESSON_FIELDS} } }\n`;\n\nconst ASSESSMENT_FIELDS = `\n id workspaceId courseId title description type status passingScore maxAttempts\n timeLimitMin isGraded createdAt updatedAt\n`;\n\n// NOTE: BuiQuestion has NO `answerKey` on the type (create-input only).\nconst QUESTION_FIELDS = `\n id workspaceId assessmentId prompt type options points position explanation\n createdAt updatedAt\n`;\n\n// `questions` is `BuiQuestionConnection!` — see COURSE_FULL_FIELDS note above.\nconst ASSESSMENT_FULL_FIELDS = `\n ${ASSESSMENT_FIELDS}\n questions { items { ${QUESTION_FIELDS} } }\n`;\n\nconst SUBMISSION_FIELDS = `\n id workspaceId assessmentId enrollmentId learnerId attempt answers status score\n passed feedback gradedById gradedAt submittedAt createdAt updatedAt\n`;\n\nconst COHORT_FIELDS = `\n id workspaceId courseId name capacity facilitatorId startDate endDate status\n createdAt updatedAt\n`;\n\nconst LESSON_PROGRESS_FIELDS = `\n id workspaceId enrollmentId lessonId status secondsSpent completedAt createdAt updatedAt\n`;\n\nconst ENROLLMENT_FIELDS = `\n id workspaceId courseId learnerId cohortId status progressPct enrolledAt startedAt\n completedAt lastActiveAt expiresAt createdAt updatedAt\n`;\n\n// `lessonProgress` is `BuiLessonProgressConnection!` — see COURSE_FULL_FIELDS note above.\nconst ENROLLMENT_FULL_FIELDS = `\n ${ENROLLMENT_FIELDS}\n cohort { ${COHORT_FIELDS} }\n lessonProgress { items { ${LESSON_PROGRESS_FIELDS} } }\n`;\n\nconst CERTIFICATE_FIELDS = `\n id workspaceId courseId learnerId enrollmentId serial status issuedAt expiresAt\n revokedAt finalScore createdAt updatedAt\n file { ${FILE_FIELDS} }\n`;\n\n// ============================================================================\n// Connection-shape unwrap (BOFF-4703)\n// ============================================================================\n// Every `Bui*Connection` field on the wire is `{ items: T[]; pageInfo }`, never\n// a bare list — including NESTED fields like `BuiCourse.modules` or\n// `BuiAssessment.questions`. The hooks below keep returning plain flat arrays\n// to consumers (that's the shape every page in this MFE is written against),\n// so raw wire responses are unwrapped once here rather than pushing the\n// Connection shape out to every page.\n\n/** Wire shape of a `BuiModule` fetched via `COURSE_FULL_FIELDS` (nested `lessons` is a Connection). */\ntype BuiModuleWire = Omit<BuiModule, 'lessons'> & { lessons: { items: BuiLesson[] } };\n\n/** Wire shape of a `BuiCourse` fetched via `COURSE_FULL_FIELDS`. */\ntype BuiCourseWire = Omit<BuiCourse, 'modules' | 'lessons'> & {\n modules: { items: BuiModuleWire[] };\n lessons: { items: BuiLesson[] };\n};\n\nconst flattenCourse = (c: BuiCourseWire): BuiCourse => ({\n ...c,\n modules: c.modules.items.map((m) => ({ ...m, lessons: m.lessons.items })),\n lessons: c.lessons.items,\n});\n\n/** Wire shape of a `BuiAssessment` fetched via `ASSESSMENT_FULL_FIELDS`. */\ntype BuiAssessmentWire = Omit<BuiAssessment, 'questions'> & { questions: { items: BuiQuestion[] } };\n\nconst flattenAssessment = (a: BuiAssessmentWire): BuiAssessment => ({\n ...a,\n questions: a.questions.items,\n});\n\n/** Wire shape of a `BuiEnrollment` fetched via `ENROLLMENT_FULL_FIELDS`. */\ntype BuiEnrollmentWire = Omit<BuiEnrollment, 'lessonProgress'> & {\n lessonProgress: { items: BuiLessonProgress[] };\n};\n\nconst flattenEnrollment = (e: BuiEnrollmentWire): BuiEnrollment => ({\n ...e,\n lessonProgress: e.lessonProgress.items,\n});\n\n// ============================================================================\n// Shared hook helper: resolve gateway URL from context\n// ============================================================================\n\nconst useGateway = (): string | undefined => {\n const { apiGatewayUrl } = useBuildmyiq();\n return apiGatewayUrl;\n};\n\n// ============================================================================\n// Courses\n// ============================================================================\n\nexport interface UseBuiCoursesArgs {\n level?: BuiCourseLevel;\n status?: BuiCourseStatus;\n cursor?: string;\n limit?: number;\n enabled?: boolean;\n}\n\nexport const useBuiCourses = (args: UseBuiCoursesArgs = {}) => {\n const baseUrl = useGateway();\n const { level, status, cursor, limit, enabled = true } = args;\n return useQuery({\n queryKey: [...KEY.courses, { level, status, cursor, limit }],\n enabled,\n queryFn: async () => {\n // Only `id` is needed here (list view shows module/lesson COUNTS, not\n // full records — see CourseCard.tsx) so we intentionally under-select\n // vs. the full `BuiModule`/`BuiLesson` shape; still must go through\n // `items { }` since both fields are Connections (BOFF-4703).\n const data = await buiQuery<{\n buiListCourses: {\n items: Array<\n Omit<BuiCourse, 'modules' | 'lessons'> & {\n modules: { items: Array<{ id: string }> };\n lessons: { items: Array<{ id: string }> };\n }\n >;\n pageInfo: BuiConnection<BuiCourse>['pageInfo'];\n };\n }>(\n `query BuiListCourses($level: BuiCourseLevel, $status: BuiCourseStatus, $pagination: PaginationInput) {\n buiListCourses(level: $level, status: $status, pagination: $pagination) {\n items { ${COURSE_CORE_FIELDS} modules { items { id } } lessons { items { id } } }\n pageInfo { cursor hasMore }\n }\n }`,\n { level, status, pagination: pageVars(cursor, limit) },\n baseUrl\n );\n return {\n items: data.buiListCourses.items.map((c) => ({\n ...c,\n // Partial `{ id }`-only records are cast to the full type — safe here\n // because every consumer of the list view only reads `.length`.\n modules: c.modules.items as unknown as BuiModule[],\n lessons: c.lessons.items as unknown as BuiLesson[],\n })),\n pageInfo: data.buiListCourses.pageInfo,\n };\n },\n });\n};\n\nexport const useBuiCourse = (id: string | undefined) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: id ? KEY.course(id) : ['buildmyiq', 'course', 'nil'],\n enabled: Boolean(id),\n queryFn: async () => {\n const data = await buiQuery<{ buiCourse: BuiCourseWire | null }>(\n `query BuiCourse($id: ID!) {\n buiCourse(id: $id) { ${COURSE_FULL_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiCourse ? flattenCourse(data.buiCourse) : null;\n },\n });\n};\n\nexport const useBuiCreateCourse = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiCreateCourseInput) => {\n const data = await buiQuery<{ buiCreateCourse: BuiCourse }>(\n `mutation BuiCreateCourse($input: BuiCreateCourseInput!) {\n buiCreateCourse(input: $input) { ${COURSE_CORE_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiCreateCourse;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.courses }),\n });\n};\n\nexport const useBuiUpdateCourse = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (args: { id: string; input: BuiUpdateCourseInput }) => {\n const data = await buiQuery<{ buiUpdateCourse: BuiCourse }>(\n `mutation BuiUpdateCourse($id: ID!, $input: BuiUpdateCourseInput!) {\n buiUpdateCourse(id: $id, input: $input) { ${COURSE_CORE_FIELDS} }\n }`,\n args,\n baseUrl\n );\n return data.buiUpdateCourse;\n },\n onSuccess: (course) => {\n qc.invalidateQueries({ queryKey: KEY.courses });\n qc.invalidateQueries({ queryKey: KEY.course(course.id) });\n },\n });\n};\n\nexport const useBuiPublishCourse = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await buiQuery<{ buiPublishCourse: BuiCourse }>(\n `mutation BuiPublishCourse($id: ID!) {\n buiPublishCourse(id: $id) { ${COURSE_CORE_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiPublishCourse;\n },\n onSuccess: (course) => {\n qc.invalidateQueries({ queryKey: KEY.courses });\n qc.invalidateQueries({ queryKey: KEY.course(course.id) });\n },\n });\n};\n\nexport const useBuiArchiveCourse = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await buiQuery<{ buiArchiveCourse: boolean }>(\n `mutation BuiArchiveCourse($id: ID!) { buiArchiveCourse(id: $id) }`,\n { id },\n baseUrl\n );\n return data.buiArchiveCourse;\n },\n onSuccess: (_r, id) => {\n qc.invalidateQueries({ queryKey: KEY.courses });\n qc.invalidateQueries({ queryKey: KEY.course(id) });\n },\n });\n};\n\n// ============================================================================\n// Modules & lessons\n// ============================================================================\n\nexport const useBuiModules = (courseId: string | undefined) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: courseId ? KEY.modules(courseId) : ['buildmyiq', 'modules', 'nil'],\n enabled: Boolean(courseId),\n queryFn: async () => {\n const data = await buiQuery<{ buiListModules: { items: BuiModuleWire[] } }>(\n `query BuiListModules($courseId: ID!) {\n buiListModules(courseId: $courseId) {\n items { ${MODULE_FIELDS} lessons { items { ${LESSON_FIELDS} } } }\n }\n }`,\n { courseId },\n baseUrl\n );\n return data.buiListModules.items.map((m) => ({ ...m, lessons: m.lessons.items }));\n },\n });\n};\n\nexport const useBuiLessons = (courseId: string | undefined, moduleId?: string) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: courseId ? [...KEY.lessons(courseId), { moduleId }] : ['buildmyiq', 'lessons', 'nil'],\n enabled: Boolean(courseId),\n queryFn: async () => {\n const data = await buiQuery<{ buiListLessons: { items: BuiLesson[] } }>(\n `query BuiListLessons($courseId: ID!, $moduleId: ID) {\n buiListLessons(courseId: $courseId, moduleId: $moduleId) { items { ${LESSON_FIELDS} } }\n }`,\n { courseId, moduleId },\n baseUrl\n );\n return data.buiListLessons.items;\n },\n });\n};\n\nexport const useBuiCreateModule = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiCreateModuleInput) => {\n const data = await buiQuery<{ buiCreateModule: BuiModule }>(\n `mutation BuiCreateModule($input: BuiCreateModuleInput!) {\n buiCreateModule(input: $input) { ${MODULE_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiCreateModule;\n },\n onSuccess: (m) => {\n qc.invalidateQueries({ queryKey: KEY.modules(m.courseId) });\n qc.invalidateQueries({ queryKey: KEY.course(m.courseId) });\n },\n });\n};\n\nexport const useBuiCreateLesson = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiCreateLessonInput) => {\n const data = await buiQuery<{ buiCreateLesson: BuiLesson }>(\n `mutation BuiCreateLesson($input: BuiCreateLessonInput!) {\n buiCreateLesson(input: $input) { ${LESSON_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiCreateLesson;\n },\n onSuccess: (l) => {\n qc.invalidateQueries({ queryKey: KEY.lessons(l.courseId) });\n qc.invalidateQueries({ queryKey: KEY.modules(l.courseId) });\n qc.invalidateQueries({ queryKey: KEY.course(l.courseId) });\n },\n });\n};\n\n// ============================================================================\n// Assessments & questions\n// ============================================================================\n\nexport const useBuiAssessments = (courseId: string | undefined, status?: BuiAssessmentStatus) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: courseId\n ? [...KEY.assessments(courseId), { status }]\n : ['buildmyiq', 'assessments', 'nil'],\n enabled: Boolean(courseId),\n queryFn: async () => {\n // Only `id` is needed here (list view shows a question COUNT, not full\n // records — see AssessmentsPage.tsx); still must go through `items { }`\n // since `questions` is a Connection (BOFF-4703).\n const data = await buiQuery<{\n buiListAssessments: {\n items: Array<\n Omit<BuiAssessment, 'questions'> & { questions: { items: Array<{ id: string }> } }\n >;\n };\n }>(\n `query BuiListAssessments($courseId: ID!, $status: BuiAssessmentStatus) {\n buiListAssessments(courseId: $courseId, status: $status) {\n items { ${ASSESSMENT_FIELDS} questions { items { id } } }\n }\n }`,\n { courseId, status },\n baseUrl\n );\n return data.buiListAssessments.items.map((a) => ({\n ...a,\n // Partial `{ id }`-only records are cast to the full type — safe here\n // because every consumer of the list view only reads `.length`.\n questions: a.questions.items as unknown as BuiQuestion[],\n }));\n },\n });\n};\n\nexport const useBuiAssessment = (id: string | undefined) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: id ? KEY.assessment(id) : ['buildmyiq', 'assessment', 'nil'],\n enabled: Boolean(id),\n queryFn: async () => {\n const data = await buiQuery<{ buiAssessment: BuiAssessmentWire | null }>(\n `query BuiAssessment($id: ID!) {\n buiAssessment(id: $id) { ${ASSESSMENT_FULL_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiAssessment ? flattenAssessment(data.buiAssessment) : null;\n },\n });\n};\n\nexport const useBuiCreateAssessment = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiCreateAssessmentInput) => {\n const data = await buiQuery<{ buiCreateAssessment: BuiAssessment }>(\n `mutation BuiCreateAssessment($input: BuiCreateAssessmentInput!) {\n buiCreateAssessment(input: $input) { ${ASSESSMENT_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiCreateAssessment;\n },\n onSuccess: (a) => qc.invalidateQueries({ queryKey: KEY.assessments(a.courseId) }),\n });\n};\n\nexport const useBuiPublishAssessment = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await buiQuery<{ buiPublishAssessment: BuiAssessment }>(\n `mutation BuiPublishAssessment($id: ID!) {\n buiPublishAssessment(id: $id) { ${ASSESSMENT_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiPublishAssessment;\n },\n onSuccess: (a) => {\n qc.invalidateQueries({ queryKey: KEY.assessment(a.id) });\n qc.invalidateQueries({ queryKey: KEY.assessments(a.courseId) });\n },\n });\n};\n\n/**\n * Archive an assessment (soft-delete) — releases its reusable\n * `buildmyiq.assessments.count` quota slot server-side (BOFF-4722) so the\n * workspace can create a replacement without hitting the plan limit.\n * `buiArchiveAssessment` returns only a `Boolean!`, not the record, so the\n * caller supplies `courseId` (already in hand from the loaded assessment)\n * to invalidate the right list query.\n */\nexport const useBuiArchiveAssessment = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (args: { id: string; courseId: string }) => {\n const data = await buiQuery<{ buiArchiveAssessment: boolean }>(\n `mutation BuiArchiveAssessment($id: ID!) { buiArchiveAssessment(id: $id) }`,\n { id: args.id },\n baseUrl\n );\n return data.buiArchiveAssessment;\n },\n onSuccess: (_r, args) => {\n qc.invalidateQueries({ queryKey: KEY.assessment(args.id) });\n qc.invalidateQueries({ queryKey: KEY.assessments(args.courseId) });\n },\n });\n};\n\nexport const useBuiCreateQuestion = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiCreateQuestionInput) => {\n const data = await buiQuery<{ buiCreateQuestion: BuiQuestion }>(\n `mutation BuiCreateQuestion($input: BuiCreateQuestionInput!) {\n buiCreateQuestion(input: $input) { ${QUESTION_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiCreateQuestion;\n },\n onSuccess: (q) => qc.invalidateQueries({ queryKey: KEY.assessment(q.assessmentId) }),\n });\n};\n\n// ============================================================================\n// Submissions & grading\n// ============================================================================\n\nexport interface UseBuiSubmissionsArgs {\n assessmentId?: string;\n learnerId?: string;\n status?: BuiSubmissionStatus;\n cursor?: string;\n limit?: number;\n enabled?: boolean;\n}\n\nexport const useBuiSubmissions = (args: UseBuiSubmissionsArgs = {}) => {\n const baseUrl = useGateway();\n const { assessmentId, learnerId, status, cursor, limit, enabled = true } = args;\n return useQuery({\n queryKey: [...KEY.submissions, { assessmentId, learnerId, status, cursor, limit }],\n enabled,\n queryFn: async () => {\n const data = await buiQuery<{ buiListSubmissions: BuiConnection<BuiSubmission> }>(\n `query BuiListSubmissions($assessmentId: ID, $learnerId: ID, $status: BuiSubmissionStatus, $pagination: PaginationInput) {\n buiListSubmissions(assessmentId: $assessmentId, learnerId: $learnerId, status: $status, pagination: $pagination) {\n items { ${SUBMISSION_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { assessmentId, learnerId, status, pagination: pageVars(cursor, limit) },\n baseUrl\n );\n return data.buiListSubmissions;\n },\n });\n};\n\n/** Single-submission lookup — used for deep-linking to `/buildmyiq/submissions/:submissionId`. */\nexport const useBuiSubmission = (id: string | undefined) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: id ? KEY.submission(id) : ['buildmyiq', 'submission', 'nil'],\n enabled: Boolean(id),\n queryFn: async () => {\n const data = await buiQuery<{ buiSubmission: BuiSubmission | null }>(\n `query BuiSubmission($id: ID!) {\n buiSubmission(id: $id) { ${SUBMISSION_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiSubmission;\n },\n });\n};\n\nexport const useBuiSubmitAssessment = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiSubmitAssessmentInput) => {\n const data = await buiQuery<{ buiSubmitAssessment: BuiSubmission }>(\n `mutation BuiSubmitAssessment($input: BuiSubmitAssessmentInput!) {\n buiSubmitAssessment(input: $input) { ${SUBMISSION_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiSubmitAssessment;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.submissions }),\n });\n};\n\nexport const useBuiGradeSubmission = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (args: { id: string; input: BuiGradeSubmissionInput }) => {\n const data = await buiQuery<{ buiGradeSubmission: BuiSubmission }>(\n `mutation BuiGradeSubmission($id: ID!, $input: BuiGradeSubmissionInput!) {\n buiGradeSubmission(id: $id, input: $input) { ${SUBMISSION_FIELDS} }\n }`,\n args,\n baseUrl\n );\n return data.buiGradeSubmission;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.submissions }),\n });\n};\n\n// ============================================================================\n// Enrollments & progress\n// ============================================================================\n\nexport interface UseBuiEnrollmentsArgs {\n courseId?: string;\n learnerId?: string;\n status?: BuiEnrollmentStatus;\n cursor?: string;\n limit?: number;\n enabled?: boolean;\n}\n\nexport const useBuiEnrollments = (args: UseBuiEnrollmentsArgs = {}) => {\n const baseUrl = useGateway();\n const { courseId, learnerId, status, cursor, limit, enabled = true } = args;\n return useQuery({\n queryKey: [...KEY.enrollments, { courseId, learnerId, status, cursor, limit }],\n enabled,\n queryFn: async () => {\n const data = await buiQuery<{ buiListEnrollments: BuiConnection<BuiEnrollment> }>(\n `query BuiListEnrollments($courseId: ID, $learnerId: ID, $status: BuiEnrollmentStatus, $pagination: PaginationInput) {\n buiListEnrollments(courseId: $courseId, learnerId: $learnerId, status: $status, pagination: $pagination) {\n items { ${ENROLLMENT_FIELDS} cohort { ${COHORT_FIELDS} } }\n pageInfo { cursor hasMore }\n }\n }`,\n { courseId, learnerId, status, pagination: pageVars(cursor, limit) },\n baseUrl\n );\n return data.buiListEnrollments;\n },\n });\n};\n\nexport const useBuiEnrollment = (id: string | undefined) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: id ? KEY.enrollment(id) : ['buildmyiq', 'enrollment', 'nil'],\n enabled: Boolean(id),\n queryFn: async () => {\n const data = await buiQuery<{ buiEnrollment: BuiEnrollmentWire | null }>(\n `query BuiEnrollment($id: ID!) {\n buiEnrollment(id: $id) { ${ENROLLMENT_FULL_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiEnrollment ? flattenEnrollment(data.buiEnrollment) : null;\n },\n });\n};\n\nexport const useBuiEnroll = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiEnrollInput) => {\n const data = await buiQuery<{ buiEnroll: BuiEnrollment }>(\n `mutation BuiEnroll($input: BuiEnrollInput!) {\n buiEnroll(input: $input) { ${ENROLLMENT_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiEnroll;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.enrollments }),\n });\n};\n\nexport const useBuiTransitionEnrollment = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (args: { id: string; status: BuiEnrollmentStatus }) => {\n const data = await buiQuery<{ buiTransitionEnrollment: BuiEnrollment }>(\n `mutation BuiTransitionEnrollment($id: ID!, $status: BuiEnrollmentStatus!) {\n buiTransitionEnrollment(id: $id, status: $status) { ${ENROLLMENT_FIELDS} }\n }`,\n args,\n baseUrl\n );\n return data.buiTransitionEnrollment;\n },\n onSuccess: (e) => {\n qc.invalidateQueries({ queryKey: KEY.enrollments });\n qc.invalidateQueries({ queryKey: KEY.enrollment(e.id) });\n },\n });\n};\n\nexport const useBuiRecordLessonProgress = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiRecordLessonProgressInput) => {\n const data = await buiQuery<{ buiRecordLessonProgress: BuiLessonProgress }>(\n `mutation BuiRecordLessonProgress($input: BuiRecordLessonProgressInput!) {\n buiRecordLessonProgress(input: $input) { ${LESSON_PROGRESS_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiRecordLessonProgress;\n },\n onSuccess: (p) => {\n qc.invalidateQueries({ queryKey: KEY.enrollment(p.enrollmentId) });\n qc.invalidateQueries({ queryKey: KEY.enrollments });\n },\n });\n};\n\n// ============================================================================\n// Cohorts\n// ============================================================================\n\nexport const useBuiCohorts = (courseId?: string, status?: BuiCohortStatus) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: [...KEY.cohorts, { courseId, status }],\n queryFn: async () => {\n const data = await buiQuery<{ buiListCohorts: { items: BuiCohort[] } }>(\n `query BuiListCohorts($courseId: ID, $status: BuiCohortStatus) {\n buiListCohorts(courseId: $courseId, status: $status) { items { ${COHORT_FIELDS} } }\n }`,\n { courseId, status },\n baseUrl\n );\n return data.buiListCohorts.items;\n },\n });\n};\n\nexport const useBuiCreateCohort = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiCreateCohortInput) => {\n const data = await buiQuery<{ buiCreateCohort: BuiCohort }>(\n `mutation BuiCreateCohort($input: BuiCreateCohortInput!) {\n buiCreateCohort(input: $input) { ${COHORT_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiCreateCohort;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.cohorts }),\n });\n};\n\n// ============================================================================\n// Skills\n// ============================================================================\n\nexport const useBuiSkills = (category?: BuiSkillCategory) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: [...KEY.skills, { category }],\n queryFn: async () => {\n const data = await buiQuery<{ buiListSkills: { items: BuiSkill[] } }>(\n `query BuiListSkills($category: BuiSkillCategory) {\n buiListSkills(category: $category) { items { ${SKILL_FIELDS} } }\n }`,\n { category },\n baseUrl\n );\n return data.buiListSkills.items;\n },\n });\n};\n\nexport const useBuiCreateSkill = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiCreateSkillInput) => {\n const data = await buiQuery<{ buiCreateSkill: BuiSkill }>(\n `mutation BuiCreateSkill($input: BuiCreateSkillInput!) {\n buiCreateSkill(input: $input) { ${SKILL_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiCreateSkill;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.skills }),\n });\n};\n\n// ============================================================================\n// Certificates\n// ============================================================================\n\nexport const useBuiCertificates = (courseId?: string, learnerId?: string) => {\n const baseUrl = useGateway();\n return useQuery({\n queryKey: [...KEY.certificates, { courseId, learnerId }],\n queryFn: async () => {\n const data = await buiQuery<{ buiListCertificates: { items: BuiCertificate[] } }>(\n `query BuiListCertificates($courseId: ID, $learnerId: ID) {\n buiListCertificates(courseId: $courseId, learnerId: $learnerId) { items { ${CERTIFICATE_FIELDS} } }\n }`,\n { courseId, learnerId },\n baseUrl\n );\n return data.buiListCertificates.items;\n },\n });\n};\n\nexport const useBuiIssueCertificate = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: BuiIssueCertificateInput) => {\n const data = await buiQuery<{ buiIssueCertificate: BuiCertificate }>(\n `mutation BuiIssueCertificate($input: BuiIssueCertificateInput!) {\n buiIssueCertificate(input: $input) { ${CERTIFICATE_FIELDS} }\n }`,\n { input },\n baseUrl\n );\n return data.buiIssueCertificate;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.certificates }),\n });\n};\n\nexport const useBuiRevokeCertificate = () => {\n const baseUrl = useGateway();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await buiQuery<{ buiRevokeCertificate: BuiCertificate }>(\n `mutation BuiRevokeCertificate($id: ID!) {\n buiRevokeCertificate(id: $id) { ${CERTIFICATE_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiRevokeCertificate;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.certificates }),\n });\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssessmentDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/buildmyiq/pages/assessments/AssessmentDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAqB,KAAK,EAAE,EAAkB,MAAM,OAAO,CAAC;AAgHnE,eAAO,MAAM,oBAAoB,EAAE,EAyblC,CAAC"}
1
+ {"version":3,"file":"AssessmentDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/buildmyiq/pages/assessments/AssessmentDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAqB,KAAK,EAAE,EAAkB,MAAM,OAAO,CAAC;AAuHnE,eAAO,MAAM,oBAAoB,EAAE,EA6flC,CAAC"}