academe-kit 0.10.0 → 0.10.2

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.
@@ -26,9 +26,19 @@ export interface FrameRenderArgs {
26
26
  scale: number;
27
27
  layout: FrameLayout;
28
28
  progress?: number;
29
+ /** Frames que renderizam o próprio ícone (3D) recebem-no aqui. */
30
+ icon?: ReactNode;
31
+ /** Permite ao frame estilizar o ícone no estado bloqueado. */
32
+ isLocked?: boolean;
29
33
  }
30
34
  export interface FrameRenderer {
31
35
  kind: FrameKind;
36
+ /**
37
+ * Frames 3D (ex.: sphere) desenham profundidade (base/skirt + lift + squash)
38
+ * e renderizam o próprio ícone. Quando true, o JourneyStep adiciona a classe
39
+ * `is-3d`, repassa o ícone ao frame e não desenha o ícone padrão.
40
+ */
41
+ is3d?: boolean;
32
42
  layout: (scale: number) => FrameLayout;
33
43
  render: (args: FrameRenderArgs) => ReactNode;
34
44
  }
@@ -645,6 +645,73 @@ export declare function createReportService(apiClient: AcademeApiClient): {
645
645
  } | undefined;
646
646
  };
647
647
  }, `${string}/${string}`>>;
648
+ /**
649
+ * Status de jornada dos alunos para os summary cards da rota /students.
650
+ *
651
+ * @param id UUID da instituição.
652
+ * @param params.periodId UUID do bimestre, ou `"all"` para todos os bimestres
653
+ * do ano letivo. Omitido = bimestre corrente.
654
+ * @param params.challengeId UUID de UM challenge específico para restringir o
655
+ * cálculo dentro do recorte temporal.
656
+ */
657
+ getStudentsJourneyStatusByInstitution(id: string, params?: {
658
+ periodId?: string;
659
+ challengeId?: string;
660
+ }): Promise<import("openapi-fetch").FetchResponse<{
661
+ parameters: {
662
+ query?: {
663
+ periodId?: string;
664
+ challengeId?: string;
665
+ };
666
+ header?: never;
667
+ path: {
668
+ id: string;
669
+ };
670
+ cookie?: never;
671
+ };
672
+ requestBody?: never;
673
+ responses: {
674
+ 200: {
675
+ headers: {
676
+ [name: string]: unknown;
677
+ };
678
+ content: {
679
+ "application/json": {
680
+ status?: string;
681
+ data?: import("../types/academe-api").components["schemas"]["StudentsJourneyStatusResponse"];
682
+ };
683
+ };
684
+ };
685
+ 400: {
686
+ headers: {
687
+ [name: string]: unknown;
688
+ };
689
+ content?: never;
690
+ };
691
+ 401: {
692
+ headers: {
693
+ [name: string]: unknown;
694
+ };
695
+ content?: never;
696
+ };
697
+ 500: {
698
+ headers: {
699
+ [name: string]: unknown;
700
+ };
701
+ content?: never;
702
+ };
703
+ };
704
+ }, {
705
+ params: {
706
+ path: {
707
+ id: string;
708
+ };
709
+ query: {
710
+ periodId?: string;
711
+ challengeId?: string;
712
+ } | undefined;
713
+ };
714
+ }, `${string}/${string}`>>;
648
715
  };
649
716
  export type ReportService = ReturnType<typeof createReportService>;
650
717
  export {};
@@ -19,7 +19,11 @@ export declare function createSubmissionService(apiClient: AcademeApiClient): {
19
19
  userId?: string;
20
20
  groupId?: string;
21
21
  institutionId?: string;
22
+ institutionClassroomId?: string;
23
+ serieId?: string;
22
24
  status?: "submitted" | "ai_evaluated" | "approved" | "rejected";
25
+ search?: string;
26
+ periodId?: string;
23
27
  page?: import("../types/academe-api").components["parameters"]["page"];
24
28
  limit?: import("../types/academe-api").components["parameters"]["limit"];
25
29
  };
