analytica-frontend-lib 1.2.51 → 1.2.52
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.css +19387 -0
- package/dist/ActivitiesHistory/index.css.map +1 -0
- package/dist/ActivitiesHistory/index.d.ts +2 -0
- package/dist/ActivitiesHistory/index.d.ts.map +1 -0
- package/dist/ActivitiesHistory/index.js +7381 -0
- package/dist/ActivitiesHistory/index.js.map +1 -0
- package/dist/ActivitiesHistory/index.mjs +7424 -0
- package/dist/ActivitiesHistory/index.mjs.map +1 -0
- package/dist/ActivityCardQuestionBanks/index.css +13 -0
- package/dist/ActivityCardQuestionBanks/index.css.map +1 -1
- package/dist/ActivityCardQuestionPreview/index.css +13 -0
- package/dist/ActivityCardQuestionPreview/index.css.map +1 -1
- package/dist/ActivityDetails/index.css +13 -0
- package/dist/ActivityDetails/index.css.map +1 -1
- package/dist/ActivityFilters/index.css +13 -0
- package/dist/ActivityFilters/index.css.map +1 -1
- package/dist/ActivityPreview/index.css +13 -0
- package/dist/ActivityPreview/index.css.map +1 -1
- package/dist/AlertManager/index.css +13 -0
- package/dist/AlertManager/index.css.map +1 -1
- package/dist/RecommendedLessonsHistory/index.css +13 -0
- package/dist/RecommendedLessonsHistory/index.css.map +1 -1
- package/dist/RecommendedLessonsHistory/index.js +10 -2
- package/dist/RecommendedLessonsHistory/index.js.map +1 -1
- package/dist/RecommendedLessonsHistory/index.mjs +10 -2
- package/dist/RecommendedLessonsHistory/index.mjs.map +1 -1
- package/dist/SendActivityModal/SendActivityModal.css +13 -0
- package/dist/SendActivityModal/SendActivityModal.css.map +1 -1
- package/dist/SendActivityModal/index.css +13 -0
- package/dist/SendActivityModal/index.css.map +1 -1
- package/dist/TableProvider/index.css +13 -0
- package/dist/TableProvider/index.css.map +1 -1
- package/dist/hooks/useActivitiesHistory/index.d.ts +210 -0
- package/dist/hooks/useActivitiesHistory/index.d.ts.map +1 -0
- package/dist/hooks/useActivitiesHistory/index.js +181 -0
- package/dist/hooks/useActivitiesHistory/index.js.map +1 -0
- package/dist/hooks/useActivitiesHistory/index.mjs +141 -0
- package/dist/hooks/useActivitiesHistory/index.mjs.map +1 -0
- package/dist/hooks/useActivitiesHistory.d.ts +210 -0
- package/dist/hooks/useActivitiesHistory.d.ts.map +1 -0
- package/dist/hooks/useActivityModels/index.d.ts +220 -0
- package/dist/hooks/useActivityModels/index.d.ts.map +1 -0
- package/dist/hooks/useActivityModels/index.js +186 -0
- package/dist/hooks/useActivityModels/index.js.map +1 -0
- package/dist/hooks/useActivityModels/index.mjs +146 -0
- package/dist/hooks/useActivityModels/index.mjs.map +1 -0
- package/dist/hooks/useActivityModels.d.ts +220 -0
- package/dist/hooks/useActivityModels.d.ts.map +1 -0
- package/dist/index.css +13 -0
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1069 -23
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1049 -23
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +13 -0
- package/dist/styles.css.map +1 -1
- package/dist/types/activitiesHistory/index.d.ts +196 -0
- package/dist/types/activitiesHistory/index.d.ts.map +1 -0
- package/dist/types/activitiesHistory/index.js +92 -0
- package/dist/types/activitiesHistory/index.js.map +1 -0
- package/dist/types/activitiesHistory/index.mjs +59 -0
- package/dist/types/activitiesHistory/index.mjs.map +1 -0
- package/dist/types/activitiesHistory.d.ts +196 -0
- package/dist/types/activitiesHistory.d.ts.map +1 -0
- package/dist/types/common.d.ts +44 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/recommendedLessons/index.d.ts +10 -18
- package/dist/types/recommendedLessons/index.d.ts.map +1 -1
- package/dist/types/recommendedLessons/index.js +27 -22
- package/dist/types/recommendedLessons/index.js.map +1 -1
- package/dist/types/recommendedLessons/index.mjs +26 -23
- package/dist/types/recommendedLessons/index.mjs.map +1 -1
- package/dist/types/recommendedLessons.d.ts +10 -18
- package/dist/types/recommendedLessons.d.ts.map +1 -1
- package/dist/utils/hookErrorHandler.d.ts +24 -0
- package/dist/utils/hookErrorHandler.d.ts.map +1 -0
- package/package.json +7 -1
- package/dist/RecommendedLessonDetails/index.d.ts +0 -5
- package/dist/RecommendedLessonDetails/index.d.ts.map +0 -1
- package/dist/RecommendedLessonDetails/index.js +0 -4854
- package/dist/RecommendedLessonDetails/index.js.map +0 -1
- package/dist/RecommendedLessonDetails/index.mjs +0 -4872
- package/dist/RecommendedLessonDetails/index.mjs.map +0 -1
- package/dist/hooks/useRecommendedLessonDetails/index.d.ts +0 -780
- package/dist/hooks/useRecommendedLessonDetails/index.d.ts.map +0 -1
- package/dist/hooks/useRecommendedLessonDetails/index.js +0 -204
- package/dist/hooks/useRecommendedLessonDetails/index.js.map +0 -1
- package/dist/hooks/useRecommendedLessonDetails/index.mjs +0 -174
- package/dist/hooks/useRecommendedLessonDetails/index.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useRecommendedLessonDetails.d.ts","sourceRoot":"","sources":["../../src/hooks/useRecommendedLessonDetails.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EACV,iBAAiB,EAIjB,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,6BAA6B,CAAC;AAmErC;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGhC,CAAC;AAmDH;;GAEG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGvC,CAAC;AAsBH;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMnC,CAAC;AAMH;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iCACf,SAAQ,gCAAgC;IACxC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,2CAA2C;IAC3C,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IACpD,kDAAkD;IAClD,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAClE,gEAAgE;IAChE,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;CACnE;AAMD;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,GAAI,OAAO,OAAO,KAAG,MAQ9D,CAAC;AAMF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,iCAAiC,GAC5C,WAAW,sBAAsB,MAEzB,UAAU,MAAM,GAAG,SAAS,KAAG,iCAwFxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kCAAkC,cA/FlC,sBAAsB,MAEzB,UAAU,MAAM,GAAG,SAAS,KAAG,iCA8FN,CAAC"}
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/hooks/useRecommendedLessonDetails.ts
|
|
21
|
-
var useRecommendedLessonDetails_exports = {};
|
|
22
|
-
__export(useRecommendedLessonDetails_exports, {
|
|
23
|
-
createRecommendedLessonDetailsHook: () => createRecommendedLessonDetailsHook,
|
|
24
|
-
createUseRecommendedLessonDetails: () => createUseRecommendedLessonDetails,
|
|
25
|
-
goalApiResponseSchema: () => goalApiResponseSchema,
|
|
26
|
-
goalDetailsApiResponseSchema: () => goalDetailsApiResponseSchema,
|
|
27
|
-
handleLessonDetailsFetchError: () => handleLessonDetailsFetchError,
|
|
28
|
-
historyApiResponseSchema: () => historyApiResponseSchema
|
|
29
|
-
});
|
|
30
|
-
module.exports = __toCommonJS(useRecommendedLessonDetails_exports);
|
|
31
|
-
var import_react = require("react");
|
|
32
|
-
var import_zod = require("zod");
|
|
33
|
-
var goalLessonSubjectSchema = import_zod.z.object({
|
|
34
|
-
id: import_zod.z.string(),
|
|
35
|
-
name: import_zod.z.string(),
|
|
36
|
-
color: import_zod.z.string(),
|
|
37
|
-
icon: import_zod.z.string()
|
|
38
|
-
});
|
|
39
|
-
var lessonContentSchema = import_zod.z.object({
|
|
40
|
-
id: import_zod.z.string(),
|
|
41
|
-
name: import_zod.z.string()
|
|
42
|
-
});
|
|
43
|
-
var goalLessonSchema = import_zod.z.object({
|
|
44
|
-
id: import_zod.z.string(),
|
|
45
|
-
content: lessonContentSchema,
|
|
46
|
-
subtopic: lessonContentSchema,
|
|
47
|
-
topic: lessonContentSchema,
|
|
48
|
-
subject: goalLessonSubjectSchema
|
|
49
|
-
});
|
|
50
|
-
var goalLessonProgressSchema = import_zod.z.object({
|
|
51
|
-
id: import_zod.z.string(),
|
|
52
|
-
userId: import_zod.z.string(),
|
|
53
|
-
lessonId: import_zod.z.string(),
|
|
54
|
-
progress: import_zod.z.number(),
|
|
55
|
-
lesson: goalLessonSchema
|
|
56
|
-
});
|
|
57
|
-
var goalLessonGoalItemSchema = import_zod.z.object({
|
|
58
|
-
goalId: import_zod.z.string(),
|
|
59
|
-
supLessonsProgressId: import_zod.z.string(),
|
|
60
|
-
supLessonsProgress: goalLessonProgressSchema
|
|
61
|
-
});
|
|
62
|
-
var goalMetadataSchema = import_zod.z.object({
|
|
63
|
-
id: import_zod.z.string(),
|
|
64
|
-
title: import_zod.z.string(),
|
|
65
|
-
startDate: import_zod.z.string(),
|
|
66
|
-
finalDate: import_zod.z.string(),
|
|
67
|
-
progress: import_zod.z.number(),
|
|
68
|
-
lessonsGoals: import_zod.z.array(goalLessonGoalItemSchema)
|
|
69
|
-
});
|
|
70
|
-
var goalApiResponseSchema = import_zod.z.object({
|
|
71
|
-
message: import_zod.z.string(),
|
|
72
|
-
data: goalMetadataSchema
|
|
73
|
-
});
|
|
74
|
-
var goalDetailStudentSchema = import_zod.z.object({
|
|
75
|
-
userInstitutionId: import_zod.z.string(),
|
|
76
|
-
userId: import_zod.z.string(),
|
|
77
|
-
name: import_zod.z.string(),
|
|
78
|
-
progress: import_zod.z.number(),
|
|
79
|
-
completedAt: import_zod.z.string().nullable(),
|
|
80
|
-
avgScore: import_zod.z.number().nullable(),
|
|
81
|
-
daysToComplete: import_zod.z.number().nullable()
|
|
82
|
-
});
|
|
83
|
-
var goalDetailAggregatedSchema = import_zod.z.object({
|
|
84
|
-
completionPercentage: import_zod.z.number(),
|
|
85
|
-
avgScore: import_zod.z.number().nullable()
|
|
86
|
-
});
|
|
87
|
-
var goalDetailContentPerformanceItemSchema = import_zod.z.object({
|
|
88
|
-
contentId: import_zod.z.string(),
|
|
89
|
-
contentName: import_zod.z.string(),
|
|
90
|
-
rate: import_zod.z.number()
|
|
91
|
-
}).nullable();
|
|
92
|
-
var goalDetailContentPerformanceSchema = import_zod.z.object({
|
|
93
|
-
best: goalDetailContentPerformanceItemSchema,
|
|
94
|
-
worst: goalDetailContentPerformanceItemSchema
|
|
95
|
-
});
|
|
96
|
-
var goalDetailsDataSchema = import_zod.z.object({
|
|
97
|
-
students: import_zod.z.array(goalDetailStudentSchema),
|
|
98
|
-
aggregated: goalDetailAggregatedSchema,
|
|
99
|
-
contentPerformance: goalDetailContentPerformanceSchema
|
|
100
|
-
});
|
|
101
|
-
var goalDetailsApiResponseSchema = import_zod.z.object({
|
|
102
|
-
message: import_zod.z.string(),
|
|
103
|
-
data: goalDetailsDataSchema
|
|
104
|
-
});
|
|
105
|
-
var goalBreakdownSchema = import_zod.z.object({
|
|
106
|
-
classId: import_zod.z.string().uuid(),
|
|
107
|
-
className: import_zod.z.string(),
|
|
108
|
-
schoolId: import_zod.z.string(),
|
|
109
|
-
schoolName: import_zod.z.string(),
|
|
110
|
-
studentCount: import_zod.z.number(),
|
|
111
|
-
completedCount: import_zod.z.number()
|
|
112
|
-
});
|
|
113
|
-
var historyGoalItemSchema = import_zod.z.object({
|
|
114
|
-
goal: import_zod.z.object({ id: import_zod.z.string().uuid() }),
|
|
115
|
-
breakdown: import_zod.z.array(goalBreakdownSchema)
|
|
116
|
-
});
|
|
117
|
-
var historyApiResponseSchema = import_zod.z.object({
|
|
118
|
-
message: import_zod.z.string(),
|
|
119
|
-
data: import_zod.z.object({
|
|
120
|
-
goals: import_zod.z.array(historyGoalItemSchema),
|
|
121
|
-
total: import_zod.z.number()
|
|
122
|
-
})
|
|
123
|
-
});
|
|
124
|
-
var handleLessonDetailsFetchError = (error) => {
|
|
125
|
-
if (error instanceof import_zod.z.ZodError) {
|
|
126
|
-
console.error("Erro ao validar dados dos detalhes da aula:", error);
|
|
127
|
-
return "Erro ao validar dados dos detalhes da aula";
|
|
128
|
-
}
|
|
129
|
-
console.error("Erro ao carregar detalhes da aula:", error);
|
|
130
|
-
return "Erro ao carregar detalhes da aula";
|
|
131
|
-
};
|
|
132
|
-
var createUseRecommendedLessonDetails = (apiClient) => {
|
|
133
|
-
return (lessonId) => {
|
|
134
|
-
const [state, setState] = (0, import_react.useState)({
|
|
135
|
-
data: null,
|
|
136
|
-
loading: true,
|
|
137
|
-
error: null
|
|
138
|
-
});
|
|
139
|
-
const fetchLessonDetails = (0, import_react.useCallback)(async () => {
|
|
140
|
-
if (!lessonId) {
|
|
141
|
-
setState({
|
|
142
|
-
data: null,
|
|
143
|
-
loading: false,
|
|
144
|
-
error: "ID da aula n\xE3o encontrado"
|
|
145
|
-
});
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
149
|
-
try {
|
|
150
|
-
const promises = [
|
|
151
|
-
apiClient.fetchGoal(lessonId),
|
|
152
|
-
apiClient.fetchGoalDetails(lessonId),
|
|
153
|
-
apiClient.fetchBreakdown ? apiClient.fetchBreakdown(lessonId) : Promise.resolve(null)
|
|
154
|
-
];
|
|
155
|
-
const [goalResponse, detailsResponse, historyResponse] = await Promise.all(promises);
|
|
156
|
-
const validatedGoal = goalApiResponseSchema.parse(goalResponse);
|
|
157
|
-
const validatedDetails = goalDetailsApiResponseSchema.parse(detailsResponse);
|
|
158
|
-
let breakdown;
|
|
159
|
-
if (historyResponse) {
|
|
160
|
-
const validatedHistory = historyApiResponseSchema.parse(historyResponse);
|
|
161
|
-
const historyItem = validatedHistory.data.goals.find(
|
|
162
|
-
(g) => g.goal.id === lessonId
|
|
163
|
-
);
|
|
164
|
-
breakdown = historyItem?.breakdown[0];
|
|
165
|
-
}
|
|
166
|
-
const lessonData = {
|
|
167
|
-
goal: validatedGoal.data,
|
|
168
|
-
details: validatedDetails.data,
|
|
169
|
-
breakdown
|
|
170
|
-
};
|
|
171
|
-
setState({
|
|
172
|
-
data: lessonData,
|
|
173
|
-
loading: false,
|
|
174
|
-
error: null
|
|
175
|
-
});
|
|
176
|
-
} catch (error) {
|
|
177
|
-
const errorMessage = handleLessonDetailsFetchError(error);
|
|
178
|
-
setState({
|
|
179
|
-
data: null,
|
|
180
|
-
loading: false,
|
|
181
|
-
error: errorMessage
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
}, [lessonId]);
|
|
185
|
-
(0, import_react.useEffect)(() => {
|
|
186
|
-
fetchLessonDetails();
|
|
187
|
-
}, [fetchLessonDetails]);
|
|
188
|
-
return {
|
|
189
|
-
...state,
|
|
190
|
-
refetch: fetchLessonDetails
|
|
191
|
-
};
|
|
192
|
-
};
|
|
193
|
-
};
|
|
194
|
-
var createRecommendedLessonDetailsHook = createUseRecommendedLessonDetails;
|
|
195
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
196
|
-
0 && (module.exports = {
|
|
197
|
-
createRecommendedLessonDetailsHook,
|
|
198
|
-
createUseRecommendedLessonDetails,
|
|
199
|
-
goalApiResponseSchema,
|
|
200
|
-
goalDetailsApiResponseSchema,
|
|
201
|
-
handleLessonDetailsFetchError,
|
|
202
|
-
historyApiResponseSchema
|
|
203
|
-
});
|
|
204
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/useRecommendedLessonDetails.ts"],"sourcesContent":["import { useState, useCallback, useEffect } from 'react';\nimport { z } from 'zod';\nimport type {\n LessonDetailsData,\n GoalMetadata,\n GoalDetailsData,\n GoalBreakdown,\n GoalApiResponse,\n GoalDetailsApiResponse,\n GoalsHistoryApiResponse,\n} from '../types/recommendedLessons';\n\n// ============================================\n// Zod Schemas for API Response Validation\n// ============================================\n\n/**\n * Schema for subject in lesson\n */\nconst goalLessonSubjectSchema = z.object({\n id: z.string(),\n name: z.string(),\n color: z.string(),\n icon: z.string(),\n});\n\n/**\n * Schema for lesson content/subtopic/topic\n */\nconst lessonContentSchema = z.object({\n id: z.string(),\n name: z.string(),\n});\n\n/**\n * Schema for lesson in goal\n */\nconst goalLessonSchema = z.object({\n id: z.string(),\n content: lessonContentSchema,\n subtopic: lessonContentSchema,\n topic: lessonContentSchema,\n subject: goalLessonSubjectSchema,\n});\n\n/**\n * Schema for lesson progress\n */\nconst goalLessonProgressSchema = z.object({\n id: z.string(),\n userId: z.string(),\n lessonId: z.string(),\n progress: z.number(),\n lesson: goalLessonSchema,\n});\n\n/**\n * Schema for lesson goal item\n */\nconst goalLessonGoalItemSchema = z.object({\n goalId: z.string(),\n supLessonsProgressId: z.string(),\n supLessonsProgress: goalLessonProgressSchema,\n});\n\n/**\n * Schema for goal metadata from /goals/{id}\n */\nconst goalMetadataSchema = z.object({\n id: z.string(),\n title: z.string(),\n startDate: z.string(),\n finalDate: z.string(),\n progress: z.number(),\n lessonsGoals: z.array(goalLessonGoalItemSchema),\n});\n\n/**\n * Schema for /goals/{id} API response\n */\nexport const goalApiResponseSchema = z.object({\n message: z.string(),\n data: goalMetadataSchema,\n});\n\n/**\n * Schema for student in details\n */\nconst goalDetailStudentSchema = z.object({\n userInstitutionId: z.string(),\n userId: z.string(),\n name: z.string(),\n progress: z.number(),\n completedAt: z.string().nullable(),\n avgScore: z.number().nullable(),\n daysToComplete: z.number().nullable(),\n});\n\n/**\n * Schema for aggregated stats\n */\nconst goalDetailAggregatedSchema = z.object({\n completionPercentage: z.number(),\n avgScore: z.number().nullable(),\n});\n\n/**\n * Schema for content performance item\n */\nconst goalDetailContentPerformanceItemSchema = z\n .object({\n contentId: z.string(),\n contentName: z.string(),\n rate: z.number(),\n })\n .nullable();\n\n/**\n * Schema for content performance\n */\nconst goalDetailContentPerformanceSchema = z.object({\n best: goalDetailContentPerformanceItemSchema,\n worst: goalDetailContentPerformanceItemSchema,\n});\n\n/**\n * Schema for details data from /goals/{id}/details\n */\nconst goalDetailsDataSchema = z.object({\n students: z.array(goalDetailStudentSchema),\n aggregated: goalDetailAggregatedSchema,\n contentPerformance: goalDetailContentPerformanceSchema,\n});\n\n/**\n * Schema for /goals/{id}/details API response\n */\nexport const goalDetailsApiResponseSchema = z.object({\n message: z.string(),\n data: goalDetailsDataSchema,\n});\n\n/**\n * Schema for breakdown item from history\n */\nconst goalBreakdownSchema = z.object({\n classId: z.string().uuid(),\n className: z.string(),\n schoolId: z.string(),\n schoolName: z.string(),\n studentCount: z.number(),\n completedCount: z.number(),\n});\n\n/**\n * Schema for history goal item (partial, only what we need)\n */\nconst historyGoalItemSchema = z.object({\n goal: z.object({ id: z.string().uuid() }),\n breakdown: z.array(goalBreakdownSchema),\n});\n\n/**\n * Schema for history API response (partial)\n */\nexport const historyApiResponseSchema = z.object({\n message: z.string(),\n data: z.object({\n goals: z.array(historyGoalItemSchema),\n total: z.number(),\n }),\n});\n\n// ============================================\n// Hook Types\n// ============================================\n\n/**\n * Hook state interface\n */\nexport interface UseRecommendedLessonDetailsState {\n data: LessonDetailsData | null;\n loading: boolean;\n error: string | null;\n}\n\n/**\n * Hook return type\n */\nexport interface UseRecommendedLessonDetailsReturn\n extends UseRecommendedLessonDetailsState {\n refetch: () => Promise<void>;\n}\n\n/**\n * API client interface for fetching lesson details\n */\nexport interface LessonDetailsApiClient {\n /** Fetch goal metadata from /goals/{id} */\n fetchGoal: (id: string) => Promise<GoalApiResponse>;\n /** Fetch goal details from /goals/{id}/details */\n fetchGoalDetails: (id: string) => Promise<GoalDetailsApiResponse>;\n /** Optional: Fetch breakdown from /recommended-class/history */\n fetchBreakdown?: (id: string) => Promise<GoalsHistoryApiResponse>;\n}\n\n// ============================================\n// Error Handling\n// ============================================\n\n/**\n * Handle errors during lesson details fetch\n * @param error - Error object\n * @returns Error message for UI display\n */\nexport const handleLessonDetailsFetchError = (error: unknown): string => {\n if (error instanceof z.ZodError) {\n console.error('Erro ao validar dados dos detalhes da aula:', error);\n return 'Erro ao validar dados dos detalhes da aula';\n }\n\n console.error('Erro ao carregar detalhes da aula:', error);\n return 'Erro ao carregar detalhes da aula';\n};\n\n// ============================================\n// Hook Factory\n// ============================================\n\n/**\n * Factory function to create useRecommendedLessonDetails hook\n *\n * @param apiClient - Object containing API fetch functions\n * @returns Hook for managing recommended lesson details\n *\n * @example\n * ```tsx\n * // In your app setup\n * const apiClient = {\n * fetchGoal: async (id) => {\n * const response = await api.get(`/goals/${id}`);\n * return response.data;\n * },\n * fetchGoalDetails: async (id) => {\n * const response = await api.get(`/goals/${id}/details`);\n * return response.data;\n * },\n * fetchBreakdown: async (id) => {\n * const response = await api.get(`/recommended-class/history?search=${id}&limit=1`);\n * return response.data;\n * },\n * };\n *\n * const useGoalDetails = createUseRecommendedLessonDetails(apiClient);\n *\n * // In your component\n * const { data, loading, error, refetch } = useGoalDetails('goal-id-123');\n * ```\n */\nexport const createUseRecommendedLessonDetails = (\n apiClient: LessonDetailsApiClient\n) => {\n return (lessonId: string | undefined): UseRecommendedLessonDetailsReturn => {\n const [state, setState] = useState<UseRecommendedLessonDetailsState>({\n data: null,\n loading: true,\n error: null,\n });\n\n /**\n * Fetch lesson details from multiple API endpoints\n */\n const fetchLessonDetails = useCallback(async () => {\n if (!lessonId) {\n setState({\n data: null,\n loading: false,\n error: 'ID da aula não encontrado',\n });\n return;\n }\n\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n // Fetch goal metadata and details in parallel\n // Breakdown is optional\n const promises: [\n Promise<GoalApiResponse>,\n Promise<GoalDetailsApiResponse>,\n Promise<GoalsHistoryApiResponse | null>,\n ] = [\n apiClient.fetchGoal(lessonId),\n apiClient.fetchGoalDetails(lessonId),\n apiClient.fetchBreakdown\n ? apiClient.fetchBreakdown(lessonId)\n : Promise.resolve(null),\n ];\n\n const [goalResponse, detailsResponse, historyResponse] =\n await Promise.all(promises);\n\n // Validate responses with Zod\n const validatedGoal = goalApiResponseSchema.parse(goalResponse);\n const validatedDetails =\n goalDetailsApiResponseSchema.parse(detailsResponse);\n\n // Extract and validate breakdown if available\n let breakdown: GoalBreakdown | undefined;\n if (historyResponse) {\n const validatedHistory =\n historyApiResponseSchema.parse(historyResponse);\n const historyItem = validatedHistory.data.goals.find(\n (g) => g.goal.id === lessonId\n );\n breakdown = historyItem?.breakdown[0];\n }\n\n // Combine data\n const lessonData: LessonDetailsData = {\n goal: validatedGoal.data as GoalMetadata,\n details: validatedDetails.data as GoalDetailsData,\n breakdown,\n };\n\n setState({\n data: lessonData,\n loading: false,\n error: null,\n });\n } catch (error) {\n const errorMessage = handleLessonDetailsFetchError(error);\n setState({\n data: null,\n loading: false,\n error: errorMessage,\n });\n }\n }, [lessonId]);\n\n // Fetch on mount and when lessonId changes\n useEffect(() => {\n fetchLessonDetails();\n }, [fetchLessonDetails]);\n\n return {\n ...state,\n refetch: fetchLessonDetails,\n };\n };\n};\n\n/**\n * Alias for createUseRecommendedLessonDetails\n */\nexport const createRecommendedLessonDetailsHook =\n createUseRecommendedLessonDetails;\n"],"mappings":"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","names":[]}
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
// src/hooks/useRecommendedLessonDetails.ts
|
|
2
|
-
import { useState, useCallback, useEffect } from "react";
|
|
3
|
-
import { z } from "zod";
|
|
4
|
-
var goalLessonSubjectSchema = z.object({
|
|
5
|
-
id: z.string(),
|
|
6
|
-
name: z.string(),
|
|
7
|
-
color: z.string(),
|
|
8
|
-
icon: z.string()
|
|
9
|
-
});
|
|
10
|
-
var lessonContentSchema = z.object({
|
|
11
|
-
id: z.string(),
|
|
12
|
-
name: z.string()
|
|
13
|
-
});
|
|
14
|
-
var goalLessonSchema = z.object({
|
|
15
|
-
id: z.string(),
|
|
16
|
-
content: lessonContentSchema,
|
|
17
|
-
subtopic: lessonContentSchema,
|
|
18
|
-
topic: lessonContentSchema,
|
|
19
|
-
subject: goalLessonSubjectSchema
|
|
20
|
-
});
|
|
21
|
-
var goalLessonProgressSchema = z.object({
|
|
22
|
-
id: z.string(),
|
|
23
|
-
userId: z.string(),
|
|
24
|
-
lessonId: z.string(),
|
|
25
|
-
progress: z.number(),
|
|
26
|
-
lesson: goalLessonSchema
|
|
27
|
-
});
|
|
28
|
-
var goalLessonGoalItemSchema = z.object({
|
|
29
|
-
goalId: z.string(),
|
|
30
|
-
supLessonsProgressId: z.string(),
|
|
31
|
-
supLessonsProgress: goalLessonProgressSchema
|
|
32
|
-
});
|
|
33
|
-
var goalMetadataSchema = z.object({
|
|
34
|
-
id: z.string(),
|
|
35
|
-
title: z.string(),
|
|
36
|
-
startDate: z.string(),
|
|
37
|
-
finalDate: z.string(),
|
|
38
|
-
progress: z.number(),
|
|
39
|
-
lessonsGoals: z.array(goalLessonGoalItemSchema)
|
|
40
|
-
});
|
|
41
|
-
var goalApiResponseSchema = z.object({
|
|
42
|
-
message: z.string(),
|
|
43
|
-
data: goalMetadataSchema
|
|
44
|
-
});
|
|
45
|
-
var goalDetailStudentSchema = z.object({
|
|
46
|
-
userInstitutionId: z.string(),
|
|
47
|
-
userId: z.string(),
|
|
48
|
-
name: z.string(),
|
|
49
|
-
progress: z.number(),
|
|
50
|
-
completedAt: z.string().nullable(),
|
|
51
|
-
avgScore: z.number().nullable(),
|
|
52
|
-
daysToComplete: z.number().nullable()
|
|
53
|
-
});
|
|
54
|
-
var goalDetailAggregatedSchema = z.object({
|
|
55
|
-
completionPercentage: z.number(),
|
|
56
|
-
avgScore: z.number().nullable()
|
|
57
|
-
});
|
|
58
|
-
var goalDetailContentPerformanceItemSchema = z.object({
|
|
59
|
-
contentId: z.string(),
|
|
60
|
-
contentName: z.string(),
|
|
61
|
-
rate: z.number()
|
|
62
|
-
}).nullable();
|
|
63
|
-
var goalDetailContentPerformanceSchema = z.object({
|
|
64
|
-
best: goalDetailContentPerformanceItemSchema,
|
|
65
|
-
worst: goalDetailContentPerformanceItemSchema
|
|
66
|
-
});
|
|
67
|
-
var goalDetailsDataSchema = z.object({
|
|
68
|
-
students: z.array(goalDetailStudentSchema),
|
|
69
|
-
aggregated: goalDetailAggregatedSchema,
|
|
70
|
-
contentPerformance: goalDetailContentPerformanceSchema
|
|
71
|
-
});
|
|
72
|
-
var goalDetailsApiResponseSchema = z.object({
|
|
73
|
-
message: z.string(),
|
|
74
|
-
data: goalDetailsDataSchema
|
|
75
|
-
});
|
|
76
|
-
var goalBreakdownSchema = z.object({
|
|
77
|
-
classId: z.string().uuid(),
|
|
78
|
-
className: z.string(),
|
|
79
|
-
schoolId: z.string(),
|
|
80
|
-
schoolName: z.string(),
|
|
81
|
-
studentCount: z.number(),
|
|
82
|
-
completedCount: z.number()
|
|
83
|
-
});
|
|
84
|
-
var historyGoalItemSchema = z.object({
|
|
85
|
-
goal: z.object({ id: z.string().uuid() }),
|
|
86
|
-
breakdown: z.array(goalBreakdownSchema)
|
|
87
|
-
});
|
|
88
|
-
var historyApiResponseSchema = z.object({
|
|
89
|
-
message: z.string(),
|
|
90
|
-
data: z.object({
|
|
91
|
-
goals: z.array(historyGoalItemSchema),
|
|
92
|
-
total: z.number()
|
|
93
|
-
})
|
|
94
|
-
});
|
|
95
|
-
var handleLessonDetailsFetchError = (error) => {
|
|
96
|
-
if (error instanceof z.ZodError) {
|
|
97
|
-
console.error("Erro ao validar dados dos detalhes da aula:", error);
|
|
98
|
-
return "Erro ao validar dados dos detalhes da aula";
|
|
99
|
-
}
|
|
100
|
-
console.error("Erro ao carregar detalhes da aula:", error);
|
|
101
|
-
return "Erro ao carregar detalhes da aula";
|
|
102
|
-
};
|
|
103
|
-
var createUseRecommendedLessonDetails = (apiClient) => {
|
|
104
|
-
return (lessonId) => {
|
|
105
|
-
const [state, setState] = useState({
|
|
106
|
-
data: null,
|
|
107
|
-
loading: true,
|
|
108
|
-
error: null
|
|
109
|
-
});
|
|
110
|
-
const fetchLessonDetails = useCallback(async () => {
|
|
111
|
-
if (!lessonId) {
|
|
112
|
-
setState({
|
|
113
|
-
data: null,
|
|
114
|
-
loading: false,
|
|
115
|
-
error: "ID da aula n\xE3o encontrado"
|
|
116
|
-
});
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
120
|
-
try {
|
|
121
|
-
const promises = [
|
|
122
|
-
apiClient.fetchGoal(lessonId),
|
|
123
|
-
apiClient.fetchGoalDetails(lessonId),
|
|
124
|
-
apiClient.fetchBreakdown ? apiClient.fetchBreakdown(lessonId) : Promise.resolve(null)
|
|
125
|
-
];
|
|
126
|
-
const [goalResponse, detailsResponse, historyResponse] = await Promise.all(promises);
|
|
127
|
-
const validatedGoal = goalApiResponseSchema.parse(goalResponse);
|
|
128
|
-
const validatedDetails = goalDetailsApiResponseSchema.parse(detailsResponse);
|
|
129
|
-
let breakdown;
|
|
130
|
-
if (historyResponse) {
|
|
131
|
-
const validatedHistory = historyApiResponseSchema.parse(historyResponse);
|
|
132
|
-
const historyItem = validatedHistory.data.goals.find(
|
|
133
|
-
(g) => g.goal.id === lessonId
|
|
134
|
-
);
|
|
135
|
-
breakdown = historyItem?.breakdown[0];
|
|
136
|
-
}
|
|
137
|
-
const lessonData = {
|
|
138
|
-
goal: validatedGoal.data,
|
|
139
|
-
details: validatedDetails.data,
|
|
140
|
-
breakdown
|
|
141
|
-
};
|
|
142
|
-
setState({
|
|
143
|
-
data: lessonData,
|
|
144
|
-
loading: false,
|
|
145
|
-
error: null
|
|
146
|
-
});
|
|
147
|
-
} catch (error) {
|
|
148
|
-
const errorMessage = handleLessonDetailsFetchError(error);
|
|
149
|
-
setState({
|
|
150
|
-
data: null,
|
|
151
|
-
loading: false,
|
|
152
|
-
error: errorMessage
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
}, [lessonId]);
|
|
156
|
-
useEffect(() => {
|
|
157
|
-
fetchLessonDetails();
|
|
158
|
-
}, [fetchLessonDetails]);
|
|
159
|
-
return {
|
|
160
|
-
...state,
|
|
161
|
-
refetch: fetchLessonDetails
|
|
162
|
-
};
|
|
163
|
-
};
|
|
164
|
-
};
|
|
165
|
-
var createRecommendedLessonDetailsHook = createUseRecommendedLessonDetails;
|
|
166
|
-
export {
|
|
167
|
-
createRecommendedLessonDetailsHook,
|
|
168
|
-
createUseRecommendedLessonDetails,
|
|
169
|
-
goalApiResponseSchema,
|
|
170
|
-
goalDetailsApiResponseSchema,
|
|
171
|
-
handleLessonDetailsFetchError,
|
|
172
|
-
historyApiResponseSchema
|
|
173
|
-
};
|
|
174
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/useRecommendedLessonDetails.ts"],"sourcesContent":["import { useState, useCallback, useEffect } from 'react';\nimport { z } from 'zod';\nimport type {\n LessonDetailsData,\n GoalMetadata,\n GoalDetailsData,\n GoalBreakdown,\n GoalApiResponse,\n GoalDetailsApiResponse,\n GoalsHistoryApiResponse,\n} from '../types/recommendedLessons';\n\n// ============================================\n// Zod Schemas for API Response Validation\n// ============================================\n\n/**\n * Schema for subject in lesson\n */\nconst goalLessonSubjectSchema = z.object({\n id: z.string(),\n name: z.string(),\n color: z.string(),\n icon: z.string(),\n});\n\n/**\n * Schema for lesson content/subtopic/topic\n */\nconst lessonContentSchema = z.object({\n id: z.string(),\n name: z.string(),\n});\n\n/**\n * Schema for lesson in goal\n */\nconst goalLessonSchema = z.object({\n id: z.string(),\n content: lessonContentSchema,\n subtopic: lessonContentSchema,\n topic: lessonContentSchema,\n subject: goalLessonSubjectSchema,\n});\n\n/**\n * Schema for lesson progress\n */\nconst goalLessonProgressSchema = z.object({\n id: z.string(),\n userId: z.string(),\n lessonId: z.string(),\n progress: z.number(),\n lesson: goalLessonSchema,\n});\n\n/**\n * Schema for lesson goal item\n */\nconst goalLessonGoalItemSchema = z.object({\n goalId: z.string(),\n supLessonsProgressId: z.string(),\n supLessonsProgress: goalLessonProgressSchema,\n});\n\n/**\n * Schema for goal metadata from /goals/{id}\n */\nconst goalMetadataSchema = z.object({\n id: z.string(),\n title: z.string(),\n startDate: z.string(),\n finalDate: z.string(),\n progress: z.number(),\n lessonsGoals: z.array(goalLessonGoalItemSchema),\n});\n\n/**\n * Schema for /goals/{id} API response\n */\nexport const goalApiResponseSchema = z.object({\n message: z.string(),\n data: goalMetadataSchema,\n});\n\n/**\n * Schema for student in details\n */\nconst goalDetailStudentSchema = z.object({\n userInstitutionId: z.string(),\n userId: z.string(),\n name: z.string(),\n progress: z.number(),\n completedAt: z.string().nullable(),\n avgScore: z.number().nullable(),\n daysToComplete: z.number().nullable(),\n});\n\n/**\n * Schema for aggregated stats\n */\nconst goalDetailAggregatedSchema = z.object({\n completionPercentage: z.number(),\n avgScore: z.number().nullable(),\n});\n\n/**\n * Schema for content performance item\n */\nconst goalDetailContentPerformanceItemSchema = z\n .object({\n contentId: z.string(),\n contentName: z.string(),\n rate: z.number(),\n })\n .nullable();\n\n/**\n * Schema for content performance\n */\nconst goalDetailContentPerformanceSchema = z.object({\n best: goalDetailContentPerformanceItemSchema,\n worst: goalDetailContentPerformanceItemSchema,\n});\n\n/**\n * Schema for details data from /goals/{id}/details\n */\nconst goalDetailsDataSchema = z.object({\n students: z.array(goalDetailStudentSchema),\n aggregated: goalDetailAggregatedSchema,\n contentPerformance: goalDetailContentPerformanceSchema,\n});\n\n/**\n * Schema for /goals/{id}/details API response\n */\nexport const goalDetailsApiResponseSchema = z.object({\n message: z.string(),\n data: goalDetailsDataSchema,\n});\n\n/**\n * Schema for breakdown item from history\n */\nconst goalBreakdownSchema = z.object({\n classId: z.string().uuid(),\n className: z.string(),\n schoolId: z.string(),\n schoolName: z.string(),\n studentCount: z.number(),\n completedCount: z.number(),\n});\n\n/**\n * Schema for history goal item (partial, only what we need)\n */\nconst historyGoalItemSchema = z.object({\n goal: z.object({ id: z.string().uuid() }),\n breakdown: z.array(goalBreakdownSchema),\n});\n\n/**\n * Schema for history API response (partial)\n */\nexport const historyApiResponseSchema = z.object({\n message: z.string(),\n data: z.object({\n goals: z.array(historyGoalItemSchema),\n total: z.number(),\n }),\n});\n\n// ============================================\n// Hook Types\n// ============================================\n\n/**\n * Hook state interface\n */\nexport interface UseRecommendedLessonDetailsState {\n data: LessonDetailsData | null;\n loading: boolean;\n error: string | null;\n}\n\n/**\n * Hook return type\n */\nexport interface UseRecommendedLessonDetailsReturn\n extends UseRecommendedLessonDetailsState {\n refetch: () => Promise<void>;\n}\n\n/**\n * API client interface for fetching lesson details\n */\nexport interface LessonDetailsApiClient {\n /** Fetch goal metadata from /goals/{id} */\n fetchGoal: (id: string) => Promise<GoalApiResponse>;\n /** Fetch goal details from /goals/{id}/details */\n fetchGoalDetails: (id: string) => Promise<GoalDetailsApiResponse>;\n /** Optional: Fetch breakdown from /recommended-class/history */\n fetchBreakdown?: (id: string) => Promise<GoalsHistoryApiResponse>;\n}\n\n// ============================================\n// Error Handling\n// ============================================\n\n/**\n * Handle errors during lesson details fetch\n * @param error - Error object\n * @returns Error message for UI display\n */\nexport const handleLessonDetailsFetchError = (error: unknown): string => {\n if (error instanceof z.ZodError) {\n console.error('Erro ao validar dados dos detalhes da aula:', error);\n return 'Erro ao validar dados dos detalhes da aula';\n }\n\n console.error('Erro ao carregar detalhes da aula:', error);\n return 'Erro ao carregar detalhes da aula';\n};\n\n// ============================================\n// Hook Factory\n// ============================================\n\n/**\n * Factory function to create useRecommendedLessonDetails hook\n *\n * @param apiClient - Object containing API fetch functions\n * @returns Hook for managing recommended lesson details\n *\n * @example\n * ```tsx\n * // In your app setup\n * const apiClient = {\n * fetchGoal: async (id) => {\n * const response = await api.get(`/goals/${id}`);\n * return response.data;\n * },\n * fetchGoalDetails: async (id) => {\n * const response = await api.get(`/goals/${id}/details`);\n * return response.data;\n * },\n * fetchBreakdown: async (id) => {\n * const response = await api.get(`/recommended-class/history?search=${id}&limit=1`);\n * return response.data;\n * },\n * };\n *\n * const useGoalDetails = createUseRecommendedLessonDetails(apiClient);\n *\n * // In your component\n * const { data, loading, error, refetch } = useGoalDetails('goal-id-123');\n * ```\n */\nexport const createUseRecommendedLessonDetails = (\n apiClient: LessonDetailsApiClient\n) => {\n return (lessonId: string | undefined): UseRecommendedLessonDetailsReturn => {\n const [state, setState] = useState<UseRecommendedLessonDetailsState>({\n data: null,\n loading: true,\n error: null,\n });\n\n /**\n * Fetch lesson details from multiple API endpoints\n */\n const fetchLessonDetails = useCallback(async () => {\n if (!lessonId) {\n setState({\n data: null,\n loading: false,\n error: 'ID da aula não encontrado',\n });\n return;\n }\n\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n // Fetch goal metadata and details in parallel\n // Breakdown is optional\n const promises: [\n Promise<GoalApiResponse>,\n Promise<GoalDetailsApiResponse>,\n Promise<GoalsHistoryApiResponse | null>,\n ] = [\n apiClient.fetchGoal(lessonId),\n apiClient.fetchGoalDetails(lessonId),\n apiClient.fetchBreakdown\n ? apiClient.fetchBreakdown(lessonId)\n : Promise.resolve(null),\n ];\n\n const [goalResponse, detailsResponse, historyResponse] =\n await Promise.all(promises);\n\n // Validate responses with Zod\n const validatedGoal = goalApiResponseSchema.parse(goalResponse);\n const validatedDetails =\n goalDetailsApiResponseSchema.parse(detailsResponse);\n\n // Extract and validate breakdown if available\n let breakdown: GoalBreakdown | undefined;\n if (historyResponse) {\n const validatedHistory =\n historyApiResponseSchema.parse(historyResponse);\n const historyItem = validatedHistory.data.goals.find(\n (g) => g.goal.id === lessonId\n );\n breakdown = historyItem?.breakdown[0];\n }\n\n // Combine data\n const lessonData: LessonDetailsData = {\n goal: validatedGoal.data as GoalMetadata,\n details: validatedDetails.data as GoalDetailsData,\n breakdown,\n };\n\n setState({\n data: lessonData,\n loading: false,\n error: null,\n });\n } catch (error) {\n const errorMessage = handleLessonDetailsFetchError(error);\n setState({\n data: null,\n loading: false,\n error: errorMessage,\n });\n }\n }, [lessonId]);\n\n // Fetch on mount and when lessonId changes\n useEffect(() => {\n fetchLessonDetails();\n }, [fetchLessonDetails]);\n\n return {\n ...state,\n refetch: fetchLessonDetails,\n };\n };\n};\n\n/**\n * Alias for createUseRecommendedLessonDetails\n */\nexport const createRecommendedLessonDetailsHook =\n createUseRecommendedLessonDetails;\n"],"mappings":"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","names":[]}
|