academe-kit 0.11.4 → 0.11.6

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.
@@ -27,6 +27,8 @@ export interface AcademeLoadingColors {
27
27
  /** Círculo branco ("face"). */
28
28
  white: string;
29
29
  }
30
+ /** Tema visual da vinheta. `light` (default) preserva o fundo claro atual; `dark` usa o fundo escuro da marca. */
31
+ export type AcademeLoadingTheme = "light" | "dark";
30
32
  export interface AcademeLoadingProps {
31
33
  /** Lado do palco quadrado, em px. Default 320. */
32
34
  size?: number;
@@ -43,9 +45,14 @@ export interface AcademeLoadingProps {
43
45
  pulseWhileLoading?: boolean;
44
46
  /** Chamado ao concluir (após a saída, ou após a vinheta completa). */
45
47
  onFinish?: () => void;
46
- /** Sobrescreve tokens de cor (merge com os defaults medidos do vídeo). */
48
+ /**
49
+ * Tema visual base. `light` (default) mantém o fundo claro atual; `dark` aplica
50
+ * a paleta escura da marca. O `colors` ainda sobrescreve qualquer token por cima.
51
+ */
52
+ theme?: AcademeLoadingTheme;
53
+ /** Sobrescreve tokens de cor (merge com os defaults do tema selecionado). */
47
54
  colors?: Partial<AcademeLoadingColors>;
48
55
  className?: string;
49
56
  style?: React.CSSProperties;
50
57
  }
51
- export declare function AcademeLoading({ size, duration, loading, autoPlay, pulseWhileLoading, onFinish, colors, className, style, }: AcademeLoadingProps): import("react/jsx-runtime").JSX.Element;
58
+ export declare function AcademeLoading({ size, duration, loading, autoPlay, pulseWhileLoading, onFinish, theme, colors, className, style, }: AcademeLoadingProps): import("react/jsx-runtime").JSX.Element;
@@ -1,3 +1,6 @@
1
+ /** Proporção (largura/altura) do asset. O AcademeLoading usa para dimensionar o
2
+ * container do logo igual à imagem e mantê-lo centralizado nos círculos. */
3
+ export declare const LOGO_A_ASPECT: number;
1
4
  export interface LogoAProps {
2
5
  /** Altura do logo em px (no palco corresponde a ~0.46·S). Largura é derivada
3
6
  * da proporção original do asset (1320×1320.42). */
@@ -1,4 +1,4 @@
1
1
  export { AcademeLoading } from "./AcademeLoading";
2
- export type { AcademeLoadingProps, AcademeLoadingColors, } from "./AcademeLoading";
2
+ export type { AcademeLoadingProps, AcademeLoadingColors, AcademeLoadingTheme, } from "./AcademeLoading";
3
3
  export { LogoA } from "./LogoA";
4
4
  export type { LogoAProps } from "./LogoA";
@@ -12,7 +12,7 @@ export type { CosmicStarsCanvasProps } from "./components/CosmicStarsCanvas";
12
12
  export { JourneyStep, JourneyCrystalPin } from "./components/JourneyStep";
13
13
  export type { JourneyStepProps, JourneyStepSize, JourneyStepType, JourneyCrystalPinProps, FrameKind, } from "./components/JourneyStep";
14
14
  export { AcademeLoading, LogoA } from "./components/AcademeLoading";
15
- export type { AcademeLoadingProps, AcademeLoadingColors, LogoAProps, } from "./components/AcademeLoading";
15
+ export type { AcademeLoadingProps, AcademeLoadingColors, AcademeLoadingTheme, LogoAProps, } from "./components/AcademeLoading";
16
16
  export { AcademeAuthProvider, useAcademeAuth, } from "./context/SecurityProvider";
17
17
  export { useProtectedAppColors } from "./components/ProtectedApp";
18
18
  export type { AcademeKeycloakContextProps, SecurityProviderProps, KeycloakUser, SecurityContextType, AcademeUser, } from "./context/SecurityProvider/types";
@@ -129,6 +129,11 @@ export declare function createSubmissionService(apiClient: AcademeApiClient): {
129
129
  institutionId: string;
130
130
  groupId?: string;
131
131
  description?: string;
132
+ items?: {
133
+ fileId?: string | null;
134
+ url?: string | null;
135
+ index?: number;
136
+ }[];
132
137
  };
133
138
  };
134
139
  };