@@ -36,7 +40,13 @@ export declare function createSubmissionService(apiClient: AcademeApiClient): {
36
40
  content: {
37
41
  "application/json": {
38
42
  status?: string;
39
- data?: import("../types/academe-api").components["schemas"]["Submission"][];
43
+ data?: (import("../types/academe-api").components["schemas"]["Submission"] & {
44
+ period?: {
45
+ id?: string;
46
+ index?: number;
47
+ label?: string;
48
+ } | null;
49
+ })[];
40
50
  meta?: import("../types/academe-api").components["schemas"]["PaginationMeta"] & {
41
51
  statusCounts?: {
42
52
  submitted?: number;
@@ -44,6 +54,12 @@ export declare function createSubmissionService(apiClient: AcademeApiClient): {
44
54
  approved?: number;
45
55
  rejected?: number;
46
56
  };
57
+ periods?: {
58
+ id?: string;
59
+ index?: number;
60
+ label?: string;
61
+ isCurrent?: boolean;
62
+ }[];
47
63
  };
48
64
  };
49
65
  };
@@ -57,7 +73,11 @@ export declare function createSubmissionService(apiClient: AcademeApiClient): {
57
73
  userId?: string;
58
74
  groupId?: string;
59
75
  institutionId?: string;
76
+ institutionClassroomId?: string;
77
+ serieId?: string;
60
78
  status?: "submitted" | "ai_evaluated" | "approved" | "rejected";
79
+ search?: string;
80
+ periodId?: string;
61
81
  page?: import("../types/academe-api").components["parameters"]["page"];
62
82
  limit?: import("../types/academe-api").components["parameters"]["limit"];
63
83
  } | undefined;
@@ -0,0 +1,239 @@
1
+ import type { AcademeApiClient } from "./index";
2
+ import type { components } from "../types/academe-api";
3
+ export type JourneyStepView = components["schemas"]["JourneyStepView"];
4
+ export type JourneyChallengeView = components["schemas"]["JourneyChallengeView"];
5
+ export type JourneyView = components["schemas"]["JourneyView"];
6
+ /**
7
+ * Service do agregado `user-challenge-progress` — o caminho oficial para os
8
+ * clientes (web/mobile) montarem a jornada e o progresso do usuário. Espelha
9
+ * app-academe-v2/src/services/academe/user-progress.service.ts.
10
+ */
11
+ export declare function createUserProgressService(apiClient: AcademeApiClient): {
12
+ /**
13
+ * Jornada pré-computada do usuário (status, progress, color, icon,
14
+ * isUpcoming, série) — base de renderização direta da tela de jornada.
15
+ */
16
+ getJourney(serieId?: string): Promise<JourneyView>;
17
+ /**
18
+ * Visão step-by-step do progresso do usuário em um desafio. Cada step traz
19
+ * `myStartedAt`, `myCompletedAt` e (em desafios em grupo) os agregados do
20
+ * grupo.
21
+ */
22
+ getChallengeProgress(challengeId: string): Promise<import("openapi-fetch").FetchResponse<{
23
+ parameters: {
24
+ query?: never;
25
+ header?: never;
26
+ path: {
27
+ id: components["parameters"]["id"];
28
+ };
29
+ cookie?: never;
30
+ };
31
+ requestBody?: never;
32
+ responses: {
33
+ 200: {
34
+ headers: {
35
+ [name: string]: unknown;
36
+ };
37
+ content: {
38
+ "application/json": {
39
+ status?: string;
40
+ data?: {
41
+ challengeStepId?: string;
42
+ stepName?: string;
43
+ index?: number;
44
+ totalMembers?: number;
45
+ completedMembers?: number;
46
+ groupCompleted?: boolean;
47
+ myStartedAt?: string | null;
48
+ myCompletedAt?: string | null;
49
+ }[];
50
+ };
51
+ };
52
+ };
53
+ 401: components["responses"]["Unauthorized"];
54
+ 404: components["responses"]["NotFound"];
55
+ };
56
+ }, {
57
+ params: {
58
+ path: {
59
+ id: string;
60
+ };
61
+ };
62
+ }, `${string}/${string}`>>;
63
+ /**
64
+ * Avança um tick na jornada do usuário no desafio, agnóstico do tipo da
65
+ * etapa. Cada chamada executa UMA ação:
66
+ * - Sem progresso na etapa atual → action='started'
67
+ * - Etapa iniciada (sem completedAt) → action='completed'
68
+ * - Todas as etapas concluídas → action='finished' (no-op)
69
+ *
70
+ * Caminho oficial para clientes (web/mobile). Não usar os endpoints
71
+ * internos `/steps/{stepId}/start` ou `/steps/{stepId}/complete`.
72
+ */
73
+ advance(challengeId: string): Promise<import("openapi-fetch").FetchResponse<{
74
+ parameters: {
75
+ query?: never;
76
+ header?: never;
77
+ path: {
78
+ id: components["parameters"]["id"];
79
+ };
80
+ cookie?: never;
81
+ };
82
+ requestBody?: never;
83
+ responses: {
84
+ 200: {
85
+ headers: {
86
+ [name: string]: unknown;
87
+ };
88
+ content: {
89
+ "application/json": {
90
+ status?: string;
91
+ data?: {
92
+ action?: "started" | "completed" | "finished";
93
+ challengeId?: string;
94
+ currentStep?: {
95
+ id?: string;
96
+ index?: number;
97
+ name?: string;
98
+ startedAt?: string | null;
99
+ completedAt?: string | null;
100
+ } | null;
101
+ nextStep?: {
102
+ id?: string;
103
+ index?: number;
104
+ name?: string;
105
+ startedAt?: string | null;
106
+ } | null;
107
+ };
108
+ };
109
+ };
110
+ };
111
+ 401: components["responses"]["Unauthorized"];
112
+ 404: components["responses"]["NotFound"];
113
+ };
114
+ }, {
115
+ params: {
116
+ path: {
117
+ id: string;
118
+ };
119
+ };
120
+ }, `${string}/${string}`>>;
121
+ /**
122
+ * Status de conclusão do grupo numa etapa. Em desafios em grupo: retorna a
123
+ * agregação (`canAdvance=true` quando todos concluíram). Em desafios
124
+ * individuais: retorna o status do próprio usuário.
125
+ */
126
+ getStepGroupStatus(stepId: string): Promise<import("openapi-fetch").FetchResponse<{
127
+ parameters: {
128
+ query?: never;
129
+ header?: never;
130
+ path: {
131
+ stepId: string;
132
+ };
133
+ cookie?: never;
134
+ };
135
+ requestBody?: never;
136
+ responses: {
137
+ 200: {
138
+ headers: {
139
+ [name: string]: unknown;
140
+ };
141
+ content: {
142
+ "application/json": {
143
+ status?: string;
144
+ data?: {
145
+ isGroupChallenge?: boolean;
146
+ totalMembers?: number;
147
+ completedMembers?: number;
148
+ canAdvance?: boolean;
149
+ };
150
+ };
151
+ };
152
+ };
153
+ 401: components["responses"]["Unauthorized"];
154
+ 404: components["responses"]["NotFound"];
155
+ };
156
+ }, {
157
+ params: {
158
+ path: {
159
+ stepId: string;
160
+ };
161
+ };
162
+ }, `${string}/${string}`>>;
163
+ /**
164
+ * Progresso agregado do usuário em um módulo (ou no curso inteiro quando
165
+ * `moduleId` é omitido). Usado pelos steps do tipo `course` da jornada.
166
+ */
167
+ getCourseProgress(courseId: string, moduleId?: string | null): Promise<import("openapi-fetch").FetchResponse<{
168
+ parameters: {
169
+ query?: never;
170
+ header?: never;
171
+ path: {
172
+ courseId: string;
173
+ moduleId: string;
174
+ };
175
+ cookie?: never;
176
+ };
177
+ requestBody?: never;
178
+ responses: {
179
+ 200: {
180
+ headers: {
181
+ [name: string]: unknown;
182
+ };
183
+ content: {
184
+ "application/json": {
185
+ status?: string;
186
+ data?: components["schemas"]["UsersCourseLogProgress"];
187
+ };
188
+ };
189
+ };
190
+ 401: components["responses"]["Unauthorized"];
191
+ 404: components["responses"]["NotFound"];
192
+ };
193
+ }, {
194
+ params: {
195
+ path: {
196
+ courseId: string;
197
+ moduleId: string;
198
+ };
199
+ };
200
+ }, `${string}/${string}`>>;
201
+ /**
202
+ * [Interno] Força o início de uma etapa específica (idempotente). Clientes
203
+ * devem preferir `advance`; mantido para casos pontuais (ex.: iniciar a
204
+ * próxima etapa após concluir um curso aberto a partir da jornada).
205
+ */
206
+ start(stepId: string): Promise<import("openapi-fetch").FetchResponse<{
207
+ parameters: {
208
+ query?: never;
209
+ header?: never;
210
+ path: {
211
+ stepId: string;
212
+ };
213
+ cookie?: never;
214
+ };
215
+ requestBody?: never;
216
+ responses: {
217
+ 201: {
218
+ headers: {
219
+ [name: string]: unknown;
220
+ };
221
+ content: {
222
+ "application/json": {
223
+ status?: string;
224
+ data?: components["schemas"]["UserChallengeProgress"];
225
+ };
226
+ };
227
+ };
228
+ 401: components["responses"]["Unauthorized"];
229
+ 404: components["responses"]["NotFound"];
230
+ };
231
+ }, {
232
+ params: {
233
+ path: {
234
+ stepId: string;
235
+ };
236
+ };
237
+ }, `${string}/${string}`>>;
238
+ };
239
+ export type UserProgressService = ReturnType<typeof createUserProgressService>;
@@ -21,6 +21,7 @@ import { type StorageFileService } from './StorageFileService';
21
21
  import { type ChallengeService } from './ChallengeService';
22
22
  import { type StepService } from './StepService';
23
23
  import { type SubmissionService } from './SubmissionService';
24
+ import { type UserProgressService } from './UserProgressService';
24
25
  export type AcademeApiClient = ReturnType<typeof createClient<paths>>;
25
26
  export declare function createAcademeApiClient(baseUrl: string): AcademeApiClient;
26
27
  export interface AcademeServices {
@@ -45,6 +46,7 @@ export interface AcademeServices {
45
46
  challenge: ChallengeService;
46
47
  step: StepService;
47
48
  submission: SubmissionService;
49
+ userProgress: UserProgressService;
48
50
  }
49
51
  export declare function createAcademeServices(apiClient: AcademeApiClient): AcademeServices;
50
52
  export { createUserService, type UserService } from "./userService";
@@ -67,3 +69,4 @@ export { createStorageFileService, type StorageFileService } from './StorageFile
67
69
  export { createChallengeService, type ChallengeService } from './ChallengeService';
68
70
  export { createStepService, type StepService } from './StepService';
69
71
  export { createSubmissionService, type SubmissionService } from './SubmissionService';
72
+ export { createUserProgressService, type UserProgressService } from './UserProgressService';
@@ -10703,6 +10703,77 @@ export interface paths {
10703
10703
  patch?: never;
10704
10704
  trace?: never;
10705
10705
  };
10706
+ "/reports/students-journey-status/{id}": {
10707
+ parameters: {
10708
+ query?: never;
10709
+ header?: never;
10710
+ path?: never;
10711
+ cookie?: never;
10712
+ };
10713
+ /**
10714
+ * Status de jornada dos alunos por bimestre (cards de /students)
10715
+ * @description Recorta os alunos ativos da escola em 4 categorias mutuamente exclusivas
10716
+ * (notStarted, inJourney, inReview, completed) considerando os challenges
10717
+ * do bimestre alvo. Cada aluno cai na categoria mais avançada que alcançou.
10718
+ */
10719
+ get: {
10720
+ parameters: {
10721
+ query?: {
10722
+ /** @description UUID do educational_model_period, OU a string literal `"all"` para considerar todos os bimestres. Omitido = corrente. */
10723
+ periodId?: string;
10724
+ /** @description Quando presente, restringe o cálculo a UM challenge específico dentro do recorte temporal. */
10725
+ challengeId?: string;
10726
+ };
10727
+ header?: never;
10728
+ path: {
10729
+ /** @description UUID da instituição */
10730
+ id: string;
10731
+ };
10732
+ cookie?: never;
10733
+ };
10734
+ requestBody?: never;
10735
+ responses: {
10736
+ /** @description Status agregado */
10737
+ 200: {
10738
+ headers: {
10739
+ [name: string]: unknown;
10740
+ };
10741
+ content: {
10742
+ "application/json": {
10743
+ /** @example success */
10744
+ status?: string;
10745
+ data?: components["schemas"]["StudentsJourneyStatusResponse"];
10746
+ };
10747
+ };
10748
+ };
10749
+ 400: {
10750
+ headers: {
10751
+ [name: string]: unknown;
10752
+ };
10753
+ content?: never;
10754
+ };
10755
+ 401: {
10756
+ headers: {
10757
+ [name: string]: unknown;
10758
+ };
10759
+ content?: never;
10760
+ };
10761
+ 500: {
10762
+ headers: {
10763
+ [name: string]: unknown;
10764
+ };
10765
+ content?: never;
10766
+ };
10767
+ };
10768
+ };
10769
+ put?: never;
10770
+ post?: never;
10771
+ delete?: never;
10772
+ options?: never;
10773
+ head?: never;
10774
+ patch?: never;
10775
+ trace?: never;
10776
+ };
10706
10777
  "/roles": {
10707
10778
  parameters: {
10708
10779
  query?: never;
@@ -11687,7 +11758,13 @@ export interface paths {
11687
11758
  userId?: string;
11688
11759
  groupId?: string;
11689
11760
  institutionId?: string;
11761
+ institutionClassroomId?: string;
11762
+ serieId?: string;
11690
11763
  status?: "submitted" | "ai_evaluated" | "approved" | "rejected";
11764
+ /** @description Busca por nome ou e-mail do aluno */
11765
+ search?: string;
11766
+ /** @description UUID de um educational_model_period. Recorta as submissões cuja data de envio (submittedAt) cai no intervalo [start, end] do período. Omitido = todos os períodos. */
11767
+ periodId?: string;
11691
11768
  /** @description Page number */
11692
11769
  page?: components["parameters"]["page"];
11693
11770
  /** @description Items per page */
@@ -11708,7 +11785,16 @@ export interface paths {
11708
11785
  "application/json": {
11709
11786
  /** @example success */
11710
11787
  status?: string;
11711
- data?: components["schemas"]["Submission"][];
11788
+ data?: (components["schemas"]["Submission"] & {
11789
+ /** @description Período letivo cujo intervalo contém a data de envio (submittedAt). Null quando a escola não tem períodos ou o envio caiu fora de qualquer período. */
11790
+ period?: {
11791
+ id?: string;
11792
+ /** @description 0-based (0 = 1º período) */
11793
+ index?: number;
11794
+ /** @example 1º Bimestre */
11795
+ label?: string;
11796
+ } | null;
11797
+ })[];
11712
11798
  meta?: components["schemas"]["PaginationMeta"] & {
11713
11799
  /**
11714
11800
  * @description Contagem por status, ignorando o filtro `status`. Útil para
@@ -11724,6 +11810,14 @@ export interface paths {
11724
11810
  /** @example 2 */
11725
11811
  rejected?: number;
11726
11812
  };
11813
+ /** @description Períodos letivos da escola (ORDER BY start ASC) para o dropdown de filtro. */
11814
+ periods?: {
11815
+ id?: string;
11816
+ index?: number;
11817
+ /** @example 1º Bimestre */
11818
+ label?: string;
11819
+ isCurrent?: boolean;
11820
+ }[];
11727
11821
  };
11728
11822
  };
11729
11823
  };
@@ -14672,6 +14766,9 @@ export interface components {
14672
14766
  createdAt: string;
14673
14767
  /** Format: date-time */
14674
14768
  updatedAt: string;
14769
+ organization?: components["schemas"]["Organization"] | null;
14770
+ address?: components["schemas"]["Address"] | null;
14771
+ institutionReward?: Record<string, never> | null;
14675
14772
  };
14676
14773
  Organization: {
14677
14774
  /** Format: uuid */
@@ -16464,10 +16561,36 @@ export interface components {
16464
16561
  courses?: components["schemas"]["EncourageJourneyCourse"][];
16465
16562
  };
16466
16563
  EncourageSubmissions: {
16564
+ /** @description Total de alunos ativos da escola (denominador para % concluído) */
16467
16565
  total?: number;
16468
- evaluated?: number;
16566
+ /** @description Última submissão por (aluno, challenge do bimestre corrente) com teacher_score preenchido */
16567
+ finalized?: number;
16568
+ /** @description Última submissão por (aluno, challenge do bimestre corrente) ainda SEM teacher_score */
16469
16569
  awaitingTeacher?: number;
16470
- awaitingAi?: number;
16570
+ };
16571
+ StudentsJourneyStatusSummary: {
16572
+ /** @description Alunos sem step concluído nos challenges do recorte */
16573
+ notStarted?: number;
16574
+ /** @description Tem step concluído mas sem submissão */
16575
+ inJourney?: number;
16576
+ /** @description Submissão pendente de avaliação (teacher_score nulo) */
16577
+ inReview?: number;
16578
+ /** @description Submissão já avaliada (teacher_score preenchido) */
16579
+ completed?: number;
16580
+ };
16581
+ StudentsJourneyStatusScope: {
16582
+ /** @description UUID do bimestre alvo; null quando allPeriods */
16583
+ periodId?: string | null;
16584
+ /** @description UUID do challenge alvo; null quando todos do recorte */
16585
+ challengeId?: string | null;
16586
+ /** @description Quantidade de challenges no recorte */
16587
+ challengesCount?: number;
16588
+ /** @description Total de alunos ativos da escola — fecha com a soma dos 4 status */
16589
+ totalStudents?: number;
16590
+ };
16591
+ StudentsJourneyStatusResponse: {
16592
+ summary?: components["schemas"]["StudentsJourneyStatusSummary"];
16593
+ scope?: components["schemas"]["StudentsJourneyStatusScope"];
16471
16594
  };
16472
16595
  EncourageClassPerformance: {
16473
16596
  /** Format: uuid */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "academe-kit",
3
- "version": "0.10.0",
3
+ "version": "0.10.2",
4
4
  "type": "module",
5
5
  "description": "Official React SDK for Academe ecosystem - Authentication, protected routes, API services, and UI components for educational management applications",
6
6
  "main": "dist/index.cjs",