academe-kit 0.9.8 → 0.10.0

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/index.d.ts CHANGED
@@ -2880,6 +2880,91 @@ interface paths {
2880
2880
  };
2881
2881
  trace?: never;
2882
2882
  };
2883
+ "/challenges/{id}/quiz-attempts": {
2884
+ parameters: {
2885
+ query?: never;
2886
+ header?: never;
2887
+ path?: never;
2888
+ cookie?: never;
2889
+ };
2890
+ /**
2891
+ * Get a user's quiz attempts for this challenge's course modules
2892
+ * @description Returns the quiz attempts of `userId` on every quiz attached to a course
2893
+ * module that is referenced by one of this challenge's steps. Optionally
2894
+ * includes the issued certificate per attempt.
2895
+ *
2896
+ * Each entry corresponds to a `challenges_steps` row that has a non-null
2897
+ * `course_module_id` whose `course_module.quiz_id` is also non-null.
2898
+ * `attempt` is `null` when the user has not yet attempted that quiz.
2899
+ */
2900
+ get: {
2901
+ parameters: {
2902
+ query?: {
2903
+ /** @description Defaults to the authenticated user when omitted. */
2904
+ userId?: string;
2905
+ };
2906
+ header?: never;
2907
+ path: {
2908
+ /** @description Resource ID */
2909
+ id: components["parameters"]["id"];
2910
+ };
2911
+ cookie?: never;
2912
+ };
2913
+ requestBody?: never;
2914
+ responses: {
2915
+ /** @description List of quiz attempts (one per quiz-bearing challenge step) */
2916
+ 200: {
2917
+ headers: {
2918
+ [name: string]: unknown;
2919
+ };
2920
+ content: {
2921
+ "application/json": {
2922
+ /** @example success */
2923
+ status?: string;
2924
+ data?: {
2925
+ /** Format: uuid */
2926
+ challengeStepId?: string;
2927
+ challengeStepName?: string;
2928
+ challengeStepIndex?: number;
2929
+ /** Format: uuid */
2930
+ courseModuleId?: string;
2931
+ courseModuleTitle?: string;
2932
+ /** Format: uuid */
2933
+ quizId?: string;
2934
+ quizTitle?: string;
2935
+ attempt?: {
2936
+ /** Format: uuid */
2937
+ id?: string;
2938
+ score?: number;
2939
+ passed?: boolean;
2940
+ /** Format: date-time */
2941
+ startedAt?: string;
2942
+ /** Format: date-time */
2943
+ completedAt?: string | null;
2944
+ } | null;
2945
+ certificate?: {
2946
+ /** Format: uuid */
2947
+ id?: string;
2948
+ certificateNumber?: string;
2949
+ url?: string | null;
2950
+ } | null;
2951
+ }[];
2952
+ };
2953
+ };
2954
+ };
2955
+ 400: components["responses"]["BadRequest"];
2956
+ 401: components["responses"]["Unauthorized"];
2957
+ 404: components["responses"]["NotFound"];
2958
+ };
2959
+ };
2960
+ put?: never;
2961
+ post?: never;
2962
+ delete?: never;
2963
+ options?: never;
2964
+ head?: never;
2965
+ patch?: never;
2966
+ trace?: never;
2967
+ };
2883
2968
  "/classrooms": {
2884
2969
  parameters: {
2885
2970
  query?: never;
@@ -10649,7 +10734,12 @@ interface paths {
10649
10734
  */
10650
10735
  get: {
10651
10736
  parameters: {
10652
- query?: never;
10737
+ query?: {
10738
+ /** @description UUID do educational_model_period. Quando omitido, o backend resolve para o período corrente (NOW). Ignorado quando allPeriods=true. */
10739
+ periodId?: string;
10740
+ /** @description Quando 'true', desliga o recorte por período em Jornada/Classes/TopTeachers — passa a refletir o ano letivo inteiro. SubmissionsCard continua sempre no bimestre corrente. */
10741
+ allPeriods?: "true";
10742
+ };
10653
10743
  header?: never;
10654
10744
  path: {
10655
10745
  /** @description ID da instituição */
@@ -11709,7 +11799,22 @@ interface paths {
11709
11799
  /** @example success */
11710
11800
  status?: string;
11711
11801
  data?: components["schemas"]["Submission"][];
11712
- meta?: components["schemas"]["PaginationMeta"];
11802
+ meta?: components["schemas"]["PaginationMeta"] & {
11803
+ /**
11804
+ * @description Contagem por status, ignorando o filtro `status`. Útil para
11805
+ * alimentar abas/pills sem requisições adicionais.
11806
+ */
11807
+ statusCounts?: {
11808
+ /** @example 12 */
11809
+ submitted?: number;
11810
+ /** @example 4 */
11811
+ ai_evaluated?: number;
11812
+ /** @example 30 */
11813
+ approved?: number;
11814
+ /** @example 2 */
11815
+ rejected?: number;
11816
+ };
11817
+ };
11713
11818
  };
11714
11819
  };
11715
11820
  };
@@ -12371,6 +12476,128 @@ interface paths {
12371
12476
  patch?: never;
12372
12477
  trace?: never;
12373
12478
  };
12479
+ "/user-challenge-progress/journey": {
12480
+ parameters: {
12481
+ query?: never;
12482
+ header?: never;
12483
+ path?: never;
12484
+ cookie?: never;
12485
+ };
12486
+ /**
12487
+ * Jornada completa pré-computada do aluno autenticado
12488
+ * @description Retorna todos os desafios da série com suas etapas e o status de progresso do aluno
12489
+ * já computados pelo backend. Substitui as ~25 chamadas HTTP paralelas que o frontend
12490
+ * fazia anteriormente para montar a tela de jornada.
12491
+ *
12492
+ * **Regra de prioridade:** para cada `index` de desafio dentro da série, o backend
12493
+ * prefere o challenge específico da instituição do aluno sobre o template global
12494
+ * (`institution_id IS NULL`). Isso permite que escolas customizem desafios pontuais
12495
+ * sem recriar toda a jornada.
12496
+ *
12497
+ * **Resolução da série:** se `serieId` não for informado, o backend resolve
12498
+ * automaticamente a partir da turma (`institutionClassroom`) do aluno. Se o aluno
12499
+ * não estiver em nenhuma turma e `serieId` também não for passado, retorna
12500
+ * `challenges: []` com `serieId: null`.
12501
+ *
12502
+ * **Status por etapa:** `done` = completedAt preenchido; `current` = primeira etapa
12503
+ * não concluída (apenas uma por vez); `locked` = todas as demais.
12504
+ *
12505
+ * **Progresso:** para etapas `type=course` no status `current`, o campo `progress`
12506
+ * reflete o percentual de lições concluídas no módulo. Para `done` é sempre 100,
12507
+ * para `locked` é sempre 0.
12508
+ */
12509
+ get: {
12510
+ parameters: {
12511
+ query?: {
12512
+ /**
12513
+ * @description ID da série a filtrar. Opcional — se omitido, o backend resolve pela turma do aluno.
12514
+ * Útil para pré-visualização administrativa ou quando o aluno pertence a múltiplas séries.
12515
+ */
12516
+ serieId?: string;
12517
+ };
12518
+ header?: never;
12519
+ path?: never;
12520
+ cookie?: never;
12521
+ };
12522
+ requestBody?: never;
12523
+ responses: {
12524
+ /** @description Jornada pré-computada com desafios e etapas */
12525
+ 200: {
12526
+ headers: {
12527
+ [name: string]: unknown;
12528
+ };
12529
+ content: {
12530
+ /**
12531
+ * @example {
12532
+ * "status": "success",
12533
+ * "data": {
12534
+ * "serieId": "a1b2c3d4-0000-0000-0000-000000000001",
12535
+ * "serieLabel": "6º ANO",
12536
+ * "challenges": [
12537
+ * {
12538
+ * "id": "a1b2c3d4-0000-0000-0000-000000000002",
12539
+ * "title": "Desafio 1 — Energia Limpa",
12540
+ * "index": 0,
12541
+ * "courseId": "a1b2c3d4-0000-0000-0000-000000000003",
12542
+ * "isUpcoming": false,
12543
+ * "steps": [
12544
+ * {
12545
+ * "id": "a1b2c3d4-0000-0000-0000-000000000010",
12546
+ * "name": "Inicie o desafio",
12547
+ * "index": 0,
12548
+ * "type": "challenge",
12549
+ * "color": "#1AC84A",
12550
+ * "icon": "LuStar",
12551
+ * "status": "done",
12552
+ * "progress": 100,
12553
+ * "courseModuleId": null,
12554
+ * "courseModuleName": null
12555
+ * },
12556
+ * {
12557
+ * "id": "a1b2c3d4-0000-0000-0000-000000000011",
12558
+ * "name": "Módulo de IA",
12559
+ * "index": 1,
12560
+ * "type": "course",
12561
+ * "color": "#8030D8",
12562
+ * "icon": "LuCirclePlay",
12563
+ * "status": "current",
12564
+ * "progress": 67,
12565
+ * "courseModuleId": "a1b2c3d4-0000-0000-0000-000000000020",
12566
+ * "courseModuleName": "Introdução a IA"
12567
+ * }
12568
+ * ]
12569
+ * }
12570
+ * ]
12571
+ * }
12572
+ * }
12573
+ */
12574
+ "application/json": {
12575
+ /** @example success */
12576
+ status?: string;
12577
+ data?: components["schemas"]["JourneyView"];
12578
+ };
12579
+ };
12580
+ };
12581
+ /** @description serieId inválido (não é um UUID) */
12582
+ 400: {
12583
+ headers: {
12584
+ [name: string]: unknown;
12585
+ };
12586
+ content: {
12587
+ "application/json": components["schemas"]["Error"];
12588
+ };
12589
+ };
12590
+ 401: components["responses"]["Unauthorized"];
12591
+ };
12592
+ };
12593
+ put?: never;
12594
+ post?: never;
12595
+ delete?: never;
12596
+ options?: never;
12597
+ head?: never;
12598
+ patch?: never;
12599
+ trace?: never;
12600
+ };
12374
12601
  "/user-challenge-progress/challenges/{id}/advance": {
12375
12602
  parameters: {
12376
12603
  query?: never;
@@ -15235,6 +15462,99 @@ interface components {
15235
15462
  /** Format: date-time */
15236
15463
  updatedAt?: string;
15237
15464
  };
15465
+ /** @description Etapa de um desafio com status computado pelo backend */
15466
+ JourneyStepView: {
15467
+ /**
15468
+ * Format: uuid
15469
+ * @description ID do challenge_step
15470
+ */
15471
+ id: string;
15472
+ /** @example Módulo de IA */
15473
+ name: string;
15474
+ /**
15475
+ * @description Ordem da etapa dentro do desafio
15476
+ * @example 1
15477
+ */
15478
+ index: number;
15479
+ /**
15480
+ * @description Tipo da etapa (do catálogo de steps)
15481
+ * @example course
15482
+ * @enum {string}
15483
+ */
15484
+ type: "challenge" | "course" | "tutorial" | "publication" | "evaluation" | "certificate";
15485
+ /**
15486
+ * @description Cor hex do step catalog
15487
+ * @example #8030D8
15488
+ */
15489
+ color: string;
15490
+ /**
15491
+ * @description Nome do ícone Lucide do step catalog
15492
+ * @example LuCirclePlay
15493
+ */
15494
+ icon: string;
15495
+ /**
15496
+ * @description Status computado pelo backend: done=concluído, current=etapa ativa, locked=ainda bloqueado
15497
+ * @example current
15498
+ * @enum {string}
15499
+ */
15500
+ status: "done" | "current" | "locked";
15501
+ /**
15502
+ * @description Percentual de progresso (0-100). Para done=100, para locked=0, para current=% do curso ou 0
15503
+ * @example 67
15504
+ */
15505
+ progress: number;
15506
+ /**
15507
+ * Format: uuid
15508
+ * @description ID do módulo do curso referenciado por esta etapa (apenas quando type=course)
15509
+ */
15510
+ courseModuleId?: string | null;
15511
+ /**
15512
+ * @description Título do módulo do curso (apenas quando courseModuleId não é null)
15513
+ * @example Introdução a IA
15514
+ */
15515
+ courseModuleName?: string | null;
15516
+ };
15517
+ /** @description Desafio da jornada com suas etapas e status computados */
15518
+ JourneyChallengeView: {
15519
+ /**
15520
+ * Format: uuid
15521
+ * @description ID do challenge
15522
+ */
15523
+ id: string;
15524
+ /** @example Desafio 1 — Energia Limpa */
15525
+ title: string;
15526
+ /**
15527
+ * @description Ordem do desafio na série
15528
+ * @example 0
15529
+ */
15530
+ index: number;
15531
+ /**
15532
+ * Format: uuid
15533
+ * @description Curso ao qual o desafio está associado
15534
+ */
15535
+ courseId: string;
15536
+ /**
15537
+ * @description True quando o desafio ainda não está disponível para o aluno (challenge seguinte ao ativo com steps pendentes)
15538
+ * @example false
15539
+ */
15540
+ isUpcoming: boolean;
15541
+ steps: components["schemas"]["JourneyStepView"][];
15542
+ };
15543
+ /** @description Resposta completa do endpoint GET /user-challenge-progress/journey — dados pré-computados para renderização direta da tela de jornada */
15544
+ JourneyView: {
15545
+ /** @description Desafios da jornada ordenados por index, com prioridade escola > template aplicada */
15546
+ challenges: components["schemas"]["JourneyChallengeView"][];
15547
+ /**
15548
+ * Format: uuid
15549
+ * @description ID da série resolvida (da turma do aluno, ou do query param serieId)
15550
+ */
15551
+ serieId: string | null;
15552
+ /**
15553
+ * @description Rótulo legível da série para exibição na UI
15554
+ * @example 6º ANO
15555
+ */
15556
+ serieLabel: string | null;
15557
+ };
15238
15558
  /** @description Aggregated progress of a user on a course or module, derived from users_course_log completion events */
15239
15559
  UsersCourseLogProgress: {
15240
15560
  /**
@@ -19878,6 +20198,81 @@ declare function createReportService(apiClient: AcademeApiClient): {
19878
20198
  query: GetTopStudentsParams;
19879
20199
  };
19880
20200
  }, `${string}/${string}`>>;
20201
+ /**
20202
+ * Get encourage dashboard for an institution
20203
+ * Retorna o payload agregado da tela /new-dashboard:
20204
+ * overview (com lista de períodos do ano letivo + flag isAllPeriods),
20205
+ * KPIs, licenças (alunos), jornada (cursos do bimestre selecionado ou do
20206
+ * ano letivo quando allPeriods), submissões do bimestre corrente,
20207
+ * desempenho por turma, top alunos e top professores do bimestre.
20208
+ *
20209
+ * @param id UUID da instituição.
20210
+ * @param params.periodId UUID do educational_model_period. Quando omitido,
20211
+ * o backend resolve para o período corrente (NOW).
20212
+ * Ignorado quando allPeriods=true.
20213
+ * @param params.allPeriods Quando true, desliga o recorte por período em
20214
+ * Jornada/Classes/TopTeachers — passa a refletir
20215
+ * o ano letivo inteiro. SubmissionsCard continua
20216
+ * sempre no bimestre corrente.
20217
+ */
20218
+ getEncourageDashboardByInstitution(id: string, params?: {
20219
+ periodId?: string;
20220
+ allPeriods?: boolean;
20221
+ }): Promise<openapi_fetch.FetchResponse<{
20222
+ parameters: {
20223
+ query?: {
20224
+ periodId?: string;
20225
+ allPeriods?: "true";
20226
+ };
20227
+ header?: never;
20228
+ path: {
20229
+ id: string;
20230
+ };
20231
+ cookie?: never;
20232
+ };
20233
+ requestBody?: never;
20234
+ responses: {
20235
+ 200: {
20236
+ headers: {
20237
+ [name: string]: unknown;
20238
+ };
20239
+ content: {
20240
+ "application/json": {
20241
+ status?: string;
20242
+ data?: components["schemas"]["EncourageDashboardResponse"];
20243
+ };
20244
+ };
20245
+ };
20246
+ 400: {
20247
+ headers: {
20248
+ [name: string]: unknown;
20249
+ };
20250
+ content?: never;
20251
+ };
20252
+ 401: {
20253
+ headers: {
20254
+ [name: string]: unknown;
20255
+ };
20256
+ content?: never;
20257
+ };
20258
+ 500: {
20259
+ headers: {
20260
+ [name: string]: unknown;
20261
+ };
20262
+ content?: never;
20263
+ };
20264
+ };
20265
+ }, {
20266
+ params: {
20267
+ path: {
20268
+ id: string;
20269
+ };
20270
+ query: {
20271
+ periodId?: string;
20272
+ allPeriods?: "true";
20273
+ } | undefined;
20274
+ };
20275
+ }, `${string}/${string}`>>;
19881
20276
  };
19882
20277
  type ReportService = ReturnType<typeof createReportService>;
19883
20278
 
@@ -24814,6 +25209,35 @@ interface UpdateEvaluationCriterionBody {
24814
25209
  description?: string;
24815
25210
  index?: number;
24816
25211
  }
25212
+ interface ChallengeUserQuizAttempt {
25213
+ challengeStepId: string;
25214
+ challengeStepName: string;
25215
+ challengeStepIndex: number;
25216
+ courseModuleId: string;
25217
+ courseModuleTitle: string;
25218
+ quizId: string;
25219
+ quizTitle: string;
25220
+ attempt: {
25221
+ id: string;
25222
+ score: number;
25223
+ passed: boolean;
25224
+ startedAt: string;
25225
+ completedAt: string | null;
25226
+ } | null;
25227
+ certificate: {
25228
+ id: string;
25229
+ certificateNumber: string;
25230
+ url: string | null;
25231
+ } | null;
25232
+ }
25233
+ interface ChallengeUserQuizAttemptsResponse {
25234
+ data?: {
25235
+ status?: string;
25236
+ data?: ChallengeUserQuizAttempt[];
25237
+ };
25238
+ error?: unknown;
25239
+ response: Response;
25240
+ }
24817
25241
  declare function createChallengeService(apiClient: AcademeApiClient): {
24818
25242
  /**
24819
25243
  * List challenges with filters and pagination
@@ -25125,6 +25549,12 @@ declare function createChallengeService(apiClient: AcademeApiClient): {
25125
25549
  title?: string;
25126
25550
  };
25127
25551
  }, `${string}/${string}`>>;
25552
+ /**
25553
+ * Get a user's quiz attempts for the quizzes attached to this challenge's
25554
+ * course modules (one entry per step with course_module.quiz_id).
25555
+ * Defaults to the authenticated user when userId is omitted.
25556
+ */
25557
+ getUserQuizAttempts(challengeId: string, userId?: string): Promise<ChallengeUserQuizAttemptsResponse>;
25128
25558
  /**
25129
25559
  * Add a step to the challenge
25130
25560
  */
@@ -25785,7 +26215,14 @@ declare function createSubmissionService(apiClient: AcademeApiClient): {
25785
26215
  "application/json": {
25786
26216
  status?: string;
25787
26217
  data?: components["schemas"]["Submission"][];
25788
- meta?: components["schemas"]["PaginationMeta"];
26218
+ meta?: components["schemas"]["PaginationMeta"] & {
26219
+ statusCounts?: {
26220
+ submitted?: number;
26221
+ ai_evaluated?: number;
26222
+ approved?: number;
26223
+ rejected?: number;
26224
+ };
26225
+ };
25789
26226
  };
25790
26227
  };
25791
26228
  };
@@ -26215,4 +26652,4 @@ declare enum NINA_ROLES {
26215
26652
  }
26216
26653
 
26217
26654
  export { AcademeAuthProvider, BACKOFFICE_ROLES, Button, CosmicDecor, CosmicStarsCanvas, DASHBOARD_ROLES, GLOBAL_ROLES, JourneyCrystalPin, JourneyStep, MIKE_ROLES, NINA_ROLES, ProtectedApp, ProtectedComponent, ProtectedRouter, STREAMING_ROLES, Spinner, WIDGET_ROLES, academeApi_d as apiTypes, cn, createAcademeApiClient, index_d as types, useAcademeAuth, useProtectedAppColors };
26218
- export type { AcademeApiClient, AcademeKeycloakContextProps, AcademeServices, AcademeUser, ButtonProps, CosmicDecorProps, CosmicDecorVariant, CosmicPlanet, CosmicStarsCanvasProps, FrameKind, JourneyCrystalPinProps, JourneyStepProps, JourneyStepSize, JourneyStepType, KeycloakUser, RequiredClientRoles, SecurityContextType, SecurityProviderProps };
26655
+ export type { AcademeApiClient, AcademeKeycloakContextProps, AcademeServices, AcademeUser, ButtonProps, ChallengeUserQuizAttempt, ChallengeUserQuizAttemptsResponse, CosmicDecorProps, CosmicDecorVariant, CosmicPlanet, CosmicStarsCanvasProps, FrameKind, JourneyCrystalPinProps, JourneyStepProps, JourneyStepSize, JourneyStepType, KeycloakUser, RequiredClientRoles, SecurityContextType, SecurityProviderProps };