analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
428 lines (421 loc) • 17 kB
JavaScript
;Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
var _chunkZXOYMRH5js = require('./chunk-ZXOYMRH5.js');
// src/hooks/useRecommendedLessonsPage.ts
var _react = require('react');
var buildQueryParams = (filters) => {
if (!filters) return {};
const params = {};
for (const key in filters) {
const value = filters[key];
if (value !== void 0 && value !== null) {
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
params[key] = value;
}
}
}
return params;
};
var getSchoolOptions = (userData) => {
if (!_optionalChain([userData, 'optionalAccess', _ => _.userInstitutions])) return [];
const schoolMap = /* @__PURE__ */ new Map();
userData.userInstitutions.forEach((inst) => {
if (_optionalChain([inst, 'access', _2 => _2.school, 'optionalAccess', _3 => _3.id]) && _optionalChain([inst, 'access', _4 => _4.school, 'optionalAccess', _5 => _5.name])) {
schoolMap.set(inst.school.id, inst.school.name);
}
});
return Array.from(schoolMap.entries()).map(([id, name]) => ({ id, name }));
};
var getClassOptions = (userData) => {
if (!_optionalChain([userData, 'optionalAccess', _6 => _6.userInstitutions])) return [];
const classMap = /* @__PURE__ */ new Map();
userData.userInstitutions.forEach((inst) => {
if (_optionalChain([inst, 'access', _7 => _7.class, 'optionalAccess', _8 => _8.id]) && _optionalChain([inst, 'access', _9 => _9.class, 'optionalAccess', _10 => _10.name])) {
classMap.set(inst.class.id, inst.class.name);
}
});
return Array.from(classMap.entries()).map(([id, name]) => ({ id, name }));
};
var getSubjectOptions = (userData) => {
if (!_optionalChain([userData, 'optionalAccess', _11 => _11.subTeacherTopicClasses])) return [];
const subjectMap = /* @__PURE__ */ new Map();
userData.subTeacherTopicClasses.forEach((stc) => {
if (_optionalChain([stc, 'access', _12 => _12.subject, 'optionalAccess', _13 => _13.id]) && _optionalChain([stc, 'access', _14 => _14.subject, 'optionalAccess', _15 => _15.name])) {
subjectMap.set(stc.subject.id, stc.subject.name);
}
});
return Array.from(subjectMap.entries()).map(([id, name]) => ({ id, name }));
};
var getSchoolYearOptions = (userData) => {
if (!_optionalChain([userData, 'optionalAccess', _16 => _16.userInstitutions])) return [];
const yearMap = /* @__PURE__ */ new Map();
userData.userInstitutions.forEach((inst) => {
if (_optionalChain([inst, 'access', _17 => _17.schoolYear, 'optionalAccess', _18 => _18.id]) && _optionalChain([inst, 'access', _19 => _19.schoolYear, 'optionalAccess', _20 => _20.name])) {
yearMap.set(inst.schoolYear.id, inst.schoolYear.name);
}
});
return Array.from(yearMap.entries()).map(([id, name]) => ({ id, name }));
};
var toFilterArray = (m) => Array.from(m.entries()).map(([id, name]) => ({ id, name }));
var collectBreakdownData = (b, schoolMap, classMap, schoolYearMap) => {
if (b.schoolId && b.schoolName) {
schoolMap.set(b.schoolId, b.schoolName);
}
if (b.classId && b.className) {
classMap.set(b.classId, b.className);
}
if (b.schoolYearId && b.schoolYearName) {
schoolYearMap.set(b.schoolYearId, b.schoolYearName);
}
};
var extractMapsFromItems = (items) => {
const schoolMap = /* @__PURE__ */ new Map();
const classMap = /* @__PURE__ */ new Map();
const subjectMap = /* @__PURE__ */ new Map();
const schoolYearMap = /* @__PURE__ */ new Map();
for (const item of items) {
if (_optionalChain([item, 'access', _21 => _21.subject, 'optionalAccess', _22 => _22.id]) && _optionalChain([item, 'access', _23 => _23.subject, 'optionalAccess', _24 => _24.name])) {
subjectMap.set(item.subject.id, item.subject.name);
}
for (const b of item.breakdown) {
collectBreakdownData(b, schoolMap, classMap, schoolYearMap);
}
}
return { schoolMap, classMap, subjectMap, schoolYearMap };
};
var extractSubjectsFromDraftItems = (drafts) => {
const subjectMap = /* @__PURE__ */ new Map();
for (const draft of drafts) {
if (_optionalChain([draft, 'access', _25 => _25.subject, 'optionalAccess', _26 => _26.id]) && _optionalChain([draft, 'access', _27 => _27.subject, 'optionalAccess', _28 => _28.name])) {
subjectMap.set(draft.subject.id, draft.subject.name);
}
}
return Array.from(subjectMap.entries()).map(([id, name]) => ({ id, name }));
};
var hasMapChanged = (merged, prev) => {
if (merged.size !== prev.length) return true;
return prev.some((item) => merged.get(item.id) !== item.name);
};
var mergeFilterData = (prev, maps) => {
const mergedSchools = new Map([
...prev.schools.map((s) => [s.id, s.name]),
...maps.schoolMap
]);
const mergedClasses = new Map([
...prev.classes.map((c) => [c.id, c.name]),
...maps.classMap
]);
const mergedSubjects = new Map([
...prev.subjects.map((s) => [s.id, s.name]),
...maps.subjectMap
]);
const mergedSchoolYears = new Map([
...prev.schoolYears.map((y) => [y.id, y.name]),
...maps.schoolYearMap
]);
if (!hasMapChanged(mergedSchools, prev.schools) && !hasMapChanged(mergedClasses, prev.classes) && !hasMapChanged(mergedSubjects, prev.subjects) && !hasMapChanged(mergedSchoolYears, prev.schoolYears)) {
return prev;
}
return {
schools: toFilterArray(mergedSchools),
classes: toFilterArray(mergedClasses),
subjects: toFilterArray(mergedSubjects),
schoolYears: toFilterArray(mergedSchoolYears)
};
};
var mergeFilterOptions = (base, extra) => {
if (extra.length === 0) return base;
const baseIds = new Set(base.map((item) => item.id));
const hasNew = extra.some((item) => !baseIds.has(item.id));
if (!hasNew) return base;
const map = new Map(base.map((item) => [item.id, item.name]));
extra.forEach((item) => {
if (!map.has(item.id)) {
map.set(item.id, item.name);
}
});
return Array.from(map.entries()).map(([id, name]) => ({ id, name }));
};
var createUseRecommendedLessonsPage = (config) => {
const {
api,
navigate,
userData,
paths,
endpoints,
texts,
emptyStateImage,
noSearchImage,
mapSubjectNameToEnum,
extraFilterCategories
} = config;
return () => {
const recommendedClassMapRef = _react.useRef.call(void 0, /* @__PURE__ */ new Map());
const [historyFilterData, setHistoryFilterData] = _react.useState.call(void 0,
{
schools: [],
classes: [],
subjects: [],
schoolYears: []
}
);
const [sendModalOpen, setSendModalOpen] = _react.useState.call(void 0, false);
const [selectedModel, setSelectedModel] = _react.useState.call(void 0, null);
const [sendModalLoading, setSendModalLoading] = _react.useState.call(void 0, false);
const [sendModalCategories, setSendModalCategories] = _react.useState.call(void 0, []);
const userFilterData = _react.useMemo.call(void 0, () => {
const baseSchools = getSchoolOptions(userData);
const baseClasses = getClassOptions(userData);
const baseSubjects = getSubjectOptions(userData);
const baseSchoolYears = getSchoolYearOptions(userData);
return {
schools: mergeFilterOptions(baseSchools, historyFilterData.schools),
classes: mergeFilterOptions(baseClasses, historyFilterData.classes),
subjects: mergeFilterOptions(baseSubjects, historyFilterData.subjects),
schoolYears: mergeFilterOptions(
baseSchoolYears,
historyFilterData.schoolYears
)
};
}, [userData, historyFilterData]);
const subjectsMap = _react.useMemo.call(void 0, () => {
const map = /* @__PURE__ */ new Map();
userFilterData.subjects.forEach((s) => {
map.set(s.id, s.name);
});
return map;
}, [userFilterData.subjects]);
const extractFilterDataFromHistory = _react.useCallback.call(void 0,
(items) => {
const maps = extractMapsFromItems(items);
setHistoryFilterData((prev) => mergeFilterData(prev, maps));
},
[]
);
const fetchRecommendedClassHistory = _react.useCallback.call(void 0,
async (filters) => {
const params = buildQueryParams(filters);
const response = await api.get(
endpoints.recommendedClassHistory,
{ params }
);
const items = response.data.data.recommendedClass;
items.forEach((item) => {
recommendedClassMapRef.current.set(item.recommendedClass.id, item);
});
extractFilterDataFromHistory(items);
return response.data;
},
[api, endpoints.recommendedClassHistory, extractFilterDataFromHistory]
);
const fetchRecommendedClassModels = _react.useCallback.call(void 0,
async (filters) => {
const params = buildQueryParams({
...filters,
type: "MODELO" /* MODELO */
});
const response = await api.get(
endpoints.recommendedClassDrafts,
{ params }
);
const subjects = extractSubjectsFromDraftItems(
response.data.data.drafts
);
if (subjects.length > 0) {
setHistoryFilterData((prev) => ({
...prev,
subjects: mergeFilterOptions(prev.subjects, subjects)
}));
}
return response.data;
},
[api, endpoints.recommendedClassDrafts]
);
const deleteRecommendedClassModel = _react.useCallback.call(void 0,
async (id) => {
await api.delete(`${endpoints.recommendedClassDrafts}/${id}`);
},
[api, endpoints.recommendedClassDrafts]
);
const fetchRecommendedClassDrafts = _react.useCallback.call(void 0,
async (filters) => {
const params = buildQueryParams({
...filters,
type: "RASCUNHO" /* RASCUNHO */
});
const response = await api.get(
endpoints.recommendedClassDrafts,
{ params }
);
const subjects = extractSubjectsFromDraftItems(
response.data.data.drafts
);
if (subjects.length > 0) {
setHistoryFilterData((prev) => ({
...prev,
subjects: mergeFilterOptions(prev.subjects, subjects)
}));
}
return response.data;
},
[api, endpoints.recommendedClassDrafts]
);
const deleteRecommendedClassDraft = _react.useCallback.call(void 0,
async (id) => {
await api.delete(`${endpoints.recommendedClassDrafts}/${id}`);
},
[api, endpoints.recommendedClassDrafts]
);
const handleCreateLesson = _react.useCallback.call(void 0, () => {
navigate(paths.createLesson);
}, []);
const handleCreateModel = _react.useCallback.call(void 0, () => {
navigate(paths.createModel);
}, []);
const handleRowClick = _react.useCallback.call(void 0, (row) => {
const originalData = recommendedClassMapRef.current.get(row.id);
navigate(`${paths.lessonDetails}/${row.id}`, {
state: { recommendedClassData: originalData }
});
}, []);
const deleteRecommendedClass = _react.useCallback.call(void 0,
async (id) => {
await api.delete(`${endpoints.submitRecommendedClass}/${id}`);
},
[api, endpoints.submitRecommendedClass]
);
const updateRecommendedClass = _react.useCallback.call(void 0,
async (id, data) => {
await api.patch(`${endpoints.submitRecommendedClass}/${id}`, data);
},
[api, endpoints.submitRecommendedClass]
);
const fetchRecommendedClassById = _react.useCallback.call(void 0,
async (id) => {
const response = await api.get(
`${endpoints.submitRecommendedClass}/${id}`
);
return response.data.data;
},
[api, endpoints.submitRecommendedClass]
);
const handleEditModel = _react.useCallback.call(void 0,
(model) => {
navigate(`${paths.editModel}${model.id}`);
},
[]
);
const handleSendLesson = _react.useCallback.call(void 0,
async (model) => {
setSelectedModel(model);
try {
const categories = await _chunkZXOYMRH5js.loadCategoriesData.call(void 0, api, []);
setSendModalCategories(categories);
} catch (error) {
console.error("Erro ao carregar destinat\xE1rios:", error);
setSendModalCategories([]);
}
setSendModalOpen(true);
},
[api]
);
const handleSendLessonSubmit = _react.useCallback.call(void 0,
async (formData) => {
if (!selectedModel) return;
setSendModalLoading(true);
try {
const draftResponse = await api.get(`${endpoints.recommendedClassDrafts}/${selectedModel.id}`);
const draft = draftResponse.data.data;
const lessonIds = (_nullishCoalesce(draft.lessons, () => ( []))).map((lesson, index) => ({
lessonId: lesson.lessonId,
sequence: index + 1
}));
const activityDraftIds = (_nullishCoalesce(draft.activityDrafts, () => ( []))).map(
(activity, index) => ({
activityDraftId: activity.activityDraftId,
sequence: index + 1
})
);
const hasAttachedActivities = activityDraftIds.length > 0;
await api.post(endpoints.submitRecommendedClass, {
title: formData.title || selectedModel.title,
startDate: (/* @__PURE__ */ new Date(
`${formData.startDate}T${formData.startTime}`
)).toISOString(),
finalDate: (/* @__PURE__ */ new Date(
`${formData.finalDate}T${formData.finalTime}`
)).toISOString(),
lessonIds,
...hasAttachedActivities && { activityDraftIds },
targetStudentIds: formData.students.map((s) => s.userInstitutionId),
...formData.notification && {
notification: formData.notification
},
...hasAttachedActivities && {
canRetry: _nullishCoalesce(formData.canRetry, () => ( false))
}
});
setSendModalOpen(false);
setSelectedModel(null);
} finally {
setSendModalLoading(false);
}
},
[
api,
endpoints.recommendedClassDrafts,
endpoints.submitRecommendedClass,
selectedModel
]
);
const handleSendModalClose = _react.useCallback.call(void 0, () => {
setSendModalOpen(false);
setSelectedModel(null);
}, []);
const { handleCategoriesChange } = _chunkZXOYMRH5js.useDynamicStudentFetching.call(void 0,
setSendModalCategories,
{ apiClient: api }
);
return {
historyProps: {
fetchRecommendedClassHistory,
fetchRecommendedClassModels,
deleteRecommendedClassModel,
onCreateLesson: handleCreateLesson,
onCreateModel: handleCreateModel,
onRowClick: handleRowClick,
deleteRecommendedClass,
updateRecommendedClass,
fetchRecommendedClassById,
onEditModel: handleEditModel,
onSendLesson: handleSendLesson,
fetchRecommendedClassDrafts,
deleteRecommendedClassDraft,
onSendDraft: handleSendLesson,
onEditDraft: handleEditModel,
emptyStateImage,
noSearchImage,
mapSubjectNameToEnum,
userFilterData,
subjectsMap,
title: texts.title,
createButtonText: texts.createButtonText,
searchPlaceholder: texts.searchPlaceholder,
extraFilterCategories
},
modalProps: {
isOpen: sendModalOpen,
onClose: handleSendModalClose,
onSubmit: handleSendLessonSubmit,
categories: sendModalCategories,
onCategoriesChange: handleCategoriesChange,
isLoading: sendModalLoading,
modalTitle: _optionalChain([selectedModel, 'optionalAccess', _29 => _29.title]),
hasAttachedActivities: (_nullishCoalesce(_optionalChain([selectedModel, 'optionalAccess', _30 => _30.activityDraftsCount]), () => ( 0))) > 0
},
navigate
};
};
};
var createRecommendedLessonsPageHook = createUseRecommendedLessonsPage;
exports.createUseRecommendedLessonsPage = createUseRecommendedLessonsPage; exports.createRecommendedLessonsPageHook = createRecommendedLessonsPageHook;
//# sourceMappingURL=chunk-VMWF6DND.js.map