@@ -141,6 +146,30 @@ export declare function createSubmissionService(apiClient: AcademeApiClient): {
141
146
  "application/json": {
142
147
  status?: string;
143
148
  data?: import("../types/academe-api").components["schemas"]["Submission"];
149
+ meta?: {
150
+ advance?: {
151
+ action?: "started" | "completed" | "finished";
152
+ challengeId?: string;
153
+ currentStep?: {
154
+ id?: string;
155
+ index?: number;
156
+ name?: string;
157
+ startedAt?: string | null;
158
+ completedAt?: string | null;
159
+ } | null;
160
+ nextStep?: {
161
+ id?: string;
162
+ index?: number;
163
+ name?: string;
164
+ startedAt?: string | null;
165
+ } | null;
166
+ autoCompletedSteps?: {
167
+ id?: string;
168
+ index?: number;
169
+ name?: string;
170
+ }[];
171
+ } | null;
172
+ };
144
173
  };
145
174
  };
146
175
  };
@@ -2875,6 +2875,94 @@ export interface paths {
2875
2875
  patch?: never;
2876
2876
  trace?: never;
2877
2877
  };
2878
+ "/challenges/{id}/participants": {
2879
+ parameters: {
2880
+ query?: never;
2881
+ header?: never;
2882
+ path?: never;
2883
+ cookie?: never;
2884
+ };
2885
+ /**
2886
+ * List the students taking part in this challenge
2887
+ * @description Returns the roster of students for the challenge along with each
2888
+ * student's status, derived from `submissions` (latest attempt) and
2889
+ * `user_challenge_progress` (whether any step was started).
2890
+ *
2891
+ * The roster is built from `institution_registration` rows of the given
2892
+ * institution, filtered by the challenge's serie. `institutionId` and
2893
+ * `serieId` may be supplied via query to provide the viewing context —
2894
+ * useful for global template challenges (`institution_id IS NULL`) shown
2895
+ * via fallback in the pedagogical portal. They default to the
2896
+ * challenge's own institution/serie when omitted.
2897
+ *
2898
+ * Status values: `novo` (not started), `andamento` (started a step, no
2899
+ * submission), `entregue` (submitted | ai_evaluated), `aprovado`
2900
+ * (approved), `rejeitado` (rejected).
2901
+ */
2902
+ get: {
2903
+ parameters: {
2904
+ query?: {
2905
+ /** @description Viewing institution. Defaults to the challenge's institution. */
2906
+ institutionId?: string;
2907
+ /** @description Serie filter. Defaults to the challenge's serie. */
2908
+ serieId?: string;
2909
+ };
2910
+ header?: never;
2911
+ path: {
2912
+ /** @description Resource ID */
2913
+ id: components["parameters"]["id"];
2914
+ };
2915
+ cookie?: never;
2916
+ };
2917
+ requestBody?: never;
2918
+ responses: {
2919
+ /** @description Roster of participants with derived status */
2920
+ 200: {
2921
+ headers: {
2922
+ [name: string]: unknown;
2923
+ };
2924
+ content: {
2925
+ "application/json": {
2926
+ /** @example success */
2927
+ status?: string;
2928
+ data?: {
2929
+ totalStudents?: number;
2930
+ classrooms?: {
2931
+ /** Format: uuid */
2932
+ id?: string;
2933
+ name?: string;
2934
+ count?: number;
2935
+ }[];
2936
+ participants?: {
2937
+ /** Format: uuid */
2938
+ userId?: string;
2939
+ name?: string;
2940
+ email?: string | null;
2941
+ avatarUrl?: string | null;
2942
+ /** Format: uuid */
2943
+ classroomId?: string | null;
2944
+ classroomName?: string | null;
2945
+ /** @enum {string} */
2946
+ status?: "novo" | "andamento" | "entregue" | "aprovado" | "rejeitado";
2947
+ /** Format: uuid */
2948
+ submissionId?: string | null;
2949
+ }[];
2950
+ };
2951
+ };
2952
+ };
2953
+ };
2954
+ 401: components["responses"]["Unauthorized"];
2955
+ 404: components["responses"]["NotFound"];
2956
+ };
2957
+ };
2958
+ put?: never;
2959
+ post?: never;
2960
+ delete?: never;
2961
+ options?: never;
2962
+ head?: never;
2963
+ patch?: never;
2964
+ trace?: never;
2965
+ };
2878
2966
  "/classrooms": {
2879
2967
  parameters: {
2880
2968
  query?: never;
@@ -11822,6 +11910,12 @@ export interface paths {
11822
11910
  * - Cannot create after status=approved
11823
11911
  * - Cannot exceed challenge.maxSubmissionsAttempts
11824
11912
  * - attempt_number is computed server-side with a row lock (FOR UPDATE)
11913
+ *
11914
+ * When `items` is provided, the submission and its files/links are persisted
11915
+ * in the SAME transaction (atomic) and AI evaluation is dispatched after commit.
11916
+ * Each item must have exactly ONE of fileId or url, and must match the
11917
+ * challenge.submissionType (file types require fileId; links require url).
11918
+ * This is the preferred path for clients (no separate POST /submissions/{id}/files).
11825
11919
  */
11826
11920
  post: {
11827
11921
  parameters: {
@@ -11846,6 +11940,17 @@ export interface paths {
11846
11940
  */
11847
11941
  groupId?: string;
11848
11942
  description?: string;
11943
+ /**
11944
+ * @description Submission delivery. When present, files/links are stored atomically
11945
+ * with the submission and AI evaluation is dispatched after commit.
11946
+ */
11947
+ items?: {
11948
+ /** Format: uuid */
11949
+ fileId?: string | null;
11950
+ /** Format: uri */
11951
+ url?: string | null;
11952
+ index?: number;
11953
+ }[];
11849
11954
  };
11850
11955
  };
11851
11956
  };
@@ -11860,6 +11965,45 @@ export interface paths {
11860
11965
  /** @example success */
11861
11966
  status?: string;
11862
11967
  data?: components["schemas"]["Submission"];
11968
+ /**
11969
+ * @description Journey side-effects of the submission. On the FIRST attempt the
11970
+ * publication step is completed and the user advances; `advance`
11971
+ * carries the resulting tick so the client can animate the journey.
11972
+ * `advance` is null on re-submissions (attempt > 1) or if the advance
11973
+ * step failed (non-fatal — the submission is still created).
11974
+ */
11975
+ meta?: {
11976
+ advance?: {
11977
+ /** @enum {string} */
11978
+ action?: "started" | "completed" | "finished";
11979
+ /** Format: uuid */
11980
+ challengeId?: string;
11981
+ currentStep?: {
11982
+ /** Format: uuid */
11983
+ id?: string;
11984
+ index?: number;
11985
+ name?: string;
11986
+ /** Format: date-time */
11987
+ startedAt?: string | null;
11988
+ /** Format: date-time */
11989
+ completedAt?: string | null;
11990
+ } | null;
11991
+ nextStep?: {
11992
+ /** Format: uuid */
11993
+ id?: string;
11994
+ index?: number;
11995
+ name?: string;
11996
+ /** Format: date-time */
11997
+ startedAt?: string | null;
11998
+ } | null;
11999
+ autoCompletedSteps?: {
12000
+ /** Format: uuid */
12001
+ id?: string;
12002
+ index?: number;
12003
+ name?: string;
12004
+ }[];
12005
+ } | null;
12006
+ };
11863
12007
  };
11864
12008
  };
11865
12009
  };
@@ -11923,6 +12067,79 @@ export interface paths {
11923
12067
  patch?: never;
11924
12068
  trace?: never;
11925
12069
  };
12070
+ "/submissions/{id}/classroom-rank": {
12071
+ parameters: {
12072
+ query?: never;
12073
+ header?: never;
12074
+ path?: never;
12075
+ cookie?: never;
12076
+ };
12077
+ /**
12078
+ * Ordem de entrega do aluno na turma para o desafio desta submissão
12079
+ * @description Retorna a posição do aluno entre os colegas de turma (institution_classroom
12080
+ * via membership) a entregar o desafio, ordenando pela PRIMEIRA entrega de cada
12081
+ * aluno (MIN(submitted_at)). Usado pelo app do aluno como incentivo a entregar
12082
+ * cedo ("Você foi o Nº de X da turma a entregar"). Quando o aluno não tem turma
12083
+ * na instituição, retorna order=0 e classSize=0 e o cliente esconde o card.
12084
+ */
12085
+ get: {
12086
+ parameters: {
12087
+ query?: never;
12088
+ header?: never;
12089
+ path: {
12090
+ /** @description Resource ID */
12091
+ id: components["parameters"]["id"];
12092
+ };
12093
+ cookie?: never;
12094
+ };
12095
+ requestBody?: never;
12096
+ responses: {
12097
+ /** @description Posição na turma */
12098
+ 200: {
12099
+ headers: {
12100
+ [name: string]: unknown;
12101
+ };
12102
+ content: {
12103
+ "application/json": {
12104
+ /** @example success */
12105
+ status?: string;
12106
+ data?: {
12107
+ /**
12108
+ * @description Posição do aluno (1-based) entre os que entregaram; 0 quando sem turma
12109
+ * @example 3
12110
+ */
12111
+ order?: number;
12112
+ /**
12113
+ * @description Total de alunos da turma (independente de terem entregado)
12114
+ * @example 28
12115
+ */
12116
+ classSize?: number;
12117
+ /**
12118
+ * @description Quantos alunos da turma já entregaram o desafio
12119
+ * @example 12
12120
+ */
12121
+ submittedCount?: number;
12122
+ /**
12123
+ * @description true quando order está entre 1 e 3
12124
+ * @example true
12125
+ */
12126
+ earlyBird?: boolean;
12127
+ };
12128
+ };
12129
+ };
12130
+ };
12131
+ 401: components["responses"]["Unauthorized"];
12132
+ 404: components["responses"]["NotFound"];
12133
+ };
12134
+ };
12135
+ put?: never;
12136
+ post?: never;
12137
+ delete?: never;
12138
+ options?: never;
12139
+ head?: never;
12140
+ patch?: never;
12141
+ trace?: never;
12142
+ };
11926
12143
  "/submissions/{id}/files": {
11927
12144
  parameters: {
11928
12145
  query?: never;
@@ -12504,6 +12721,12 @@ export interface paths {
12504
12721
  * Útil para pré-visualização administrativa ou quando o aluno pertence a múltiplas séries.
12505
12722
  */
12506
12723
  serieId?: string;
12724
+ /**
12725
+ * @description Escola atual (contexto de instituição do app). Opcional — se omitido, usa a 1ª
12726
+ * matrícula. A jornada é por escola: filtra os challenges e resolve a turma/série
12727
+ * default a partir da membership do usuário NESTA instituição.
12728
+ */
12729
+ institutionId?: string;
12507
12730
  /**
12508
12731
  * @description [Admin] Quando presente, retorna a jornada do usuário-alvo em vez da do
12509
12732
  * autenticado. Usado pelo backoffice para visualizar a jornada de um aluno.
@@ -13401,6 +13624,97 @@ export interface paths {
13401
13624
  patch?: never;
13402
13625
  trace?: never;
13403
13626
  };
13627
+ "/users/me/classrooms": {
13628
+ parameters: {
13629
+ query?: never;
13630
+ header?: never;
13631
+ path?: never;
13632
+ cookie?: never;
13633
+ };
13634
+ /**
13635
+ * Turmas e séries do usuário autenticado
13636
+ * @description Contexto de matrícula do aluno: TODAS as suas turmas (com série, turno e
13637
+ * instituição), a escola ATUAL e a lista DEDUPLICADA de séries dessa escola.
13638
+ *
13639
+ * Fonte única para o app: `classrooms` alimenta a listagem de turmas no
13640
+ * perfil; `currentInstitutionId` é a escola atual (o app mostra uma escola
13641
+ * por vez); `series` traz APENAS as séries da escola atual (deduplicada e
13642
+ * ordenada por nível/valor) — alimenta o seletor da jornada, que também é
13643
+ * por escola. O botão só aparece com 2+ séries na escola atual.
13644
+ */
13645
+ get: {
13646
+ parameters: {
13647
+ query?: never;
13648
+ header?: never;
13649
+ path?: never;
13650
+ cookie?: never;
13651
+ };
13652
+ requestBody?: never;
13653
+ responses: {
13654
+ /** @description Turmas + séries acessíveis */
13655
+ 200: {
13656
+ headers: {
13657
+ [name: string]: unknown;
13658
+ };
13659
+ content: {
13660
+ "application/json": {
13661
+ /** @example success */
13662
+ status?: string;
13663
+ data?: {
13664
+ /**
13665
+ * Format: uuid
13666
+ * @description Escola atual (a da matrícula). As séries são desta escola.
13667
+ */
13668
+ currentInstitutionId?: string | null;
13669
+ classrooms?: {
13670
+ /** Format: uuid */
13671
+ institutionClassroomId?: string;
13672
+ /** Format: uuid */
13673
+ classroomId?: string;
13674
+ /** @example 6º A */
13675
+ classroomName?: string;
13676
+ /** @example manhã */
13677
+ shiftName?: string | null;
13678
+ /** Format: uuid */
13679
+ institutionId?: string;
13680
+ /** @example Escola Modelo */
13681
+ institutionName?: string | null;
13682
+ serie?: {
13683
+ /** Format: uuid */
13684
+ serieId?: string;
13685
+ /** @example 6 */
13686
+ serieValue?: number;
13687
+ /** @example 6º ANO */
13688
+ serieLabel?: string;
13689
+ /** @enum {string} */
13690
+ level?: "fundamental" | "medio";
13691
+ } | null;
13692
+ }[];
13693
+ series?: {
13694
+ /** Format: uuid */
13695
+ serieId?: string;
13696
+ /** @example 6 */
13697
+ serieValue?: number;
13698
+ /** @example 6º ANO */
13699
+ serieLabel?: string;
13700
+ /** @enum {string} */
13701
+ level?: "fundamental" | "medio";
13702
+ }[];
13703
+ };
13704
+ };
13705
+ };
13706
+ };
13707
+ 401: components["responses"]["Unauthorized"];
13708
+ };
13709
+ };
13710
+ put?: never;
13711
+ post?: never;
13712
+ delete?: never;
13713
+ options?: never;
13714
+ head?: never;
13715
+ patch?: never;
13716
+ trace?: never;
13717
+ };
13404
13718
  "/users/me/push-tokens": {
13405
13719
  parameters: {
13406
13720
  query?: never;
@@ -15013,6 +15327,8 @@ export interface components {
15013
15327
  certificateTemplate?: components["schemas"]["CertificateTemplate"];
15014
15328
  /** @description Course information related to the certificate (extracted from Quiz or CertificateTemplate) */
15015
15329
  course?: components["schemas"]["CourseSimplified"];
15330
+ /** @description Course module information related to the certificate (resolved from the quiz the student took). Null when the certificate came from a template course. */
15331
+ module?: components["schemas"]["ModuleSimplified"];
15016
15332
  };
15017
15333
  /** @description Simplified course information included in certificate responses */
15018
15334
  CourseSimplified: {
@@ -15032,6 +15348,26 @@ export interface components {
15032
15348
  */
15033
15349
  description?: string | null;
15034
15350
  };
15351
+ /** @description Simplified course module information included in certificate responses */
15352
+ ModuleSimplified: {
15353
+ /**
15354
+ * Format: uuid
15355
+ * @description Course module ID
15356
+ */
15357
+ id?: string;
15358
+ /**
15359
+ * @description Course module title
15360
+ * @example Variables and Data Types
15361
+ */
15362
+ title?: string;
15363
+ /** @description Course module description */
15364
+ description?: string | null;
15365
+ /**
15366
+ * @description Course module workload in hours
15367
+ * @example 40
15368
+ */
15369
+ duration?: number | null;
15370
+ };
15035
15371
  /** @description Simplified quiz information included in course and module responses */
15036
15372
  QuizSimplified: {
15037
15373
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "academe-kit",
3
- "version": "0.11.4",
3
+ "version": "0.11.6",
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",