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
|
@@ -81,7 +81,7 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
81
81
|
mapSubjectNameToEnum
|
|
82
82
|
} = config;
|
|
83
83
|
return () => {
|
|
84
|
-
const
|
|
84
|
+
const recommendedClassMapRef = (0, import_react.useRef)(/* @__PURE__ */ new Map());
|
|
85
85
|
const [sendModalOpen, setSendModalOpen] = (0, import_react.useState)(false);
|
|
86
86
|
const [selectedModel, setSelectedModel] = (0, import_react.useState)(null);
|
|
87
87
|
const [sendModalLoading, setSendModalLoading] = (0, import_react.useState)(false);
|
|
@@ -100,60 +100,63 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
100
100
|
subjects.forEach((s) => map.set(s.id, s.name));
|
|
101
101
|
return map;
|
|
102
102
|
}, [userData]);
|
|
103
|
-
const
|
|
103
|
+
const fetchRecommendedClassHistory = (0, import_react.useCallback)(
|
|
104
104
|
async (filters) => {
|
|
105
105
|
const params = buildQueryParams(filters);
|
|
106
106
|
const response = await api.get(
|
|
107
|
-
endpoints.
|
|
107
|
+
endpoints.recommendedClassHistory,
|
|
108
108
|
{ params }
|
|
109
109
|
);
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
110
|
+
const recommendedClass = response.data.data.recommendedClass;
|
|
111
|
+
recommendedClass.forEach((recommendedClass2) => {
|
|
112
|
+
recommendedClassMapRef.current.set(
|
|
113
|
+
recommendedClass2.recommendedClass.id,
|
|
114
|
+
recommendedClass2
|
|
115
|
+
);
|
|
113
116
|
});
|
|
114
117
|
return response.data;
|
|
115
118
|
},
|
|
116
|
-
[api, endpoints.
|
|
119
|
+
[api, endpoints.recommendedClassHistory]
|
|
117
120
|
);
|
|
118
|
-
const
|
|
121
|
+
const fetchRecommendedClassModels = (0, import_react.useCallback)(
|
|
119
122
|
async (filters) => {
|
|
120
123
|
const params = buildQueryParams({
|
|
121
124
|
...filters,
|
|
122
125
|
type: "MODELO" /* MODELO */
|
|
123
126
|
});
|
|
124
127
|
const response = await api.get(
|
|
125
|
-
endpoints.
|
|
128
|
+
endpoints.recommendedClassDrafts,
|
|
126
129
|
{ params }
|
|
127
130
|
);
|
|
128
131
|
return response.data;
|
|
129
132
|
},
|
|
130
|
-
[api, endpoints.
|
|
133
|
+
[api, endpoints.recommendedClassDrafts]
|
|
131
134
|
);
|
|
132
|
-
const
|
|
135
|
+
const deleteRecommendedClassModel = (0, import_react.useCallback)(
|
|
133
136
|
async (id) => {
|
|
134
|
-
await api.delete(`${endpoints.
|
|
137
|
+
await api.delete(`${endpoints.recommendedClassDrafts}/${id}`);
|
|
135
138
|
},
|
|
136
|
-
[api, endpoints.
|
|
139
|
+
[api, endpoints.recommendedClassDrafts]
|
|
137
140
|
);
|
|
138
|
-
const
|
|
141
|
+
const fetchRecommendedClassDrafts = (0, import_react.useCallback)(
|
|
139
142
|
async (filters) => {
|
|
140
143
|
const params = buildQueryParams({
|
|
141
144
|
...filters,
|
|
142
145
|
type: "RASCUNHO" /* RASCUNHO */
|
|
143
146
|
});
|
|
144
147
|
const response = await api.get(
|
|
145
|
-
endpoints.
|
|
148
|
+
endpoints.recommendedClassDrafts,
|
|
146
149
|
{ params }
|
|
147
150
|
);
|
|
148
151
|
return response.data;
|
|
149
152
|
},
|
|
150
|
-
[api, endpoints.
|
|
153
|
+
[api, endpoints.recommendedClassDrafts]
|
|
151
154
|
);
|
|
152
|
-
const
|
|
155
|
+
const deleteRecommendedClassDraft = (0, import_react.useCallback)(
|
|
153
156
|
async (id) => {
|
|
154
|
-
await api.delete(`${endpoints.
|
|
157
|
+
await api.delete(`${endpoints.recommendedClassDrafts}/${id}`);
|
|
155
158
|
},
|
|
156
|
-
[api, endpoints.
|
|
159
|
+
[api, endpoints.recommendedClassDrafts]
|
|
157
160
|
);
|
|
158
161
|
const handleCreateLesson = (0, import_react.useCallback)(() => {
|
|
159
162
|
navigate(paths.createLesson);
|
|
@@ -162,17 +165,20 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
162
165
|
navigate(paths.createModel);
|
|
163
166
|
}, []);
|
|
164
167
|
const handleRowClick = (0, import_react.useCallback)((row) => {
|
|
165
|
-
const originalData =
|
|
168
|
+
const originalData = recommendedClassMapRef.current.get(row.id);
|
|
166
169
|
navigate(`${paths.lessonDetails}/${row.id}`, {
|
|
167
|
-
state: {
|
|
170
|
+
state: { recommendedClassData: originalData }
|
|
168
171
|
});
|
|
169
172
|
}, []);
|
|
170
|
-
const
|
|
173
|
+
const handleEditRecommendedClass = (0, import_react.useCallback)((id) => {
|
|
171
174
|
navigate(`${paths.editLesson}/${id}/editar`);
|
|
172
175
|
}, []);
|
|
173
|
-
const handleEditModel = (0, import_react.useCallback)(
|
|
174
|
-
|
|
175
|
-
|
|
176
|
+
const handleEditModel = (0, import_react.useCallback)(
|
|
177
|
+
(model) => {
|
|
178
|
+
navigate(`${paths.editModel}${model.id}`);
|
|
179
|
+
},
|
|
180
|
+
[]
|
|
181
|
+
);
|
|
176
182
|
const handleSendLesson = (0, import_react.useCallback)(
|
|
177
183
|
(model) => {
|
|
178
184
|
setSelectedModel(model);
|
|
@@ -201,7 +207,7 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
201
207
|
if (!selectedModel) return;
|
|
202
208
|
setSendModalLoading(true);
|
|
203
209
|
try {
|
|
204
|
-
await api.post(endpoints.
|
|
210
|
+
await api.post(endpoints.submitRecommendedClass, {
|
|
205
211
|
draftId: selectedModel.id,
|
|
206
212
|
students: formData.students,
|
|
207
213
|
startDate: `${formData.startDate}T${formData.startTime}:00`,
|
|
@@ -213,7 +219,7 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
213
219
|
setSendModalLoading(false);
|
|
214
220
|
}
|
|
215
221
|
},
|
|
216
|
-
[api, endpoints.
|
|
222
|
+
[api, endpoints.submitRecommendedClass, selectedModel]
|
|
217
223
|
);
|
|
218
224
|
const handleSendModalClose = (0, import_react.useCallback)(() => {
|
|
219
225
|
setSendModalOpen(false);
|
|
@@ -227,17 +233,17 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
227
233
|
);
|
|
228
234
|
return {
|
|
229
235
|
historyProps: {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
236
|
+
fetchRecommendedClassHistory,
|
|
237
|
+
fetchRecommendedClassModels,
|
|
238
|
+
deleteRecommendedClassModel,
|
|
233
239
|
onCreateLesson: handleCreateLesson,
|
|
234
240
|
onCreateModel: handleCreateModel,
|
|
235
241
|
onRowClick: handleRowClick,
|
|
236
|
-
|
|
242
|
+
onEditRecommendedClass: handleEditRecommendedClass,
|
|
237
243
|
onEditModel: handleEditModel,
|
|
238
244
|
onSendLesson: handleSendLesson,
|
|
239
|
-
|
|
240
|
-
|
|
245
|
+
fetchRecommendedClassDrafts,
|
|
246
|
+
deleteRecommendedClassDraft,
|
|
241
247
|
onSendDraft: handleSendLesson,
|
|
242
248
|
onEditDraft: handleEditModel,
|
|
243
249
|
emptyStateImage,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/useRecommendedLessonsPage.ts"],"sourcesContent":["/**\n * useRecommendedLessonsPage Hook Factory\n *\n * Factory function to create a hook for RecommendedLessons, LessonDrafts, and LessonModels pages.\n * Contains all common state, memos, and callbacks.\n */\n\nimport { useCallback, useRef, useMemo, useState } from 'react';\nimport {\n GoalDraftType,\n type GoalHistoryFilters,\n type GoalsHistoryApiResponse,\n type GoalTableItem,\n type GoalHistoryItem,\n type GoalModelFilters,\n type GoalModelsApiResponse,\n type GoalModelTableItem,\n} from '../types/recommendedLessons';\nimport type {\n SendLessonFormData,\n CategoryConfig,\n} from '../components/SendLessonModal/types';\nimport { SubjectEnum } from '../enums/SubjectEnum';\n\n/**\n * API client interface\n */\nexport interface RecommendedLessonsApiClient {\n get: <T>(\n url: string,\n config?: { params?: Record<string, unknown> }\n ) => Promise<{ data: T }>;\n post: <T>(url: string, data?: unknown) => Promise<{ data: T }>;\n delete: <T>(url: string) => Promise<{ data: T }>;\n}\n\n/**\n * User institution data structure\n */\nexport interface UserInstitution {\n school: { id: string; name: string };\n schoolYear: { id: string; name: string };\n class: { id: string; name: string };\n}\n\n/**\n * Subject teacher class data structure\n */\nexport interface SubTeacherTopicClass {\n subject: { id: string; name: string };\n class: { id: string; name: string };\n}\n\n/**\n * User data structure\n */\nexport interface RecommendedLessonsUserData {\n userInstitutions?: UserInstitution[];\n subTeacherTopicClasses?: SubTeacherTopicClass[];\n}\n\n/**\n * Navigation paths configuration\n */\nexport interface RecommendedLessonsPagePaths {\n /** Path for creating a new lesson */\n createLesson: string;\n /** Path for creating a new model */\n createModel: string;\n /** Base path for lesson details */\n lessonDetails: string;\n /** Base path for editing a lesson */\n editLesson: string;\n /** Path for editing a model (with id parameter) */\n editModel: string;\n}\n\n/**\n * API endpoints configuration\n */\nexport interface RecommendedLessonsPageEndpoints {\n /** Endpoint for fetching goals history */\n goalsHistory: string;\n /** Endpoint for fetching goal models/drafts */\n goalDrafts: string;\n /** Endpoint for submitting a goal */\n submitGoal: string;\n}\n\n/**\n * UI text configuration\n */\nexport interface RecommendedLessonsPageTexts {\n title: string;\n createButtonText: string;\n searchPlaceholder: string;\n}\n\n/**\n * Configuration for createUseRecommendedLessonsPage factory\n */\nexport interface UseRecommendedLessonsPageConfig {\n /** API client for making requests */\n api: RecommendedLessonsApiClient;\n /** Navigation function */\n navigate: (path: string, options?: { state?: unknown }) => void;\n /** User data for filter options */\n userData: RecommendedLessonsUserData | null;\n /** Navigation paths */\n paths: RecommendedLessonsPagePaths;\n /** API endpoints */\n endpoints: RecommendedLessonsPageEndpoints;\n /** UI text */\n texts: RecommendedLessonsPageTexts;\n /** Image for empty state */\n emptyStateImage: string;\n /** Image for no search results */\n noSearchImage: string;\n /** Function to map subject name to SubjectEnum */\n mapSubjectNameToEnum: (subjectName: string) => SubjectEnum | null;\n}\n\n/**\n * Return type for the useRecommendedLessonsPage hook\n */\nexport interface UseRecommendedLessonsPageReturn {\n /** Props for RecommendedLessonsHistory component */\n historyProps: {\n fetchGoalsHistory: (\n filters?: GoalHistoryFilters\n ) => Promise<GoalsHistoryApiResponse>;\n fetchGoalModels: (\n filters?: GoalModelFilters\n ) => Promise<GoalModelsApiResponse>;\n deleteGoalModel: (id: string) => Promise<void>;\n onCreateLesson: () => void;\n onCreateModel: () => void;\n onRowClick: (row: GoalTableItem) => void;\n onEditGoal: (id: string) => void;\n onEditModel: (model: GoalModelTableItem) => void;\n onSendLesson: (model: GoalModelTableItem) => void;\n fetchGoalDrafts: (\n filters?: GoalModelFilters\n ) => Promise<GoalModelsApiResponse>;\n deleteGoalDraft: (id: string) => Promise<void>;\n onSendDraft: (draft: GoalModelTableItem) => void;\n onEditDraft: (draft: GoalModelTableItem) => void;\n emptyStateImage: string;\n noSearchImage: string;\n mapSubjectNameToEnum: (subjectName: string) => SubjectEnum | null;\n userFilterData: {\n schools: Array<{ id: string; name: string }>;\n classes: Array<{ id: string; name: string }>;\n subjects: Array<{ id: string; name: string }>;\n };\n subjectsMap: Map<string, string>;\n title: string;\n createButtonText: string;\n searchPlaceholder: string;\n };\n /** Props for SendLessonModal component */\n modalProps: {\n isOpen: boolean;\n onClose: () => void;\n onSubmit: (formData: SendLessonFormData) => Promise<void>;\n categories: CategoryConfig[];\n onCategoriesChange: (categories: CategoryConfig[]) => void;\n isLoading: boolean;\n modalTitle: string | undefined;\n };\n /** Navigate function for custom tab handlers */\n navigate: (path: string, options?: { state?: unknown }) => void;\n}\n\n/**\n * Build query parameters from filter object\n */\nconst buildQueryParams = (\n filters?: Record<string, unknown>\n): Record<string, unknown> => {\n if (!filters) return {};\n\n const params: Record<string, unknown> = {};\n for (const key in filters) {\n const value = filters[key];\n if (value !== undefined && value !== null) {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n params[key] = value;\n }\n }\n }\n return params;\n};\n\n/**\n * Get school options from user data\n */\nconst getSchoolOptions = (\n userData: RecommendedLessonsUserData | null\n): Array<{ id: string; name: string }> => {\n if (!userData?.userInstitutions) return [];\n\n const schoolMap = new Map<string, string>();\n userData.userInstitutions.forEach((inst) => {\n if (inst.school?.id && inst.school?.name) {\n schoolMap.set(inst.school.id, inst.school.name);\n }\n });\n\n return Array.from(schoolMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Get class options from user data\n */\nconst getClassOptions = (\n userData: RecommendedLessonsUserData | null\n): Array<{ id: string; name: string }> => {\n if (!userData?.userInstitutions) return [];\n\n const classMap = new Map<string, string>();\n userData.userInstitutions.forEach((inst) => {\n if (inst.class?.id && inst.class?.name) {\n classMap.set(inst.class.id, inst.class.name);\n }\n });\n\n return Array.from(classMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Get subject options from user data\n */\nconst getSubjectOptions = (\n userData: RecommendedLessonsUserData | null\n): Array<{ id: string; name: string }> => {\n if (!userData?.subTeacherTopicClasses) return [];\n\n const subjectMap = new Map<string, string>();\n userData.subTeacherTopicClasses.forEach((stc) => {\n if (stc.subject?.id && stc.subject?.name) {\n subjectMap.set(stc.subject.id, stc.subject.name);\n }\n });\n\n return Array.from(subjectMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Factory function to create useRecommendedLessonsPage hook\n *\n * @param config - Configuration object with API client, navigation, user data, paths, etc.\n * @returns Hook function that returns historyProps, modalProps, and navigate\n *\n * @example\n * ```tsx\n * // In your app setup\n * const useRecommendedLessonsPage = createUseRecommendedLessonsPage({\n * api,\n * navigate,\n * userData,\n * paths: {\n * createLesson: '/criar-aula',\n * createModel: '/criar-aula?mode=model',\n * lessonDetails: '/aulas-recomendadas',\n * editLesson: '/aulas-recomendadas',\n * editModel: '/criar-aula?mode=model&id=',\n * },\n * endpoints: {\n * goalsHistory: '/recommended-class/history',\n * goalDrafts: '/recommended-class/drafts',\n * submitGoal: '/goals',\n * },\n * texts: {\n * title: 'Histórico de aulas recomendadas',\n * createButtonText: 'Criar aula',\n * searchPlaceholder: 'Buscar aula',\n * },\n * emptyStateImage,\n * noSearchImage,\n * mapSubjectNameToEnum,\n * });\n *\n * // In your component\n * const { historyProps, modalProps, navigate } = useRecommendedLessonsPage();\n * ```\n */\nexport const createUseRecommendedLessonsPage = (\n config: UseRecommendedLessonsPageConfig\n): (() => UseRecommendedLessonsPageReturn) => {\n const {\n api,\n navigate,\n userData,\n paths,\n endpoints,\n texts,\n emptyStateImage,\n noSearchImage,\n mapSubjectNameToEnum,\n } = config;\n\n return (): UseRecommendedLessonsPageReturn => {\n // Store original goal data for navigation\n const goalsMapRef = useRef<Map<string, GoalHistoryItem>>(new Map());\n\n // SendLessonModal state\n const [sendModalOpen, setSendModalOpen] = useState(false);\n const [selectedModel, setSelectedModel] =\n useState<GoalModelTableItem | null>(null);\n const [sendModalLoading, setSendModalLoading] = useState(false);\n const [sendModalCategories, setSendModalCategories] = useState<\n CategoryConfig[]\n >([]);\n\n // Build user filter data from user data\n const userFilterData = useMemo(\n () => ({\n schools: getSchoolOptions(userData),\n classes: getClassOptions(userData),\n subjects: getSubjectOptions(userData),\n }),\n [userData]\n );\n\n // Memoized subjects map for models display\n const subjectsMap = useMemo(() => {\n const map = new Map<string, string>();\n const subjects = getSubjectOptions(userData);\n subjects.forEach((s) => map.set(s.id, s.name));\n return map;\n }, [userData]);\n\n /**\n * Fetch goals history from API\n */\n const fetchGoalsHistory = useCallback(\n async (\n filters?: GoalHistoryFilters\n ): Promise<GoalsHistoryApiResponse> => {\n const params = buildQueryParams(filters as Record<string, unknown>);\n const response = await api.get<GoalsHistoryApiResponse>(\n endpoints.goalsHistory,\n { params }\n );\n\n // Store original goal data for later use in navigation\n const goals = response.data.data.goals;\n goals.forEach((goal) => {\n goalsMapRef.current.set(goal.goal.id, goal);\n });\n\n return response.data;\n },\n [api, endpoints.goalsHistory]\n );\n\n /**\n * Fetch goal models from API\n */\n const fetchGoalModels = useCallback(\n async (filters?: GoalModelFilters): Promise<GoalModelsApiResponse> => {\n const params = buildQueryParams({\n ...filters,\n type: GoalDraftType.MODELO,\n } as Record<string, unknown>);\n const response = await api.get<GoalModelsApiResponse>(\n endpoints.goalDrafts,\n { params }\n );\n return response.data;\n },\n [api, endpoints.goalDrafts]\n );\n\n /**\n * Delete a goal model\n */\n const deleteGoalModel = useCallback(\n async (id: string): Promise<void> => {\n await api.delete(`${endpoints.goalDrafts}/${id}`);\n },\n [api, endpoints.goalDrafts]\n );\n\n /**\n * Fetch goal drafts from API\n */\n const fetchGoalDrafts = useCallback(\n async (filters?: GoalModelFilters): Promise<GoalModelsApiResponse> => {\n const params = buildQueryParams({\n ...filters,\n type: GoalDraftType.RASCUNHO,\n } as Record<string, unknown>);\n const response = await api.get<GoalModelsApiResponse>(\n endpoints.goalDrafts,\n { params }\n );\n return response.data;\n },\n [api, endpoints.goalDrafts]\n );\n\n /**\n * Delete a goal draft\n */\n const deleteGoalDraft = useCallback(\n async (id: string): Promise<void> => {\n await api.delete(`${endpoints.goalDrafts}/${id}`);\n },\n [api, endpoints.goalDrafts]\n );\n\n /**\n * Handle create lesson button click\n */\n const handleCreateLesson = useCallback(() => {\n navigate(paths.createLesson);\n }, []);\n\n /**\n * Handle create model button click\n */\n const handleCreateModel = useCallback(() => {\n navigate(paths.createModel);\n }, []);\n\n /**\n * Handle row click - navigate to goal details\n */\n const handleRowClick = useCallback((row: GoalTableItem) => {\n const originalData = goalsMapRef.current.get(row.id);\n navigate(`${paths.lessonDetails}/${row.id}`, {\n state: { goalData: originalData },\n });\n }, []);\n\n /**\n * Handle edit goal action\n */\n const handleEditGoal = useCallback((id: string) => {\n navigate(`${paths.editLesson}/${id}/editar`);\n }, []);\n\n /**\n * Handle edit model action\n */\n const handleEditModel = useCallback((model: GoalModelTableItem) => {\n navigate(`${paths.editModel}${model.id}`);\n }, []);\n\n /**\n * Handle send lesson button click - opens modal\n */\n const handleSendLesson = useCallback(\n (model: GoalModelTableItem) => {\n setSelectedModel(model);\n\n // Build categories from user data for CheckboxGroup\n const classes = getClassOptions(userData);\n const categories: CategoryConfig[] = [];\n\n if (classes.length > 0) {\n categories.push({\n key: 'students',\n label: 'Turmas',\n selectedIds: [],\n itens: classes.map((cls) => ({\n id: cls.id,\n name: cls.name,\n studentId: cls.id,\n userInstitutionId: cls.id,\n })),\n });\n }\n\n setSendModalCategories(categories);\n setSendModalOpen(true);\n },\n [userData]\n );\n\n /**\n * Handle send lesson modal submit\n */\n const handleSendLessonSubmit = useCallback(\n async (formData: SendLessonFormData) => {\n if (!selectedModel) return;\n\n setSendModalLoading(true);\n try {\n await api.post(endpoints.submitGoal, {\n draftId: selectedModel.id,\n students: formData.students,\n startDate: `${formData.startDate}T${formData.startTime}:00`,\n finalDate: `${formData.finalDate}T${formData.finalTime}:00`,\n });\n\n setSendModalOpen(false);\n setSelectedModel(null);\n } finally {\n setSendModalLoading(false);\n }\n },\n [api, endpoints.submitGoal, selectedModel]\n );\n\n /**\n * Handle send lesson modal close\n */\n const handleSendModalClose = useCallback(() => {\n setSendModalOpen(false);\n setSelectedModel(null);\n }, []);\n\n /**\n * Handle categories change in send modal\n */\n const handleCategoriesChange = useCallback(\n (categories: CategoryConfig[]) => {\n setSendModalCategories(categories);\n },\n []\n );\n\n return {\n historyProps: {\n fetchGoalsHistory,\n fetchGoalModels,\n deleteGoalModel,\n onCreateLesson: handleCreateLesson,\n onCreateModel: handleCreateModel,\n onRowClick: handleRowClick,\n onEditGoal: handleEditGoal,\n onEditModel: handleEditModel,\n onSendLesson: handleSendLesson,\n fetchGoalDrafts,\n deleteGoalDraft,\n onSendDraft: handleSendLesson,\n onEditDraft: handleEditModel,\n emptyStateImage,\n noSearchImage,\n mapSubjectNameToEnum,\n userFilterData,\n subjectsMap,\n title: texts.title,\n createButtonText: texts.createButtonText,\n searchPlaceholder: texts.searchPlaceholder,\n },\n modalProps: {\n isOpen: sendModalOpen,\n onClose: handleSendModalClose,\n onSubmit: handleSendLessonSubmit,\n categories: sendModalCategories,\n onCategoriesChange: handleCategoriesChange,\n isLoading: sendModalLoading,\n modalTitle: selectedModel?.title,\n },\n navigate,\n };\n };\n};\n\n/**\n * Alias for createUseRecommendedLessonsPage\n */\nexport const createRecommendedLessonsPageHook = createUseRecommendedLessonsPage;\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useRecommendedLessonsPage.ts"],"sourcesContent":["/**\n * useRecommendedLessonsPage Hook Factory\n *\n * Factory function to create a hook for RecommendedLessons, LessonDrafts, and LessonModels pages.\n * Contains all common state, memos, and callbacks.\n */\n\nimport { useCallback, useRef, useMemo, useState } from 'react';\nimport {\n RecommendedClassDraftType,\n type RecommendedClassHistoryFilters,\n type RecommendedClassHistoryApiResponse,\n type RecommendedClassTableItem,\n type RecommendedClassHistoryItem,\n type RecommendedClassModelFilters,\n type RecommendedClassModelsApiResponse,\n type RecommendedClassModelTableItem,\n} from '../types/recommendedLessons';\nimport type {\n SendLessonFormData,\n CategoryConfig,\n} from '../components/SendLessonModal/types';\nimport { SubjectEnum } from '../enums/SubjectEnum';\n\n/**\n * API client interface\n */\nexport interface RecommendedLessonsApiClient {\n get: <T>(\n url: string,\n config?: { params?: Record<string, unknown> }\n ) => Promise<{ data: T }>;\n post: <T>(url: string, data?: unknown) => Promise<{ data: T }>;\n delete: <T>(url: string) => Promise<{ data: T }>;\n}\n\n/**\n * User institution data structure\n */\nexport interface UserInstitution {\n school: { id: string; name: string };\n schoolYear: { id: string; name: string };\n class: { id: string; name: string };\n}\n\n/**\n * Subject teacher class data structure\n */\nexport interface SubTeacherTopicClass {\n subject: { id: string; name: string };\n class: { id: string; name: string };\n}\n\n/**\n * User data structure\n */\nexport interface RecommendedLessonsUserData {\n userInstitutions?: UserInstitution[];\n subTeacherTopicClasses?: SubTeacherTopicClass[];\n}\n\n/**\n * Navigation paths configuration\n */\nexport interface RecommendedLessonsPagePaths {\n /** Path for creating a new lesson */\n createLesson: string;\n /** Path for creating a new model */\n createModel: string;\n /** Base path for lesson details */\n lessonDetails: string;\n /** Base path for editing a lesson */\n editLesson: string;\n /** Path for editing a model (with id parameter) */\n editModel: string;\n}\n\n/**\n * API endpoints configuration\n */\nexport interface RecommendedLessonsPageEndpoints {\n /** Endpoint for fetching recommendedClass history */\n recommendedClassHistory: string;\n /** Endpoint for fetching recommendedClass models/drafts */\n recommendedClassDrafts: string;\n /** Endpoint for submitting a recommendedClass */\n submitRecommendedClass: string;\n}\n\n/**\n * UI text configuration\n */\nexport interface RecommendedLessonsPageTexts {\n title: string;\n createButtonText: string;\n searchPlaceholder: string;\n}\n\n/**\n * Configuration for createUseRecommendedLessonsPage factory\n */\nexport interface UseRecommendedLessonsPageConfig {\n /** API client for making requests */\n api: RecommendedLessonsApiClient;\n /** Navigation function */\n navigate: (path: string, options?: { state?: unknown }) => void;\n /** User data for filter options */\n userData: RecommendedLessonsUserData | null;\n /** Navigation paths */\n paths: RecommendedLessonsPagePaths;\n /** API endpoints */\n endpoints: RecommendedLessonsPageEndpoints;\n /** UI text */\n texts: RecommendedLessonsPageTexts;\n /** Image for empty state */\n emptyStateImage: string;\n /** Image for no search results */\n noSearchImage: string;\n /** Function to map subject name to SubjectEnum */\n mapSubjectNameToEnum: (subjectName: string) => SubjectEnum | null;\n}\n\n/**\n * Return type for the useRecommendedLessonsPage hook\n */\nexport interface UseRecommendedLessonsPageReturn {\n /** Props for RecommendedLessonsHistory component */\n historyProps: {\n fetchRecommendedClassHistory: (\n filters?: RecommendedClassHistoryFilters\n ) => Promise<RecommendedClassHistoryApiResponse>;\n fetchRecommendedClassModels: (\n filters?: RecommendedClassModelFilters\n ) => Promise<RecommendedClassModelsApiResponse>;\n deleteRecommendedClassModel: (id: string) => Promise<void>;\n onCreateLesson: () => void;\n onCreateModel: () => void;\n onRowClick: (row: RecommendedClassTableItem) => void;\n onEditRecommendedClass: (id: string) => void;\n onEditModel: (model: RecommendedClassModelTableItem) => void;\n onSendLesson: (model: RecommendedClassModelTableItem) => void;\n fetchRecommendedClassDrafts: (\n filters?: RecommendedClassModelFilters\n ) => Promise<RecommendedClassModelsApiResponse>;\n deleteRecommendedClassDraft: (id: string) => Promise<void>;\n onSendDraft: (draft: RecommendedClassModelTableItem) => void;\n onEditDraft: (draft: RecommendedClassModelTableItem) => void;\n emptyStateImage: string;\n noSearchImage: string;\n mapSubjectNameToEnum: (subjectName: string) => SubjectEnum | null;\n userFilterData: {\n schools: Array<{ id: string; name: string }>;\n classes: Array<{ id: string; name: string }>;\n subjects: Array<{ id: string; name: string }>;\n };\n subjectsMap: Map<string, string>;\n title: string;\n createButtonText: string;\n searchPlaceholder: string;\n };\n /** Props for SendLessonModal component */\n modalProps: {\n isOpen: boolean;\n onClose: () => void;\n onSubmit: (formData: SendLessonFormData) => Promise<void>;\n categories: CategoryConfig[];\n onCategoriesChange: (categories: CategoryConfig[]) => void;\n isLoading: boolean;\n modalTitle: string | undefined;\n };\n /** Navigate function for custom tab handlers */\n navigate: (path: string, options?: { state?: unknown }) => void;\n}\n\n/**\n * Build query parameters from filter object\n */\nconst buildQueryParams = (\n filters?: Record<string, unknown>\n): Record<string, unknown> => {\n if (!filters) return {};\n\n const params: Record<string, unknown> = {};\n for (const key in filters) {\n const value = filters[key];\n if (value !== undefined && value !== null) {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n params[key] = value;\n }\n }\n }\n return params;\n};\n\n/**\n * Get school options from user data\n */\nconst getSchoolOptions = (\n userData: RecommendedLessonsUserData | null\n): Array<{ id: string; name: string }> => {\n if (!userData?.userInstitutions) return [];\n\n const schoolMap = new Map<string, string>();\n userData.userInstitutions.forEach((inst) => {\n if (inst.school?.id && inst.school?.name) {\n schoolMap.set(inst.school.id, inst.school.name);\n }\n });\n\n return Array.from(schoolMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Get class options from user data\n */\nconst getClassOptions = (\n userData: RecommendedLessonsUserData | null\n): Array<{ id: string; name: string }> => {\n if (!userData?.userInstitutions) return [];\n\n const classMap = new Map<string, string>();\n userData.userInstitutions.forEach((inst) => {\n if (inst.class?.id && inst.class?.name) {\n classMap.set(inst.class.id, inst.class.name);\n }\n });\n\n return Array.from(classMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Get subject options from user data\n */\nconst getSubjectOptions = (\n userData: RecommendedLessonsUserData | null\n): Array<{ id: string; name: string }> => {\n if (!userData?.subTeacherTopicClasses) return [];\n\n const subjectMap = new Map<string, string>();\n userData.subTeacherTopicClasses.forEach((stc) => {\n if (stc.subject?.id && stc.subject?.name) {\n subjectMap.set(stc.subject.id, stc.subject.name);\n }\n });\n\n return Array.from(subjectMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Factory function to create useRecommendedLessonsPage hook\n *\n * @param config - Configuration object with API client, navigation, user data, paths, etc.\n * @returns Hook function that returns historyProps, modalProps, and navigate\n *\n * @example\n * ```tsx\n * // In your app setup\n * const useRecommendedLessonsPage = createUseRecommendedLessonsPage({\n * api,\n * navigate,\n * userData,\n * paths: {\n * createLesson: '/criar-aula',\n * createModel: '/criar-aula?mode=model',\n * lessonDetails: '/aulas-recomendadas',\n * editLesson: '/aulas-recomendadas',\n * editModel: '/criar-aula?mode=model&id=',\n * },\n * endpoints: {\n * recommendedClassHistory: '/recommended-class/history',\n * recommendedClassDrafts: '/recommended-class/drafts',\n * submitRecommendedClass: '/recommendedClass',\n * },\n * texts: {\n * title: 'Histórico de aulas recomendadas',\n * createButtonText: 'Criar aula',\n * searchPlaceholder: 'Buscar aula',\n * },\n * emptyStateImage,\n * noSearchImage,\n * mapSubjectNameToEnum,\n * });\n *\n * // In your component\n * const { historyProps, modalProps, navigate } = useRecommendedLessonsPage();\n * ```\n */\nexport const createUseRecommendedLessonsPage = (\n config: UseRecommendedLessonsPageConfig\n): (() => UseRecommendedLessonsPageReturn) => {\n const {\n api,\n navigate,\n userData,\n paths,\n endpoints,\n texts,\n emptyStateImage,\n noSearchImage,\n mapSubjectNameToEnum,\n } = config;\n\n return (): UseRecommendedLessonsPageReturn => {\n // Store original recommendedClass data for navigation\n const recommendedClassMapRef = useRef<\n Map<string, RecommendedClassHistoryItem>\n >(new Map());\n\n // SendLessonModal state\n const [sendModalOpen, setSendModalOpen] = useState(false);\n const [selectedModel, setSelectedModel] =\n useState<RecommendedClassModelTableItem | null>(null);\n const [sendModalLoading, setSendModalLoading] = useState(false);\n const [sendModalCategories, setSendModalCategories] = useState<\n CategoryConfig[]\n >([]);\n\n // Build user filter data from user data\n const userFilterData = useMemo(\n () => ({\n schools: getSchoolOptions(userData),\n classes: getClassOptions(userData),\n subjects: getSubjectOptions(userData),\n }),\n [userData]\n );\n\n // Memoized subjects map for models display\n const subjectsMap = useMemo(() => {\n const map = new Map<string, string>();\n const subjects = getSubjectOptions(userData);\n subjects.forEach((s) => map.set(s.id, s.name));\n return map;\n }, [userData]);\n\n /**\n * Fetch recommendedClass history from API\n */\n const fetchRecommendedClassHistory = useCallback(\n async (\n filters?: RecommendedClassHistoryFilters\n ): Promise<RecommendedClassHistoryApiResponse> => {\n const params = buildQueryParams(filters as Record<string, unknown>);\n const response = await api.get<RecommendedClassHistoryApiResponse>(\n endpoints.recommendedClassHistory,\n { params }\n );\n\n // Store original recommendedClass data for later use in navigation\n const recommendedClass = response.data.data.recommendedClass;\n recommendedClass.forEach((recommendedClass) => {\n recommendedClassMapRef.current.set(\n recommendedClass.recommendedClass.id,\n recommendedClass\n );\n });\n\n return response.data;\n },\n [api, endpoints.recommendedClassHistory]\n );\n\n /**\n * Fetch recommendedClass models from API\n */\n const fetchRecommendedClassModels = useCallback(\n async (\n filters?: RecommendedClassModelFilters\n ): Promise<RecommendedClassModelsApiResponse> => {\n const params = buildQueryParams({\n ...filters,\n type: RecommendedClassDraftType.MODELO,\n } as Record<string, unknown>);\n const response = await api.get<RecommendedClassModelsApiResponse>(\n endpoints.recommendedClassDrafts,\n { params }\n );\n return response.data;\n },\n [api, endpoints.recommendedClassDrafts]\n );\n\n /**\n * Delete a recommendedClass model\n */\n const deleteRecommendedClassModel = useCallback(\n async (id: string): Promise<void> => {\n await api.delete(`${endpoints.recommendedClassDrafts}/${id}`);\n },\n [api, endpoints.recommendedClassDrafts]\n );\n\n /**\n * Fetch recommendedClass drafts from API\n */\n const fetchRecommendedClassDrafts = useCallback(\n async (\n filters?: RecommendedClassModelFilters\n ): Promise<RecommendedClassModelsApiResponse> => {\n const params = buildQueryParams({\n ...filters,\n type: RecommendedClassDraftType.RASCUNHO,\n } as Record<string, unknown>);\n const response = await api.get<RecommendedClassModelsApiResponse>(\n endpoints.recommendedClassDrafts,\n { params }\n );\n return response.data;\n },\n [api, endpoints.recommendedClassDrafts]\n );\n\n /**\n * Delete a recommendedClass draft\n */\n const deleteRecommendedClassDraft = useCallback(\n async (id: string): Promise<void> => {\n await api.delete(`${endpoints.recommendedClassDrafts}/${id}`);\n },\n [api, endpoints.recommendedClassDrafts]\n );\n\n /**\n * Handle create lesson button click\n */\n const handleCreateLesson = useCallback(() => {\n navigate(paths.createLesson);\n }, []);\n\n /**\n * Handle create model button click\n */\n const handleCreateModel = useCallback(() => {\n navigate(paths.createModel);\n }, []);\n\n /**\n * Handle row click - navigate to recommendedClass details\n */\n const handleRowClick = useCallback((row: RecommendedClassTableItem) => {\n const originalData = recommendedClassMapRef.current.get(row.id);\n navigate(`${paths.lessonDetails}/${row.id}`, {\n state: { recommendedClassData: originalData },\n });\n }, []);\n\n /**\n * Handle edit recommendedClass action\n */\n const handleEditRecommendedClass = useCallback((id: string) => {\n navigate(`${paths.editLesson}/${id}/editar`);\n }, []);\n\n /**\n * Handle edit model action\n */\n const handleEditModel = useCallback(\n (model: RecommendedClassModelTableItem) => {\n navigate(`${paths.editModel}${model.id}`);\n },\n []\n );\n\n /**\n * Handle send lesson button click - opens modal\n */\n const handleSendLesson = useCallback(\n (model: RecommendedClassModelTableItem) => {\n setSelectedModel(model);\n\n // Build categories from user data for CheckboxGroup\n const classes = getClassOptions(userData);\n const categories: CategoryConfig[] = [];\n\n if (classes.length > 0) {\n categories.push({\n key: 'students',\n label: 'Turmas',\n selectedIds: [],\n itens: classes.map((cls) => ({\n id: cls.id,\n name: cls.name,\n studentId: cls.id,\n userInstitutionId: cls.id,\n })),\n });\n }\n\n setSendModalCategories(categories);\n setSendModalOpen(true);\n },\n [userData]\n );\n\n /**\n * Handle send lesson modal submit\n */\n const handleSendLessonSubmit = useCallback(\n async (formData: SendLessonFormData) => {\n if (!selectedModel) return;\n\n setSendModalLoading(true);\n try {\n await api.post(endpoints.submitRecommendedClass, {\n draftId: selectedModel.id,\n students: formData.students,\n startDate: `${formData.startDate}T${formData.startTime}:00`,\n finalDate: `${formData.finalDate}T${formData.finalTime}:00`,\n });\n\n setSendModalOpen(false);\n setSelectedModel(null);\n } finally {\n setSendModalLoading(false);\n }\n },\n [api, endpoints.submitRecommendedClass, selectedModel]\n );\n\n /**\n * Handle send lesson modal close\n */\n const handleSendModalClose = useCallback(() => {\n setSendModalOpen(false);\n setSelectedModel(null);\n }, []);\n\n /**\n * Handle categories change in send modal\n */\n const handleCategoriesChange = useCallback(\n (categories: CategoryConfig[]) => {\n setSendModalCategories(categories);\n },\n []\n );\n\n return {\n historyProps: {\n fetchRecommendedClassHistory,\n fetchRecommendedClassModels,\n deleteRecommendedClassModel,\n onCreateLesson: handleCreateLesson,\n onCreateModel: handleCreateModel,\n onRowClick: handleRowClick,\n onEditRecommendedClass: handleEditRecommendedClass,\n onEditModel: handleEditModel,\n onSendLesson: handleSendLesson,\n fetchRecommendedClassDrafts,\n deleteRecommendedClassDraft,\n onSendDraft: handleSendLesson,\n onEditDraft: handleEditModel,\n emptyStateImage,\n noSearchImage,\n mapSubjectNameToEnum,\n userFilterData,\n subjectsMap,\n title: texts.title,\n createButtonText: texts.createButtonText,\n searchPlaceholder: texts.searchPlaceholder,\n },\n modalProps: {\n isOpen: sendModalOpen,\n onClose: handleSendModalClose,\n onSubmit: handleSendLessonSubmit,\n categories: sendModalCategories,\n onCategoriesChange: handleCategoriesChange,\n isLoading: sendModalLoading,\n modalTitle: selectedModel?.title,\n },\n navigate,\n };\n };\n};\n\n/**\n * Alias for createUseRecommendedLessonsPage\n */\nexport const createRecommendedLessonsPageHook = createUseRecommendedLessonsPage;\n"],"mappings":"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","names":["recommendedClass"]}
|
|
@@ -56,7 +56,7 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
56
56
|
mapSubjectNameToEnum
|
|
57
57
|
} = config;
|
|
58
58
|
return () => {
|
|
59
|
-
const
|
|
59
|
+
const recommendedClassMapRef = useRef(/* @__PURE__ */ new Map());
|
|
60
60
|
const [sendModalOpen, setSendModalOpen] = useState(false);
|
|
61
61
|
const [selectedModel, setSelectedModel] = useState(null);
|
|
62
62
|
const [sendModalLoading, setSendModalLoading] = useState(false);
|
|
@@ -75,60 +75,63 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
75
75
|
subjects.forEach((s) => map.set(s.id, s.name));
|
|
76
76
|
return map;
|
|
77
77
|
}, [userData]);
|
|
78
|
-
const
|
|
78
|
+
const fetchRecommendedClassHistory = useCallback(
|
|
79
79
|
async (filters) => {
|
|
80
80
|
const params = buildQueryParams(filters);
|
|
81
81
|
const response = await api.get(
|
|
82
|
-
endpoints.
|
|
82
|
+
endpoints.recommendedClassHistory,
|
|
83
83
|
{ params }
|
|
84
84
|
);
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
const recommendedClass = response.data.data.recommendedClass;
|
|
86
|
+
recommendedClass.forEach((recommendedClass2) => {
|
|
87
|
+
recommendedClassMapRef.current.set(
|
|
88
|
+
recommendedClass2.recommendedClass.id,
|
|
89
|
+
recommendedClass2
|
|
90
|
+
);
|
|
88
91
|
});
|
|
89
92
|
return response.data;
|
|
90
93
|
},
|
|
91
|
-
[api, endpoints.
|
|
94
|
+
[api, endpoints.recommendedClassHistory]
|
|
92
95
|
);
|
|
93
|
-
const
|
|
96
|
+
const fetchRecommendedClassModels = useCallback(
|
|
94
97
|
async (filters) => {
|
|
95
98
|
const params = buildQueryParams({
|
|
96
99
|
...filters,
|
|
97
100
|
type: "MODELO" /* MODELO */
|
|
98
101
|
});
|
|
99
102
|
const response = await api.get(
|
|
100
|
-
endpoints.
|
|
103
|
+
endpoints.recommendedClassDrafts,
|
|
101
104
|
{ params }
|
|
102
105
|
);
|
|
103
106
|
return response.data;
|
|
104
107
|
},
|
|
105
|
-
[api, endpoints.
|
|
108
|
+
[api, endpoints.recommendedClassDrafts]
|
|
106
109
|
);
|
|
107
|
-
const
|
|
110
|
+
const deleteRecommendedClassModel = useCallback(
|
|
108
111
|
async (id) => {
|
|
109
|
-
await api.delete(`${endpoints.
|
|
112
|
+
await api.delete(`${endpoints.recommendedClassDrafts}/${id}`);
|
|
110
113
|
},
|
|
111
|
-
[api, endpoints.
|
|
114
|
+
[api, endpoints.recommendedClassDrafts]
|
|
112
115
|
);
|
|
113
|
-
const
|
|
116
|
+
const fetchRecommendedClassDrafts = useCallback(
|
|
114
117
|
async (filters) => {
|
|
115
118
|
const params = buildQueryParams({
|
|
116
119
|
...filters,
|
|
117
120
|
type: "RASCUNHO" /* RASCUNHO */
|
|
118
121
|
});
|
|
119
122
|
const response = await api.get(
|
|
120
|
-
endpoints.
|
|
123
|
+
endpoints.recommendedClassDrafts,
|
|
121
124
|
{ params }
|
|
122
125
|
);
|
|
123
126
|
return response.data;
|
|
124
127
|
},
|
|
125
|
-
[api, endpoints.
|
|
128
|
+
[api, endpoints.recommendedClassDrafts]
|
|
126
129
|
);
|
|
127
|
-
const
|
|
130
|
+
const deleteRecommendedClassDraft = useCallback(
|
|
128
131
|
async (id) => {
|
|
129
|
-
await api.delete(`${endpoints.
|
|
132
|
+
await api.delete(`${endpoints.recommendedClassDrafts}/${id}`);
|
|
130
133
|
},
|
|
131
|
-
[api, endpoints.
|
|
134
|
+
[api, endpoints.recommendedClassDrafts]
|
|
132
135
|
);
|
|
133
136
|
const handleCreateLesson = useCallback(() => {
|
|
134
137
|
navigate(paths.createLesson);
|
|
@@ -137,17 +140,20 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
137
140
|
navigate(paths.createModel);
|
|
138
141
|
}, []);
|
|
139
142
|
const handleRowClick = useCallback((row) => {
|
|
140
|
-
const originalData =
|
|
143
|
+
const originalData = recommendedClassMapRef.current.get(row.id);
|
|
141
144
|
navigate(`${paths.lessonDetails}/${row.id}`, {
|
|
142
|
-
state: {
|
|
145
|
+
state: { recommendedClassData: originalData }
|
|
143
146
|
});
|
|
144
147
|
}, []);
|
|
145
|
-
const
|
|
148
|
+
const handleEditRecommendedClass = useCallback((id) => {
|
|
146
149
|
navigate(`${paths.editLesson}/${id}/editar`);
|
|
147
150
|
}, []);
|
|
148
|
-
const handleEditModel = useCallback(
|
|
149
|
-
|
|
150
|
-
|
|
151
|
+
const handleEditModel = useCallback(
|
|
152
|
+
(model) => {
|
|
153
|
+
navigate(`${paths.editModel}${model.id}`);
|
|
154
|
+
},
|
|
155
|
+
[]
|
|
156
|
+
);
|
|
151
157
|
const handleSendLesson = useCallback(
|
|
152
158
|
(model) => {
|
|
153
159
|
setSelectedModel(model);
|
|
@@ -176,7 +182,7 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
176
182
|
if (!selectedModel) return;
|
|
177
183
|
setSendModalLoading(true);
|
|
178
184
|
try {
|
|
179
|
-
await api.post(endpoints.
|
|
185
|
+
await api.post(endpoints.submitRecommendedClass, {
|
|
180
186
|
draftId: selectedModel.id,
|
|
181
187
|
students: formData.students,
|
|
182
188
|
startDate: `${formData.startDate}T${formData.startTime}:00`,
|
|
@@ -188,7 +194,7 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
188
194
|
setSendModalLoading(false);
|
|
189
195
|
}
|
|
190
196
|
},
|
|
191
|
-
[api, endpoints.
|
|
197
|
+
[api, endpoints.submitRecommendedClass, selectedModel]
|
|
192
198
|
);
|
|
193
199
|
const handleSendModalClose = useCallback(() => {
|
|
194
200
|
setSendModalOpen(false);
|
|
@@ -202,17 +208,17 @@ var createUseRecommendedLessonsPage = (config) => {
|
|
|
202
208
|
);
|
|
203
209
|
return {
|
|
204
210
|
historyProps: {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
211
|
+
fetchRecommendedClassHistory,
|
|
212
|
+
fetchRecommendedClassModels,
|
|
213
|
+
deleteRecommendedClassModel,
|
|
208
214
|
onCreateLesson: handleCreateLesson,
|
|
209
215
|
onCreateModel: handleCreateModel,
|
|
210
216
|
onRowClick: handleRowClick,
|
|
211
|
-
|
|
217
|
+
onEditRecommendedClass: handleEditRecommendedClass,
|
|
212
218
|
onEditModel: handleEditModel,
|
|
213
219
|
onSendLesson: handleSendLesson,
|
|
214
|
-
|
|
215
|
-
|
|
220
|
+
fetchRecommendedClassDrafts,
|
|
221
|
+
deleteRecommendedClassDraft,
|
|
216
222
|
onSendDraft: handleSendLesson,
|
|
217
223
|
onEditDraft: handleEditModel,
|
|
218
224
|
emptyStateImage,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/useRecommendedLessonsPage.ts"],"sourcesContent":["/**\n * useRecommendedLessonsPage Hook Factory\n *\n * Factory function to create a hook for RecommendedLessons, LessonDrafts, and LessonModels pages.\n * Contains all common state, memos, and callbacks.\n */\n\nimport { useCallback, useRef, useMemo, useState } from 'react';\nimport {\n GoalDraftType,\n type GoalHistoryFilters,\n type GoalsHistoryApiResponse,\n type GoalTableItem,\n type GoalHistoryItem,\n type GoalModelFilters,\n type GoalModelsApiResponse,\n type GoalModelTableItem,\n} from '../types/recommendedLessons';\nimport type {\n SendLessonFormData,\n CategoryConfig,\n} from '../components/SendLessonModal/types';\nimport { SubjectEnum } from '../enums/SubjectEnum';\n\n/**\n * API client interface\n */\nexport interface RecommendedLessonsApiClient {\n get: <T>(\n url: string,\n config?: { params?: Record<string, unknown> }\n ) => Promise<{ data: T }>;\n post: <T>(url: string, data?: unknown) => Promise<{ data: T }>;\n delete: <T>(url: string) => Promise<{ data: T }>;\n}\n\n/**\n * User institution data structure\n */\nexport interface UserInstitution {\n school: { id: string; name: string };\n schoolYear: { id: string; name: string };\n class: { id: string; name: string };\n}\n\n/**\n * Subject teacher class data structure\n */\nexport interface SubTeacherTopicClass {\n subject: { id: string; name: string };\n class: { id: string; name: string };\n}\n\n/**\n * User data structure\n */\nexport interface RecommendedLessonsUserData {\n userInstitutions?: UserInstitution[];\n subTeacherTopicClasses?: SubTeacherTopicClass[];\n}\n\n/**\n * Navigation paths configuration\n */\nexport interface RecommendedLessonsPagePaths {\n /** Path for creating a new lesson */\n createLesson: string;\n /** Path for creating a new model */\n createModel: string;\n /** Base path for lesson details */\n lessonDetails: string;\n /** Base path for editing a lesson */\n editLesson: string;\n /** Path for editing a model (with id parameter) */\n editModel: string;\n}\n\n/**\n * API endpoints configuration\n */\nexport interface RecommendedLessonsPageEndpoints {\n /** Endpoint for fetching goals history */\n goalsHistory: string;\n /** Endpoint for fetching goal models/drafts */\n goalDrafts: string;\n /** Endpoint for submitting a goal */\n submitGoal: string;\n}\n\n/**\n * UI text configuration\n */\nexport interface RecommendedLessonsPageTexts {\n title: string;\n createButtonText: string;\n searchPlaceholder: string;\n}\n\n/**\n * Configuration for createUseRecommendedLessonsPage factory\n */\nexport interface UseRecommendedLessonsPageConfig {\n /** API client for making requests */\n api: RecommendedLessonsApiClient;\n /** Navigation function */\n navigate: (path: string, options?: { state?: unknown }) => void;\n /** User data for filter options */\n userData: RecommendedLessonsUserData | null;\n /** Navigation paths */\n paths: RecommendedLessonsPagePaths;\n /** API endpoints */\n endpoints: RecommendedLessonsPageEndpoints;\n /** UI text */\n texts: RecommendedLessonsPageTexts;\n /** Image for empty state */\n emptyStateImage: string;\n /** Image for no search results */\n noSearchImage: string;\n /** Function to map subject name to SubjectEnum */\n mapSubjectNameToEnum: (subjectName: string) => SubjectEnum | null;\n}\n\n/**\n * Return type for the useRecommendedLessonsPage hook\n */\nexport interface UseRecommendedLessonsPageReturn {\n /** Props for RecommendedLessonsHistory component */\n historyProps: {\n fetchGoalsHistory: (\n filters?: GoalHistoryFilters\n ) => Promise<GoalsHistoryApiResponse>;\n fetchGoalModels: (\n filters?: GoalModelFilters\n ) => Promise<GoalModelsApiResponse>;\n deleteGoalModel: (id: string) => Promise<void>;\n onCreateLesson: () => void;\n onCreateModel: () => void;\n onRowClick: (row: GoalTableItem) => void;\n onEditGoal: (id: string) => void;\n onEditModel: (model: GoalModelTableItem) => void;\n onSendLesson: (model: GoalModelTableItem) => void;\n fetchGoalDrafts: (\n filters?: GoalModelFilters\n ) => Promise<GoalModelsApiResponse>;\n deleteGoalDraft: (id: string) => Promise<void>;\n onSendDraft: (draft: GoalModelTableItem) => void;\n onEditDraft: (draft: GoalModelTableItem) => void;\n emptyStateImage: string;\n noSearchImage: string;\n mapSubjectNameToEnum: (subjectName: string) => SubjectEnum | null;\n userFilterData: {\n schools: Array<{ id: string; name: string }>;\n classes: Array<{ id: string; name: string }>;\n subjects: Array<{ id: string; name: string }>;\n };\n subjectsMap: Map<string, string>;\n title: string;\n createButtonText: string;\n searchPlaceholder: string;\n };\n /** Props for SendLessonModal component */\n modalProps: {\n isOpen: boolean;\n onClose: () => void;\n onSubmit: (formData: SendLessonFormData) => Promise<void>;\n categories: CategoryConfig[];\n onCategoriesChange: (categories: CategoryConfig[]) => void;\n isLoading: boolean;\n modalTitle: string | undefined;\n };\n /** Navigate function for custom tab handlers */\n navigate: (path: string, options?: { state?: unknown }) => void;\n}\n\n/**\n * Build query parameters from filter object\n */\nconst buildQueryParams = (\n filters?: Record<string, unknown>\n): Record<string, unknown> => {\n if (!filters) return {};\n\n const params: Record<string, unknown> = {};\n for (const key in filters) {\n const value = filters[key];\n if (value !== undefined && value !== null) {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n params[key] = value;\n }\n }\n }\n return params;\n};\n\n/**\n * Get school options from user data\n */\nconst getSchoolOptions = (\n userData: RecommendedLessonsUserData | null\n): Array<{ id: string; name: string }> => {\n if (!userData?.userInstitutions) return [];\n\n const schoolMap = new Map<string, string>();\n userData.userInstitutions.forEach((inst) => {\n if (inst.school?.id && inst.school?.name) {\n schoolMap.set(inst.school.id, inst.school.name);\n }\n });\n\n return Array.from(schoolMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Get class options from user data\n */\nconst getClassOptions = (\n userData: RecommendedLessonsUserData | null\n): Array<{ id: string; name: string }> => {\n if (!userData?.userInstitutions) return [];\n\n const classMap = new Map<string, string>();\n userData.userInstitutions.forEach((inst) => {\n if (inst.class?.id && inst.class?.name) {\n classMap.set(inst.class.id, inst.class.name);\n }\n });\n\n return Array.from(classMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Get subject options from user data\n */\nconst getSubjectOptions = (\n userData: RecommendedLessonsUserData | null\n): Array<{ id: string; name: string }> => {\n if (!userData?.subTeacherTopicClasses) return [];\n\n const subjectMap = new Map<string, string>();\n userData.subTeacherTopicClasses.forEach((stc) => {\n if (stc.subject?.id && stc.subject?.name) {\n subjectMap.set(stc.subject.id, stc.subject.name);\n }\n });\n\n return Array.from(subjectMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Factory function to create useRecommendedLessonsPage hook\n *\n * @param config - Configuration object with API client, navigation, user data, paths, etc.\n * @returns Hook function that returns historyProps, modalProps, and navigate\n *\n * @example\n * ```tsx\n * // In your app setup\n * const useRecommendedLessonsPage = createUseRecommendedLessonsPage({\n * api,\n * navigate,\n * userData,\n * paths: {\n * createLesson: '/criar-aula',\n * createModel: '/criar-aula?mode=model',\n * lessonDetails: '/aulas-recomendadas',\n * editLesson: '/aulas-recomendadas',\n * editModel: '/criar-aula?mode=model&id=',\n * },\n * endpoints: {\n * goalsHistory: '/recommended-class/history',\n * goalDrafts: '/recommended-class/drafts',\n * submitGoal: '/goals',\n * },\n * texts: {\n * title: 'Histórico de aulas recomendadas',\n * createButtonText: 'Criar aula',\n * searchPlaceholder: 'Buscar aula',\n * },\n * emptyStateImage,\n * noSearchImage,\n * mapSubjectNameToEnum,\n * });\n *\n * // In your component\n * const { historyProps, modalProps, navigate } = useRecommendedLessonsPage();\n * ```\n */\nexport const createUseRecommendedLessonsPage = (\n config: UseRecommendedLessonsPageConfig\n): (() => UseRecommendedLessonsPageReturn) => {\n const {\n api,\n navigate,\n userData,\n paths,\n endpoints,\n texts,\n emptyStateImage,\n noSearchImage,\n mapSubjectNameToEnum,\n } = config;\n\n return (): UseRecommendedLessonsPageReturn => {\n // Store original goal data for navigation\n const goalsMapRef = useRef<Map<string, GoalHistoryItem>>(new Map());\n\n // SendLessonModal state\n const [sendModalOpen, setSendModalOpen] = useState(false);\n const [selectedModel, setSelectedModel] =\n useState<GoalModelTableItem | null>(null);\n const [sendModalLoading, setSendModalLoading] = useState(false);\n const [sendModalCategories, setSendModalCategories] = useState<\n CategoryConfig[]\n >([]);\n\n // Build user filter data from user data\n const userFilterData = useMemo(\n () => ({\n schools: getSchoolOptions(userData),\n classes: getClassOptions(userData),\n subjects: getSubjectOptions(userData),\n }),\n [userData]\n );\n\n // Memoized subjects map for models display\n const subjectsMap = useMemo(() => {\n const map = new Map<string, string>();\n const subjects = getSubjectOptions(userData);\n subjects.forEach((s) => map.set(s.id, s.name));\n return map;\n }, [userData]);\n\n /**\n * Fetch goals history from API\n */\n const fetchGoalsHistory = useCallback(\n async (\n filters?: GoalHistoryFilters\n ): Promise<GoalsHistoryApiResponse> => {\n const params = buildQueryParams(filters as Record<string, unknown>);\n const response = await api.get<GoalsHistoryApiResponse>(\n endpoints.goalsHistory,\n { params }\n );\n\n // Store original goal data for later use in navigation\n const goals = response.data.data.goals;\n goals.forEach((goal) => {\n goalsMapRef.current.set(goal.goal.id, goal);\n });\n\n return response.data;\n },\n [api, endpoints.goalsHistory]\n );\n\n /**\n * Fetch goal models from API\n */\n const fetchGoalModels = useCallback(\n async (filters?: GoalModelFilters): Promise<GoalModelsApiResponse> => {\n const params = buildQueryParams({\n ...filters,\n type: GoalDraftType.MODELO,\n } as Record<string, unknown>);\n const response = await api.get<GoalModelsApiResponse>(\n endpoints.goalDrafts,\n { params }\n );\n return response.data;\n },\n [api, endpoints.goalDrafts]\n );\n\n /**\n * Delete a goal model\n */\n const deleteGoalModel = useCallback(\n async (id: string): Promise<void> => {\n await api.delete(`${endpoints.goalDrafts}/${id}`);\n },\n [api, endpoints.goalDrafts]\n );\n\n /**\n * Fetch goal drafts from API\n */\n const fetchGoalDrafts = useCallback(\n async (filters?: GoalModelFilters): Promise<GoalModelsApiResponse> => {\n const params = buildQueryParams({\n ...filters,\n type: GoalDraftType.RASCUNHO,\n } as Record<string, unknown>);\n const response = await api.get<GoalModelsApiResponse>(\n endpoints.goalDrafts,\n { params }\n );\n return response.data;\n },\n [api, endpoints.goalDrafts]\n );\n\n /**\n * Delete a goal draft\n */\n const deleteGoalDraft = useCallback(\n async (id: string): Promise<void> => {\n await api.delete(`${endpoints.goalDrafts}/${id}`);\n },\n [api, endpoints.goalDrafts]\n );\n\n /**\n * Handle create lesson button click\n */\n const handleCreateLesson = useCallback(() => {\n navigate(paths.createLesson);\n }, []);\n\n /**\n * Handle create model button click\n */\n const handleCreateModel = useCallback(() => {\n navigate(paths.createModel);\n }, []);\n\n /**\n * Handle row click - navigate to goal details\n */\n const handleRowClick = useCallback((row: GoalTableItem) => {\n const originalData = goalsMapRef.current.get(row.id);\n navigate(`${paths.lessonDetails}/${row.id}`, {\n state: { goalData: originalData },\n });\n }, []);\n\n /**\n * Handle edit goal action\n */\n const handleEditGoal = useCallback((id: string) => {\n navigate(`${paths.editLesson}/${id}/editar`);\n }, []);\n\n /**\n * Handle edit model action\n */\n const handleEditModel = useCallback((model: GoalModelTableItem) => {\n navigate(`${paths.editModel}${model.id}`);\n }, []);\n\n /**\n * Handle send lesson button click - opens modal\n */\n const handleSendLesson = useCallback(\n (model: GoalModelTableItem) => {\n setSelectedModel(model);\n\n // Build categories from user data for CheckboxGroup\n const classes = getClassOptions(userData);\n const categories: CategoryConfig[] = [];\n\n if (classes.length > 0) {\n categories.push({\n key: 'students',\n label: 'Turmas',\n selectedIds: [],\n itens: classes.map((cls) => ({\n id: cls.id,\n name: cls.name,\n studentId: cls.id,\n userInstitutionId: cls.id,\n })),\n });\n }\n\n setSendModalCategories(categories);\n setSendModalOpen(true);\n },\n [userData]\n );\n\n /**\n * Handle send lesson modal submit\n */\n const handleSendLessonSubmit = useCallback(\n async (formData: SendLessonFormData) => {\n if (!selectedModel) return;\n\n setSendModalLoading(true);\n try {\n await api.post(endpoints.submitGoal, {\n draftId: selectedModel.id,\n students: formData.students,\n startDate: `${formData.startDate}T${formData.startTime}:00`,\n finalDate: `${formData.finalDate}T${formData.finalTime}:00`,\n });\n\n setSendModalOpen(false);\n setSelectedModel(null);\n } finally {\n setSendModalLoading(false);\n }\n },\n [api, endpoints.submitGoal, selectedModel]\n );\n\n /**\n * Handle send lesson modal close\n */\n const handleSendModalClose = useCallback(() => {\n setSendModalOpen(false);\n setSelectedModel(null);\n }, []);\n\n /**\n * Handle categories change in send modal\n */\n const handleCategoriesChange = useCallback(\n (categories: CategoryConfig[]) => {\n setSendModalCategories(categories);\n },\n []\n );\n\n return {\n historyProps: {\n fetchGoalsHistory,\n fetchGoalModels,\n deleteGoalModel,\n onCreateLesson: handleCreateLesson,\n onCreateModel: handleCreateModel,\n onRowClick: handleRowClick,\n onEditGoal: handleEditGoal,\n onEditModel: handleEditModel,\n onSendLesson: handleSendLesson,\n fetchGoalDrafts,\n deleteGoalDraft,\n onSendDraft: handleSendLesson,\n onEditDraft: handleEditModel,\n emptyStateImage,\n noSearchImage,\n mapSubjectNameToEnum,\n userFilterData,\n subjectsMap,\n title: texts.title,\n createButtonText: texts.createButtonText,\n searchPlaceholder: texts.searchPlaceholder,\n },\n modalProps: {\n isOpen: sendModalOpen,\n onClose: handleSendModalClose,\n onSubmit: handleSendLessonSubmit,\n categories: sendModalCategories,\n onCategoriesChange: handleCategoriesChange,\n isLoading: sendModalLoading,\n modalTitle: selectedModel?.title,\n },\n navigate,\n };\n };\n};\n\n/**\n * Alias for createUseRecommendedLessonsPage\n */\nexport const createRecommendedLessonsPageHook = createUseRecommendedLessonsPage;\n"],"mappings":";AAOA,SAAS,aAAa,QAAQ,SAAS,gBAAgB;AA0KvD,IAAM,mBAAmB,CACvB,YAC4B;AAC5B,MAAI,CAAC,QAAS,QAAO,CAAC;AAEtB,QAAM,SAAkC,CAAC;AACzC,aAAW,OAAO,SAAS;AACzB,UAAM,QAAQ,QAAQ,GAAG;AACzB,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC,UACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAKA,IAAM,mBAAmB,CACvB,aACwC;AACxC,MAAI,CAAC,UAAU,iBAAkB,QAAO,CAAC;AAEzC,QAAM,YAAY,oBAAI,IAAoB;AAC1C,WAAS,iBAAiB,QAAQ,CAAC,SAAS;AAC1C,QAAI,KAAK,QAAQ,MAAM,KAAK,QAAQ,MAAM;AACxC,gBAAU,IAAI,KAAK,OAAO,IAAI,KAAK,OAAO,IAAI;AAAA,IAChD;AAAA,EACF,CAAC;AAED,SAAO,MAAM,KAAK,UAAU,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,EAAE,IAAI,KAAK,EAAE;AAC3E;AAKA,IAAM,kBAAkB,CACtB,aACwC;AACxC,MAAI,CAAC,UAAU,iBAAkB,QAAO,CAAC;AAEzC,QAAM,WAAW,oBAAI,IAAoB;AACzC,WAAS,iBAAiB,QAAQ,CAAC,SAAS;AAC1C,QAAI,KAAK,OAAO,MAAM,KAAK,OAAO,MAAM;AACtC,eAAS,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI;AAAA,IAC7C;AAAA,EACF,CAAC;AAED,SAAO,MAAM,KAAK,SAAS,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,EAAE,IAAI,KAAK,EAAE;AAC1E;AAKA,IAAM,oBAAoB,CACxB,aACwC;AACxC,MAAI,CAAC,UAAU,uBAAwB,QAAO,CAAC;AAE/C,QAAM,aAAa,oBAAI,IAAoB;AAC3C,WAAS,uBAAuB,QAAQ,CAAC,QAAQ;AAC/C,QAAI,IAAI,SAAS,MAAM,IAAI,SAAS,MAAM;AACxC,iBAAW,IAAI,IAAI,QAAQ,IAAI,IAAI,QAAQ,IAAI;AAAA,IACjD;AAAA,EACF,CAAC;AAED,SAAO,MAAM,KAAK,WAAW,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,EAAE,IAAI,KAAK,EAAE;AAC5E;AAyCO,IAAM,kCAAkC,CAC7C,WAC4C;AAC5C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,SAAO,MAAuC;AAE5C,UAAM,cAAc,OAAqC,oBAAI,IAAI,CAAC;AAGlE,UAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,KAAK;AACxD,UAAM,CAAC,eAAe,gBAAgB,IACpC,SAAoC,IAAI;AAC1C,UAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,KAAK;AAC9D,UAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAEpD,CAAC,CAAC;AAGJ,UAAM,iBAAiB;AAAA,MACrB,OAAO;AAAA,QACL,SAAS,iBAAiB,QAAQ;AAAA,QAClC,SAAS,gBAAgB,QAAQ;AAAA,QACjC,UAAU,kBAAkB,QAAQ;AAAA,MACtC;AAAA,MACA,CAAC,QAAQ;AAAA,IACX;AAGA,UAAM,cAAc,QAAQ,MAAM;AAChC,YAAM,MAAM,oBAAI,IAAoB;AACpC,YAAM,WAAW,kBAAkB,QAAQ;AAC3C,eAAS,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;AAC7C,aAAO;AAAA,IACT,GAAG,CAAC,QAAQ,CAAC;AAKb,UAAM,oBAAoB;AAAA,MACxB,OACE,YACqC;AACrC,cAAM,SAAS,iBAAiB,OAAkC;AAClE,cAAM,WAAW,MAAM,IAAI;AAAA,UACzB,UAAU;AAAA,UACV,EAAE,OAAO;AAAA,QACX;AAGA,cAAM,QAAQ,SAAS,KAAK,KAAK;AACjC,cAAM,QAAQ,CAAC,SAAS;AACtB,sBAAY,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI;AAAA,QAC5C,CAAC;AAED,eAAO,SAAS;AAAA,MAClB;AAAA,MACA,CAAC,KAAK,UAAU,YAAY;AAAA,IAC9B;AAKA,UAAM,kBAAkB;AAAA,MACtB,OAAO,YAA+D;AACpE,cAAM,SAAS,iBAAiB;AAAA,UAC9B,GAAG;AAAA,UACH;AAAA,QACF,CAA4B;AAC5B,cAAM,WAAW,MAAM,IAAI;AAAA,UACzB,UAAU;AAAA,UACV,EAAE,OAAO;AAAA,QACX;AACA,eAAO,SAAS;AAAA,MAClB;AAAA,MACA,CAAC,KAAK,UAAU,UAAU;AAAA,IAC5B;AAKA,UAAM,kBAAkB;AAAA,MACtB,OAAO,OAA8B;AACnC,cAAM,IAAI,OAAO,GAAG,UAAU,UAAU,IAAI,EAAE,EAAE;AAAA,MAClD;AAAA,MACA,CAAC,KAAK,UAAU,UAAU;AAAA,IAC5B;AAKA,UAAM,kBAAkB;AAAA,MACtB,OAAO,YAA+D;AACpE,cAAM,SAAS,iBAAiB;AAAA,UAC9B,GAAG;AAAA,UACH;AAAA,QACF,CAA4B;AAC5B,cAAM,WAAW,MAAM,IAAI;AAAA,UACzB,UAAU;AAAA,UACV,EAAE,OAAO;AAAA,QACX;AACA,eAAO,SAAS;AAAA,MAClB;AAAA,MACA,CAAC,KAAK,UAAU,UAAU;AAAA,IAC5B;AAKA,UAAM,kBAAkB;AAAA,MACtB,OAAO,OAA8B;AACnC,cAAM,IAAI,OAAO,GAAG,UAAU,UAAU,IAAI,EAAE,EAAE;AAAA,MAClD;AAAA,MACA,CAAC,KAAK,UAAU,UAAU;AAAA,IAC5B;AAKA,UAAM,qBAAqB,YAAY,MAAM;AAC3C,eAAS,MAAM,YAAY;AAAA,IAC7B,GAAG,CAAC,CAAC;AAKL,UAAM,oBAAoB,YAAY,MAAM;AAC1C,eAAS,MAAM,WAAW;AAAA,IAC5B,GAAG,CAAC,CAAC;AAKL,UAAM,iBAAiB,YAAY,CAAC,QAAuB;AACzD,YAAM,eAAe,YAAY,QAAQ,IAAI,IAAI,EAAE;AACnD,eAAS,GAAG,MAAM,aAAa,IAAI,IAAI,EAAE,IAAI;AAAA,QAC3C,OAAO,EAAE,UAAU,aAAa;AAAA,MAClC,CAAC;AAAA,IACH,GAAG,CAAC,CAAC;AAKL,UAAM,iBAAiB,YAAY,CAAC,OAAe;AACjD,eAAS,GAAG,MAAM,UAAU,IAAI,EAAE,SAAS;AAAA,IAC7C,GAAG,CAAC,CAAC;AAKL,UAAM,kBAAkB,YAAY,CAAC,UAA8B;AACjE,eAAS,GAAG,MAAM,SAAS,GAAG,MAAM,EAAE,EAAE;AAAA,IAC1C,GAAG,CAAC,CAAC;AAKL,UAAM,mBAAmB;AAAA,MACvB,CAAC,UAA8B;AAC7B,yBAAiB,KAAK;AAGtB,cAAM,UAAU,gBAAgB,QAAQ;AACxC,cAAM,aAA+B,CAAC;AAEtC,YAAI,QAAQ,SAAS,GAAG;AACtB,qBAAW,KAAK;AAAA,YACd,KAAK;AAAA,YACL,OAAO;AAAA,YACP,aAAa,CAAC;AAAA,YACd,OAAO,QAAQ,IAAI,CAAC,SAAS;AAAA,cAC3B,IAAI,IAAI;AAAA,cACR,MAAM,IAAI;AAAA,cACV,WAAW,IAAI;AAAA,cACf,mBAAmB,IAAI;AAAA,YACzB,EAAE;AAAA,UACJ,CAAC;AAAA,QACH;AAEA,+BAAuB,UAAU;AACjC,yBAAiB,IAAI;AAAA,MACvB;AAAA,MACA,CAAC,QAAQ;AAAA,IACX;AAKA,UAAM,yBAAyB;AAAA,MAC7B,OAAO,aAAiC;AACtC,YAAI,CAAC,cAAe;AAEpB,4BAAoB,IAAI;AACxB,YAAI;AACF,gBAAM,IAAI,KAAK,UAAU,YAAY;AAAA,YACnC,SAAS,cAAc;AAAA,YACvB,UAAU,SAAS;AAAA,YACnB,WAAW,GAAG,SAAS,SAAS,IAAI,SAAS,SAAS;AAAA,YACtD,WAAW,GAAG,SAAS,SAAS,IAAI,SAAS,SAAS;AAAA,UACxD,CAAC;AAED,2BAAiB,KAAK;AACtB,2BAAiB,IAAI;AAAA,QACvB,UAAE;AACA,8BAAoB,KAAK;AAAA,QAC3B;AAAA,MACF;AAAA,MACA,CAAC,KAAK,UAAU,YAAY,aAAa;AAAA,IAC3C;AAKA,UAAM,uBAAuB,YAAY,MAAM;AAC7C,uBAAiB,KAAK;AACtB,uBAAiB,IAAI;AAAA,IACvB,GAAG,CAAC,CAAC;AAKL,UAAM,yBAAyB;AAAA,MAC7B,CAAC,eAAiC;AAChC,+BAAuB,UAAU;AAAA,MACnC;AAAA,MACA,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb,aAAa;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,MAAM;AAAA,QACb,kBAAkB,MAAM;AAAA,QACxB,mBAAmB,MAAM;AAAA,MAC3B;AAAA,MACA,YAAY;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,oBAAoB;AAAA,QACpB,WAAW;AAAA,QACX,YAAY,eAAe;AAAA,MAC7B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,mCAAmC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useRecommendedLessonsPage.ts"],"sourcesContent":["/**\n * useRecommendedLessonsPage Hook Factory\n *\n * Factory function to create a hook for RecommendedLessons, LessonDrafts, and LessonModels pages.\n * Contains all common state, memos, and callbacks.\n */\n\nimport { useCallback, useRef, useMemo, useState } from 'react';\nimport {\n RecommendedClassDraftType,\n type RecommendedClassHistoryFilters,\n type RecommendedClassHistoryApiResponse,\n type RecommendedClassTableItem,\n type RecommendedClassHistoryItem,\n type RecommendedClassModelFilters,\n type RecommendedClassModelsApiResponse,\n type RecommendedClassModelTableItem,\n} from '../types/recommendedLessons';\nimport type {\n SendLessonFormData,\n CategoryConfig,\n} from '../components/SendLessonModal/types';\nimport { SubjectEnum } from '../enums/SubjectEnum';\n\n/**\n * API client interface\n */\nexport interface RecommendedLessonsApiClient {\n get: <T>(\n url: string,\n config?: { params?: Record<string, unknown> }\n ) => Promise<{ data: T }>;\n post: <T>(url: string, data?: unknown) => Promise<{ data: T }>;\n delete: <T>(url: string) => Promise<{ data: T }>;\n}\n\n/**\n * User institution data structure\n */\nexport interface UserInstitution {\n school: { id: string; name: string };\n schoolYear: { id: string; name: string };\n class: { id: string; name: string };\n}\n\n/**\n * Subject teacher class data structure\n */\nexport interface SubTeacherTopicClass {\n subject: { id: string; name: string };\n class: { id: string; name: string };\n}\n\n/**\n * User data structure\n */\nexport interface RecommendedLessonsUserData {\n userInstitutions?: UserInstitution[];\n subTeacherTopicClasses?: SubTeacherTopicClass[];\n}\n\n/**\n * Navigation paths configuration\n */\nexport interface RecommendedLessonsPagePaths {\n /** Path for creating a new lesson */\n createLesson: string;\n /** Path for creating a new model */\n createModel: string;\n /** Base path for lesson details */\n lessonDetails: string;\n /** Base path for editing a lesson */\n editLesson: string;\n /** Path for editing a model (with id parameter) */\n editModel: string;\n}\n\n/**\n * API endpoints configuration\n */\nexport interface RecommendedLessonsPageEndpoints {\n /** Endpoint for fetching recommendedClass history */\n recommendedClassHistory: string;\n /** Endpoint for fetching recommendedClass models/drafts */\n recommendedClassDrafts: string;\n /** Endpoint for submitting a recommendedClass */\n submitRecommendedClass: string;\n}\n\n/**\n * UI text configuration\n */\nexport interface RecommendedLessonsPageTexts {\n title: string;\n createButtonText: string;\n searchPlaceholder: string;\n}\n\n/**\n * Configuration for createUseRecommendedLessonsPage factory\n */\nexport interface UseRecommendedLessonsPageConfig {\n /** API client for making requests */\n api: RecommendedLessonsApiClient;\n /** Navigation function */\n navigate: (path: string, options?: { state?: unknown }) => void;\n /** User data for filter options */\n userData: RecommendedLessonsUserData | null;\n /** Navigation paths */\n paths: RecommendedLessonsPagePaths;\n /** API endpoints */\n endpoints: RecommendedLessonsPageEndpoints;\n /** UI text */\n texts: RecommendedLessonsPageTexts;\n /** Image for empty state */\n emptyStateImage: string;\n /** Image for no search results */\n noSearchImage: string;\n /** Function to map subject name to SubjectEnum */\n mapSubjectNameToEnum: (subjectName: string) => SubjectEnum | null;\n}\n\n/**\n * Return type for the useRecommendedLessonsPage hook\n */\nexport interface UseRecommendedLessonsPageReturn {\n /** Props for RecommendedLessonsHistory component */\n historyProps: {\n fetchRecommendedClassHistory: (\n filters?: RecommendedClassHistoryFilters\n ) => Promise<RecommendedClassHistoryApiResponse>;\n fetchRecommendedClassModels: (\n filters?: RecommendedClassModelFilters\n ) => Promise<RecommendedClassModelsApiResponse>;\n deleteRecommendedClassModel: (id: string) => Promise<void>;\n onCreateLesson: () => void;\n onCreateModel: () => void;\n onRowClick: (row: RecommendedClassTableItem) => void;\n onEditRecommendedClass: (id: string) => void;\n onEditModel: (model: RecommendedClassModelTableItem) => void;\n onSendLesson: (model: RecommendedClassModelTableItem) => void;\n fetchRecommendedClassDrafts: (\n filters?: RecommendedClassModelFilters\n ) => Promise<RecommendedClassModelsApiResponse>;\n deleteRecommendedClassDraft: (id: string) => Promise<void>;\n onSendDraft: (draft: RecommendedClassModelTableItem) => void;\n onEditDraft: (draft: RecommendedClassModelTableItem) => void;\n emptyStateImage: string;\n noSearchImage: string;\n mapSubjectNameToEnum: (subjectName: string) => SubjectEnum | null;\n userFilterData: {\n schools: Array<{ id: string; name: string }>;\n classes: Array<{ id: string; name: string }>;\n subjects: Array<{ id: string; name: string }>;\n };\n subjectsMap: Map<string, string>;\n title: string;\n createButtonText: string;\n searchPlaceholder: string;\n };\n /** Props for SendLessonModal component */\n modalProps: {\n isOpen: boolean;\n onClose: () => void;\n onSubmit: (formData: SendLessonFormData) => Promise<void>;\n categories: CategoryConfig[];\n onCategoriesChange: (categories: CategoryConfig[]) => void;\n isLoading: boolean;\n modalTitle: string | undefined;\n };\n /** Navigate function for custom tab handlers */\n navigate: (path: string, options?: { state?: unknown }) => void;\n}\n\n/**\n * Build query parameters from filter object\n */\nconst buildQueryParams = (\n filters?: Record<string, unknown>\n): Record<string, unknown> => {\n if (!filters) return {};\n\n const params: Record<string, unknown> = {};\n for (const key in filters) {\n const value = filters[key];\n if (value !== undefined && value !== null) {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n params[key] = value;\n }\n }\n }\n return params;\n};\n\n/**\n * Get school options from user data\n */\nconst getSchoolOptions = (\n userData: RecommendedLessonsUserData | null\n): Array<{ id: string; name: string }> => {\n if (!userData?.userInstitutions) return [];\n\n const schoolMap = new Map<string, string>();\n userData.userInstitutions.forEach((inst) => {\n if (inst.school?.id && inst.school?.name) {\n schoolMap.set(inst.school.id, inst.school.name);\n }\n });\n\n return Array.from(schoolMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Get class options from user data\n */\nconst getClassOptions = (\n userData: RecommendedLessonsUserData | null\n): Array<{ id: string; name: string }> => {\n if (!userData?.userInstitutions) return [];\n\n const classMap = new Map<string, string>();\n userData.userInstitutions.forEach((inst) => {\n if (inst.class?.id && inst.class?.name) {\n classMap.set(inst.class.id, inst.class.name);\n }\n });\n\n return Array.from(classMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Get subject options from user data\n */\nconst getSubjectOptions = (\n userData: RecommendedLessonsUserData | null\n): Array<{ id: string; name: string }> => {\n if (!userData?.subTeacherTopicClasses) return [];\n\n const subjectMap = new Map<string, string>();\n userData.subTeacherTopicClasses.forEach((stc) => {\n if (stc.subject?.id && stc.subject?.name) {\n subjectMap.set(stc.subject.id, stc.subject.name);\n }\n });\n\n return Array.from(subjectMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Factory function to create useRecommendedLessonsPage hook\n *\n * @param config - Configuration object with API client, navigation, user data, paths, etc.\n * @returns Hook function that returns historyProps, modalProps, and navigate\n *\n * @example\n * ```tsx\n * // In your app setup\n * const useRecommendedLessonsPage = createUseRecommendedLessonsPage({\n * api,\n * navigate,\n * userData,\n * paths: {\n * createLesson: '/criar-aula',\n * createModel: '/criar-aula?mode=model',\n * lessonDetails: '/aulas-recomendadas',\n * editLesson: '/aulas-recomendadas',\n * editModel: '/criar-aula?mode=model&id=',\n * },\n * endpoints: {\n * recommendedClassHistory: '/recommended-class/history',\n * recommendedClassDrafts: '/recommended-class/drafts',\n * submitRecommendedClass: '/recommendedClass',\n * },\n * texts: {\n * title: 'Histórico de aulas recomendadas',\n * createButtonText: 'Criar aula',\n * searchPlaceholder: 'Buscar aula',\n * },\n * emptyStateImage,\n * noSearchImage,\n * mapSubjectNameToEnum,\n * });\n *\n * // In your component\n * const { historyProps, modalProps, navigate } = useRecommendedLessonsPage();\n * ```\n */\nexport const createUseRecommendedLessonsPage = (\n config: UseRecommendedLessonsPageConfig\n): (() => UseRecommendedLessonsPageReturn) => {\n const {\n api,\n navigate,\n userData,\n paths,\n endpoints,\n texts,\n emptyStateImage,\n noSearchImage,\n mapSubjectNameToEnum,\n } = config;\n\n return (): UseRecommendedLessonsPageReturn => {\n // Store original recommendedClass data for navigation\n const recommendedClassMapRef = useRef<\n Map<string, RecommendedClassHistoryItem>\n >(new Map());\n\n // SendLessonModal state\n const [sendModalOpen, setSendModalOpen] = useState(false);\n const [selectedModel, setSelectedModel] =\n useState<RecommendedClassModelTableItem | null>(null);\n const [sendModalLoading, setSendModalLoading] = useState(false);\n const [sendModalCategories, setSendModalCategories] = useState<\n CategoryConfig[]\n >([]);\n\n // Build user filter data from user data\n const userFilterData = useMemo(\n () => ({\n schools: getSchoolOptions(userData),\n classes: getClassOptions(userData),\n subjects: getSubjectOptions(userData),\n }),\n [userData]\n );\n\n // Memoized subjects map for models display\n const subjectsMap = useMemo(() => {\n const map = new Map<string, string>();\n const subjects = getSubjectOptions(userData);\n subjects.forEach((s) => map.set(s.id, s.name));\n return map;\n }, [userData]);\n\n /**\n * Fetch recommendedClass history from API\n */\n const fetchRecommendedClassHistory = useCallback(\n async (\n filters?: RecommendedClassHistoryFilters\n ): Promise<RecommendedClassHistoryApiResponse> => {\n const params = buildQueryParams(filters as Record<string, unknown>);\n const response = await api.get<RecommendedClassHistoryApiResponse>(\n endpoints.recommendedClassHistory,\n { params }\n );\n\n // Store original recommendedClass data for later use in navigation\n const recommendedClass = response.data.data.recommendedClass;\n recommendedClass.forEach((recommendedClass) => {\n recommendedClassMapRef.current.set(\n recommendedClass.recommendedClass.id,\n recommendedClass\n );\n });\n\n return response.data;\n },\n [api, endpoints.recommendedClassHistory]\n );\n\n /**\n * Fetch recommendedClass models from API\n */\n const fetchRecommendedClassModels = useCallback(\n async (\n filters?: RecommendedClassModelFilters\n ): Promise<RecommendedClassModelsApiResponse> => {\n const params = buildQueryParams({\n ...filters,\n type: RecommendedClassDraftType.MODELO,\n } as Record<string, unknown>);\n const response = await api.get<RecommendedClassModelsApiResponse>(\n endpoints.recommendedClassDrafts,\n { params }\n );\n return response.data;\n },\n [api, endpoints.recommendedClassDrafts]\n );\n\n /**\n * Delete a recommendedClass model\n */\n const deleteRecommendedClassModel = useCallback(\n async (id: string): Promise<void> => {\n await api.delete(`${endpoints.recommendedClassDrafts}/${id}`);\n },\n [api, endpoints.recommendedClassDrafts]\n );\n\n /**\n * Fetch recommendedClass drafts from API\n */\n const fetchRecommendedClassDrafts = useCallback(\n async (\n filters?: RecommendedClassModelFilters\n ): Promise<RecommendedClassModelsApiResponse> => {\n const params = buildQueryParams({\n ...filters,\n type: RecommendedClassDraftType.RASCUNHO,\n } as Record<string, unknown>);\n const response = await api.get<RecommendedClassModelsApiResponse>(\n endpoints.recommendedClassDrafts,\n { params }\n );\n return response.data;\n },\n [api, endpoints.recommendedClassDrafts]\n );\n\n /**\n * Delete a recommendedClass draft\n */\n const deleteRecommendedClassDraft = useCallback(\n async (id: string): Promise<void> => {\n await api.delete(`${endpoints.recommendedClassDrafts}/${id}`);\n },\n [api, endpoints.recommendedClassDrafts]\n );\n\n /**\n * Handle create lesson button click\n */\n const handleCreateLesson = useCallback(() => {\n navigate(paths.createLesson);\n }, []);\n\n /**\n * Handle create model button click\n */\n const handleCreateModel = useCallback(() => {\n navigate(paths.createModel);\n }, []);\n\n /**\n * Handle row click - navigate to recommendedClass details\n */\n const handleRowClick = useCallback((row: RecommendedClassTableItem) => {\n const originalData = recommendedClassMapRef.current.get(row.id);\n navigate(`${paths.lessonDetails}/${row.id}`, {\n state: { recommendedClassData: originalData },\n });\n }, []);\n\n /**\n * Handle edit recommendedClass action\n */\n const handleEditRecommendedClass = useCallback((id: string) => {\n navigate(`${paths.editLesson}/${id}/editar`);\n }, []);\n\n /**\n * Handle edit model action\n */\n const handleEditModel = useCallback(\n (model: RecommendedClassModelTableItem) => {\n navigate(`${paths.editModel}${model.id}`);\n },\n []\n );\n\n /**\n * Handle send lesson button click - opens modal\n */\n const handleSendLesson = useCallback(\n (model: RecommendedClassModelTableItem) => {\n setSelectedModel(model);\n\n // Build categories from user data for CheckboxGroup\n const classes = getClassOptions(userData);\n const categories: CategoryConfig[] = [];\n\n if (classes.length > 0) {\n categories.push({\n key: 'students',\n label: 'Turmas',\n selectedIds: [],\n itens: classes.map((cls) => ({\n id: cls.id,\n name: cls.name,\n studentId: cls.id,\n userInstitutionId: cls.id,\n })),\n });\n }\n\n setSendModalCategories(categories);\n setSendModalOpen(true);\n },\n [userData]\n );\n\n /**\n * Handle send lesson modal submit\n */\n const handleSendLessonSubmit = useCallback(\n async (formData: SendLessonFormData) => {\n if (!selectedModel) return;\n\n setSendModalLoading(true);\n try {\n await api.post(endpoints.submitRecommendedClass, {\n draftId: selectedModel.id,\n students: formData.students,\n startDate: `${formData.startDate}T${formData.startTime}:00`,\n finalDate: `${formData.finalDate}T${formData.finalTime}:00`,\n });\n\n setSendModalOpen(false);\n setSelectedModel(null);\n } finally {\n setSendModalLoading(false);\n }\n },\n [api, endpoints.submitRecommendedClass, selectedModel]\n );\n\n /**\n * Handle send lesson modal close\n */\n const handleSendModalClose = useCallback(() => {\n setSendModalOpen(false);\n setSelectedModel(null);\n }, []);\n\n /**\n * Handle categories change in send modal\n */\n const handleCategoriesChange = useCallback(\n (categories: CategoryConfig[]) => {\n setSendModalCategories(categories);\n },\n []\n );\n\n return {\n historyProps: {\n fetchRecommendedClassHistory,\n fetchRecommendedClassModels,\n deleteRecommendedClassModel,\n onCreateLesson: handleCreateLesson,\n onCreateModel: handleCreateModel,\n onRowClick: handleRowClick,\n onEditRecommendedClass: handleEditRecommendedClass,\n onEditModel: handleEditModel,\n onSendLesson: handleSendLesson,\n fetchRecommendedClassDrafts,\n deleteRecommendedClassDraft,\n onSendDraft: handleSendLesson,\n onEditDraft: handleEditModel,\n emptyStateImage,\n noSearchImage,\n mapSubjectNameToEnum,\n userFilterData,\n subjectsMap,\n title: texts.title,\n createButtonText: texts.createButtonText,\n searchPlaceholder: texts.searchPlaceholder,\n },\n modalProps: {\n isOpen: sendModalOpen,\n onClose: handleSendModalClose,\n onSubmit: handleSendLessonSubmit,\n categories: sendModalCategories,\n onCategoriesChange: handleCategoriesChange,\n isLoading: sendModalLoading,\n modalTitle: selectedModel?.title,\n },\n navigate,\n };\n };\n};\n\n/**\n * Alias for createUseRecommendedLessonsPage\n */\nexport const createRecommendedLessonsPageHook = createUseRecommendedLessonsPage;\n"],"mappings":"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","names":["recommendedClass"]}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Factory function to create a hook for RecommendedLessons, LessonDrafts, and LessonModels pages.
|
|
5
5
|
* Contains all common state, memos, and callbacks.
|
|
6
6
|
*/
|
|
7
|
-
import { type
|
|
7
|
+
import { type RecommendedClassHistoryFilters, type RecommendedClassHistoryApiResponse, type RecommendedClassTableItem, type RecommendedClassModelFilters, type RecommendedClassModelsApiResponse, type RecommendedClassModelTableItem } from '../types/recommendedLessons';
|
|
8
8
|
import type { SendLessonFormData, CategoryConfig } from '../components/SendLessonModal/types';
|
|
9
9
|
import { SubjectEnum } from '../enums/SubjectEnum';
|
|
10
10
|
/**
|
|
@@ -79,12 +79,12 @@ export interface RecommendedLessonsPagePaths {
|
|
|
79
79
|
* API endpoints configuration
|
|
80
80
|
*/
|
|
81
81
|
export interface RecommendedLessonsPageEndpoints {
|
|
82
|
-
/** Endpoint for fetching
|
|
83
|
-
|
|
84
|
-
/** Endpoint for fetching
|
|
85
|
-
|
|
86
|
-
/** Endpoint for submitting a
|
|
87
|
-
|
|
82
|
+
/** Endpoint for fetching recommendedClass history */
|
|
83
|
+
recommendedClassHistory: string;
|
|
84
|
+
/** Endpoint for fetching recommendedClass models/drafts */
|
|
85
|
+
recommendedClassDrafts: string;
|
|
86
|
+
/** Endpoint for submitting a recommendedClass */
|
|
87
|
+
submitRecommendedClass: string;
|
|
88
88
|
}
|
|
89
89
|
/**
|
|
90
90
|
* UI text configuration
|
|
@@ -125,19 +125,19 @@ export interface UseRecommendedLessonsPageConfig {
|
|
|
125
125
|
export interface UseRecommendedLessonsPageReturn {
|
|
126
126
|
/** Props for RecommendedLessonsHistory component */
|
|
127
127
|
historyProps: {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
128
|
+
fetchRecommendedClassHistory: (filters?: RecommendedClassHistoryFilters) => Promise<RecommendedClassHistoryApiResponse>;
|
|
129
|
+
fetchRecommendedClassModels: (filters?: RecommendedClassModelFilters) => Promise<RecommendedClassModelsApiResponse>;
|
|
130
|
+
deleteRecommendedClassModel: (id: string) => Promise<void>;
|
|
131
131
|
onCreateLesson: () => void;
|
|
132
132
|
onCreateModel: () => void;
|
|
133
|
-
onRowClick: (row:
|
|
134
|
-
|
|
135
|
-
onEditModel: (model:
|
|
136
|
-
onSendLesson: (model:
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
onSendDraft: (draft:
|
|
140
|
-
onEditDraft: (draft:
|
|
133
|
+
onRowClick: (row: RecommendedClassTableItem) => void;
|
|
134
|
+
onEditRecommendedClass: (id: string) => void;
|
|
135
|
+
onEditModel: (model: RecommendedClassModelTableItem) => void;
|
|
136
|
+
onSendLesson: (model: RecommendedClassModelTableItem) => void;
|
|
137
|
+
fetchRecommendedClassDrafts: (filters?: RecommendedClassModelFilters) => Promise<RecommendedClassModelsApiResponse>;
|
|
138
|
+
deleteRecommendedClassDraft: (id: string) => Promise<void>;
|
|
139
|
+
onSendDraft: (draft: RecommendedClassModelTableItem) => void;
|
|
140
|
+
onEditDraft: (draft: RecommendedClassModelTableItem) => void;
|
|
141
141
|
emptyStateImage: string;
|
|
142
142
|
noSearchImage: string;
|
|
143
143
|
mapSubjectNameToEnum: (subjectName: string) => SubjectEnum | null;
|
|
@@ -196,9 +196,9 @@ export interface UseRecommendedLessonsPageReturn {
|
|
|
196
196
|
* editModel: '/criar-aula?mode=model&id=',
|
|
197
197
|
* },
|
|
198
198
|
* endpoints: {
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
*
|
|
199
|
+
* recommendedClassHistory: '/recommended-class/history',
|
|
200
|
+
* recommendedClassDrafts: '/recommended-class/drafts',
|
|
201
|
+
* submitRecommendedClass: '/recommendedClass',
|
|
202
202
|
* },
|
|
203
203
|
* texts: {
|
|
204
204
|
* title: 'Histórico de aulas recomendadas',
|