@burdenoff/microfe-buildmyiq 2026.705.4 → 2026.705.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.
- package/dist/buildmyiq/BuildmyiqRoot.d.ts +5 -0
- package/dist/buildmyiq/BuildmyiqRoot.d.ts.map +1 -0
- package/dist/buildmyiq/BuildmyiqRoutes.d.ts +4 -0
- package/dist/buildmyiq/BuildmyiqRoutes.d.ts.map +1 -0
- package/dist/buildmyiq/components/BuiDiscussion.d.ts +18 -0
- package/dist/buildmyiq/components/BuiDiscussion.d.ts.map +1 -0
- package/dist/buildmyiq/components/BuiTags.d.ts +17 -0
- package/dist/buildmyiq/components/BuiTags.d.ts.map +1 -0
- package/dist/buildmyiq/components/DataTable.d.ts +28 -0
- package/dist/buildmyiq/components/DataTable.d.ts.map +1 -0
- package/dist/buildmyiq/components/EmptyState.d.ts +18 -0
- package/dist/buildmyiq/components/EmptyState.d.ts.map +1 -0
- package/dist/buildmyiq/components/EvidenceUpload.d.ts +14 -0
- package/dist/buildmyiq/components/EvidenceUpload.d.ts.map +1 -0
- package/dist/buildmyiq/components/FileLink.d.ts +15 -0
- package/dist/buildmyiq/components/FileLink.d.ts.map +1 -0
- package/dist/buildmyiq/components/FilterTabs.d.ts +18 -0
- package/dist/buildmyiq/components/FilterTabs.d.ts.map +1 -0
- package/dist/buildmyiq/components/MetricsCard.d.ts +23 -0
- package/dist/buildmyiq/components/MetricsCard.d.ts.map +1 -0
- package/dist/buildmyiq/components/MiniBar.d.ts +16 -0
- package/dist/buildmyiq/components/MiniBar.d.ts.map +1 -0
- package/dist/buildmyiq/components/PageLayout.d.ts +16 -0
- package/dist/buildmyiq/components/PageLayout.d.ts.map +1 -0
- package/dist/buildmyiq/components/Pagination.d.ts +22 -0
- package/dist/buildmyiq/components/Pagination.d.ts.map +1 -0
- package/dist/buildmyiq/components/StateViews.d.ts +24 -0
- package/dist/buildmyiq/components/StateViews.d.ts.map +1 -0
- package/dist/buildmyiq/components/StatusBadge.d.ts +9 -0
- package/dist/buildmyiq/components/StatusBadge.d.ts.map +1 -0
- package/dist/buildmyiq/components/Tabs.d.ts +17 -0
- package/dist/buildmyiq/components/Tabs.d.ts.map +1 -0
- package/dist/buildmyiq/components/index.d.ts +19 -0
- package/dist/buildmyiq/components/index.d.ts.map +1 -0
- package/dist/buildmyiq/context/BuildmyiqContext.d.ts +16 -0
- package/dist/buildmyiq/context/BuildmyiqContext.d.ts.map +1 -0
- package/dist/buildmyiq/context/index.d.ts +6 -0
- package/dist/buildmyiq/context/index.d.ts.map +1 -0
- package/dist/buildmyiq/hooks/index.d.ts +10 -0
- package/dist/buildmyiq/hooks/index.d.ts.map +1 -0
- package/dist/buildmyiq/hooks/useBuiComments.d.ts +36 -0
- package/dist/buildmyiq/hooks/useBuiComments.d.ts.map +1 -0
- package/dist/buildmyiq/hooks/useBuiFiles.d.ts +47 -0
- package/dist/buildmyiq/hooks/useBuiFiles.d.ts.map +1 -0
- package/dist/buildmyiq/hooks/useBuiTags.d.ts +44 -0
- package/dist/buildmyiq/hooks/useBuiTags.d.ts.map +1 -0
- package/dist/buildmyiq/hooks/useBuildmyiqApi.d.ts +65 -0
- package/dist/buildmyiq/hooks/useBuildmyiqApi.d.ts.map +1 -0
- package/dist/buildmyiq/hooks/useBuildmyiqApi.js +1 -1
- package/dist/buildmyiq/hooks/useBuildmyiqApi.js.map +1 -1
- package/dist/buildmyiq/hooks/useCursorPager.d.ts +33 -0
- package/dist/buildmyiq/hooks/useCursorPager.d.ts.map +1 -0
- package/dist/buildmyiq/index.d.ts +9 -0
- package/dist/buildmyiq/index.d.ts.map +1 -0
- package/dist/buildmyiq/pages/DashboardPage.d.ts +4 -0
- package/dist/buildmyiq/pages/DashboardPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/_shared/CourseCard.d.ts +13 -0
- package/dist/buildmyiq/pages/_shared/CourseCard.d.ts.map +1 -0
- package/dist/buildmyiq/pages/_shared/CourseCard.js +2 -2
- package/dist/buildmyiq/pages/_shared/CourseCard.js.map +1 -1
- package/dist/buildmyiq/pages/_shared/index.d.ts +6 -0
- package/dist/buildmyiq/pages/_shared/index.d.ts.map +1 -0
- package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.d.ts +4 -0
- package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/assessments/AssessmentsPage.d.ts +4 -0
- package/dist/buildmyiq/pages/assessments/AssessmentsPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/authoring/AuthoringPage.d.ts +4 -0
- package/dist/buildmyiq/pages/authoring/AuthoringPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/authoring/CourseBuilderPage.d.ts +4 -0
- package/dist/buildmyiq/pages/authoring/CourseBuilderPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/authoring/CourseBuilderPage.js +2 -2
- package/dist/buildmyiq/pages/authoring/CourseBuilderPage.js.map +1 -1
- package/dist/buildmyiq/pages/authoring/_forms.d.ts +44 -0
- package/dist/buildmyiq/pages/authoring/_forms.d.ts.map +1 -0
- package/dist/buildmyiq/pages/catalog/CatalogPage.d.ts +4 -0
- package/dist/buildmyiq/pages/catalog/CatalogPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/catalog/CourseDetailPage.d.ts +4 -0
- package/dist/buildmyiq/pages/catalog/CourseDetailPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/catalog/CourseDetailPage.js +2 -2
- package/dist/buildmyiq/pages/catalog/CourseDetailPage.js.map +1 -1
- package/dist/buildmyiq/pages/certificates/CertificatesPage.d.ts +4 -0
- package/dist/buildmyiq/pages/certificates/CertificatesPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/cohorts/CohortsPage.d.ts +4 -0
- package/dist/buildmyiq/pages/cohorts/CohortsPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/learning/LessonPlayerPage.d.ts +4 -0
- package/dist/buildmyiq/pages/learning/LessonPlayerPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/learning/MyLearningPage.d.ts +4 -0
- package/dist/buildmyiq/pages/learning/MyLearningPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/skills/SkillsPage.d.ts +4 -0
- package/dist/buildmyiq/pages/skills/SkillsPage.d.ts.map +1 -0
- package/dist/buildmyiq/pages/submissions/SubmissionsPage.d.ts +4 -0
- package/dist/buildmyiq/pages/submissions/SubmissionsPage.d.ts.map +1 -0
- package/dist/buildmyiq/types/index.d.ts +382 -0
- package/dist/buildmyiq/types/index.d.ts.map +1 -0
- package/dist/buildmyiq/types/index.js.map +1 -1
- package/dist/buildmyiq/utils/cn.d.ts +4 -0
- package/dist/buildmyiq/utils/cn.d.ts.map +1 -0
- package/dist/buildmyiq/utils/cn.js +2 -2
- package/dist/buildmyiq/utils/formatters.d.ts +33 -0
- package/dist/buildmyiq/utils/formatters.d.ts.map +1 -0
- package/dist/buildmyiq/utils/i18n.d.ts +6 -0
- package/dist/buildmyiq/utils/i18n.d.ts.map +1 -0
- package/dist/buildmyiq/utils/index.d.ts +9 -0
- package/dist/buildmyiq/utils/index.d.ts.map +1 -0
- package/dist/buildmyiq/utils/navigation.d.ts +14 -0
- package/dist/buildmyiq/utils/navigation.d.ts.map +1 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +18199 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +43046 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/node_modules/{clsx → .bun/clsx@2.1.1/node_modules/clsx}/dist/clsx.js +1 -1
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/{tailwind-merge → .bun/tailwind-merge@3.5.0/node_modules/tailwind-merge}/dist/bundle-mjs.js +170 -212
- package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/package.json +1 -1
- package/dist/node_modules/clsx/dist/clsx.js.map +0 -1
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { BuiConnection, BuiCourse, BuiCourseLevel, BuiCourseStatus, BuiModule, BuiLesson, BuiAssessment, BuiAssessmentStatus, BuiQuestion, BuiSubmission, BuiSubmissionStatus, BuiEnrollment, BuiEnrollmentStatus, BuiCohort, BuiCohortStatus, BuiSkill, BuiSkillCategory, BuiCertificate, BuiLessonProgress, BuiCreateCourseInput, BuiUpdateCourseInput, BuiCreateModuleInput, BuiCreateLessonInput, BuiCreateAssessmentInput, BuiCreateQuestionInput, BuiCreateSkillInput, BuiCreateCohortInput, BuiEnrollInput, BuiRecordLessonProgressInput, BuiSubmitAssessmentInput, BuiGradeSubmissionInput, BuiIssueCertificateInput } from '../types';
|
|
2
|
+
|
|
3
|
+
export interface UseBuiCoursesArgs {
|
|
4
|
+
level?: BuiCourseLevel;
|
|
5
|
+
status?: BuiCourseStatus;
|
|
6
|
+
cursor?: string;
|
|
7
|
+
limit?: number;
|
|
8
|
+
enabled?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare const useBuiCourses: (args?: UseBuiCoursesArgs) => import('@tanstack/react-query').UseQueryResult<BuiConnection<BuiCourse>, Error>;
|
|
11
|
+
export declare const useBuiCourse: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<BuiCourse | null, Error>;
|
|
12
|
+
export declare const useBuiCreateCourse: () => import('@tanstack/react-query').UseMutationResult<BuiCourse, Error, BuiCreateCourseInput, unknown>;
|
|
13
|
+
export declare const useBuiUpdateCourse: () => import('@tanstack/react-query').UseMutationResult<BuiCourse, Error, {
|
|
14
|
+
id: string;
|
|
15
|
+
input: BuiUpdateCourseInput;
|
|
16
|
+
}, unknown>;
|
|
17
|
+
export declare const useBuiPublishCourse: () => import('@tanstack/react-query').UseMutationResult<BuiCourse, Error, string, unknown>;
|
|
18
|
+
export declare const useBuiArchiveCourse: () => import('@tanstack/react-query').UseMutationResult<boolean, Error, string, unknown>;
|
|
19
|
+
export declare const useBuiModules: (courseId: string | undefined) => import('@tanstack/react-query').UseQueryResult<BuiModule[], Error>;
|
|
20
|
+
export declare const useBuiLessons: (courseId: string | undefined, moduleId?: string) => import('@tanstack/react-query').UseQueryResult<BuiLesson[], Error>;
|
|
21
|
+
export declare const useBuiCreateModule: () => import('@tanstack/react-query').UseMutationResult<BuiModule, Error, BuiCreateModuleInput, unknown>;
|
|
22
|
+
export declare const useBuiCreateLesson: () => import('@tanstack/react-query').UseMutationResult<BuiLesson, Error, BuiCreateLessonInput, unknown>;
|
|
23
|
+
export declare const useBuiAssessments: (courseId: string | undefined, status?: BuiAssessmentStatus) => import('@tanstack/react-query').UseQueryResult<BuiAssessment[], Error>;
|
|
24
|
+
export declare const useBuiAssessment: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<BuiAssessment | null, Error>;
|
|
25
|
+
export declare const useBuiCreateAssessment: () => import('@tanstack/react-query').UseMutationResult<BuiAssessment, Error, BuiCreateAssessmentInput, unknown>;
|
|
26
|
+
export declare const useBuiPublishAssessment: () => import('@tanstack/react-query').UseMutationResult<BuiAssessment, Error, string, unknown>;
|
|
27
|
+
export declare const useBuiCreateQuestion: () => import('@tanstack/react-query').UseMutationResult<BuiQuestion, Error, BuiCreateQuestionInput, unknown>;
|
|
28
|
+
export interface UseBuiSubmissionsArgs {
|
|
29
|
+
assessmentId?: string;
|
|
30
|
+
learnerId?: string;
|
|
31
|
+
status?: BuiSubmissionStatus;
|
|
32
|
+
cursor?: string;
|
|
33
|
+
limit?: number;
|
|
34
|
+
enabled?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare const useBuiSubmissions: (args?: UseBuiSubmissionsArgs) => import('@tanstack/react-query').UseQueryResult<BuiConnection<BuiSubmission>, Error>;
|
|
37
|
+
export declare const useBuiSubmitAssessment: () => import('@tanstack/react-query').UseMutationResult<BuiSubmission, Error, BuiSubmitAssessmentInput, unknown>;
|
|
38
|
+
export declare const useBuiGradeSubmission: () => import('@tanstack/react-query').UseMutationResult<BuiSubmission, Error, {
|
|
39
|
+
id: string;
|
|
40
|
+
input: BuiGradeSubmissionInput;
|
|
41
|
+
}, unknown>;
|
|
42
|
+
export interface UseBuiEnrollmentsArgs {
|
|
43
|
+
courseId?: string;
|
|
44
|
+
learnerId?: string;
|
|
45
|
+
status?: BuiEnrollmentStatus;
|
|
46
|
+
cursor?: string;
|
|
47
|
+
limit?: number;
|
|
48
|
+
enabled?: boolean;
|
|
49
|
+
}
|
|
50
|
+
export declare const useBuiEnrollments: (args?: UseBuiEnrollmentsArgs) => import('@tanstack/react-query').UseQueryResult<BuiConnection<BuiEnrollment>, Error>;
|
|
51
|
+
export declare const useBuiEnrollment: (id: string | undefined) => import('@tanstack/react-query').UseQueryResult<BuiEnrollment | null, Error>;
|
|
52
|
+
export declare const useBuiEnroll: () => import('@tanstack/react-query').UseMutationResult<BuiEnrollment, Error, BuiEnrollInput, unknown>;
|
|
53
|
+
export declare const useBuiTransitionEnrollment: () => import('@tanstack/react-query').UseMutationResult<BuiEnrollment, Error, {
|
|
54
|
+
id: string;
|
|
55
|
+
status: BuiEnrollmentStatus;
|
|
56
|
+
}, unknown>;
|
|
57
|
+
export declare const useBuiRecordLessonProgress: () => import('@tanstack/react-query').UseMutationResult<BuiLessonProgress, Error, BuiRecordLessonProgressInput, unknown>;
|
|
58
|
+
export declare const useBuiCohorts: (courseId?: string, status?: BuiCohortStatus) => import('@tanstack/react-query').UseQueryResult<BuiCohort[], Error>;
|
|
59
|
+
export declare const useBuiCreateCohort: () => import('@tanstack/react-query').UseMutationResult<BuiCohort, Error, BuiCreateCohortInput, unknown>;
|
|
60
|
+
export declare const useBuiSkills: (category?: BuiSkillCategory) => import('@tanstack/react-query').UseQueryResult<BuiSkill[], Error>;
|
|
61
|
+
export declare const useBuiCreateSkill: () => import('@tanstack/react-query').UseMutationResult<BuiSkill, Error, BuiCreateSkillInput, unknown>;
|
|
62
|
+
export declare const useBuiCertificates: (courseId?: string, learnerId?: string) => import('@tanstack/react-query').UseQueryResult<BuiCertificate[], Error>;
|
|
63
|
+
export declare const useBuiIssueCertificate: () => import('@tanstack/react-query').UseMutationResult<BuiCertificate, Error, BuiIssueCertificateInput, unknown>;
|
|
64
|
+
export declare const useBuiRevokeCertificate: () => import('@tanstack/react-query').UseMutationResult<BuiCertificate, Error, string, unknown>;
|
|
65
|
+
//# sourceMappingURL=useBuildmyiqApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBuildmyiqApi.d.ts","sourceRoot":"","sources":["../../../src/buildmyiq/hooks/useBuildmyiqApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,7 +57,7 @@ var a = () => {
|
|
|
57
57
|
}, c = 24, l = (e, t = c) => e ? {
|
|
58
58
|
limit: t,
|
|
59
59
|
cursor: e
|
|
60
|
-
} : { limit: t }, u = "id name
|
|
60
|
+
} : { limit: t }, u = "id name downloadUrl mimeType", d = "\n id workspaceId name category description isActive createdAt updatedAt\n", f = `
|
|
61
61
|
id workspaceId title slug summary description status level language
|
|
62
62
|
estimatedHours isPublic tags skillId instructorId publishedAt createdAt updatedAt
|
|
63
63
|
cover { ${u} }
|
|
@@ -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 url 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\nconst COURSE_FULL_FIELDS = `\n ${COURSE_CORE_FIELDS}\n modules { ${MODULE_FIELDS} lessons { ${LESSON_FIELDS} } }\n lessons { ${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\nconst ASSESSMENT_FULL_FIELDS = `\n ${ASSESSMENT_FIELDS}\n questions { ${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\nconst ENROLLMENT_FULL_FIELDS = `\n ${ENROLLMENT_FIELDS}\n cohort { ${COHORT_FIELDS} }\n lessonProgress { ${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// 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 const data = await buiQuery<{ buiListCourses: BuiConnection<BuiCourse> }>(\n `query BuiListCourses($level: BuiCourseLevel, $status: BuiCourseStatus, $pagination: PaginationInput) {\n buiListCourses(level: $level, status: $status, pagination: $pagination) {\n items { ${COURSE_CORE_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { level, status, pagination: pageVars(cursor, limit) },\n baseUrl\n );\n return data.buiListCourses;\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: BuiCourse | null }>(\n `query BuiCourse($id: ID!) {\n buiCourse(id: $id) { ${COURSE_FULL_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiCourse;\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: BuiModule[] }>(\n `query BuiListModules($courseId: ID!) {\n buiListModules(courseId: $courseId) { ${MODULE_FIELDS} lessons { ${LESSON_FIELDS} } }\n }`,\n { courseId },\n baseUrl\n );\n return data.buiListModules;\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: BuiLesson[] }>(\n `query BuiListLessons($courseId: ID!, $moduleId: ID) {\n buiListLessons(courseId: $courseId, moduleId: $moduleId) { ${LESSON_FIELDS} }\n }`,\n { courseId, moduleId },\n baseUrl\n );\n return data.buiListLessons;\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 const data = await buiQuery<{ buiListAssessments: BuiAssessment[] }>(\n `query BuiListAssessments($courseId: ID!, $status: BuiAssessmentStatus) {\n buiListAssessments(courseId: $courseId, status: $status) { ${ASSESSMENT_FIELDS} }\n }`,\n { courseId, status },\n baseUrl\n );\n return data.buiListAssessments;\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: BuiAssessment | null }>(\n `query BuiAssessment($id: ID!) {\n buiAssessment(id: $id) { ${ASSESSMENT_FULL_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiAssessment;\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: BuiEnrollment | null }>(\n `query BuiEnrollment($id: ID!) {\n buiEnrollment(id: $id) { ${ENROLLMENT_FULL_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiEnrollment;\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: BuiCohort[] }>(\n `query BuiListCohorts($courseId: ID, $status: BuiCohortStatus) {\n buiListCohorts(courseId: $courseId, status: $status) { ${COHORT_FIELDS} }\n }`,\n { courseId, status },\n baseUrl\n );\n return data.buiListCohorts;\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: BuiSkill[] }>(\n `query BuiListSkills($category: BuiSkillCategory) {\n buiListSkills(category: $category) { ${SKILL_FIELDS} }\n }`,\n { category },\n baseUrl\n );\n return data.buiListSkills;\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: BuiCertificate[] }>(\n `query BuiListCertificates($courseId: ID, $learnerId: ID) {\n buiListCertificates(courseId: $courseId, learnerId: $learnerId) { ${CERTIFICATE_FIELDS} }\n }`,\n { courseId, learnerId },\n baseUrl\n );\n return data.buiListCertificates;\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
|
+
{"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\nconst COURSE_FULL_FIELDS = `\n ${COURSE_CORE_FIELDS}\n modules { ${MODULE_FIELDS} lessons { ${LESSON_FIELDS} } }\n lessons { ${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\nconst ASSESSMENT_FULL_FIELDS = `\n ${ASSESSMENT_FIELDS}\n questions { ${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\nconst ENROLLMENT_FULL_FIELDS = `\n ${ENROLLMENT_FIELDS}\n cohort { ${COHORT_FIELDS} }\n lessonProgress { ${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// 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 const data = await buiQuery<{ buiListCourses: BuiConnection<BuiCourse> }>(\n `query BuiListCourses($level: BuiCourseLevel, $status: BuiCourseStatus, $pagination: PaginationInput) {\n buiListCourses(level: $level, status: $status, pagination: $pagination) {\n items { ${COURSE_CORE_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { level, status, pagination: pageVars(cursor, limit) },\n baseUrl\n );\n return data.buiListCourses;\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: BuiCourse | null }>(\n `query BuiCourse($id: ID!) {\n buiCourse(id: $id) { ${COURSE_FULL_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiCourse;\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: BuiModule[] }>(\n `query BuiListModules($courseId: ID!) {\n buiListModules(courseId: $courseId) { ${MODULE_FIELDS} lessons { ${LESSON_FIELDS} } }\n }`,\n { courseId },\n baseUrl\n );\n return data.buiListModules;\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: BuiLesson[] }>(\n `query BuiListLessons($courseId: ID!, $moduleId: ID) {\n buiListLessons(courseId: $courseId, moduleId: $moduleId) { ${LESSON_FIELDS} }\n }`,\n { courseId, moduleId },\n baseUrl\n );\n return data.buiListLessons;\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 const data = await buiQuery<{ buiListAssessments: BuiAssessment[] }>(\n `query BuiListAssessments($courseId: ID!, $status: BuiAssessmentStatus) {\n buiListAssessments(courseId: $courseId, status: $status) { ${ASSESSMENT_FIELDS} }\n }`,\n { courseId, status },\n baseUrl\n );\n return data.buiListAssessments;\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: BuiAssessment | null }>(\n `query BuiAssessment($id: ID!) {\n buiAssessment(id: $id) { ${ASSESSMENT_FULL_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiAssessment;\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: BuiEnrollment | null }>(\n `query BuiEnrollment($id: ID!) {\n buiEnrollment(id: $id) { ${ENROLLMENT_FULL_FIELDS} }\n }`,\n { id },\n baseUrl\n );\n return data.buiEnrollment;\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: BuiCohort[] }>(\n `query BuiListCohorts($courseId: ID, $status: BuiCohortStatus) {\n buiListCohorts(courseId: $courseId, status: $status) { ${COHORT_FIELDS} }\n }`,\n { courseId, status },\n baseUrl\n );\n return data.buiListCohorts;\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: BuiSkill[] }>(\n `query BuiListSkills($category: BuiSkillCategory) {\n buiListSkills(category: $category) { ${SKILL_FIELDS} }\n }`,\n { category },\n baseUrl\n );\n return data.buiListSkills;\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: BuiCertificate[] }>(\n `query BuiListCertificates($courseId: ID, $learnerId: ID) {\n buiListCertificates(courseId: $courseId, learnerId: $learnerId) { ${CERTIFICATE_FIELDS} }\n }`,\n { courseId, learnerId },\n baseUrl\n );\n return data.buiListCertificates;\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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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useCursorPager — forward/back cursor pagination for Bui* list connections.
|
|
3
|
+
* @module buildmyiq/hooks
|
|
4
|
+
*
|
|
5
|
+
* The svc paginates by cursor only (`PaginationInput.offset` is a no-op — the
|
|
6
|
+
* resolver never sets Prisma `skip` from it). So a page must send
|
|
7
|
+
* `pagination.cursor = the previous page's pageInfo.cursor` to advance. This
|
|
8
|
+
* hook keeps a stack of the cursors that opened each visited page so Prev/Next
|
|
9
|
+
* are exact, and exposes a 0-indexed `page` for display.
|
|
10
|
+
*/
|
|
11
|
+
export interface CursorPager {
|
|
12
|
+
/** 0-indexed page number for display. */
|
|
13
|
+
page: number;
|
|
14
|
+
/**
|
|
15
|
+
* Cursor that opens the current page — `undefined` on the first page so it is
|
|
16
|
+
* OMITTED from the GraphQL variables (the svc rejects an explicit `cursor: null`;
|
|
17
|
+
* a first page must send no cursor at all, per cursor-pagination convention).
|
|
18
|
+
*/
|
|
19
|
+
cursor: string | undefined;
|
|
20
|
+
/** Advance to the next page using the current page's end cursor. No-op if null. */
|
|
21
|
+
next: (endCursor: string | null | undefined) => void;
|
|
22
|
+
/** Go back one page. No-op on the first page. */
|
|
23
|
+
prev: () => void;
|
|
24
|
+
/** Reset to the first page (call when filters change). */
|
|
25
|
+
reset: () => void;
|
|
26
|
+
/**
|
|
27
|
+
* Adapter for `<Pagination onPageChange>` — compares the requested page to the
|
|
28
|
+
* current one and calls next()/prev() accordingly.
|
|
29
|
+
*/
|
|
30
|
+
onPageChange: (targetPage: number, endCursor: string | null | undefined) => void;
|
|
31
|
+
}
|
|
32
|
+
export declare function useCursorPager(): CursorPager;
|
|
33
|
+
//# sourceMappingURL=useCursorPager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCursorPager.d.ts","sourceRoot":"","sources":["../../../src/buildmyiq/hooks/useCursorPager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,mFAAmF;IACnF,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;IACrD,iDAAiD;IACjD,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB;;;OAGG;IACH,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;CAClF;AAED,wBAAgB,cAAc,IAAI,WAAW,CA4B5C"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buildmyiq Module Exports
|
|
3
|
+
* @module buildmyiq
|
|
4
|
+
*/
|
|
5
|
+
export { BuildmyiqRoot, BuildmyiqRoot as BuildMyIQRoot } from './BuildmyiqRoot';
|
|
6
|
+
export type { BuildmyiqRootProps, NavItem, FooterItem, TrendDirection } from './types';
|
|
7
|
+
export { BuildmyiqProvider, useBuildmyiq } from './context';
|
|
8
|
+
export { cn, joinPath, formatDate, formatDateTime, formatRelativeTime, formatNumber, formatQuantity, formatPercent, formatDuration, formatHours, formatEnumLabel, formatPersonName, } from './utils';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/buildmyiq/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,aAAa,EAAE,aAAa,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhF,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGvF,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAG5D,OAAO,EACL,EAAE,EACF,QAAQ,EACR,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,eAAe,EACf,gBAAgB,GACjB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardPage.d.ts","sourceRoot":"","sources":["../../../src/buildmyiq/pages/DashboardPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAWhC,eAAO,MAAM,aAAa,EAAE,EAwJ3B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { BuiCourse } from '../../types';
|
|
3
|
+
|
|
4
|
+
interface CourseCardProps {
|
|
5
|
+
course: BuiCourse;
|
|
6
|
+
onClick?: () => void;
|
|
7
|
+
/** Show the workflow status pill (authoring view) in addition to level. */
|
|
8
|
+
showStatus?: boolean;
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const CourseCard: FC<CourseCardProps>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=CourseCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CourseCard.d.ts","sourceRoot":"","sources":["../../../../src/buildmyiq/pages/_shared/CourseCard.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAMhC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,UAAU,eAAe;IACvB,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAqD1C,CAAC"}
|
|
@@ -14,8 +14,8 @@ var l = ({ course: l, onClick: u, showStatus: d, className: f }) => {
|
|
|
14
14
|
onClick: u,
|
|
15
15
|
children: [/* @__PURE__ */ s("div", {
|
|
16
16
|
className: "relative h-32 w-full overflow-hidden bg-bg-sunken",
|
|
17
|
-
children: [l.cover?.
|
|
18
|
-
src: l.cover.
|
|
17
|
+
children: [l.cover?.downloadUrl ? /* @__PURE__ */ o("img", {
|
|
18
|
+
src: l.cover.downloadUrl,
|
|
19
19
|
alt: "",
|
|
20
20
|
className: "h-full w-full object-cover transition-transform duration-500 group-hover:scale-105"
|
|
21
21
|
}) : /* @__PURE__ */ o("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CourseCard.js","names":[],"sources":["../../../../src/buildmyiq/pages/_shared/CourseCard.tsx"],"sourcesContent":["/**\n * CourseCard — a reusable course tile for catalog / authoring grids.\n * @module buildmyiq/pages/_shared\n */\n\nimport type { FC } from 'react';\nimport { BookOpen, Clock, Layers } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { StatusBadge } from '../../components';\nimport { cn } from '../../utils/cn';\nimport { formatHours } from '../../utils/formatters';\nimport type { BuiCourse } from '../../types';\n\ninterface CourseCardProps {\n course: BuiCourse;\n onClick?: () => void;\n /** Show the workflow status pill (authoring view) in addition to level. */\n showStatus?: boolean;\n className?: string;\n}\n\nexport const CourseCard: FC<CourseCardProps> = ({ course, onClick, showStatus, className }) => {\n const moduleCount = course.modules?.length ?? 0;\n const lessonCount = course.lessons?.length ?? 0;\n\n return (\n <GlassCard\n treatment=\"plain\"\n className={cn(\n 'group flex flex-col overflow-hidden transition-shadow',\n onClick && 'cursor-pointer hover:shadow-lg',\n className\n )}\n onClick={onClick}\n >\n <div className=\"relative h-32 w-full overflow-hidden bg-bg-sunken\">\n {course.cover?.
|
|
1
|
+
{"version":3,"file":"CourseCard.js","names":[],"sources":["../../../../src/buildmyiq/pages/_shared/CourseCard.tsx"],"sourcesContent":["/**\n * CourseCard — a reusable course tile for catalog / authoring grids.\n * @module buildmyiq/pages/_shared\n */\n\nimport type { FC } from 'react';\nimport { BookOpen, Clock, Layers } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { StatusBadge } from '../../components';\nimport { cn } from '../../utils/cn';\nimport { formatHours } from '../../utils/formatters';\nimport type { BuiCourse } from '../../types';\n\ninterface CourseCardProps {\n course: BuiCourse;\n onClick?: () => void;\n /** Show the workflow status pill (authoring view) in addition to level. */\n showStatus?: boolean;\n className?: string;\n}\n\nexport const CourseCard: FC<CourseCardProps> = ({ course, onClick, showStatus, className }) => {\n const moduleCount = course.modules?.length ?? 0;\n const lessonCount = course.lessons?.length ?? 0;\n\n return (\n <GlassCard\n treatment=\"plain\"\n className={cn(\n 'group flex flex-col overflow-hidden transition-shadow',\n onClick && 'cursor-pointer hover:shadow-lg',\n className\n )}\n onClick={onClick}\n >\n <div className=\"relative h-32 w-full overflow-hidden bg-bg-sunken\">\n {course.cover?.downloadUrl ? (\n <img\n src={course.cover.downloadUrl}\n alt=\"\"\n className=\"h-full w-full object-cover transition-transform duration-500 group-hover:scale-105\"\n />\n ) : (\n <div className=\"flex h-full w-full items-center justify-center bg-[var(--color-accent-soft)]\">\n <BookOpen className=\"h-8 w-8 text-text-secondary opacity-60\" />\n </div>\n )}\n <div className=\"absolute left-2 top-2 flex flex-wrap gap-1.5\">\n <StatusBadge status={course.level} />\n {showStatus && <StatusBadge status={course.status} />}\n </div>\n </div>\n\n <div className=\"flex flex-1 flex-col gap-2 p-4\">\n <h3 className=\"line-clamp-2 font-semibold text-text-primary\">{course.title}</h3>\n {course.summary && (\n <p className=\"line-clamp-2 text-sm text-text-secondary\">{course.summary}</p>\n )}\n <div className=\"mt-auto flex flex-wrap items-center gap-3 pt-2 text-xs text-text-secondary\">\n {course.skill?.name && (\n <span className=\"rounded-full bg-bg-sunken px-2 py-0.5\">{course.skill.name}</span>\n )}\n <span className=\"inline-flex items-center gap-1\">\n <Layers className=\"h-3.5 w-3.5\" /> {moduleCount} mod · {lessonCount} lessons\n </span>\n {course.estimatedHours > 0 && (\n <span className=\"inline-flex items-center gap-1\">\n <Clock className=\"h-3.5 w-3.5\" /> {formatHours(course.estimatedHours)}\n </span>\n )}\n </div>\n </div>\n </GlassCard>\n );\n};\n"],"mappings":";;;;;;;;AAqBA,IAAa,KAAmC,EAAE,WAAQ,YAAS,eAAY,mBAAgB;CAC7F,IAAM,IAAc,EAAO,SAAS,UAAU,GACxC,IAAc,EAAO,SAAS,UAAU;AAE9C,QACE,kBAAC,GAAD;EACE,WAAU;EACV,WAAW,EACT,yDACA,KAAW,kCACX,EACD;EACQ;YAPX,CASE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,EAAO,OAAO,cACb,kBAAC,OAAD;IACE,KAAK,EAAO,MAAM;IAClB,KAAI;IACJ,WAAU;IACV,CAAA,GAEF,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD,EAAU,WAAU,0CAA2C,CAAA;IAC3D,CAAA,EAER,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAa,QAAQ,EAAO,OAAS,CAAA,EACpC,KAAc,kBAAC,GAAD,EAAa,QAAQ,EAAO,QAAU,CAAA,CACjD;MACF;MAEN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,MAAD;KAAI,WAAU;eAAgD,EAAO;KAAW,CAAA;IAC/E,EAAO,WACN,kBAAC,KAAD;KAAG,WAAU;eAA4C,EAAO;KAAY,CAAA;IAE9E,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,EAAO,OAAO,QACb,kBAAC,QAAD;OAAM,WAAU;iBAAyC,EAAO,MAAM;OAAY,CAAA;MAEpF,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QACE,kBAAC,GAAD,EAAQ,WAAU,eAAgB,CAAA;;QAAE;QAAY;QAAQ;QAAY;QAC/D;;MACN,EAAO,iBAAiB,KACvB,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QACE,kBAAC,GAAD,EAAO,WAAU,eAAgB,CAAA;;QAAE,EAAY,EAAO,eAAe;QAChE;;MAEL;;IACF;KACI"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/buildmyiq/pages/_shared/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +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,EAAE,MAAM,OAAO,CAAC;AAoGnD,eAAO,MAAM,oBAAoB,EAAE,EAkalC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssessmentsPage.d.ts","sourceRoot":"","sources":["../../../../src/buildmyiq/pages/assessments/AssessmentsPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAqB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAmEnD,eAAO,MAAM,eAAe,EAAE,EAwW7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthoringPage.d.ts","sourceRoot":"","sources":["../../../../src/buildmyiq/pages/authoring/AuthoringPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAmLhC,eAAO,MAAM,aAAa,EAAE,EAwG3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CourseBuilderPage.d.ts","sourceRoot":"","sources":["../../../../src/buildmyiq/pages/authoring/CourseBuilderPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAsqBhC,eAAO,MAAM,iBAAiB,EAAE,EA2E/B,CAAC"}
|
|
@@ -190,8 +190,8 @@ var K = ({ course: e }) => {
|
|
|
190
190
|
children: [
|
|
191
191
|
/* @__PURE__ */ z("div", {
|
|
192
192
|
className: "h-36 w-full overflow-hidden rounded-xl border border-border-seam bg-bg-sunken",
|
|
193
|
-
children: e.cover?.
|
|
194
|
-
src: e.cover.
|
|
193
|
+
children: e.cover?.downloadUrl ? /* @__PURE__ */ z("img", {
|
|
194
|
+
src: e.cover.downloadUrl,
|
|
195
195
|
alt: "",
|
|
196
196
|
className: "h-full w-full object-cover"
|
|
197
197
|
}) : /* @__PURE__ */ z("div", {
|