analytica-frontend-lib 1.2.86 → 1.2.88
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/ActivitiesHistory/index.js.map +1 -1
- package/dist/ActivitiesHistory/index.mjs.map +1 -1
- package/dist/NotificationCard/index.js +1 -1
- package/dist/NotificationCard/index.js.map +1 -1
- package/dist/NotificationCard/index.mjs +1 -1
- package/dist/NotificationCard/index.mjs.map +1 -1
- package/dist/QuestionsData/index.d.ts +26 -1
- package/dist/QuestionsData/index.d.ts.map +1 -1
- package/dist/QuestionsData/index.js.map +1 -1
- package/dist/QuestionsData/index.mjs.map +1 -1
- package/dist/RecommendedLessonsHistory/index.d.ts +1 -1
- package/dist/RecommendedLessonsHistory/index.d.ts.map +1 -1
- package/dist/RecommendedLessonsHistory/index.js +148 -142
- package/dist/RecommendedLessonsHistory/index.js.map +1 -1
- package/dist/RecommendedLessonsHistory/index.mjs +147 -141
- package/dist/RecommendedLessonsHistory/index.mjs.map +1 -1
- package/dist/StudentRanking/index.d.ts +33 -9
- package/dist/StudentRanking/index.d.ts.map +1 -1
- package/dist/StudentRanking/index.js.map +1 -1
- package/dist/StudentRanking/index.mjs.map +1 -1
- package/dist/hooks/useActivitiesHistory/index.js.map +1 -1
- package/dist/hooks/useActivitiesHistory/index.mjs.map +1 -1
- package/dist/hooks/useNotifications.d.ts +2 -2
- package/dist/hooks/useNotifications.d.ts.map +1 -1
- package/dist/hooks/useQuestionsData.d.ts +218 -0
- package/dist/hooks/useQuestionsData.d.ts.map +1 -0
- package/dist/hooks/useRecommendedClassDrafts/index.d.ts +57 -0
- package/dist/hooks/useRecommendedClassDrafts/index.d.ts.map +1 -0
- package/dist/hooks/{useGoalDrafts → useRecommendedClassDrafts}/index.js +40 -40
- package/dist/hooks/useRecommendedClassDrafts/index.js.map +1 -0
- package/dist/hooks/{useGoalDrafts → useRecommendedClassDrafts}/index.mjs +33 -33
- package/dist/hooks/useRecommendedClassDrafts/index.mjs.map +1 -0
- package/dist/hooks/useRecommendedClassDrafts.d.ts +57 -0
- package/dist/hooks/useRecommendedClassDrafts.d.ts.map +1 -0
- package/dist/hooks/{useGoalModels.d.ts → useRecommendedClassModels.d.ts} +32 -32
- package/dist/hooks/useRecommendedClassModels.d.ts.map +1 -0
- package/dist/hooks/useRecommendedLessonDetails.d.ts +44 -44
- package/dist/hooks/useRecommendedLessonDetails.d.ts.map +1 -1
- package/dist/hooks/useRecommendedLessons/index.d.ts +35 -35
- package/dist/hooks/useRecommendedLessons/index.d.ts.map +1 -1
- package/dist/hooks/useRecommendedLessons/index.js +41 -41
- package/dist/hooks/useRecommendedLessons/index.js.map +1 -1
- package/dist/hooks/useRecommendedLessons/index.mjs +37 -37
- package/dist/hooks/useRecommendedLessons/index.mjs.map +1 -1
- package/dist/hooks/useRecommendedLessons.d.ts +35 -35
- package/dist/hooks/useRecommendedLessons.d.ts.map +1 -1
- package/dist/hooks/useRecommendedLessonsPage/index.d.ts +21 -21
- package/dist/hooks/useRecommendedLessonsPage/index.d.ts.map +1 -1
- package/dist/hooks/useRecommendedLessonsPage/index.js +39 -33
- package/dist/hooks/useRecommendedLessonsPage/index.js.map +1 -1
- package/dist/hooks/useRecommendedLessonsPage/index.mjs +39 -33
- package/dist/hooks/useRecommendedLessonsPage/index.mjs.map +1 -1
- package/dist/hooks/useRecommendedLessonsPage.d.ts +21 -21
- package/dist/hooks/useRecommendedLessonsPage.d.ts.map +1 -1
- package/dist/hooks/useStudentsHighlight.d.ts +275 -0
- package/dist/hooks/useStudentsHighlight.d.ts.map +1 -0
- package/dist/index.d.ts +15 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +570 -351
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +516 -308
- package/dist/index.mjs.map +1 -1
- package/dist/store/notificationStore.d.ts.map +1 -1
- package/dist/types/activitiesHistory/index.js.map +1 -1
- package/dist/types/activitiesHistory/index.mjs.map +1 -1
- package/dist/types/common.d.ts +2 -2
- package/dist/types/notifications.d.ts +5 -5
- package/dist/types/notifications.d.ts.map +1 -1
- package/dist/types/recommendedLessons/index.d.ts +112 -112
- package/dist/types/recommendedLessons/index.d.ts.map +1 -1
- package/dist/types/recommendedLessons/index.js +25 -25
- package/dist/types/recommendedLessons/index.js.map +1 -1
- package/dist/types/recommendedLessons/index.mjs +17 -17
- package/dist/types/recommendedLessons/index.mjs.map +1 -1
- package/dist/types/recommendedLessons.d.ts +112 -112
- package/dist/types/recommendedLessons.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/hooks/useGoalDrafts/index.d.ts +0 -57
- package/dist/hooks/useGoalDrafts/index.d.ts.map +0 -1
- package/dist/hooks/useGoalDrafts/index.js.map +0 -1
- package/dist/hooks/useGoalDrafts/index.mjs.map +0 -1
- package/dist/hooks/useGoalDrafts.d.ts +0 -57
- package/dist/hooks/useGoalDrafts.d.ts.map +0 -1
- package/dist/hooks/useGoalModels.d.ts.map +0 -1
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Period filter options for questions data
|
|
4
|
+
*/
|
|
5
|
+
export type QuestionsDataPeriod = '7_DAYS' | '30_DAYS' | '6_MONTHS' | '1_YEAR';
|
|
6
|
+
/**
|
|
7
|
+
* Trend direction for questions data
|
|
8
|
+
*/
|
|
9
|
+
export type QuestionsDataTrendDirection = 'up' | 'down' | 'stable';
|
|
10
|
+
/**
|
|
11
|
+
* Filters for questions data API request
|
|
12
|
+
*/
|
|
13
|
+
export interface QuestionsDataFilters {
|
|
14
|
+
period?: QuestionsDataPeriod;
|
|
15
|
+
subjectId?: string;
|
|
16
|
+
schoolYearId?: string;
|
|
17
|
+
classId?: string;
|
|
18
|
+
schoolId?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Trend information from API response
|
|
22
|
+
*/
|
|
23
|
+
export interface QuestionsDataTrend {
|
|
24
|
+
totalQuestions: number;
|
|
25
|
+
correctPercentage: number;
|
|
26
|
+
direction: QuestionsDataTrendDirection;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* API response data structure
|
|
30
|
+
*/
|
|
31
|
+
export interface QuestionsDataApiData {
|
|
32
|
+
totalQuestions: number;
|
|
33
|
+
correctQuestions: number;
|
|
34
|
+
incorrectQuestions: number;
|
|
35
|
+
blankQuestions: number;
|
|
36
|
+
correctPercentage: number;
|
|
37
|
+
incorrectPercentage: number;
|
|
38
|
+
blankPercentage: number;
|
|
39
|
+
trend: QuestionsDataTrend | null;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* API response structure for questions data endpoint
|
|
43
|
+
*/
|
|
44
|
+
export interface QuestionsDataApiResponse {
|
|
45
|
+
message: string;
|
|
46
|
+
data: QuestionsDataApiData;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Transformed data for UI display.
|
|
50
|
+
* Extends the basic QuestionsDataItem from component with additional API fields.
|
|
51
|
+
* Can be passed directly to QuestionsData component (extra fields are ignored).
|
|
52
|
+
*/
|
|
53
|
+
export interface QuestionsDataHookResult {
|
|
54
|
+
/** Total number of questions answered */
|
|
55
|
+
total: number;
|
|
56
|
+
/** Number of correct answers */
|
|
57
|
+
corretas: number;
|
|
58
|
+
/** Number of incorrect answers */
|
|
59
|
+
incorretas: number;
|
|
60
|
+
/** Number of blank (unanswered) questions */
|
|
61
|
+
emBranco: number;
|
|
62
|
+
/** Percentage of correct answers */
|
|
63
|
+
correctPercentage: number;
|
|
64
|
+
/** Percentage of incorrect answers */
|
|
65
|
+
incorrectPercentage: number;
|
|
66
|
+
/** Percentage of blank answers */
|
|
67
|
+
blankPercentage: number;
|
|
68
|
+
/** Trend information */
|
|
69
|
+
trend: QuestionsDataTrend | null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Zod schema for questions data API response validation
|
|
73
|
+
*/
|
|
74
|
+
export declare const questionsDataApiResponseSchema: z.ZodObject<{
|
|
75
|
+
message: z.ZodString;
|
|
76
|
+
data: z.ZodObject<{
|
|
77
|
+
totalQuestions: z.ZodNumber;
|
|
78
|
+
correctQuestions: z.ZodNumber;
|
|
79
|
+
incorrectQuestions: z.ZodNumber;
|
|
80
|
+
blankQuestions: z.ZodNumber;
|
|
81
|
+
correctPercentage: z.ZodNumber;
|
|
82
|
+
incorrectPercentage: z.ZodNumber;
|
|
83
|
+
blankPercentage: z.ZodNumber;
|
|
84
|
+
trend: z.ZodNullable<z.ZodObject<{
|
|
85
|
+
totalQuestions: z.ZodNumber;
|
|
86
|
+
correctPercentage: z.ZodNumber;
|
|
87
|
+
direction: z.ZodEnum<["up", "down", "stable"]>;
|
|
88
|
+
}, "strip", z.ZodTypeAny, {
|
|
89
|
+
direction: "stable" | "up" | "down";
|
|
90
|
+
totalQuestions: number;
|
|
91
|
+
correctPercentage: number;
|
|
92
|
+
}, {
|
|
93
|
+
direction: "stable" | "up" | "down";
|
|
94
|
+
totalQuestions: number;
|
|
95
|
+
correctPercentage: number;
|
|
96
|
+
}>>;
|
|
97
|
+
}, "strip", z.ZodTypeAny, {
|
|
98
|
+
totalQuestions: number;
|
|
99
|
+
trend: {
|
|
100
|
+
direction: "stable" | "up" | "down";
|
|
101
|
+
totalQuestions: number;
|
|
102
|
+
correctPercentage: number;
|
|
103
|
+
} | null;
|
|
104
|
+
correctPercentage: number;
|
|
105
|
+
correctQuestions: number;
|
|
106
|
+
incorrectQuestions: number;
|
|
107
|
+
blankQuestions: number;
|
|
108
|
+
incorrectPercentage: number;
|
|
109
|
+
blankPercentage: number;
|
|
110
|
+
}, {
|
|
111
|
+
totalQuestions: number;
|
|
112
|
+
trend: {
|
|
113
|
+
direction: "stable" | "up" | "down";
|
|
114
|
+
totalQuestions: number;
|
|
115
|
+
correctPercentage: number;
|
|
116
|
+
} | null;
|
|
117
|
+
correctPercentage: number;
|
|
118
|
+
correctQuestions: number;
|
|
119
|
+
incorrectQuestions: number;
|
|
120
|
+
blankQuestions: number;
|
|
121
|
+
incorrectPercentage: number;
|
|
122
|
+
blankPercentage: number;
|
|
123
|
+
}>;
|
|
124
|
+
}, "strip", z.ZodTypeAny, {
|
|
125
|
+
data: {
|
|
126
|
+
totalQuestions: number;
|
|
127
|
+
trend: {
|
|
128
|
+
direction: "stable" | "up" | "down";
|
|
129
|
+
totalQuestions: number;
|
|
130
|
+
correctPercentage: number;
|
|
131
|
+
} | null;
|
|
132
|
+
correctPercentage: number;
|
|
133
|
+
correctQuestions: number;
|
|
134
|
+
incorrectQuestions: number;
|
|
135
|
+
blankQuestions: number;
|
|
136
|
+
incorrectPercentage: number;
|
|
137
|
+
blankPercentage: number;
|
|
138
|
+
};
|
|
139
|
+
message: string;
|
|
140
|
+
}, {
|
|
141
|
+
data: {
|
|
142
|
+
totalQuestions: number;
|
|
143
|
+
trend: {
|
|
144
|
+
direction: "stable" | "up" | "down";
|
|
145
|
+
totalQuestions: number;
|
|
146
|
+
correctPercentage: number;
|
|
147
|
+
} | null;
|
|
148
|
+
correctPercentage: number;
|
|
149
|
+
correctQuestions: number;
|
|
150
|
+
incorrectQuestions: number;
|
|
151
|
+
blankQuestions: number;
|
|
152
|
+
incorrectPercentage: number;
|
|
153
|
+
blankPercentage: number;
|
|
154
|
+
};
|
|
155
|
+
message: string;
|
|
156
|
+
}>;
|
|
157
|
+
/**
|
|
158
|
+
* Hook state interface
|
|
159
|
+
*/
|
|
160
|
+
export interface UseQuestionsDataState {
|
|
161
|
+
data: QuestionsDataHookResult | null;
|
|
162
|
+
loading: boolean;
|
|
163
|
+
error: string | null;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Hook return type
|
|
167
|
+
*/
|
|
168
|
+
export interface UseQuestionsDataReturn extends UseQuestionsDataState {
|
|
169
|
+
fetchQuestionsData: (filters?: QuestionsDataFilters) => Promise<void>;
|
|
170
|
+
reset: () => void;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Transform API response data to component format
|
|
174
|
+
* @param apiData - Data from API response
|
|
175
|
+
* @returns Transformed data for QuestionsData component
|
|
176
|
+
*/
|
|
177
|
+
export declare const transformQuestionsData: (apiData: QuestionsDataApiData) => QuestionsDataHookResult;
|
|
178
|
+
/**
|
|
179
|
+
* Handle errors during questions data fetch
|
|
180
|
+
* @param error - Error object
|
|
181
|
+
* @returns Error message for UI display
|
|
182
|
+
*/
|
|
183
|
+
export declare const handleQuestionsDataFetchError: (error: unknown) => string;
|
|
184
|
+
/**
|
|
185
|
+
* Factory function to create useQuestionsData hook
|
|
186
|
+
*
|
|
187
|
+
* @param fetchQuestionsDataApi - Function to fetch questions data from API
|
|
188
|
+
* @returns Hook for managing questions data
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* ```tsx
|
|
192
|
+
* // In your app setup
|
|
193
|
+
* const fetchQuestionsDataApi = async (filters) => {
|
|
194
|
+
* const response = await api.get('/performance/questions-data', { params: filters });
|
|
195
|
+
* return response.data;
|
|
196
|
+
* };
|
|
197
|
+
*
|
|
198
|
+
* const useQuestionsData = createUseQuestionsData(fetchQuestionsDataApi);
|
|
199
|
+
*
|
|
200
|
+
* // In your component
|
|
201
|
+
* const { data, loading, error, fetchQuestionsData } = useQuestionsData();
|
|
202
|
+
*
|
|
203
|
+
* useEffect(() => {
|
|
204
|
+
* fetchQuestionsData({ period: '30_DAYS' });
|
|
205
|
+
* }, []);
|
|
206
|
+
*
|
|
207
|
+
* if (loading) return <Skeleton />;
|
|
208
|
+
* if (!data) return null;
|
|
209
|
+
*
|
|
210
|
+
* return <QuestionsData data={data} />;
|
|
211
|
+
* ```
|
|
212
|
+
*/
|
|
213
|
+
export declare const createUseQuestionsData: (fetchQuestionsDataApi: (filters?: QuestionsDataFilters) => Promise<QuestionsDataApiResponse>) => () => UseQuestionsDataReturn;
|
|
214
|
+
/**
|
|
215
|
+
* Alias for createUseQuestionsData
|
|
216
|
+
*/
|
|
217
|
+
export declare const createQuestionsDataHook: (fetchQuestionsDataApi: (filters?: QuestionsDataFilters) => Promise<QuestionsDataApiResponse>) => () => UseQuestionsDataReturn;
|
|
218
|
+
//# sourceMappingURL=useQuestionsData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQuestionsData.d.ts","sourceRoot":"","sources":["../../src/hooks/useQuestionsData.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { RecommendedClassModelTableItem, RecommendedClassModelsApiResponse, RecommendedClassModelFilters, RecommendedClassModelPagination } from '../types/recommendedLessons';
|
|
2
|
+
/**
|
|
3
|
+
* Hook state interface for recommendedClass drafts
|
|
4
|
+
*/
|
|
5
|
+
export interface UseRecommendedClassDraftsState {
|
|
6
|
+
models: RecommendedClassModelTableItem[];
|
|
7
|
+
loading: boolean;
|
|
8
|
+
error: string | null;
|
|
9
|
+
pagination: RecommendedClassModelPagination;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Hook return type for recommendedClass drafts
|
|
13
|
+
*/
|
|
14
|
+
export interface UseRecommendedClassDraftsReturn extends UseRecommendedClassDraftsState {
|
|
15
|
+
fetchModels: (filters?: RecommendedClassModelFilters, subjectsMap?: Map<string, string>) => Promise<void>;
|
|
16
|
+
deleteModel: (id: string) => Promise<boolean>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Default pagination values for drafts
|
|
20
|
+
*/
|
|
21
|
+
export declare const DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION: RecommendedClassModelPagination;
|
|
22
|
+
/**
|
|
23
|
+
* Handle errors during draft fetch
|
|
24
|
+
* Uses the generic error handler factory to reduce code duplication
|
|
25
|
+
*/
|
|
26
|
+
export declare const handleRecommendedClassDraftFetchError: (error: unknown) => string;
|
|
27
|
+
/**
|
|
28
|
+
* Factory function to create useRecommendedClassDrafts hook
|
|
29
|
+
*
|
|
30
|
+
* @param fetchRecommendedClassDrafts - Function to fetch drafts from API
|
|
31
|
+
* @param deleteRecommendedClassDraft - Function to delete a draft
|
|
32
|
+
* @returns Hook for managing recommendedClass drafts
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```tsx
|
|
36
|
+
* // In your app setup
|
|
37
|
+
* const fetchRecommendedClassDrafts = async (filters) => {
|
|
38
|
+
* const response = await api.get('/recommended-class/drafts', { params: { ...filters, type: 'RASCUNHO' } });
|
|
39
|
+
* return response.data;
|
|
40
|
+
* };
|
|
41
|
+
*
|
|
42
|
+
* const deleteRecommendedClassDraft = async (id) => {
|
|
43
|
+
* await api.delete(`/recommended-class/drafts/${id}`);
|
|
44
|
+
* };
|
|
45
|
+
*
|
|
46
|
+
* const useRecommendedClassDrafts = createUseRecommendedClassDrafts(fetchRecommendedClassDrafts, deleteRecommendedClassDraft);
|
|
47
|
+
*
|
|
48
|
+
* // In your component
|
|
49
|
+
* const { models, loading, error, pagination, fetchModels, deleteModel } = useRecommendedClassDrafts();
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare const createUseRecommendedClassDrafts: (fetchRecommendedClassDrafts: (filters?: RecommendedClassModelFilters) => Promise<RecommendedClassModelsApiResponse>, deleteRecommendedClassDraft: (id: string) => Promise<void>) => () => UseRecommendedClassDraftsReturn;
|
|
53
|
+
/**
|
|
54
|
+
* Alias for createUseRecommendedClassDrafts
|
|
55
|
+
*/
|
|
56
|
+
export declare const createRecommendedClassDraftsHook: (fetchRecommendedClassDrafts: (filters?: RecommendedClassModelFilters) => Promise<RecommendedClassModelsApiResponse>, deleteRecommendedClassDraft: (id: string) => Promise<void>) => () => UseRecommendedClassDraftsReturn;
|
|
57
|
+
//# sourceMappingURL=useRecommendedClassDrafts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRecommendedClassDrafts.d.ts","sourceRoot":"","sources":["../../src/hooks/useRecommendedClassDrafts.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,8BAA8B,EAC9B,iCAAiC,EACjC,4BAA4B,EAC5B,+BAA+B,EAChC,MAAM,6BAA6B,CAAC;AAErC;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,8BAA8B,EAAE,CAAC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,+BAA+B,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,+BACf,SAAQ,8BAA8B;IACtC,WAAW,EAAE,CACX,OAAO,CAAC,EAAE,4BAA4B,EACtC,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/C;AAED;;GAEG;AACH,eAAO,MAAM,2CAA2C,EAAE,+BAMvD,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,qCAAqC,4BAGjD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,+BAA+B,GAC1C,6BAA6B,CAC3B,OAAO,CAAC,EAAE,4BAA4B,KACnC,OAAO,CAAC,iCAAiC,CAAC,EAC/C,6BAA6B,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,WAE/C,+BAuFZ,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gCAAgC,gCAjGd,CAC3B,OAAO,CAAC,EAAE,4BAA4B,KACnC,OAAO,CAAC,iCAAiC,CAAC,+BAClB,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,WAE/C,+BA4FkE,CAAC"}
|
|
@@ -27,37 +27,37 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
27
27
|
));
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
29
|
|
|
30
|
-
// src/hooks/
|
|
31
|
-
var
|
|
32
|
-
__export(
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
// src/hooks/useRecommendedClassDrafts.ts
|
|
31
|
+
var useRecommendedClassDrafts_exports = {};
|
|
32
|
+
__export(useRecommendedClassDrafts_exports, {
|
|
33
|
+
DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION: () => DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION,
|
|
34
|
+
createRecommendedClassDraftsHook: () => createRecommendedClassDraftsHook,
|
|
35
|
+
createUseRecommendedClassDrafts: () => createUseRecommendedClassDrafts,
|
|
36
|
+
handleRecommendedClassDraftFetchError: () => handleRecommendedClassDraftFetchError
|
|
37
37
|
});
|
|
38
|
-
module.exports = __toCommonJS(
|
|
38
|
+
module.exports = __toCommonJS(useRecommendedClassDrafts_exports);
|
|
39
39
|
var import_react2 = require("react");
|
|
40
40
|
|
|
41
|
-
// src/hooks/
|
|
41
|
+
// src/hooks/useRecommendedClassModels.ts
|
|
42
42
|
var import_react = require("react");
|
|
43
43
|
var import_zod2 = require("zod");
|
|
44
44
|
var import_dayjs = __toESM(require("dayjs"));
|
|
45
45
|
|
|
46
46
|
// src/types/recommendedLessons.ts
|
|
47
|
-
var
|
|
47
|
+
var RECOMMENDED_CLASS_FILTER_STATUS_OPTIONS = [
|
|
48
48
|
{ id: "VENCIDA" /* VENCIDA */, name: "Vencida" },
|
|
49
49
|
{ id: "A_VENCER" /* A_VENCER */, name: "Ativa" }
|
|
50
50
|
];
|
|
51
|
-
var
|
|
51
|
+
var RECOMMENDED_CLASS_STATUS_OPTIONS = [
|
|
52
52
|
{ id: "A_VENCER" /* A_VENCER */, name: "A Vencer" },
|
|
53
53
|
{ id: "VENCIDA" /* VENCIDA */, name: "Vencida" },
|
|
54
54
|
{ id: "CONCLUIDA" /* CONCLUIDA */, name: "Conclu\xEDda" }
|
|
55
55
|
];
|
|
56
|
-
var
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
return
|
|
60
|
-
})(
|
|
56
|
+
var RecommendedClassDraftType = /* @__PURE__ */ ((RecommendedClassDraftType2) => {
|
|
57
|
+
RecommendedClassDraftType2["MODELO"] = "MODELO";
|
|
58
|
+
RecommendedClassDraftType2["RASCUNHO"] = "RASCUNHO";
|
|
59
|
+
return RecommendedClassDraftType2;
|
|
60
|
+
})(RecommendedClassDraftType || {});
|
|
61
61
|
|
|
62
62
|
// src/utils/hookErrorHandler.ts
|
|
63
63
|
var import_zod = require("zod");
|
|
@@ -70,10 +70,10 @@ var createFetchErrorHandler = (validationErrorMessage, genericErrorMessage) => (
|
|
|
70
70
|
return genericErrorMessage;
|
|
71
71
|
};
|
|
72
72
|
|
|
73
|
-
// src/hooks/
|
|
74
|
-
var
|
|
73
|
+
// src/hooks/useRecommendedClassModels.ts
|
|
74
|
+
var recommendedClassModelResponseSchema = import_zod2.z.object({
|
|
75
75
|
id: import_zod2.z.string().uuid(),
|
|
76
|
-
type: import_zod2.z.nativeEnum(
|
|
76
|
+
type: import_zod2.z.nativeEnum(RecommendedClassDraftType),
|
|
77
77
|
title: import_zod2.z.string(),
|
|
78
78
|
description: import_zod2.z.string().nullable(),
|
|
79
79
|
creatorUserInstitutionId: import_zod2.z.string().uuid(),
|
|
@@ -83,14 +83,14 @@ var goalModelResponseSchema = import_zod2.z.object({
|
|
|
83
83
|
createdAt: import_zod2.z.string(),
|
|
84
84
|
updatedAt: import_zod2.z.string()
|
|
85
85
|
});
|
|
86
|
-
var
|
|
86
|
+
var recommendedClassModelsApiResponseSchema = import_zod2.z.object({
|
|
87
87
|
message: import_zod2.z.string(),
|
|
88
88
|
data: import_zod2.z.object({
|
|
89
|
-
drafts: import_zod2.z.array(
|
|
89
|
+
drafts: import_zod2.z.array(recommendedClassModelResponseSchema),
|
|
90
90
|
total: import_zod2.z.number()
|
|
91
91
|
})
|
|
92
92
|
});
|
|
93
|
-
var
|
|
93
|
+
var transformRecommendedClassModelToTableItem = (model, subjectsMap) => {
|
|
94
94
|
const subjectName = model.subjectId ? subjectsMap?.get(model.subjectId) || "" : "";
|
|
95
95
|
return {
|
|
96
96
|
id: model.id,
|
|
@@ -100,38 +100,38 @@ var transformGoalModelToTableItem = (model, subjectsMap) => {
|
|
|
100
100
|
subjectId: model.subjectId
|
|
101
101
|
};
|
|
102
102
|
};
|
|
103
|
-
var
|
|
103
|
+
var handleRecommendedClassModelFetchError = createFetchErrorHandler(
|
|
104
104
|
"Erro ao validar dados de modelos de aulas",
|
|
105
105
|
"Erro ao carregar modelos de aulas"
|
|
106
106
|
);
|
|
107
107
|
|
|
108
|
-
// src/hooks/
|
|
109
|
-
var
|
|
108
|
+
// src/hooks/useRecommendedClassDrafts.ts
|
|
109
|
+
var DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION = {
|
|
110
110
|
total: 0,
|
|
111
111
|
page: 1,
|
|
112
112
|
limit: 10,
|
|
113
113
|
totalPages: 0
|
|
114
114
|
};
|
|
115
|
-
var
|
|
115
|
+
var handleRecommendedClassDraftFetchError = createFetchErrorHandler(
|
|
116
116
|
"Erro ao validar dados de rascunhos de aulas",
|
|
117
117
|
"Erro ao carregar rascunhos de aulas"
|
|
118
118
|
);
|
|
119
|
-
var
|
|
119
|
+
var createUseRecommendedClassDrafts = (fetchRecommendedClassDrafts, deleteRecommendedClassDraft) => {
|
|
120
120
|
return () => {
|
|
121
121
|
const [state, setState] = (0, import_react2.useState)({
|
|
122
122
|
models: [],
|
|
123
123
|
loading: false,
|
|
124
124
|
error: null,
|
|
125
|
-
pagination:
|
|
125
|
+
pagination: DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION
|
|
126
126
|
});
|
|
127
127
|
const fetchModels = (0, import_react2.useCallback)(
|
|
128
128
|
async (filters, subjectsMap) => {
|
|
129
129
|
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
130
130
|
try {
|
|
131
|
-
const responseData = await
|
|
132
|
-
const validatedData =
|
|
131
|
+
const responseData = await fetchRecommendedClassDrafts(filters);
|
|
132
|
+
const validatedData = recommendedClassModelsApiResponseSchema.parse(responseData);
|
|
133
133
|
const tableItems = validatedData.data.drafts.map(
|
|
134
|
-
(draft) =>
|
|
134
|
+
(draft) => transformRecommendedClassModelToTableItem(draft, subjectsMap)
|
|
135
135
|
);
|
|
136
136
|
const limit = filters?.limit || 10;
|
|
137
137
|
const page = filters?.page || 1;
|
|
@@ -149,7 +149,7 @@ var createUseGoalDrafts = (fetchGoalDrafts, deleteGoalDraft) => {
|
|
|
149
149
|
}
|
|
150
150
|
});
|
|
151
151
|
} catch (error) {
|
|
152
|
-
const errorMessage =
|
|
152
|
+
const errorMessage = handleRecommendedClassDraftFetchError(error);
|
|
153
153
|
setState((prev) => ({
|
|
154
154
|
...prev,
|
|
155
155
|
loading: false,
|
|
@@ -157,19 +157,19 @@ var createUseGoalDrafts = (fetchGoalDrafts, deleteGoalDraft) => {
|
|
|
157
157
|
}));
|
|
158
158
|
}
|
|
159
159
|
},
|
|
160
|
-
[
|
|
160
|
+
[fetchRecommendedClassDrafts]
|
|
161
161
|
);
|
|
162
162
|
const deleteModel = (0, import_react2.useCallback)(
|
|
163
163
|
async (id) => {
|
|
164
164
|
try {
|
|
165
|
-
await
|
|
165
|
+
await deleteRecommendedClassDraft(id);
|
|
166
166
|
return true;
|
|
167
167
|
} catch (error) {
|
|
168
168
|
console.error("Erro ao deletar rascunho:", error);
|
|
169
169
|
return false;
|
|
170
170
|
}
|
|
171
171
|
},
|
|
172
|
-
[
|
|
172
|
+
[deleteRecommendedClassDraft]
|
|
173
173
|
);
|
|
174
174
|
return {
|
|
175
175
|
...state,
|
|
@@ -178,12 +178,12 @@ var createUseGoalDrafts = (fetchGoalDrafts, deleteGoalDraft) => {
|
|
|
178
178
|
};
|
|
179
179
|
};
|
|
180
180
|
};
|
|
181
|
-
var
|
|
181
|
+
var createRecommendedClassDraftsHook = createUseRecommendedClassDrafts;
|
|
182
182
|
// Annotate the CommonJS export names for ESM import in node:
|
|
183
183
|
0 && (module.exports = {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
184
|
+
DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION,
|
|
185
|
+
createRecommendedClassDraftsHook,
|
|
186
|
+
createUseRecommendedClassDrafts,
|
|
187
|
+
handleRecommendedClassDraftFetchError
|
|
188
188
|
});
|
|
189
189
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useRecommendedClassDrafts.ts","../../../src/hooks/useRecommendedClassModels.ts","../../../src/types/recommendedLessons.ts","../../../src/utils/hookErrorHandler.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport {\n recommendedClassModelsApiResponseSchema,\n transformRecommendedClassModelToTableItem,\n} from './useRecommendedClassModels';\nimport { createFetchErrorHandler } from '../utils/hookErrorHandler';\nimport type {\n RecommendedClassModelTableItem,\n RecommendedClassModelsApiResponse,\n RecommendedClassModelFilters,\n RecommendedClassModelPagination,\n} from '../types/recommendedLessons';\n\n/**\n * Hook state interface for recommendedClass drafts\n */\nexport interface UseRecommendedClassDraftsState {\n models: RecommendedClassModelTableItem[];\n loading: boolean;\n error: string | null;\n pagination: RecommendedClassModelPagination;\n}\n\n/**\n * Hook return type for recommendedClass drafts\n */\nexport interface UseRecommendedClassDraftsReturn\n extends UseRecommendedClassDraftsState {\n fetchModels: (\n filters?: RecommendedClassModelFilters,\n subjectsMap?: Map<string, string>\n ) => Promise<void>;\n deleteModel: (id: string) => Promise<boolean>;\n}\n\n/**\n * Default pagination values for drafts\n */\nexport const DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION: RecommendedClassModelPagination =\n {\n total: 0,\n page: 1,\n limit: 10,\n totalPages: 0,\n };\n\n/**\n * Handle errors during draft fetch\n * Uses the generic error handler factory to reduce code duplication\n */\nexport const handleRecommendedClassDraftFetchError = createFetchErrorHandler(\n 'Erro ao validar dados de rascunhos de aulas',\n 'Erro ao carregar rascunhos de aulas'\n);\n\n/**\n * Factory function to create useRecommendedClassDrafts hook\n *\n * @param fetchRecommendedClassDrafts - Function to fetch drafts from API\n * @param deleteRecommendedClassDraft - Function to delete a draft\n * @returns Hook for managing recommendedClass drafts\n *\n * @example\n * ```tsx\n * // In your app setup\n * const fetchRecommendedClassDrafts = async (filters) => {\n * const response = await api.get('/recommended-class/drafts', { params: { ...filters, type: 'RASCUNHO' } });\n * return response.data;\n * };\n *\n * const deleteRecommendedClassDraft = async (id) => {\n * await api.delete(`/recommended-class/drafts/${id}`);\n * };\n *\n * const useRecommendedClassDrafts = createUseRecommendedClassDrafts(fetchRecommendedClassDrafts, deleteRecommendedClassDraft);\n *\n * // In your component\n * const { models, loading, error, pagination, fetchModels, deleteModel } = useRecommendedClassDrafts();\n * ```\n */\nexport const createUseRecommendedClassDrafts = (\n fetchRecommendedClassDrafts: (\n filters?: RecommendedClassModelFilters\n ) => Promise<RecommendedClassModelsApiResponse>,\n deleteRecommendedClassDraft: (id: string) => Promise<void>\n) => {\n return (): UseRecommendedClassDraftsReturn => {\n const [state, setState] = useState<UseRecommendedClassDraftsState>({\n models: [],\n loading: false,\n error: null,\n pagination: DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION,\n });\n\n /**\n * Fetch recommendedClass drafts from API\n * @param filters - Optional filters for pagination, search, etc.\n * @param subjectsMap - Map of subject IDs to subject names for display\n */\n const fetchModels = useCallback(\n async (\n filters?: RecommendedClassModelFilters,\n subjectsMap?: Map<string, string>\n ) => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n // Fetch data from API\n const responseData = await fetchRecommendedClassDrafts(filters);\n\n // Validate response with Zod\n const validatedData =\n recommendedClassModelsApiResponseSchema.parse(responseData);\n\n // Transform drafts to table format\n const tableItems = validatedData.data.drafts.map((draft) =>\n transformRecommendedClassModelToTableItem(draft, subjectsMap)\n );\n\n // Calculate pagination\n const limit = filters?.limit || 10;\n const page = filters?.page || 1;\n const total = validatedData.data.total;\n const totalPages = Math.ceil(total / limit);\n\n // Update state with validated and transformed data\n setState({\n models: tableItems,\n loading: false,\n error: null,\n pagination: {\n total,\n page,\n limit,\n totalPages,\n },\n });\n } catch (error) {\n const errorMessage = handleRecommendedClassDraftFetchError(error);\n setState((prev) => ({\n ...prev,\n loading: false,\n error: errorMessage,\n }));\n }\n },\n [fetchRecommendedClassDrafts]\n );\n\n /**\n * Delete a recommendedClass draft\n * @param id - Draft ID to delete\n * @returns True if deletion was successful\n */\n const deleteModel = useCallback(\n async (id: string): Promise<boolean> => {\n try {\n await deleteRecommendedClassDraft(id);\n return true;\n } catch (error) {\n console.error('Erro ao deletar rascunho:', error);\n return false;\n }\n },\n [deleteRecommendedClassDraft]\n );\n\n return {\n ...state,\n fetchModels,\n deleteModel,\n };\n };\n};\n\n/**\n * Alias for createUseRecommendedClassDrafts\n */\nexport const createRecommendedClassDraftsHook = createUseRecommendedClassDrafts;\n","import { useState, useCallback } from 'react';\nimport { z } from 'zod';\nimport dayjs from 'dayjs';\nimport { RecommendedClassDraftType } from '../types/recommendedLessons';\nimport type {\n RecommendedClassModelResponse,\n RecommendedClassModelTableItem,\n RecommendedClassModelsApiResponse,\n RecommendedClassModelFilters,\n RecommendedClassModelPagination,\n} from '../types/recommendedLessons';\nimport { createFetchErrorHandler } from '../utils/hookErrorHandler';\n\n/**\n * Zod schema for recommendedClass model response validation\n */\nconst recommendedClassModelResponseSchema = z.object({\n id: z.string().uuid(),\n type: z.nativeEnum(RecommendedClassDraftType),\n title: z.string(),\n description: z.string().nullable(),\n creatorUserInstitutionId: z.string().uuid(),\n subjectId: z.string().uuid().nullable(),\n startDate: z.string().nullable(),\n finalDate: z.string().nullable(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\n/**\n * Zod schema for recommendedClass models API response validation\n */\nexport const recommendedClassModelsApiResponseSchema = z.object({\n message: z.string(),\n data: z.object({\n drafts: z.array(recommendedClassModelResponseSchema),\n total: z.number(),\n }),\n});\n\n/**\n * Hook state interface\n */\nexport interface UseRecommendedClassModelsState {\n models: RecommendedClassModelTableItem[];\n loading: boolean;\n error: string | null;\n pagination: RecommendedClassModelPagination;\n}\n\n/**\n * Hook return type\n */\nexport interface UseRecommendedClassModelsReturn\n extends UseRecommendedClassModelsState {\n fetchModels: (\n filters?: RecommendedClassModelFilters,\n subjectsMap?: Map<string, string>\n ) => Promise<void>;\n deleteModel: (id: string) => Promise<boolean>;\n}\n\n/**\n * Default pagination values\n */\nexport const DEFAULT_RECOMMENDED_CLASS_MODELS_PAGINATION: RecommendedClassModelPagination =\n {\n total: 0,\n page: 1,\n limit: 10,\n totalPages: 0,\n };\n\n/**\n * Transform API response to table item format\n * @param model - RecommendedClass model from API response\n * @param subjectsMap - Map of subject IDs to subject names\n * @returns Formatted model for table display\n */\nexport const transformRecommendedClassModelToTableItem = (\n model: RecommendedClassModelResponse,\n subjectsMap?: Map<string, string>\n): RecommendedClassModelTableItem => {\n const subjectName = model.subjectId\n ? subjectsMap?.get(model.subjectId) || ''\n : '';\n\n return {\n id: model.id,\n title: model.title || 'Sem título',\n savedAt: dayjs(model.createdAt).format('DD/MM/YYYY'),\n subject: subjectName,\n subjectId: model.subjectId,\n };\n};\n\n/**\n * Handle errors during model fetch\n * Uses the generic error handler factory to reduce code duplication\n */\nexport const handleRecommendedClassModelFetchError = createFetchErrorHandler(\n 'Erro ao validar dados de modelos de aulas',\n 'Erro ao carregar modelos de aulas'\n);\n\n/**\n * Factory function to create useRecommendedClassModels hook\n *\n * @param fetchRecommendedClassModels - Function to fetch models from API\n * @param deleteRecommendedClassModel - Function to delete a model\n * @returns Hook for managing recommendedClass models\n *\n * @example\n * ```tsx\n * // In your app setup\n * const fetchRecommendedClassModels = async (filters) => {\n * const response = await api.get('/recommended-class/drafts', { params: { ...filters, type: 'MODELO' } });\n * return response.data;\n * };\n *\n * const deleteRecommendedClassModel = async (id) => {\n * await api.delete(`/recommended-class/drafts/${id}`);\n * };\n *\n * const useRecommendedClassModels = createUseRecommendedClassModels(fetchRecommendedClassModels, deleteRecommendedClassModel);\n *\n * // In your component\n * const { models, loading, error, pagination, fetchModels, deleteModel } = useRecommendedClassModels();\n * ```\n */\nexport const createUseRecommendedClassModels = (\n fetchRecommendedClassModels: (\n filters?: RecommendedClassModelFilters\n ) => Promise<RecommendedClassModelsApiResponse>,\n deleteRecommendedClassModel: (id: string) => Promise<void>\n) => {\n return (): UseRecommendedClassModelsReturn => {\n const [state, setState] = useState<UseRecommendedClassModelsState>({\n models: [],\n loading: false,\n error: null,\n pagination: DEFAULT_RECOMMENDED_CLASS_MODELS_PAGINATION,\n });\n\n /**\n * Fetch recommendedClass models from API\n * @param filters - Optional filters for pagination, search, etc.\n * @param subjectsMap - Map of subject IDs to subject names for display\n */\n const fetchModels = useCallback(\n async (\n filters?: RecommendedClassModelFilters,\n subjectsMap?: Map<string, string>\n ) => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n // Fetch data from API\n const responseData = await fetchRecommendedClassModels(filters);\n\n // Validate response with Zod\n const validatedData =\n recommendedClassModelsApiResponseSchema.parse(responseData);\n\n // Transform models to table format\n const tableItems = validatedData.data.drafts.map((model) =>\n transformRecommendedClassModelToTableItem(model, subjectsMap)\n );\n\n // Calculate pagination\n const limit = filters?.limit || 10;\n const page = filters?.page || 1;\n const total = validatedData.data.total;\n const totalPages = Math.ceil(total / limit);\n\n // Update state with validated and transformed data\n setState({\n models: tableItems,\n loading: false,\n error: null,\n pagination: {\n total,\n page,\n limit,\n totalPages,\n },\n });\n } catch (error) {\n const errorMessage = handleRecommendedClassModelFetchError(error);\n setState((prev) => ({\n ...prev,\n loading: false,\n error: errorMessage,\n }));\n }\n },\n [fetchRecommendedClassModels]\n );\n\n /**\n * Delete a recommendedClass model\n * @param id - Model ID to delete\n * @returns True if deletion was successful\n */\n const deleteModel = useCallback(\n async (id: string): Promise<boolean> => {\n try {\n await deleteRecommendedClassModel(id);\n return true;\n } catch (error) {\n console.error('Erro ao deletar modelo:', error);\n return false;\n }\n },\n [deleteRecommendedClassModel]\n );\n\n return {\n ...state,\n fetchModels,\n deleteModel,\n };\n };\n};\n\n/**\n * Alias for createUseRecommendedClassModels\n */\nexport const createRecommendedClassModelsHook = createUseRecommendedClassModels;\n","/**\n * Recommended Lessons / Recommended Class (Aulas Recomendadas) Type Definitions\n * Based on /recommended-class/history endpoint\n */\n\nimport {\n GenericApiStatus,\n GenericDisplayStatus,\n BadgeActionType,\n getStatusBadgeAction,\n} from './common';\n\n/**\n * Recommended Class status from backend API\n * Re-exported from common for backward compatibility\n */\nexport { GenericApiStatus as RecommendedClassApiStatus } from './common';\n\n/**\n * Recommended Class status for display in UI (Badge component)\n * Re-exported from common for backward compatibility\n */\nexport { GenericDisplayStatus as RecommendedClassDisplayStatus } from './common';\n\n/**\n * Badge action types for recommended class status visualization\n * Re-exported from common for backward compatibility\n */\nexport { BadgeActionType as RecommendedClassBadgeActionType } from './common';\n\n/**\n * Subject info from API response\n */\nexport interface RecommendedClassSubject {\n id: string;\n name: string;\n}\n\n/**\n * Creator info from API response\n */\nexport interface RecommendedClassCreator {\n id: string;\n name: string;\n}\n\n/**\n * Recommended Class stats from API response\n */\nexport interface RecommendedClassStats {\n totalStudents: number;\n completedCount: number;\n completionPercentage: number;\n}\n\n/**\n * Class breakdown info from API response\n */\nexport interface RecommendedClassBreakdown {\n classId: string;\n className: string;\n schoolId: string;\n schoolName: string;\n studentCount: number;\n completedCount: number;\n}\n\n/**\n * Recommended Class data from API response\n */\nexport interface RecommendedClassData {\n id: string;\n title: string;\n startDate: string | null;\n finalDate: string | null;\n createdAt: string;\n progress: number;\n totalLessons: number;\n}\n\n/**\n * Recommended Class history item from /recommended-class/history endpoint\n */\nexport interface RecommendedClassHistoryItem {\n recommendedClass: RecommendedClassData;\n subject: RecommendedClassSubject | null;\n creator: RecommendedClassCreator | null;\n stats: RecommendedClassStats;\n breakdown: RecommendedClassBreakdown[];\n}\n\n/**\n * Recommended Class table item interface for recommended class list table\n */\nexport interface RecommendedClassTableItem extends Record<string, unknown> {\n id: string;\n startDate: string | null;\n deadline: string | null;\n title: string;\n school: string;\n year: string;\n subject: string;\n class: string;\n status: GenericDisplayStatus;\n completionPercentage: number;\n}\n\n/**\n * Recommended Class history API complete response from /recommended-class/history\n */\nexport interface RecommendedClassHistoryApiResponse {\n message: string;\n data: {\n recommendedClass: RecommendedClassHistoryItem[];\n total: number;\n };\n}\n\n/**\n * Recommended Class history filters for API query parameters\n */\nexport interface RecommendedClassHistoryFilters {\n page?: number;\n limit?: number;\n status?: GenericApiStatus;\n search?: string;\n startDate?: string;\n finalDate?: string;\n subjectId?: string;\n schoolId?: string;\n schoolIds?: string[];\n classId?: string;\n classIds?: string[];\n studentIds?: string[];\n sortBy?: 'createdAt' | 'finalDate' | 'title' | 'completionPercentage';\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Pagination info for recommended class history\n */\nexport interface RecommendedClassHistoryPagination {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n\n/**\n * Filter option for dropdowns\n * Extends with index signature to be compatible with CheckBoxGroup Item type\n */\nexport interface RecommendedClassFilterOption {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * User data for filter options (schools, classes, subjects)\n */\nexport interface RecommendedClassUserFilterData {\n schools?: Array<{ id: string; name: string }>;\n classes?: Array<{ id: string; name: string; schoolId?: string }>;\n subjects?: Array<{ id: string; name: string }>;\n schoolYears?: Array<{ id: string; name: string }>;\n}\n\n/**\n * Get status badge action based on recommended class display status\n * @param status - Recommended Class display status\n * @returns Badge action type for styling\n */\nexport const getRecommendedClassStatusBadgeAction = (\n status: GenericDisplayStatus\n): BadgeActionType => getStatusBadgeAction(status);\n\n/**\n * Recommended Class status options for filter (Vencida and Ativa)\n */\nexport const RECOMMENDED_CLASS_FILTER_STATUS_OPTIONS: RecommendedClassFilterOption[] =\n [\n { id: GenericApiStatus.VENCIDA, name: 'Vencida' },\n { id: GenericApiStatus.A_VENCER, name: 'Ativa' },\n ];\n\n/**\n * All recommended class status options\n */\nexport const RECOMMENDED_CLASS_STATUS_OPTIONS: RecommendedClassFilterOption[] =\n [\n { id: GenericApiStatus.A_VENCER, name: 'A Vencer' },\n { id: GenericApiStatus.VENCIDA, name: 'Vencida' },\n { id: GenericApiStatus.CONCLUIDA, name: 'Concluída' },\n ];\n\n// ============================================\n// Recommended Lesson Details Types\n// Based on /recommended class/{id} and /recommended class/{id}/details endpoints\n// ============================================\n\n/**\n * Student status for display in UI\n */\nexport enum StudentLessonStatus {\n A_INICIAR = 'A INICIAR',\n EM_ANDAMENTO = 'EM ANDAMENTO',\n NAO_FINALIZADO = 'NÃO FINALIZADO',\n CONCLUIDO = 'CONCLUÍDO',\n}\n\n/**\n * Badge action type for student status\n */\nexport const getStudentStatusBadgeAction = (\n status: StudentLessonStatus\n): 'success' | 'warning' | 'error' | 'info' => {\n const actionMap: Record<\n StudentLessonStatus,\n 'success' | 'warning' | 'error' | 'info'\n > = {\n [StudentLessonStatus.CONCLUIDO]: 'success',\n [StudentLessonStatus.EM_ANDAMENTO]: 'info',\n [StudentLessonStatus.A_INICIAR]: 'warning',\n [StudentLessonStatus.NAO_FINALIZADO]: 'error',\n };\n return actionMap[status] ?? 'warning';\n};\n\n/**\n * Checks if a deadline has passed\n * @param deadline - ISO date string of the deadline\n * @returns true if deadline has passed, false otherwise\n */\nexport const isDeadlinePassed = (deadline: string | null): boolean => {\n if (!deadline) return false;\n return new Date(deadline) < new Date();\n};\n\n/**\n * Derives student display status from progress, completedAt, and deadline\n * @param progress - Student progress percentage (0-100)\n * @param completedAt - ISO date string when student completed, or null\n * @param deadline - ISO date string of the recommended class deadline, or null\n * @returns The appropriate StudentLessonStatus\n */\nexport const deriveStudentStatus = (\n progress: number,\n completedAt: string | null,\n deadline?: string | null\n): StudentLessonStatus => {\n // If completed (either by completedAt or 100% progress), it's CONCLUIDO\n if (completedAt) return StudentLessonStatus.CONCLUIDO;\n if (progress === 100) return StudentLessonStatus.CONCLUIDO;\n\n // If deadline passed and not completed, it's NAO_FINALIZADO\n if (isDeadlinePassed(deadline ?? null) && progress < 100) {\n return StudentLessonStatus.NAO_FINALIZADO;\n }\n\n // Otherwise, derive from progress\n if (progress === 0) return StudentLessonStatus.A_INICIAR;\n if (progress > 0) return StudentLessonStatus.EM_ANDAMENTO;\n return StudentLessonStatus.A_INICIAR;\n};\n\n/**\n * Formats days to complete as a readable string\n */\nexport const formatDaysToComplete = (\n daysToComplete: number | null\n): string | null => {\n if (daysToComplete === null) return null;\n if (daysToComplete === 1) return '1 dia';\n return `${daysToComplete} dias`;\n};\n\n// ============================================\n// API Response Types - /recommended class/{id}/details\n// ============================================\n\n/**\n * Student data from /recommended class/{id}/details endpoint\n */\nexport interface RecommendedClassDetailStudent {\n userInstitutionId: string;\n userId: string;\n name: string;\n progress: number;\n completedAt: string | null;\n avgScore: number | null;\n daysToComplete: number | null;\n}\n\n/**\n * Aggregated stats from /recommended class/{id}/details endpoint\n */\nexport interface RecommendedClassDetailAggregated {\n completionPercentage: number;\n avgScore: number | null;\n}\n\n/**\n * Content performance item from /recommended class/{id}/details endpoint\n */\nexport interface RecommendedClassDetailContentPerformanceItem {\n contentId: string;\n contentName: string;\n rate: number;\n}\n\n/**\n * Content performance from /recommended class/{id}/details endpoint\n */\nexport interface RecommendedClassDetailContentPerformance {\n best: RecommendedClassDetailContentPerformanceItem | null;\n worst: RecommendedClassDetailContentPerformanceItem | null;\n}\n\n/**\n * Response data from /recommended class/{id}/details endpoint\n */\nexport interface RecommendedClassDetailsData {\n students: RecommendedClassDetailStudent[];\n aggregated: RecommendedClassDetailAggregated;\n contentPerformance: RecommendedClassDetailContentPerformance;\n}\n\n/**\n * Full API response from /recommended class/{id}/details endpoint\n */\nexport interface RecommendedClassDetailsApiResponse {\n message: string;\n data: RecommendedClassDetailsData;\n}\n\n// ============================================\n// Recommended Class Activity Types - /recommended class/{id} activities\n// ============================================\n\n/**\n * Activity status for recommended class activities\n * Used in activitiesRecommendedClass array from /recommended class/{id} endpoint\n */\nexport const RECOMMENDED_CLASS_ACTIVITY_STATUS = {\n PENDENTE: 'PENDENTE',\n CONCLUIDA: 'CONCLUIDA',\n EXPIRADA: 'EXPIRADA',\n} as const;\n\nexport type RecommendedClassActivityStatus =\n (typeof RECOMMENDED_CLASS_ACTIVITY_STATUS)[keyof typeof RECOMMENDED_CLASS_ACTIVITY_STATUS];\n\n/**\n * Activity details within a recommended class\n */\nexport interface RecommendedClassActivity {\n id: string;\n title: string;\n status: RecommendedClassActivityStatus;\n}\n\n/**\n * User activities within a recommended class\n */\nexport interface RecommendedClassSupUsersActivities {\n id: string;\n activity: RecommendedClassActivity;\n userInstitutionId: string;\n answeredAt: string | null;\n timeSpent: number;\n score: number | null;\n lastInteraction: string;\n}\n\n/**\n * Activities associated with a recommended class\n */\nexport interface RecommendedClassActivities {\n recommendedClassId: string;\n supUsersActivitiesId: string;\n supUsersActivities: RecommendedClassSupUsersActivities;\n}\n\n// ============================================\n// API Response Types - /recommended class/{id}\n// ============================================\n\n/**\n * Subject info from lesson in /recommended class/{id} response\n */\nexport interface RecommendedClassLessonSubject {\n id: string;\n name: string;\n color: string;\n icon: string;\n}\n\n/**\n * Lesson info from /recommended class/{id} response\n */\nexport interface RecommendedClassLesson {\n id: string;\n content: { id: string; name: string };\n subtopic: { id: string; name: string };\n topic: { id: string; name: string };\n subject: RecommendedClassLessonSubject;\n}\n\n/**\n * Lesson progress from /recommended class/{id} response\n */\nexport interface RecommendedClassLessonProgress {\n id: string;\n userId: string;\n lessonId: string;\n progress: number;\n lesson: RecommendedClassLesson;\n}\n\n/**\n * Lesson recommended class item from /recommended class/{id} response\n */\nexport interface RecommendedClassLessonsItem {\n recommendedClassId: string;\n supLessonsProgressId: string;\n supLessonsProgress: RecommendedClassLessonProgress;\n}\n\n/**\n * Recommended Class metadata from /recommended class/{id} endpoint\n */\nexport interface RecommendedClassMetadata {\n id: string;\n title: string;\n startDate: string;\n finalDate: string;\n progress: number;\n lessons: RecommendedClassLessonsItem[];\n activities?: RecommendedClassActivities[];\n}\n\n/**\n * Full API response from /recommended class/{id} endpoint\n */\nexport interface RecommendedClassApiResponse {\n message: string;\n data: RecommendedClassMetadata;\n}\n\n// ============================================\n// Combined Data for Component\n// ============================================\n\n/**\n * Combined data structure for RecommendedLessonDetails component\n * Combines data from /recommended class/{id}, /recommended class/{id}/details, and breakdown info\n */\nexport interface LessonDetailsData {\n /** Recommended Class metadata from /recommended class/{id} */\n recommendedClass: RecommendedClassMetadata;\n /** Details from /recommended class/{id}/details */\n details: RecommendedClassDetailsData;\n /** Optional breakdown info from /recommended-class/history */\n breakdown?: RecommendedClassBreakdown;\n}\n\n// ============================================\n// Recommended Class Draft/Model Types\n// Based on /recommended-class/drafts endpoint\n// ============================================\n\n/**\n * Recommended Class draft type enum - matches backend RECOMMENDED_CLASS_DRAFT_TYPE\n */\nexport enum RecommendedClassDraftType {\n MODELO = 'MODELO',\n RASCUNHO = 'RASCUNHO',\n}\n\n/**\n * Recommended Class model response from backend API /recommended-class/drafts\n */\nexport interface RecommendedClassModelResponse {\n id: string;\n type: RecommendedClassDraftType;\n title: string;\n description: string | null;\n creatorUserInstitutionId: string;\n subjectId: string | null;\n startDate: string | null;\n finalDate: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Recommended Class model table item for display in models table\n */\nexport interface RecommendedClassModelTableItem\n extends Record<string, unknown> {\n id: string;\n title: string;\n savedAt: string;\n subject: string;\n subjectId: string | null;\n}\n\n/**\n * Recommended Class models API complete response from /recommended-class/drafts\n */\nexport interface RecommendedClassModelsApiResponse {\n message: string;\n data: {\n drafts: RecommendedClassModelResponse[];\n total: number;\n };\n}\n\n/**\n * Recommended Class model filters for API query parameters\n */\nexport interface RecommendedClassModelFilters {\n page?: number;\n limit?: number;\n search?: string;\n subjectId?: string;\n type?: RecommendedClassDraftType;\n}\n\n/**\n * Pagination info for recommended class models\n */\nexport interface RecommendedClassModelPagination {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n","import { z } from 'zod';\n\n/**\n * Factory function to create a fetch error handler\n * This reduces code duplication across data fetching hooks\n *\n * @param validationErrorMessage - Message to display for Zod validation errors\n * @param genericErrorMessage - Message to display for other errors\n * @returns Error handler function that returns appropriate error message\n *\n * @example\n * ```typescript\n * const handleFetchError = createFetchErrorHandler(\n * 'Erro ao validar dados',\n * 'Erro ao carregar dados'\n * );\n *\n * try {\n * // fetch data\n * } catch (error) {\n * const errorMessage = handleFetchError(error);\n * }\n * ```\n */\nexport const createFetchErrorHandler =\n (validationErrorMessage: string, genericErrorMessage: string) =>\n (error: unknown): string => {\n if (error instanceof z.ZodError) {\n console.error(validationErrorMessage, error);\n return validationErrorMessage;\n }\n\n console.error(genericErrorMessage, error);\n return genericErrorMessage;\n };\n"],"mappings":"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","names":["import_react","import_zod","RecommendedClassDraftType","dayjs"]}
|