analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
1,599 lines (1,306 loc) • 789 kB
JavaScript
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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 _chunkAF563OT2js = require('./chunk-AF563OT2.js');
var _chunkPPRJH3XLjs = require('./chunk-PPRJH3XL.js');
var _chunkVZMCTNX7js = require('./chunk-VZMCTNX7.js');
var _chunkJO6FYEKHjs = require('./chunk-JO6FYEKH.js');
var _chunkHLCT4MJAjs = require('./chunk-HLCT4MJA.js');
var _chunk4DQBBXY3js = require('./chunk-4DQBBXY3.js');
var _chunkC2IJDAEKjs = require('./chunk-C2IJDAEK.js');
var _chunkMJX4EXOOjs = require('./chunk-MJX4EXOO.js');
var _chunkM4Z5LDHLjs = require('./chunk-M4Z5LDHL.js');
var _chunkGVSA4SX7js = require('./chunk-GVSA4SX7.js');
var _chunk5W5EWLC2js = require('./chunk-5W5EWLC2.js');
var _chunkRX4NMGD4js = require('./chunk-RX4NMGD4.js');
var _chunkIT7YRLPMjs = require('./chunk-IT7YRLPM.js');
var _chunkTBD2B4VVjs = require('./chunk-TBD2B4VV.js');
var _chunkERYPJBIPjs = require('./chunk-ERYPJBIP.js');
var _chunkDRIFBRUSjs = require('./chunk-DRIFBRUS.js');
var _chunkCG7GWF5Ejs = require('./chunk-CG7GWF5E.js');
var _chunkJLOAEKEJjs = require('./chunk-JLOAEKEJ.js');
var _chunkCDO3SEITjs = require('./chunk-CDO3SEIT.js');
var _chunkTTSTAOIZjs = require('./chunk-TTSTAOIZ.js');
var _chunkR5QHGGXZjs = require('./chunk-R5QHGGXZ.js');
var _chunkZXOYMRH5js = require('./chunk-ZXOYMRH5.js');
var _chunk2S53HGFXjs = require('./chunk-2S53HGFX.js');
var _chunk536MQUJGjs = require('./chunk-536MQUJG.js');
var _chunk3GSGCLCOjs = require('./chunk-3GSGCLCO.js');
var _chunkZRTTIUKJjs = require('./chunk-ZRTTIUKJ.js');
var _chunkAVDZHON5js = require('./chunk-AVDZHON5.js');
var _chunkVUGO7VURjs = require('./chunk-VUGO7VUR.js');
var _chunkTBRQXPPOjs = require('./chunk-TBRQXPPO.js');
var _chunkB4EFRRXHjs = require('./chunk-B4EFRRXH.js');
var _chunk2WX2ZBAHjs = require('./chunk-2WX2ZBAH.js');
var _chunkABMVSNYEjs = require('./chunk-ABMVSNYE.js');
var _chunkZPUXEJOQjs = require('./chunk-ZPUXEJOQ.js');
var _chunk52VZ6TOFjs = require('./chunk-52VZ6TOF.js');
var _chunkAJC7YAEKjs = require('./chunk-AJC7YAEK.js');
var _chunk23TTOILXjs = require('./chunk-23TTOILX.js');
var _chunkVDLACBCFjs = require('./chunk-VDLACBCF.js');
var _chunkQ7THVSHRjs = require('./chunk-Q7THVSHR.js');
var _chunkHA7IHFOEjs = require('./chunk-HA7IHFOE.js');
var _chunkHOVTCEHKjs = require('./chunk-HOVTCEHK.js');
var _chunkZHWRUIVEjs = require('./chunk-ZHWRUIVE.js');
var _chunkJ3X3YTTHjs = require('./chunk-J3X3YTTH.js');
var _chunkXOJ3ERALjs = require('./chunk-XOJ3ERAL.js');
var _chunk7W6XZZKKjs = require('./chunk-7W6XZZKK.js');
var _chunkHYCL2IYZjs = require('./chunk-HYCL2IYZ.js');
var _chunkYBM4EYPAjs = require('./chunk-YBM4EYPA.js');
var _chunkOKU4RHFXjs = require('./chunk-OKU4RHFX.js');
var _chunkGYQUB3VWjs = require('./chunk-GYQUB3VW.js');
var _chunkDR7XX7RNjs = require('./chunk-DR7XX7RN.js');
var _chunkRPDDVEWKjs = require('./chunk-RPDDVEWK.js');
var _chunkHZE6VBF5js = require('./chunk-HZE6VBF5.js');
var _chunkHN2HFYUOjs = require('./chunk-HN2HFYUO.js');
var _chunkSZD7L65Qjs = require('./chunk-SZD7L65Q.js');
var _chunkQOF47WYZjs = require('./chunk-QOF47WYZ.js');
var _chunkZK5QTM5Cjs = require('./chunk-ZK5QTM5C.js');
var _chunkMPQZUD42js = require('./chunk-MPQZUD42.js');
var _chunkJR4KWECXjs = require('./chunk-JR4KWECX.js');
var _chunkHGWU3GUNjs = require('./chunk-HGWU3GUN.js');
var _chunkLWUL5WRWjs = require('./chunk-LWUL5WRW.js');
var _chunkJL5R5KTYjs = require('./chunk-JL5R5KTY.js');
var _chunkNEDUOGWUjs = require('./chunk-NEDUOGWU.js');
var _chunk3PCTUEIBjs = require('./chunk-3PCTUEIB.js');
var _chunkFCCPBAAQjs = require('./chunk-FCCPBAAQ.js');
var _chunkCMUIZOUVjs = require('./chunk-CMUIZOUV.js');
var _chunkBVUPM6EYjs = require('./chunk-BVUPM6EY.js');
var _chunkRIVDFVR5js = require('./chunk-RIVDFVR5.js');
var _chunkLGPTKTMPjs = require('./chunk-LGPTKTMP.js');
var _chunkFF2NCALYjs = require('./chunk-FF2NCALY.js');
var _chunk7A33ZIFEjs = require('./chunk-7A33ZIFE.js');
var _chunk5PEPG6VSjs = require('./chunk-5PEPG6VS.js');
var _chunkCFD6NHL7js = require('./chunk-CFD6NHL7.js');
var _chunkBJMKBBN3js = require('./chunk-BJMKBBN3.js');
var _chunkMNU45FM3js = require('./chunk-MNU45FM3.js');
var _chunkXVBSGC7Vjs = require('./chunk-XVBSGC7V.js');
var _chunkWWXDXIV7js = require('./chunk-WWXDXIV7.js');
var _chunk76VXVNA2js = require('./chunk-76VXVNA2.js');
var _chunkORRSVKFKjs = require('./chunk-ORRSVKFK.js');
var _chunkI3SR6N3Ljs = require('./chunk-I3SR6N3L.js');
var _chunkTCLRDUMFjs = require('./chunk-TCLRDUMF.js');
var _chunk34ST3MKOjs = require('./chunk-34ST3MKO.js');
var _chunkANT66KVKjs = require('./chunk-ANT66KVK.js');
var _chunkTN3AYOMVjs = require('./chunk-TN3AYOMV.js');
var _chunkDNGOIXIWjs = require('./chunk-DNGOIXIW.js');
var _chunkYFHORWTNjs = require('./chunk-YFHORWTN.js');
var _chunkB27BOQ2Ejs = require('./chunk-B27BOQ2E.js');
var _chunkAOUX6XXNjs = require('./chunk-AOUX6XXN.js');
// src/components/CheckBoxGroup/CheckBoxGroup.tsx
var _react = require('react');
// src/components/AlertManager/AlertsManager.tsx
var _CaretLeft = require('@phosphor-icons/react/dist/csr/CaretLeft');
var _CaretRight = require('@phosphor-icons/react/dist/csr/CaretRight');
var _PaperPlaneTilt = require('@phosphor-icons/react/dist/csr/PaperPlaneTilt');
// src/components/AlertManager/AlertSteps/MessageStep.tsx
var _shallow = require('zustand/react/shallow');
var _jsxruntime = require('react/jsx-runtime');
var ACCEPTED_IMAGE_EXTENSIONS = ".jpg,.jpeg,.png,.gif,.webp,.svg";
var MAX_IMAGE_SIZE_BYTES = 5 * 1024 * 1024;
var MAX_IMAGE_SIZE_LABEL = "5MB";
var MessageStep = ({
labels,
allowImageAttachment = true
}) => {
const [imageError, setImageError] = _react.useState.call(void 0, null);
const { title, message, image, setTitle, setMessage, setImage } = _chunkTBD2B4VVjs.useAlertFormStore.call(void 0,
_shallow.useShallow.call(void 0, (state) => ({
title: state.title,
message: state.message,
image: state.image,
setTitle: state.setTitle,
setMessage: state.setMessage,
setImage: state.setImage
}))
);
const handleFileSelect = (file) => {
setImageError(null);
setImage(file);
};
const handleRemoveFile = () => {
setImageError(null);
setImage(null);
};
const handleTypeError = () => {
setImageError(
"Formato de imagem n\xE3o suportado. Use jpg, jpeg, png, gif, webp ou svg."
);
};
const handleSizeError = () => {
setImageError(
`Imagem muito grande. O tamanho m\xE1ximo permitido \xE9 ${MAX_IMAGE_SIZE_LABEL}.`
);
};
const isImageFile = image instanceof File;
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "section", { className: "flex flex-col gap-4", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunkLGPTKTMPjs.Input_default,
{
required: true,
label: _optionalChain([labels, 'optionalAccess', _ => _.titleLabel]) || "T\xEDtulo",
placeholder: _optionalChain([labels, 'optionalAccess', _2 => _2.titlePlaceholder]) || "Digite o t\xEDtulo do aviso",
variant: "rounded",
value: title,
onChange: (e) => setTitle(e.target.value)
}
),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunkSZD7L65Qjs.TextArea_default,
{
required: true,
label: _optionalChain([labels, 'optionalAccess', _3 => _3.messageLabel]) || "Mensagem",
placeholder: _optionalChain([labels, 'optionalAccess', _4 => _4.messagePlaceholder]) || "Digite a mensagem do aviso",
value: message,
onChange: (e) => setMessage(e.target.value)
}
),
allowImageAttachment && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-2", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunk23TTOILXjs.ImageUpload,
{
selectedFile: isImageFile ? image : null,
onFileSelect: handleFileSelect,
onRemoveFile: handleRemoveFile,
accept: ACCEPTED_IMAGE_EXTENSIONS,
maxSize: MAX_IMAGE_SIZE_BYTES,
onTypeError: handleTypeError,
onSizeError: handleSizeError
}
),
imageError && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "sm", className: "text-error-600", role: "alert", children: imageError })
] })
] });
};
// src/components/AlertManager/AlertSteps/RecipientsStep.tsx
var RecipientsStep = ({
categories,
labels,
onCategoriesChange
}) => {
const { recipientCategories, initializeCategory } = _chunkTBD2B4VVjs.useAlertFormStore.call(void 0, );
_react.useEffect.call(void 0, () => {
for (const category of categories) {
const existingCategory = recipientCategories[category.key];
if (!existingCategory) {
initializeCategory({
key: category.key,
label: category.label,
availableItems: category.itens || [],
selectedIds: category.selectedIds || [],
allSelected: false
});
}
}
}, [categories, recipientCategories, initializeCategory]);
const handleCategoriesChange = (updatedCategories) => {
for (const category of updatedCategories) {
const selectedIds = category.selectedIds || [];
const allSelected = selectedIds.length === (_optionalChain([category, 'access', _5 => _5.itens, 'optionalAccess', _6 => _6.length]) || 0);
initializeCategory({
key: category.key,
label: category.label,
availableItems: category.itens || [],
selectedIds,
allSelected
});
}
if (onCategoriesChange) {
onCategoriesChange(updatedCategories);
}
};
const syncedCategories = _react.useMemo.call(void 0, () => {
return categories.map((category) => {
const storeCategory = recipientCategories[category.key];
if (storeCategory) {
return {
...category,
selectedIds: storeCategory.selectedIds
};
}
return category;
});
}, [categories, recipientCategories]);
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "section", { className: "flex flex-col gap-4", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "lg", weight: "medium", className: "text-text-950", children: _optionalChain([labels, 'optionalAccess', _7 => _7.recipientsDescription]) || "Para quem voc\xEA vai enviar o aviso?" }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
CheckboxGroup,
{
categories: syncedCategories,
onCategoriesChange: handleCategoriesChange
}
)
] });
};
// src/components/AlertManager/AlertSteps/DateStep.tsx
var DateStep = ({
labels,
allowScheduling = true,
allowEmailCopy = true
}) => {
const date = _chunkTBD2B4VVjs.useAlertFormStore.call(void 0, (state) => state.date);
const time = _chunkTBD2B4VVjs.useAlertFormStore.call(void 0, (state) => state.time);
const sendToday = _chunkTBD2B4VVjs.useAlertFormStore.call(void 0, (state) => state.sendToday);
const sendCopyToEmail = _chunkTBD2B4VVjs.useAlertFormStore.call(void 0, (state) => state.sendCopyToEmail);
const setDate = _chunkTBD2B4VVjs.useAlertFormStore.call(void 0, (state) => state.setDate);
const setTime = _chunkTBD2B4VVjs.useAlertFormStore.call(void 0, (state) => state.setTime);
const setSendToday = _chunkTBD2B4VVjs.useAlertFormStore.call(void 0, (state) => state.setSendToday);
const setSendCopyToEmail = _chunkTBD2B4VVjs.useAlertFormStore.call(void 0,
(state) => state.setSendCopyToEmail
);
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "section", { className: "flex flex-col gap-4", children: [
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex flex-row items-center gap-6", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunkANT66KVKjs.Text_default,
{
weight: "normal",
className: "cursor-pointer select-none leading-[150%] flex items-center font-roboto",
children: _optionalChain([labels, 'optionalAccess', _8 => _8.sendTodayLabel]) || "Enviar Hoje?"
}
),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunkMNU45FM3js.CheckBox_default,
{
label: "Sim",
checked: sendToday,
onChange: (e) => setSendToday(e.target.checked)
}
)
] }),
allowScheduling && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
DateTimeInput_default,
{
label: _optionalChain([labels, 'optionalAccess', _9 => _9.dateLabel]) || "Data de envio",
date,
time,
onDateChange: setDate,
onTimeChange: setTime,
disabled: sendToday,
timeLabel: _optionalChain([labels, 'optionalAccess', _10 => _10.timeLabel]) || "Hora de envio",
testId: "alert-datetime"
}
),
allowEmailCopy && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunkMNU45FM3js.CheckBox_default,
{
label: _optionalChain([labels, 'optionalAccess', _11 => _11.sendCopyToEmailLabel]) || "Enviar c\xF3pia para e-mail",
checked: sendCopyToEmail,
onChange: (e) => setSendCopyToEmail(e.target.checked)
}
)
] });
};
// src/components/AlertManager/AlertSteps/PreviewStep.tsx
var PreviewStep = ({ imageLink, defaultImage }) => {
const title = _chunkTBD2B4VVjs.useAlertFormStore.call(void 0, (state) => state.title);
const message = _chunkTBD2B4VVjs.useAlertFormStore.call(void 0, (state) => state.message);
const image = _chunkTBD2B4VVjs.useAlertFormStore.call(void 0, (state) => state.image);
const imageUrl = _react.useMemo.call(void 0, () => {
if (globalThis.window === void 0) {
return void 0;
}
if (image instanceof File) {
return globalThis.window.URL.createObjectURL(image);
}
if (typeof image === "string") {
return image;
}
return void 0;
}, [image]);
_react.useEffect.call(void 0, () => {
return () => {
if (globalThis.window !== void 0 && imageUrl && image instanceof File) {
URL.revokeObjectURL(imageUrl);
}
};
}, [imageUrl, image]);
const finalImageUrl = imageLink || imageUrl || defaultImage || void 0;
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "section", { className: "flex flex-col gap-4", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "bg-background-50 px-5 py-6 flex flex-col items-center gap-4 rounded-xl", children: [
finalImageUrl && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "img", { src: finalImageUrl, alt: title || "Imagem do alerta" }),
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col items-center text-center gap-3", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "lg", weight: "semibold", children: title || "Nenhum T\xEDtulo de Alerta" }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkANT66KVKjs.Text_default, { size: "sm", weight: "normal", className: "text-text-500", children: message || "Aqui aparecer\xE1 a mensagem do alerta definido pelo usu\xE1rio" })
] })
] }) });
};
// src/components/AlertManager/validation.ts
var BASE_STEPS_COUNT = 4;
var validateMessageStep = (formData) => {
if (!_optionalChain([formData, 'access', _12 => _12.title, 'optionalAccess', _13 => _13.trim, 'call', _14 => _14()])) return "T\xEDtulo \xE9 obrigat\xF3rio";
if (!_optionalChain([formData, 'access', _15 => _15.message, 'optionalAccess', _16 => _16.trim, 'call', _17 => _17()])) return "Mensagem \xE9 obrigat\xF3ria";
return true;
};
var validateRecipientsStep = (categories) => {
if (categories.length === 0) return "Nenhuma categoria configurada";
const lastCategory = categories[categories.length - 1];
if (!_optionalChain([lastCategory, 'optionalAccess', _18 => _18.selectedIds, 'optionalAccess', _19 => _19.length])) return "Selecione destinat\xE1rios";
return true;
};
var validateDateStep = (formData) => {
if (formData.sendToday) return true;
if (!formData.date) return "Data \xE9 obrigat\xF3ria";
if (!formData.time) return "Hora \xE9 obrigat\xF3ria";
return true;
};
var canFinish = (formData, categories) => {
return validateMessageStep(formData) === true && validateRecipientsStep(categories) === true && validateDateStep(formData) === true;
};
var isCurrentStepValid = (currentStep, formData, categories, customSteps) => {
return validateCurrentStep(currentStep, formData, categories, customSteps) === true;
};
var validateCurrentStep = (currentStep, formData, categories, customSteps) => {
switch (currentStep) {
case 0:
return validateMessageStep(formData);
case 1:
return validateRecipientsStep(categories);
case 2:
return validateDateStep(formData);
case 3:
return true;
default: {
const currentStepConfig = _optionalChain([customSteps, 'optionalAccess', _20 => _20[currentStep - BASE_STEPS_COUNT]]);
return _optionalChain([currentStepConfig, 'optionalAccess', _21 => _21.validate]) ? currentStepConfig.validate(formData) : true;
}
}
};
var advanceToNextStep = (currentStep, completedSteps, setCompletedSteps, setCurrentStep) => {
if (setCompletedSteps && !completedSteps.includes(currentStep)) {
setCompletedSteps([...completedSteps, currentStep]);
}
if (setCurrentStep) {
setCurrentStep(currentStep + 1);
}
};
var handleNext = ({
currentStep,
steps,
formData,
categories,
customSteps,
completedSteps = [],
setCompletedSteps,
setCurrentStep
}) => {
if (currentStep >= steps.length - 1) {
return { success: false, error: "J\xE1 est\xE1 no \xFAltimo step" };
}
const validation = validateCurrentStep(
currentStep,
formData,
categories,
customSteps
);
if (validation !== true) {
console.error("Valida\xE7\xE3o falhou:", validation);
const errorMessage = typeof validation === "string" ? validation : "Preencha todos os campos obrigat\xF3rios";
return { success: false, error: errorMessage };
}
advanceToNextStep(
currentStep,
completedSteps,
setCompletedSteps,
setCurrentStep
);
return { success: true };
};
// src/components/shared/SendModalBase/utils/applyChainedAutoSelection.ts
function applyChainedAutoSelection(categories) {
let current = categories;
let safety = 0;
let changed = true;
while (changed && safety < categories.length + 2) {
safety += 1;
changed = false;
const next = current.map((category) => {
const filteredItems = _chunkIT7YRLPMjs.calculateFormattedItemsForAutoSelection.call(void 0,
category,
current
);
const hasNoSelection = !category.selectedIds || category.selectedIds.length === 0;
if (filteredItems.length === 1 && hasNoSelection) {
changed = true;
return { ...category, selectedIds: [filteredItems[0].id] };
}
return category;
});
current = next;
}
return current;
}
// src/components/shared/SendModalBase/hooks/useDateTimeHandlers.ts
function useDateTimeHandlers({ setFormData }) {
const handleStartDateChange = _react.useCallback.call(void 0,
(value) => {
setFormData({ startDate: value });
},
[setFormData]
);
const handleStartTimeChange = _react.useCallback.call(void 0,
(value) => {
setFormData({ startTime: value });
},
[setFormData]
);
const handleFinalDateChange = _react.useCallback.call(void 0,
(value) => {
setFormData({ finalDate: value });
},
[setFormData]
);
const handleFinalTimeChange = _react.useCallback.call(void 0,
(value) => {
setFormData({ finalTime: value });
},
[setFormData]
);
return {
handleStartDateChange,
handleStartTimeChange,
handleFinalDateChange,
handleFinalTimeChange
};
}
// src/components/shared/SendModalBase/hooks/useCategoryInitialization.ts
function useCategoryInitialization({
isOpen,
initialCategories,
setCategories,
onCategoriesChange
}) {
const categoriesInitialized = _react.useRef.call(void 0, false);
_react.useEffect.call(void 0, () => {
if (isOpen && initialCategories.length > 0 && !categoriesInitialized.current) {
const autoSelectedCategories = applyChainedAutoSelection(initialCategories);
setCategories(autoSelectedCategories);
if (onCategoriesChange) {
onCategoriesChange(autoSelectedCategories);
}
categoriesInitialized.current = true;
}
}, [isOpen, initialCategories, setCategories, onCategoriesChange]);
_react.useEffect.call(void 0, () => {
if (!isOpen) {
categoriesInitialized.current = false;
}
}, [isOpen]);
return {
categoriesInitializedRef: categoriesInitialized
};
}
// src/components/shared/SendModalBase/hooks/useCategorySync.ts
var DYNAMIC_KEYS = ["turma", "students"];
function dynamicItemsSignature(categories) {
return DYNAMIC_KEYS.map((key) => {
const category = categories.find((c) => c.key === key);
const ids = (_nullishCoalesce(_optionalChain([category, 'optionalAccess', _22 => _22.itens]), () => ( []))).map((item) => item.id).join(",");
return `${key}:${ids}`;
}).join("|");
}
function useCategorySync({
isOpen,
initialCategories,
storeCategories,
setCategories,
categoriesInitializedRef
}) {
_react.useEffect.call(void 0, () => {
if (isOpen && initialCategories.length > 0 && categoriesInitializedRef.current) {
if (dynamicItemsSignature(initialCategories) !== dynamicItemsSignature(storeCategories)) {
setCategories(initialCategories);
}
}
}, [
isOpen,
initialCategories,
storeCategories,
setCategories,
categoriesInitializedRef
]);
}
// src/components/shared/SendModalBase/components/SendModalError.tsx
var _WarningCircle = require('@phosphor-icons/react/dist/csr/WarningCircle');
var SendModalError = ({
error,
testId,
className
}) => {
if (!error) return null;
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
_chunkANT66KVKjs.Text_default,
{
as: "p",
size: "sm",
color: "text-error-600",
className: `flex items-center gap-1 mt-1 ${className || ""}`,
"data-testid": testId,
"aria-live": "polite",
children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _WarningCircle.WarningCircleIcon, { size: 16 }),
error
]
}
);
};
// src/components/shared/SendModalBase/components/RecipientStep.tsx
var RecipientStep = ({
categories,
onCategoriesChange,
entityNameWithArticle,
studentsError,
testIdPrefix
}) => {
const categoriesWithSearch = _react.useMemo.call(void 0,
() => categories.map(
(category) => category.key === "students" ? { ...category, searchable: true } : category
),
[categories]
);
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
"div",
{
className: "flex flex-col gap-4 min-h-0 flex-1",
"data-testid": testIdPrefix ? `${testIdPrefix}-recipient-step` : void 0,
children: [
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
_chunkANT66KVKjs.Text_default,
{
size: "sm",
weight: "medium",
color: "text-text-700",
className: "flex-shrink-0",
children: [
"Para quem voc\xEA vai enviar ",
entityNameWithArticle,
"?"
]
}
),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
"div",
{
className: _chunkTN3AYOMVjs.cn.call(void 0,
"flex-1 min-h-0 overflow-y-auto",
"scrollbar-thin scrollbar-thumb-border-300 scrollbar-track-transparent"
),
"data-testid": testIdPrefix ? `${testIdPrefix}-scroll-container` : "scroll-container",
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
CheckboxGroup,
{
categories: categoriesWithSearch,
onCategoriesChange,
compactSingleItem: true,
showDivider: true
}
)
}
),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
SendModalError,
{
error: studentsError,
testId: testIdPrefix ? `${testIdPrefix}-students-error` : void 0,
className: "flex-shrink-0"
}
)
]
}
);
};
// src/components/DateTimeInput/DateTimeInput.tsx
var _CalendarBlank = require('@phosphor-icons/react/dist/csr/CalendarBlank');
var formatDateToInput = (dateObj) => {
const year = dateObj.getFullYear();
const month = String(dateObj.getMonth() + 1).padStart(2, "0");
const day = String(dateObj.getDate()).padStart(2, "0");
return `${year}-${month}-${day}`;
};
var DateTimeInput = ({
label,
date,
time,
onDateChange,
onTimeChange,
errorMessage,
disabled = false,
defaultTime = "00:00",
testId,
timeLabel = "Hora",
className
}) => {
const [isCalendarOpen, setIsCalendarOpen] = _react.useState.call(void 0, false);
const [selectedDate, setSelectedDate] = _react.useState.call(void 0,
date ? /* @__PURE__ */ new Date(`${date}T12:00:00`) : void 0
);
const triggerRef = _react.useRef.call(void 0, null);
const handleDateSelect = (dateObj) => {
setSelectedDate(dateObj);
onDateChange(formatDateToInput(dateObj));
if (!time) {
onTimeChange(defaultTime);
}
};
const handleDateInputChange = (e) => {
const value = e.target.value;
if (value.includes("T")) {
const [datePart, timePart] = value.split("T");
onDateChange(datePart);
if (timePart) {
onTimeChange(timePart);
}
} else {
onDateChange(value);
}
if (value) {
const dateValue = value.includes("T") ? value : `${value}T12:00:00`;
const dateObj = new Date(dateValue);
if (!Number.isNaN(dateObj.getTime())) {
setSelectedDate(dateObj);
}
}
};
const handleTimeChange = (e) => {
onTimeChange(e.target.value);
};
const inputValue = date ? `${date}T${time || defaultTime}` : "";
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
_chunk76VXVNA2js.DropdownMenu_default,
{
open: !disabled && isCalendarOpen,
onOpenChange: (open) => {
if (!disabled) {
setIsCalendarOpen(open);
}
},
children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunk76VXVNA2js.DropdownMenuTrigger,
{
className,
ref: triggerRef,
disabled,
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunkLGPTKTMPjs.Input_default,
{
label,
type: "datetime-local",
placeholder: "00/00/0000",
value: inputValue,
onChange: handleDateInputChange,
variant: "rounded",
errorMessage,
disabled,
"data-testid": testId ? `${testId}-input` : void 0,
iconRight: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _CalendarBlank.CalendarBlankIcon, { size: 14 }),
className: "[&::-webkit-calendar-picker-indicator]:hidden"
}
)
}
),
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
_chunk76VXVNA2js.DropdownMenuContent,
{
align: "start",
className: "p-0 z-[100]",
portal: true,
triggerRef,
children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunkHA7IHFOEjs.Calendar_default,
{
variant: "selection",
selectedDate,
onDateSelect: handleDateSelect,
showActivities: false
}
),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "p-3 border-t border-border-200", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunkLGPTKTMPjs.Input_default,
{
label: timeLabel,
type: "time",
value: time || defaultTime,
onChange: handleTimeChange,
variant: "rounded",
"data-testid": testId ? `${testId}-time` : void 0
}
) })
]
}
)
]
}
);
};
var DateTimeInput_default = DateTimeInput;
// src/components/shared/SendModalBase/components/DeadlineStep.tsx
var DeadlineStep = ({
startDate,
startTime,
finalDate,
finalTime,
onStartDateChange,
onStartTimeChange,
onFinalDateChange,
onFinalTimeChange,
errors,
testIdPrefix,
children
}) => {
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
"div",
{
className: "flex flex-col gap-4 sm:gap-6 pt-6",
"data-testid": testIdPrefix ? `${testIdPrefix}-deadline-step` : void 0,
children: [
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-2 sm:grid sm:grid-cols-2", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
DateTimeInput_default,
{
label: "Iniciar em*",
date: startDate,
time: startTime,
onDateChange: onStartDateChange,
onTimeChange: onStartTimeChange,
errorMessage: [errors.startDate, errors.startTime].filter(Boolean).join(" ") || void 0,
defaultTime: "00:00",
testId: testIdPrefix ? `${testIdPrefix}-start-datetime` : "start-datetime",
className: "w-full"
}
),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
DateTimeInput_default,
{
label: "Finalizar at\xE9*",
date: finalDate,
time: finalTime,
onDateChange: onFinalDateChange,
onTimeChange: onFinalTimeChange,
errorMessage: [errors.finalDate, errors.finalTime].filter(Boolean).join(" ") || void 0,
defaultTime: "23:59",
testId: testIdPrefix ? `${testIdPrefix}-final-datetime` : "final-datetime",
className: "w-full"
}
)
] }),
children
]
}
);
};
var DeadlineStep_default = DeadlineStep;
// src/components/shared/SendModalBase/components/SendModalFooter.tsx
var _ArrowRight = require('@phosphor-icons/react/dist/csr/ArrowRight');
var SendModalFooter = ({
currentStep,
maxSteps,
isLoading,
onCancel,
onPreviousStep,
onNextStep,
onSubmit,
entityName,
testIdPrefix
}) => {
const isLastStep = currentStep >= maxSteps;
const showPreviousButton = currentStep > 1;
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
"div",
{
className: "flex flex-col-reverse sm:flex-row items-center justify-between gap-3 w-full",
"data-testid": testIdPrefix ? `${testIdPrefix}-footer` : void 0,
children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunk34ST3MKOjs.Button_default,
{
variant: "link",
action: "primary",
onClick: onCancel,
className: "w-full sm:w-auto",
"data-testid": testIdPrefix ? `${testIdPrefix}-cancel-button` : void 0,
children: "Cancelar"
}
),
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col-reverse sm:flex-row items-center gap-2 sm:gap-3 w-full sm:w-auto", children: [
showPreviousButton && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunk34ST3MKOjs.Button_default,
{
variant: "outline",
action: "primary",
onClick: onPreviousStep,
iconLeft: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _CaretLeft.CaretLeftIcon, { size: 16 }),
className: "w-full sm:w-auto",
"data-testid": testIdPrefix ? `${testIdPrefix}-previous-button` : void 0,
children: "Anterior"
}
),
isLastStep ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunk34ST3MKOjs.Button_default,
{
variant: "solid",
action: "primary",
onClick: onSubmit,
disabled: isLoading,
iconLeft: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _PaperPlaneTilt.PaperPlaneTiltIcon, { size: 16 }),
className: "w-full sm:w-auto",
"data-testid": testIdPrefix ? `${testIdPrefix}-submit-button` : void 0,
children: isLoading ? "Enviando..." : `Enviar ${entityName}`
}
) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunk34ST3MKOjs.Button_default,
{
variant: "solid",
action: "primary",
onClick: onNextStep,
iconRight: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _ArrowRight.ArrowRightIcon, { size: 16 }),
className: "w-full sm:w-auto",
"data-testid": testIdPrefix ? `${testIdPrefix}-next-button` : void 0,
children: "Pr\xF3ximo"
}
)
] })
]
}
);
};
// src/components/AlertManager/AlertsManager.tsx
var StepWrapper = ({ children }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { children });
var AlertsManager = ({
config,
isOpen = false,
onClose,
imageLink,
defaultImage
}) => {
const [isModalOpen, setIsModalOpen] = _react.useState.call(void 0, isOpen);
const [currentStep, setCurrentStep] = _react.useState.call(void 0, 0);
const [completedSteps, setCompletedSteps] = _react.useState.call(void 0, []);
const [categories, setCategories] = _react.useState.call(void 0, config.categories);
const formData = _react.useSyncExternalStore.call(void 0,
_chunkTBD2B4VVjs.useAlertFormStore.subscribe,
_chunkTBD2B4VVjs.useAlertFormStore.getState
);
_react.useEffect.call(void 0, () => {
setIsModalOpen(isOpen);
}, [isOpen]);
const categoriesInitializedRef = _react.useRef.call(void 0, false);
const { labels, behavior, steps: customSteps } = config;
const { handleCategoriesChange: baseHandleCategoriesChange } = _chunkZXOYMRH5js.useDynamicStudentFetching.call(void 0, setCategories, {
fetchStudentsByFilters: _optionalChain([behavior, 'optionalAccess', _23 => _23.fetchStudentsByFilters])
});
const handleCategoriesChange = _react.useCallback.call(void 0,
async (updatedCategories) => {
await baseHandleCategoriesChange(updatedCategories);
},
[baseHandleCategoriesChange]
);
_react.useEffect.call(void 0, () => {
if (isModalOpen && config.categories.length > 0 && !categoriesInitializedRef.current) {
const autoSelectedCategories = applyChainedAutoSelection(
config.categories
);
setCategories(autoSelectedCategories);
void handleCategoriesChange(autoSelectedCategories);
categoriesInitializedRef.current = true;
}
}, [
isModalOpen,
config.categories,
applyChainedAutoSelection,
handleCategoriesChange
]);
_react.useEffect.call(void 0, () => {
if (!isModalOpen) {
categoriesInitializedRef.current = false;
}
}, [isModalOpen]);
const defaultSteps = [
{
id: "1",
label: "Mensagem",
state: "completed"
},
{
id: "2",
label: _optionalChain([labels, 'optionalAccess', _24 => _24.recipientsTitle]) || "Destinat\xE1rios",
state: "current"
},
{
id: "3",
label: _optionalChain([labels, 'optionalAccess', _25 => _25.dateLabel]) || "Data de envio",
state: "pending"
},
{
id: "4",
label: _optionalChain([labels, 'optionalAccess', _26 => _26.previewTitle]) || "Pr\xE9via",
state: "pending"
}
];
const steps = customSteps || defaultSteps;
const handleCloseModal = () => {
setIsModalOpen(false);
_optionalChain([onClose, 'optionalCall', _27 => _27()]);
};
const isCurrentStepValid2 = _react.useCallback.call(void 0, () => {
return isCurrentStepValid(
currentStep,
formData,
categories,
customSteps
);
}, [currentStep, categories, customSteps, formData]);
const canFinish2 = _react.useCallback.call(void 0, () => {
return canFinish(formData, categories);
}, [categories, formData]);
const handleNext2 = _react.useCallback.call(void 0, () => {
const result = handleNext({
currentStep,
steps,
formData,
categories,
customSteps,
completedSteps,
setCompletedSteps,
setCurrentStep
});
if (!result.success && result.error) {
alert(result.error);
}
}, [
currentStep,
steps,
categories,
customSteps,
completedSteps,
setCompletedSteps,
setCurrentStep,
formData
]);
const handlePrevious = _react.useCallback.call(void 0, () => {
if (currentStep > 0) {
setCurrentStep(currentStep - 1);
}
}, [currentStep, setCurrentStep]);
const handleFinish = async () => {
if (!completedSteps.includes(currentStep)) {
setCompletedSteps([...completedSteps, currentStep]);
}
const alertData = {
title: formData.title,
message: formData.message,
image: formData.image,
date: formData.date,
time: formData.time,
sendToday: formData.sendToday,
sendCopyToEmail: formData.sendCopyToEmail,
recipientCategories: Object.fromEntries(
Object.entries(formData.recipientCategories).map(([key, c]) => [
key,
{
selectedIds: c.selectedIds || [],
allSelected: !!c.allSelected
}
])
)
};
try {
if (_optionalChain([behavior, 'optionalAccess', _28 => _28.onSendAlert])) {
await behavior.onSendAlert(alertData);
} else {
console.log("Dados do formul\xE1rio:", alertData);
alert("Aviso enviado com sucesso!");
}
handleCloseModal();
} catch (error) {
console.error("Erro ao enviar aviso:", error);
}
};
const dynamicSteps = steps.map(
(step, index) => {
if (completedSteps.includes(index)) {
return { ...step, state: "completed" };
}
if (index === currentStep) {
return { ...step, state: "current" };
}
return { ...step, state: "pending" };
}
);
const currentStepContent = _react.useMemo.call(void 0, () => {
if (_optionalChain([customSteps, 'optionalAccess', _29 => _29[currentStep], 'optionalAccess', _30 => _30.component])) {
const CustomComponent = customSteps[currentStep].component;
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, StepWrapper, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, CustomComponent, { onNext: handleNext2, onPrevious: handlePrevious }) });
}
switch (currentStep) {
case 0:
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, StepWrapper, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
MessageStep,
{
labels,
allowImageAttachment: _optionalChain([behavior, 'optionalAccess', _31 => _31.allowImageAttachment])
}
) });
case 1:
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, StepWrapper, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
RecipientsStep,
{
categories,
labels,
onCategoriesChange: handleCategoriesChange
}
) });
case 2:
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, StepWrapper, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
DateStep,
{
labels,
allowScheduling: _optionalChain([behavior, 'optionalAccess', _32 => _32.allowScheduling]),
allowEmailCopy: _optionalChain([behavior, 'optionalAccess', _33 => _33.allowEmailCopy])
}
) });
case 3:
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, StepWrapper, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, PreviewStep, { imageLink, defaultImage }) });
default:
return null;
}
}, [
currentStep,
customSteps,
categories,
labels,
behavior,
handleNext2,
handlePrevious,
imageLink,
defaultImage
]);
const isFirstStep = currentStep === 0;
const isLastStep = currentStep === steps.length - 1;
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunkTCLRDUMFjs.Modal_default,
{
isOpen: isModalOpen,
onClose: handleCloseModal,
title: _optionalChain([labels, 'optionalAccess', _34 => _34.modalTitle]) || "Enviar aviso",
size: "md",
contentClassName: "p-0",
footer: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex gap-3 justify-end w-full", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex gap-3", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk34ST3MKOjs.Button_default, { variant: "link", size: "small", onClick: handleCloseModal, children: _optionalChain([labels, 'optionalAccess', _35 => _35.cancelButton]) || "Cancelar" }),
!isFirstStep && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunk34ST3MKOjs.Button_default,
{
variant: "outline",
size: "small",
iconLeft: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _CaretLeft.CaretLeftIcon, {}),
onClick: handlePrevious,
children: _optionalChain([labels, 'optionalAccess', _36 => _36.previousButton]) || "Anterior"
}
),
isLastStep ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunk34ST3MKOjs.Button_default,
{
variant: "solid",
iconLeft: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _PaperPlaneTilt.PaperPlaneTiltIcon, {}),
size: "small",
onClick: handleFinish,
disabled: !canFinish2(),
children: _optionalChain([labels, 'optionalAccess', _37 => _37.finishButton]) || "Enviar Aviso"
}
) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunk34ST3MKOjs.Button_default,
{
variant: "solid",
iconRight: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _CaretRight.CaretRightIcon, {}),
size: "small",
onClick: handleNext2,
disabled: !isCurrentStepValid2(),
children: _optionalChain([labels, 'optionalAccess', _38 => _38.nextButton]) || "Pr\xF3ximo"
}
)
] }) }),
children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col h-[calc(100vh-14rem)] max-h-[600px]", children: [
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "shrink-0 px-6 pt-4", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
_chunkHOVTCEHKjs.Stepper_default,
{
steps: dynamicSteps,
size: "small",
showProgress: true,
responsive: true,
progressText: `Etapa ${currentStep + 1} de ${steps.length}`
}
) }),
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex-1 overflow-y-auto px-6 pb-4", children: currentStepContent })
] })
}
);
};
// src/hooks/useActivityFiltersData.ts
var areCategoriesSame = (prev, current) => {
if (prev.length !== current.length) return false;
return current.every((category) => {
const prevCategory = prev.find((c) => c.key === category.key);
if (!prevCategory) return false;
const prevIds = (prevCategory.itens || []).map(
(item) => item.id
);
const currentIds = (category.itens || []).map(
(item) => item.id
);
if (prevIds.length !== currentIds.length) return false;
return currentIds.every((id) => prevIds.includes(id));
});
};
var mergeCategoriesWithSelection = (prev, current) => {
return current.map((category) => {
const prevCategory = prev.find((c) => c.key === category.key);
if (!prevCategory) {
return category;
}
const validSelectedIds = (prevCategory.selectedIds || []).filter(
(id) => _optionalChain([category, 'access', _39 => _39.itens, 'optionalAccess', _40 => _40.some, 'call', _41 => _41((item) => item.id === id)])
);
return {
...category,
selectedIds: validSelectedIds
};
});
};
var mapSelectedNames = (ids, items) => {
return ids.map((id) => {
const item = items.find((t) => t.id === id);
return item ? item.name : null;
}).filter((name) => name !== null);
};
var useActivityFiltersDataImpl = (apiClient, options) => {
const { selectedSubjects, institutionId } = options;
const [banksState, setBanksState] = _react.useState.call(void 0, {
banks: [],
bankYears: [],
loading: false,
error: null
});
const loadBanks = _react.useCallback.call(void 0, async () => {
setBanksState((prev) => ({ ...prev, loading: true, error: null }));
try {
const response = await apiClient.get(
"/questions/exam-institutions"
);
const banksMap = /* @__PURE__ */ new Map();
const bankYearsArray = [];
for (const item of response.data.data) {
if (!item.questionBankName) continue;
const existingBank = banksMap.get(item.questionBankName);
if (existingBank) {
if (!existingBank.years.includes(item.year)) {
existingBank.years.push(item.year);
}
existingBank.questionsCount += item.questionsCount;
} else {
banksMap.set(item.questionBankName, {
id: item.questionBankName,
name: item.questionBankName,
examInstitution: item.questionBankName,
years: [item.year],
questionsCount: item.questionsCount
});
}
bankYearsArray.push({
id: `${item.questionBankYearId}-${item.questionBankName}`,
name: item.year,
bankId: item.questionBankName
});
}
const banks = Array.from(banksMap.values()).map((bank) => ({
id: bank.id,
name: bank.name,
examInstitution: bank.examInstitution
}));
setBanksState({
banks,
bankYears: bankYearsArray,
loading: false,
error: null
});
} catch (error) {
console.error("Erro ao carregar bancas de vestibular:", error);
setBanksState((prev) => ({
...prev,
loading: false,
error: "Erro ao carregar bancas de vestibular"
}));
}
}, [apiClient]);
const [areasState, setAreasState] = _react.useState.call(void 0, {
knowledgeAreas: [],
loading: false,
error: null
});
const loadKnowledgeAreas = _react.useCallback.call(void 0, async () => {
setAreasState((prev) => ({ ...prev, loading: true, error: null }));
try {
const response = await apiClient.get(
"/knowledge/subjects"
);
setAreasState({
knowledgeAreas: response.data.data,
loading: false,
error: null
});
} catch (error) {
console.error("Erro ao carregar \xE1reas de conhecimento:", error);
setAreasState((prev) => ({
...prev,
loading: false,
error: "Erro ao carregar \xE1reas de conhecimento"
}));
}
}, [apiClient]);
const [questionTypesState, setQuestionTypesState] = _react.useState.call(void 0, {
questionTypes: [],
loading: false,
error: null
});
const loadQuestionTypes = _react.useCallback.call(void 0, async () => {
if (!institutionId) {
setQuestionTypesState((prev) => ({
...prev,
questionTypes: [],
loading: false,
error: null
}));
return;
}
setQuestionTypesState((prev) => ({
...prev,
loading: true,
error: null
}));
try {
const response = await apiClient.get(
`/institutions/${institutionId}/question-types`
);
const mappedTypes = response.data.data.questionTypes.map((type) => _chunkTN3AYOMVjs.mapQuestionTypeToEnum.call(void 0, type)).filter((type) => type !== null);
setQuestionTypesState({
questionTypes: mappedTypes,
loading: false,
error: null
});
} catch (error) {
console.error("Erro ao carregar tipos de quest\xF5es:", error);
setQuestionTypesState((prev) => ({
...prev,
loading: false,
error: "Erro ao carregar tipos de quest\xF5es"
}));
}
}, [apiClient, institutionId]);
const [knowledgeStructure, setKnowledgeStructure] = _react.useState.call(void 0, {
topics: [],
subtopics: [],
contents: [],
loading: false,
error: null
});
const [knowledgeCategories, setKnowledgeCategories] = _react.useState.call(void 0, []);
const previousSubjectsRef = _react.useRef.call(void 0, null);
const loadTopics = _react.useCallback.call(void 0,
async (subjectIds) => {
if (subjectIds.length =