analytica-frontend-lib 1.4.40 → 1.4.41
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/hooks/useRecommendedLessonsPage/index.d.ts.map +1 -1
- package/dist/hooks/useRecommendedLessonsPage/index.js +382 -50
- package/dist/hooks/useRecommendedLessonsPage/index.js.map +1 -1
- package/dist/hooks/useRecommendedLessonsPage/index.mjs +376 -44
- package/dist/hooks/useRecommendedLessonsPage/index.mjs.map +1 -1
- package/dist/hooks/useRecommendedLessonsPage.d.ts.map +1 -1
- package/dist/index.js +49 -28
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +49 -28
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRecommendedLessonsPage.d.ts","sourceRoot":"","sources":["../../src/hooks/useRecommendedLessonsPage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAEL,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EACvC,KAAK,yBAAyB,EAE9B,KAAK,4BAA4B,EACjC,KAAK,iCAAiC,EACtC,KAAK,8BAA8B,EAEpC,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACf,MAAM,qCAAqC,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"useRecommendedLessonsPage.d.ts","sourceRoot":"","sources":["../../src/hooks/useRecommendedLessonsPage.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,7 +24,318 @@ __export(useRecommendedLessonsPage_exports, {
|
|
|
24
24
|
createUseRecommendedLessonsPage: () => createUseRecommendedLessonsPage
|
|
25
25
|
});
|
|
26
26
|
module.exports = __toCommonJS(useRecommendedLessonsPage_exports);
|
|
27
|
+
var import_react2 = require("react");
|
|
28
|
+
|
|
29
|
+
// src/utils/categoryDataUtils.ts
|
|
30
|
+
async function fetchStudentsByFilters(apiClient, filters) {
|
|
31
|
+
if ((!filters.schoolIds || filters.schoolIds.length === 0) && (!filters.schoolYearIds || filters.schoolYearIds.length === 0) && (!filters.classIds || filters.classIds.length === 0)) {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
const response = await apiClient.post("/students/filters", {
|
|
35
|
+
...filters.schoolIds && filters.schoolIds.length > 0 && {
|
|
36
|
+
schoolIds: filters.schoolIds
|
|
37
|
+
},
|
|
38
|
+
...filters.schoolYearIds && filters.schoolYearIds.length > 0 && {
|
|
39
|
+
schoolYearIds: filters.schoolYearIds
|
|
40
|
+
},
|
|
41
|
+
...filters.classIds && filters.classIds.length > 0 && {
|
|
42
|
+
classIds: filters.classIds
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
return response.data.data.students || [];
|
|
46
|
+
}
|
|
47
|
+
async function loadCategoriesData(apiClient, existingCategories) {
|
|
48
|
+
if (existingCategories.length > 0) {
|
|
49
|
+
return existingCategories;
|
|
50
|
+
}
|
|
51
|
+
const [schoolsResponse, schoolYearsResponse, classesResponse] = await Promise.all([
|
|
52
|
+
apiClient.get(
|
|
53
|
+
"/school"
|
|
54
|
+
),
|
|
55
|
+
apiClient.get("/schoolYear"),
|
|
56
|
+
apiClient.get("/classes")
|
|
57
|
+
]);
|
|
58
|
+
const schools = schoolsResponse.data.data.schools;
|
|
59
|
+
const schoolYears = schoolYearsResponse.data.data.schoolYears;
|
|
60
|
+
const classes = classesResponse.data.data.classes;
|
|
61
|
+
const transformedCategories = [
|
|
62
|
+
{
|
|
63
|
+
key: "escola",
|
|
64
|
+
label: "Escola",
|
|
65
|
+
itens: schools.map((s) => ({ id: s.id, name: s.companyName })),
|
|
66
|
+
selectedIds: []
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
key: "serie",
|
|
70
|
+
label: "S\xE9rie",
|
|
71
|
+
dependsOn: ["escola"],
|
|
72
|
+
filteredBy: [{ key: "escola", internalField: "schoolId" }],
|
|
73
|
+
itens: schoolYears.map((sy) => ({
|
|
74
|
+
id: sy.id,
|
|
75
|
+
name: sy.name,
|
|
76
|
+
schoolId: sy.schoolId
|
|
77
|
+
})),
|
|
78
|
+
selectedIds: []
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
key: "turma",
|
|
82
|
+
label: "Turma",
|
|
83
|
+
dependsOn: ["serie"],
|
|
84
|
+
filteredBy: [{ key: "serie", internalField: "schoolYearId" }],
|
|
85
|
+
itens: classes.map((c) => ({
|
|
86
|
+
id: c.id,
|
|
87
|
+
name: c.name,
|
|
88
|
+
schoolYearId: c.schoolYearId
|
|
89
|
+
})),
|
|
90
|
+
selectedIds: []
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
key: "students",
|
|
94
|
+
label: "Alunos",
|
|
95
|
+
dependsOn: ["turma"],
|
|
96
|
+
filteredBy: [
|
|
97
|
+
{ key: "escola", internalField: "escolaId" },
|
|
98
|
+
{ key: "serie", internalField: "serieId" },
|
|
99
|
+
{ key: "turma", internalField: "turmaId" }
|
|
100
|
+
],
|
|
101
|
+
// Students will be loaded dynamically based on selections
|
|
102
|
+
itens: [],
|
|
103
|
+
selectedIds: []
|
|
104
|
+
}
|
|
105
|
+
];
|
|
106
|
+
return transformedCategories;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// src/utils/useDynamicStudentFetching.ts
|
|
27
110
|
var import_react = require("react");
|
|
111
|
+
function extractSelectedIds(updatedCategories) {
|
|
112
|
+
const escolaCategory = updatedCategories.find((c) => c.key === "escola");
|
|
113
|
+
const serieCategory = updatedCategories.find((c) => c.key === "serie");
|
|
114
|
+
const turmaCategory = updatedCategories.find((c) => c.key === "turma");
|
|
115
|
+
const studentsCategory = updatedCategories.find((c) => c.key === "students");
|
|
116
|
+
return {
|
|
117
|
+
schoolIds: escolaCategory?.selectedIds || [],
|
|
118
|
+
schoolYearIds: serieCategory?.selectedIds || [],
|
|
119
|
+
classIds: turmaCategory?.selectedIds || [],
|
|
120
|
+
studentsCategory
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function detectSelectionChanges(previousSelections, currentSelections) {
|
|
124
|
+
const isInitialState = previousSelections.schoolIds.length === 0 && previousSelections.schoolYearIds.length === 0 && previousSelections.classIds.length === 0;
|
|
125
|
+
const arraysEqual = (a, b) => {
|
|
126
|
+
if (a.length !== b.length) return false;
|
|
127
|
+
return a.every((id) => b.includes(id)) && b.every((id) => a.includes(id));
|
|
128
|
+
};
|
|
129
|
+
const schoolIdsChanged = isInitialState || !arraysEqual(previousSelections.schoolIds, currentSelections.schoolIds);
|
|
130
|
+
const schoolYearIdsChanged = isInitialState || !arraysEqual(
|
|
131
|
+
previousSelections.schoolYearIds,
|
|
132
|
+
currentSelections.schoolYearIds
|
|
133
|
+
);
|
|
134
|
+
const classIdsChanged = isInitialState || !arraysEqual(previousSelections.classIds, currentSelections.classIds);
|
|
135
|
+
const shouldFetchStudents = schoolIdsChanged || schoolYearIdsChanged || classIdsChanged;
|
|
136
|
+
return {
|
|
137
|
+
schoolIdsChanged,
|
|
138
|
+
schoolYearIdsChanged,
|
|
139
|
+
classIdsChanged,
|
|
140
|
+
shouldFetchStudents
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function transformStudentsToItems(students) {
|
|
144
|
+
return students.map((s) => ({
|
|
145
|
+
id: `${s.userInstitutionId}-${s.class.id}`,
|
|
146
|
+
name: s.name,
|
|
147
|
+
classId: String(s.class.id),
|
|
148
|
+
schoolId: String(s.school.id),
|
|
149
|
+
schoolYearId: String(s.schoolYear.id),
|
|
150
|
+
studentId: s.id,
|
|
151
|
+
userInstitutionId: s.userInstitutionId,
|
|
152
|
+
escolaId: String(s.school.id),
|
|
153
|
+
serieId: String(s.schoolYear.id),
|
|
154
|
+
turmaId: String(s.class.id)
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
function updateCategoriesWithStudents(updatedCategories, studentItems) {
|
|
158
|
+
return updatedCategories.map(
|
|
159
|
+
(cat) => cat.key === "students" ? { ...cat, itens: studentItems } : cat
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
function clearStudentsFromCategories(updatedCategories) {
|
|
163
|
+
return updatedCategories.map(
|
|
164
|
+
(cat) => cat.key === "students" ? { ...cat, itens: [] } : cat
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
function useDynamicStudentFetching(setCategories, options = {}) {
|
|
168
|
+
const {
|
|
169
|
+
apiClient,
|
|
170
|
+
fetchStudentsByFilters: customFetchStudents,
|
|
171
|
+
onError
|
|
172
|
+
} = options;
|
|
173
|
+
const previousSelectionsRef = (0, import_react.useRef)({
|
|
174
|
+
schoolIds: [],
|
|
175
|
+
schoolYearIds: [],
|
|
176
|
+
classIds: []
|
|
177
|
+
});
|
|
178
|
+
const fetchRequestId = (0, import_react.useRef)(0);
|
|
179
|
+
const buildStudentFilters = (0, import_react.useCallback)(
|
|
180
|
+
(selectedSchoolIds, selectedSchoolYearIds, selectedClassIds) => ({
|
|
181
|
+
schoolIds: selectedSchoolIds.length > 0 ? selectedSchoolIds : void 0,
|
|
182
|
+
schoolYearIds: selectedSchoolYearIds.length > 0 ? selectedSchoolYearIds : void 0,
|
|
183
|
+
classIds: selectedClassIds.length > 0 ? selectedClassIds : void 0
|
|
184
|
+
}),
|
|
185
|
+
[]
|
|
186
|
+
);
|
|
187
|
+
const fetchWithCustomFunction = (0, import_react.useCallback)(
|
|
188
|
+
async (selectedSchoolIds, selectedSchoolYearIds, selectedClassIds, localRequestId) => {
|
|
189
|
+
if (!customFetchStudents) {
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
const filters = buildStudentFilters(
|
|
193
|
+
selectedSchoolIds,
|
|
194
|
+
selectedSchoolYearIds,
|
|
195
|
+
selectedClassIds
|
|
196
|
+
);
|
|
197
|
+
const students = await customFetchStudents(filters);
|
|
198
|
+
if (localRequestId !== fetchRequestId.current) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
return students;
|
|
202
|
+
},
|
|
203
|
+
[customFetchStudents, buildStudentFilters]
|
|
204
|
+
);
|
|
205
|
+
const fetchWithApiClient = (0, import_react.useCallback)(
|
|
206
|
+
async (selectedSchoolIds, selectedSchoolYearIds, selectedClassIds, localRequestId) => {
|
|
207
|
+
if (!apiClient) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
const filters = buildStudentFilters(
|
|
211
|
+
selectedSchoolIds,
|
|
212
|
+
selectedSchoolYearIds,
|
|
213
|
+
selectedClassIds
|
|
214
|
+
);
|
|
215
|
+
const students = await fetchStudentsByFilters(apiClient, filters);
|
|
216
|
+
if (localRequestId !== fetchRequestId.current) {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
return students;
|
|
220
|
+
},
|
|
221
|
+
[apiClient, buildStudentFilters]
|
|
222
|
+
);
|
|
223
|
+
const performStudentFetch = (0, import_react.useCallback)(
|
|
224
|
+
async (selectedSchoolIds, selectedSchoolYearIds, selectedClassIds, localRequestId) => {
|
|
225
|
+
const students = await fetchWithCustomFunction(
|
|
226
|
+
selectedSchoolIds,
|
|
227
|
+
selectedSchoolYearIds,
|
|
228
|
+
selectedClassIds,
|
|
229
|
+
localRequestId
|
|
230
|
+
);
|
|
231
|
+
if (students !== null) {
|
|
232
|
+
return students;
|
|
233
|
+
}
|
|
234
|
+
return fetchWithApiClient(
|
|
235
|
+
selectedSchoolIds,
|
|
236
|
+
selectedSchoolYearIds,
|
|
237
|
+
selectedClassIds,
|
|
238
|
+
localRequestId
|
|
239
|
+
);
|
|
240
|
+
},
|
|
241
|
+
[fetchWithCustomFunction, fetchWithApiClient]
|
|
242
|
+
);
|
|
243
|
+
const handleSuccessfulFetch = (0, import_react.useCallback)(
|
|
244
|
+
(students, updatedCategories, localRequestId) => {
|
|
245
|
+
if (localRequestId !== fetchRequestId.current) {
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
const studentItems = transformStudentsToItems(students);
|
|
249
|
+
const finalCategories = updateCategoriesWithStudents(
|
|
250
|
+
updatedCategories,
|
|
251
|
+
studentItems
|
|
252
|
+
);
|
|
253
|
+
setCategories(finalCategories);
|
|
254
|
+
return true;
|
|
255
|
+
},
|
|
256
|
+
[setCategories]
|
|
257
|
+
);
|
|
258
|
+
const handleFetchError = (0, import_react.useCallback)(
|
|
259
|
+
(error, updatedCategories, localRequestId) => {
|
|
260
|
+
console.error("Error fetching students:", error);
|
|
261
|
+
if (onError && error instanceof Error) {
|
|
262
|
+
onError(error);
|
|
263
|
+
}
|
|
264
|
+
if (localRequestId !== fetchRequestId.current) {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
const finalCategories = clearStudentsFromCategories(updatedCategories);
|
|
268
|
+
setCategories(finalCategories);
|
|
269
|
+
return true;
|
|
270
|
+
},
|
|
271
|
+
[onError, setCategories]
|
|
272
|
+
);
|
|
273
|
+
const handleCategoriesChange = (0, import_react.useCallback)(
|
|
274
|
+
async (updatedCategories) => {
|
|
275
|
+
if (!customFetchStudents && !apiClient) {
|
|
276
|
+
setCategories(updatedCategories);
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
const {
|
|
280
|
+
schoolIds: selectedSchoolIds,
|
|
281
|
+
schoolYearIds: selectedSchoolYearIds,
|
|
282
|
+
classIds: selectedClassIds,
|
|
283
|
+
studentsCategory
|
|
284
|
+
} = extractSelectedIds(updatedCategories);
|
|
285
|
+
const previousSelections = previousSelectionsRef.current;
|
|
286
|
+
const { shouldFetchStudents } = detectSelectionChanges(
|
|
287
|
+
previousSelections,
|
|
288
|
+
{
|
|
289
|
+
schoolIds: selectedSchoolIds,
|
|
290
|
+
schoolYearIds: selectedSchoolYearIds,
|
|
291
|
+
classIds: selectedClassIds
|
|
292
|
+
}
|
|
293
|
+
);
|
|
294
|
+
previousSelectionsRef.current = {
|
|
295
|
+
schoolIds: [...selectedSchoolIds],
|
|
296
|
+
schoolYearIds: [...selectedSchoolYearIds],
|
|
297
|
+
classIds: [...selectedClassIds]
|
|
298
|
+
};
|
|
299
|
+
if (shouldFetchStudents && selectedClassIds.length > 0 && studentsCategory) {
|
|
300
|
+
fetchRequestId.current += 1;
|
|
301
|
+
const localRequestId = fetchRequestId.current;
|
|
302
|
+
try {
|
|
303
|
+
const students = await performStudentFetch(
|
|
304
|
+
selectedSchoolIds,
|
|
305
|
+
selectedSchoolYearIds,
|
|
306
|
+
selectedClassIds,
|
|
307
|
+
localRequestId
|
|
308
|
+
);
|
|
309
|
+
if (students === null) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
handleSuccessfulFetch(students, updatedCategories, localRequestId);
|
|
313
|
+
} catch (error) {
|
|
314
|
+
handleFetchError(error, updatedCategories, localRequestId);
|
|
315
|
+
}
|
|
316
|
+
} else if (shouldFetchStudents && studentsCategory) {
|
|
317
|
+
fetchRequestId.current += 1;
|
|
318
|
+
const finalCategories = clearStudentsFromCategories(updatedCategories);
|
|
319
|
+
setCategories(finalCategories);
|
|
320
|
+
} else {
|
|
321
|
+
setCategories(updatedCategories);
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
[
|
|
325
|
+
apiClient,
|
|
326
|
+
customFetchStudents,
|
|
327
|
+
setCategories,
|
|
328
|
+
performStudentFetch,
|
|
329
|
+
handleSuccessfulFetch,
|
|
330
|
+
handleFetchError
|
|
331
|
+
]
|
|
332
|
+
);
|
|
333
|
+
return {
|
|
334
|
+
handleCategoriesChange
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// src/hooks/useRecommendedLessonsPage.ts
|
|
28
339
|
var buildQueryParams = (filters) => {
|
|
29
340
|
if (!filters) return {};
|
|
30
341
|
const params = {};
|
|
@@ -172,8 +483,8 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
172
483
|
extraFilterCategories
|
|
173
484
|
} = config;
|
|
174
485
|
return () => {
|
|
175
|
-
const recommendedClassMapRef = (0,
|
|
176
|
-
const [historyFilterData, setHistoryFilterData] = (0,
|
|
486
|
+
const recommendedClassMapRef = (0, import_react2.useRef)(/* @__PURE__ */ new Map());
|
|
487
|
+
const [historyFilterData, setHistoryFilterData] = (0, import_react2.useState)(
|
|
177
488
|
{
|
|
178
489
|
schools: [],
|
|
179
490
|
classes: [],
|
|
@@ -181,11 +492,11 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
181
492
|
schoolYears: []
|
|
182
493
|
}
|
|
183
494
|
);
|
|
184
|
-
const [sendModalOpen, setSendModalOpen] = (0,
|
|
185
|
-
const [selectedModel, setSelectedModel] = (0,
|
|
186
|
-
const [sendModalLoading, setSendModalLoading] = (0,
|
|
187
|
-
const [sendModalCategories, setSendModalCategories] = (0,
|
|
188
|
-
const userFilterData = (0,
|
|
495
|
+
const [sendModalOpen, setSendModalOpen] = (0, import_react2.useState)(false);
|
|
496
|
+
const [selectedModel, setSelectedModel] = (0, import_react2.useState)(null);
|
|
497
|
+
const [sendModalLoading, setSendModalLoading] = (0, import_react2.useState)(false);
|
|
498
|
+
const [sendModalCategories, setSendModalCategories] = (0, import_react2.useState)([]);
|
|
499
|
+
const userFilterData = (0, import_react2.useMemo)(() => {
|
|
189
500
|
const baseSchools = getSchoolOptions(userData);
|
|
190
501
|
const baseClasses = getClassOptions(userData);
|
|
191
502
|
const baseSubjects = getSubjectOptions(userData);
|
|
@@ -200,21 +511,21 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
200
511
|
)
|
|
201
512
|
};
|
|
202
513
|
}, [userData, historyFilterData]);
|
|
203
|
-
const subjectsMap = (0,
|
|
514
|
+
const subjectsMap = (0, import_react2.useMemo)(() => {
|
|
204
515
|
const map = /* @__PURE__ */ new Map();
|
|
205
516
|
userFilterData.subjects.forEach((s) => {
|
|
206
517
|
map.set(s.id, s.name);
|
|
207
518
|
});
|
|
208
519
|
return map;
|
|
209
520
|
}, [userFilterData.subjects]);
|
|
210
|
-
const extractFilterDataFromHistory = (0,
|
|
521
|
+
const extractFilterDataFromHistory = (0, import_react2.useCallback)(
|
|
211
522
|
(items) => {
|
|
212
523
|
const maps = extractMapsFromItems(items);
|
|
213
524
|
setHistoryFilterData((prev) => mergeFilterData(prev, maps));
|
|
214
525
|
},
|
|
215
526
|
[]
|
|
216
527
|
);
|
|
217
|
-
const fetchRecommendedClassHistory = (0,
|
|
528
|
+
const fetchRecommendedClassHistory = (0, import_react2.useCallback)(
|
|
218
529
|
async (filters) => {
|
|
219
530
|
const params = buildQueryParams(filters);
|
|
220
531
|
const response = await api.get(
|
|
@@ -230,7 +541,7 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
230
541
|
},
|
|
231
542
|
[api, endpoints.recommendedClassHistory, extractFilterDataFromHistory]
|
|
232
543
|
);
|
|
233
|
-
const fetchRecommendedClassModels = (0,
|
|
544
|
+
const fetchRecommendedClassModels = (0, import_react2.useCallback)(
|
|
234
545
|
async (filters) => {
|
|
235
546
|
const params = buildQueryParams({
|
|
236
547
|
...filters,
|
|
@@ -253,13 +564,13 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
253
564
|
},
|
|
254
565
|
[api, endpoints.recommendedClassDrafts]
|
|
255
566
|
);
|
|
256
|
-
const deleteRecommendedClassModel = (0,
|
|
567
|
+
const deleteRecommendedClassModel = (0, import_react2.useCallback)(
|
|
257
568
|
async (id) => {
|
|
258
569
|
await api.delete(`${endpoints.recommendedClassDrafts}/${id}`);
|
|
259
570
|
},
|
|
260
571
|
[api, endpoints.recommendedClassDrafts]
|
|
261
572
|
);
|
|
262
|
-
const fetchRecommendedClassDrafts = (0,
|
|
573
|
+
const fetchRecommendedClassDrafts = (0, import_react2.useCallback)(
|
|
263
574
|
async (filters) => {
|
|
264
575
|
const params = buildQueryParams({
|
|
265
576
|
...filters,
|
|
@@ -282,67 +593,85 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
282
593
|
},
|
|
283
594
|
[api, endpoints.recommendedClassDrafts]
|
|
284
595
|
);
|
|
285
|
-
const deleteRecommendedClassDraft = (0,
|
|
596
|
+
const deleteRecommendedClassDraft = (0, import_react2.useCallback)(
|
|
286
597
|
async (id) => {
|
|
287
598
|
await api.delete(`${endpoints.recommendedClassDrafts}/${id}`);
|
|
288
599
|
},
|
|
289
600
|
[api, endpoints.recommendedClassDrafts]
|
|
290
601
|
);
|
|
291
|
-
const handleCreateLesson = (0,
|
|
602
|
+
const handleCreateLesson = (0, import_react2.useCallback)(() => {
|
|
292
603
|
navigate(paths.createLesson);
|
|
293
604
|
}, []);
|
|
294
|
-
const handleCreateModel = (0,
|
|
605
|
+
const handleCreateModel = (0, import_react2.useCallback)(() => {
|
|
295
606
|
navigate(paths.createModel);
|
|
296
607
|
}, []);
|
|
297
|
-
const handleRowClick = (0,
|
|
608
|
+
const handleRowClick = (0, import_react2.useCallback)((row) => {
|
|
298
609
|
const originalData = recommendedClassMapRef.current.get(row.id);
|
|
299
610
|
navigate(`${paths.lessonDetails}/${row.id}`, {
|
|
300
611
|
state: { recommendedClassData: originalData }
|
|
301
612
|
});
|
|
302
613
|
}, []);
|
|
303
|
-
const handleEditRecommendedClass = (0,
|
|
614
|
+
const handleEditRecommendedClass = (0, import_react2.useCallback)((id) => {
|
|
304
615
|
navigate(`${paths.editLesson}/${id}/editar`);
|
|
305
616
|
}, []);
|
|
306
|
-
const handleEditModel = (0,
|
|
617
|
+
const handleEditModel = (0, import_react2.useCallback)(
|
|
307
618
|
(model) => {
|
|
308
619
|
navigate(`${paths.editModel}${model.id}`);
|
|
309
620
|
},
|
|
310
621
|
[]
|
|
311
622
|
);
|
|
312
|
-
const handleSendLesson = (0,
|
|
313
|
-
(model) => {
|
|
623
|
+
const handleSendLesson = (0, import_react2.useCallback)(
|
|
624
|
+
async (model) => {
|
|
314
625
|
setSelectedModel(model);
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
name: cls.name,
|
|
325
|
-
studentId: cls.id,
|
|
326
|
-
userInstitutionId: cls.id
|
|
327
|
-
}))
|
|
328
|
-
});
|
|
626
|
+
try {
|
|
627
|
+
const categories = await loadCategoriesData(
|
|
628
|
+
api,
|
|
629
|
+
[]
|
|
630
|
+
);
|
|
631
|
+
setSendModalCategories(categories);
|
|
632
|
+
} catch (error) {
|
|
633
|
+
console.error("Erro ao carregar destinat\xE1rios:", error);
|
|
634
|
+
setSendModalCategories([]);
|
|
329
635
|
}
|
|
330
|
-
setSendModalCategories(categories);
|
|
331
636
|
setSendModalOpen(true);
|
|
332
637
|
},
|
|
333
|
-
[
|
|
638
|
+
[api]
|
|
334
639
|
);
|
|
335
|
-
const handleSendLessonSubmit = (0,
|
|
640
|
+
const handleSendLessonSubmit = (0, import_react2.useCallback)(
|
|
336
641
|
async (formData) => {
|
|
337
642
|
if (!selectedModel) return;
|
|
338
643
|
setSendModalLoading(true);
|
|
339
644
|
try {
|
|
645
|
+
const draftResponse = await api.get(`${endpoints.recommendedClassDrafts}/${selectedModel.id}`);
|
|
646
|
+
const draft = draftResponse.data.data;
|
|
647
|
+
const lessonIds = (draft.lessons ?? []).map((lesson, index) => ({
|
|
648
|
+
lessonId: lesson.lessonId,
|
|
649
|
+
sequence: index + 1
|
|
650
|
+
}));
|
|
651
|
+
const activityDraftIds = (draft.activityDrafts ?? []).map(
|
|
652
|
+
(activity, index) => ({
|
|
653
|
+
activityDraftId: activity.activityDraftId,
|
|
654
|
+
sequence: index + 1
|
|
655
|
+
})
|
|
656
|
+
);
|
|
657
|
+
const hasAttachedActivities = activityDraftIds.length > 0;
|
|
340
658
|
await api.post(endpoints.submitRecommendedClass, {
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
659
|
+
title: formData.title || selectedModel.title,
|
|
660
|
+
startDate: (/* @__PURE__ */ new Date(
|
|
661
|
+
`${formData.startDate}T${formData.startTime}`
|
|
662
|
+
)).toISOString(),
|
|
663
|
+
finalDate: (/* @__PURE__ */ new Date(
|
|
664
|
+
`${formData.finalDate}T${formData.finalTime}`
|
|
665
|
+
)).toISOString(),
|
|
666
|
+
lessonIds,
|
|
667
|
+
...hasAttachedActivities && { activityDraftIds },
|
|
668
|
+
targetStudentIds: formData.students.map((s) => s.userInstitutionId),
|
|
669
|
+
...formData.notification && {
|
|
670
|
+
notification: formData.notification
|
|
671
|
+
},
|
|
672
|
+
...hasAttachedActivities && {
|
|
673
|
+
canRetry: formData.canRetry ?? false
|
|
674
|
+
}
|
|
346
675
|
});
|
|
347
676
|
setSendModalOpen(false);
|
|
348
677
|
setSelectedModel(null);
|
|
@@ -350,17 +679,20 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
350
679
|
setSendModalLoading(false);
|
|
351
680
|
}
|
|
352
681
|
},
|
|
353
|
-
[
|
|
682
|
+
[
|
|
683
|
+
api,
|
|
684
|
+
endpoints.recommendedClassDrafts,
|
|
685
|
+
endpoints.submitRecommendedClass,
|
|
686
|
+
selectedModel
|
|
687
|
+
]
|
|
354
688
|
);
|
|
355
|
-
const handleSendModalClose = (0,
|
|
689
|
+
const handleSendModalClose = (0, import_react2.useCallback)(() => {
|
|
356
690
|
setSendModalOpen(false);
|
|
357
691
|
setSelectedModel(null);
|
|
358
692
|
}, []);
|
|
359
|
-
const handleCategoriesChange = (
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
},
|
|
363
|
-
[]
|
|
693
|
+
const { handleCategoriesChange } = useDynamicStudentFetching(
|
|
694
|
+
setSendModalCategories,
|
|
695
|
+
{ apiClient: api }
|
|
364
696
|
);
|
|
365
697
|
return {
|
|
366
698
|
historyProps: {
|