UNPKG

analytica-frontend-lib

Version:

Repositório público dos componentes utilizados nas plataformas da Analytica Ensino

1,599 lines (1,306 loc) 789 kB
"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 =