This repository was archived by the owner on Jun 27, 2023. It is now read-only.
forked from AcademiaTemple/website-react
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path.eslintcache
More file actions
1 lines (1 loc) · 107 KB
/
.eslintcache
File metadata and controls
1 lines (1 loc) · 107 KB
1
[{"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\index.js":"1","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\TempleApp.js":"2","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\inicio.js":"3","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\admin.js":"4","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\teachers.js":"5","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\courses.js":"6","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\about.js":"7","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\contact.js":"8","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\context\\AuthContext.js":"9","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\login.js":"10","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\course-player.js":"11","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\course.js":"12","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\teacher_detail.js":"13","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\customRouter\\privateRoute.js":"14","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\firebase.js":"15","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\helpers\\obtUsuarioStorage.js":"16","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\tabla\\docentes.js":"17","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\api.js":"18","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\tabla\\cursos.js":"19","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\nuestroscursos\\nuestroscursos.jsx":"20","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\testimonios\\testimonios.jsx":"21","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\footer\\footer.jsx":"22","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\navbar\\navbar.jsx":"23","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\carrusel\\carrusele.jsx":"24","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\episodio\\acordeon_episodios.jsx":"25","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\estadisticas\\estadisticas.jsx":"26","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\cursos\\card\\card.jsx":"27","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\parrafo_teacher\\parrafo_teacher.jsx":"28","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\course_teacher\\course_teacher.jsx":"29","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\docentes\\card\\card_teacher.jsx":"30","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\navbar\\index.js":"31","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\footer\\index.js":"32","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\panoramaInicio\\index.js":"33","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\calendario\\index.js":"34","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\pestanas\\index.js":"35","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\avatar\\index.js":"36","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\modal\\confirmacion.js":"37","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\modal\\edicionClases.js":"38","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\modal\\edicionProfesor.js":"39","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\modal\\edicionCurso.js":"40","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\testimonios\\testimonios-data.jsx":"41","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\episodio\\card\\card_episodio.jsx":"42","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\pestanas\\pestanas.js":"43","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\avatar\\avatar.js":"44","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\panoramaInicio\\panorama.jsx":"45","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\calendario\\calendario.jsx":"46","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\modal\\tarjeta_edicion_clase.js":"47","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\helpers\\funcionesArreglo.js":"48","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\cursos\\cursos-data.jsx":"49"},{"size":452,"mtime":1611697608950,"results":"50","hashOfConfig":"51"},{"size":1615,"mtime":1611691791878,"results":"52","hashOfConfig":"51"},{"size":1818,"mtime":1611694859486,"results":"53","hashOfConfig":"51"},{"size":1205,"mtime":1611692389713,"results":"54","hashOfConfig":"51"},{"size":1571,"mtime":1611433829111,"results":"55","hashOfConfig":"51"},{"size":1677,"mtime":1611447102491,"results":"56","hashOfConfig":"51"},{"size":357,"mtime":1611692395480,"results":"57","hashOfConfig":"51"},{"size":738,"mtime":1611425705215,"results":"58","hashOfConfig":"51"},{"size":667,"mtime":1611440868158,"results":"59","hashOfConfig":"51"},{"size":2930,"mtime":1611449368099,"results":"60","hashOfConfig":"51"},{"size":3238,"mtime":1611433867613,"results":"61","hashOfConfig":"51"},{"size":5819,"mtime":1611526858483,"results":"62","hashOfConfig":"51"},{"size":5599,"mtime":1611433782353,"results":"63","hashOfConfig":"51"},{"size":662,"mtime":1611453158468,"results":"64","hashOfConfig":"51"},{"size":659,"mtime":1611426599873,"results":"65","hashOfConfig":"51"},{"size":88,"mtime":1611424036717,"results":"66","hashOfConfig":"51"},{"size":7524,"mtime":1611452996330,"results":"67","hashOfConfig":"51"},{"size":11132,"mtime":1611453103358,"results":"68","hashOfConfig":"51"},{"size":9245,"mtime":1611453024063,"results":"69","hashOfConfig":"51"},{"size":1702,"mtime":1611692502680,"results":"70","hashOfConfig":"51"},{"size":1137,"mtime":1611692422631,"results":"71","hashOfConfig":"51"},{"size":1994,"mtime":1611692562737,"results":"72","hashOfConfig":"51"},{"size":2747,"mtime":1611697035203,"results":"73","hashOfConfig":"51"},{"size":775,"mtime":1611436615792,"results":"74","hashOfConfig":"51"},{"size":530,"mtime":1611424035661,"results":"75","hashOfConfig":"51"},{"size":3506,"mtime":1611697752299,"results":"76","hashOfConfig":"51"},{"size":1181,"mtime":1611637215345,"results":"77","hashOfConfig":"51"},{"size":1503,"mtime":1611424036315,"results":"78","hashOfConfig":"51"},{"size":1452,"mtime":1611449403756,"results":"79","hashOfConfig":"51"},{"size":2423,"mtime":1611637135000,"results":"80","hashOfConfig":"51"},{"size":35,"mtime":1611424036088,"results":"81","hashOfConfig":"51"},{"size":35,"mtime":1611424035861,"results":"82","hashOfConfig":"51"},{"size":37,"mtime":1611425534150,"results":"83","hashOfConfig":"51"},{"size":39,"mtime":1611424035314,"results":"84","hashOfConfig":"51"},{"size":36,"mtime":1611692468392,"results":"85","hashOfConfig":"51"},{"size":35,"mtime":1611424035261,"results":"86","hashOfConfig":"51"},{"size":812,"mtime":1611446993466,"results":"87","hashOfConfig":"51"},{"size":4901,"mtime":1611453191790,"results":"88","hashOfConfig":"51"},{"size":10015,"mtime":1611452760831,"results":"89","hashOfConfig":"51"},{"size":11880,"mtime":1611506217312,"results":"90","hashOfConfig":"51"},{"size":1235,"mtime":1611553176055,"results":"91","hashOfConfig":"51"},{"size":1083,"mtime":1611424035684,"results":"92","hashOfConfig":"51"},{"size":1022,"mtime":1611453139164,"results":"93","hashOfConfig":"51"},{"size":475,"mtime":1611434139071,"results":"94","hashOfConfig":"51"},{"size":697,"mtime":1611697769306,"results":"95","hashOfConfig":"51"},{"size":5471,"mtime":1611435603060,"results":"96","hashOfConfig":"51"},{"size":7017,"mtime":1611517595254,"results":"97","hashOfConfig":"51"},{"size":332,"mtime":1611424036715,"results":"98","hashOfConfig":"51"},{"size":3161,"mtime":1611424035549,"results":"99","hashOfConfig":"51"},{"filePath":"100","messages":"101","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"19vociv",{"filePath":"102","messages":"103","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"105","messages":"106","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"107","messages":"108","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"109","messages":"110","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"111","messages":"112","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"113","messages":"114","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"115","messages":"116","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"117","messages":"118","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"119","messages":"120","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"121","usedDeprecatedRules":"104"},{"filePath":"122","messages":"123","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"124","usedDeprecatedRules":"104"},{"filePath":"125","messages":"126","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"127","usedDeprecatedRules":"104"},{"filePath":"128","messages":"129","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"130","messages":"131","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"132","messages":"133","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"134","messages":"135","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"136","messages":"137","errorCount":0,"warningCount":7,"fixableErrorCount":0,"fixableWarningCount":0,"source":"138","usedDeprecatedRules":"104"},{"filePath":"139","messages":"140","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"141","usedDeprecatedRules":"104"},{"filePath":"142","messages":"143","errorCount":0,"warningCount":7,"fixableErrorCount":0,"fixableWarningCount":0,"source":"144","usedDeprecatedRules":"104"},{"filePath":"145","messages":"146","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"147","messages":"148","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"149","messages":"150","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"151","messages":"152","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"153","usedDeprecatedRules":"104"},{"filePath":"154","messages":"155","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"156","messages":"157","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"158","messages":"159","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"160","messages":"161","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"162","messages":"163","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"164","usedDeprecatedRules":"104"},{"filePath":"165","messages":"166","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"167","messages":"168","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"169","messages":"170","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"171","messages":"172","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"173","messages":"174","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"175","messages":"176","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"177","messages":"178","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"179","messages":"180","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"181","messages":"182","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"183","messages":"184","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"185","usedDeprecatedRules":"104"},{"filePath":"186","messages":"187","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"188","usedDeprecatedRules":"104"},{"filePath":"189","messages":"190","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"191","usedDeprecatedRules":"104"},{"filePath":"192","messages":"193","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"194","messages":"195","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"196","messages":"197","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"198","messages":"199","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"200","messages":"201","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"202","messages":"203","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"204","messages":"205","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"206","usedDeprecatedRules":"104"},{"filePath":"207","messages":"208","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},{"filePath":"209","messages":"210","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"104"},"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\index.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\TempleApp.js",[],["211","212"],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\inicio.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\admin.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\teachers.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\courses.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\about.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\contact.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\context\\AuthContext.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\login.js",["213"],"import React, { useState, useEffect } from \"react\"\r\nimport { useHistory } from \"react-router-dom\"\r\nimport Navbar from \"../components/navbar/navbar\"\r\nimport Footer from \"../components/footer/footer\"\r\nimport { obtCursosMuestra, iniciarSesion } from \"../api\"\r\nimport { obtUsuarioStorage } from '../helpers/obtUsuarioStorage';\r\n\r\nexport default function Login({ location }) {\r\n\r\n let history = useHistory();\r\n const [cursos, estCursos] = useState([]);\r\n const [correo, estCorreo] = useState('');\r\n const [contrasena, estContrasena] = useState('');\r\n const [usuario] = useState(obtUsuarioStorage());\r\n\r\n useEffect(() => {\r\n obtCursosMuestra()\r\n .then(data => {\r\n estCursos(data);\r\n });\r\n }, []);\r\n\r\n const manejarCampoCorreo = (ev) => {\r\n estCorreo(ev.target.value);\r\n }\r\n\r\n const manejarCampoContrasena = (ev) => {\r\n estContrasena(ev.target.value);\r\n }\r\n\r\n const ingresar = (e) => {\r\n if (correo && contrasena) {\r\n e.preventDefault();\r\n iniciarSesion(correo, contrasena)\r\n .then(usuario => {\r\n if (usuario) {\r\n localStorage.setItem('usuario', usuario);\r\n history.push('/admin');\r\n } else {\r\n alert('Usuario inexistente');\r\n }\r\n })\r\n .catch(error => {\r\n alert('Usuario inválido');\r\n })\r\n } else {\r\n alert('Hay campos vacíos')\r\n }\r\n }\r\n\r\n if (usuario) {\r\n history.push('/admin');\r\n }\r\n\r\n return (\r\n <div>\r\n <Navbar />\r\n <div className=\"contenedor cuerpo-pagina\">\r\n <h2 className=\"titulo-seccion mt-5\">Iniciar sesión</h2>\r\n\r\n <form onSubmit={ingresar}>\r\n <div class=\"form-group form-group-login\">\r\n <label for=\"exampleInputEmail1\">Correo</label>\r\n <input value={correo} onChange={manejarCampoCorreo} type=\"email\" class=\"form-control\" id=\"exampleInputEmail1\" placeholder=\"Ingresa tu usuario\" />\r\n </div>\r\n <div class=\"form-group form-group-login\">\r\n <label for=\"exampleInputPassword1\">Contraseña</label>\r\n <input value={contrasena} onChange={manejarCampoContrasena} type=\"password\" class=\"form-control\" id=\"exampleInputPassword1\" placeholder=\"**********************\" />\r\n </div>\r\n <button type='submit' target=\"_blank\" className=\"boton btn-principal btn-rep-curso d-block mt-5\" to={'/'}>\r\n <i className=\"fas fa-sign-in-alt mr-3\"></i>\r\n Ingresar\r\n </button>\r\n </form>\r\n </div>\r\n <Footer />\r\n </div>\r\n )\r\n}","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\course-player.js",["214"],"import React, { useState, useEffect } from \"react\"\r\nimport Plyr from 'plyr'\r\nimport Navbar from \"../components/navbar/navbar\"\r\nimport Footer from \"../components/footer/footer\"\r\nimport AcordeonEpisodio from \"../components/episodio/acordeon_episodios\"\r\nimport queryString from 'query-string'\r\nimport { obtClasesCurso } from '../api'\r\n\r\nconst construirUrlVideo = (urlVideo) => {\r\n return `https://www.youtube.com/embed/${urlVideo}?origin=https://plyr.io&iv_load_policy=3&modestbranding=1&playsinline=1&showinfo=0&rel=0&enablejsapi=1`;\r\n}\r\n\r\nexport default function Course(props) {\r\n const { id: idCurso, episode: idEpisodio } = queryString.parse(props.location.search);\r\n\r\n const [episodios, estEpisodios] = useState([]);\r\n const [cargandoEpisodios, estCargandoEpisodios] = useState(true);\r\n const [urlVideo, estUrlVideo] = useState('');\r\n const [idVideo, estIdVideo] = useState(idEpisodio);\r\n\r\n const obtUrlPorIdVideo = (episodios, idEpisodio) => {\r\n const encontrado = episodios.find(e => e.id === idEpisodio);\r\n return encontrado && encontrado.urlVideo;\r\n }\r\n\r\n const seleccionarEpisodio = (id, urlVideo) => {\r\n estIdVideo(id);\r\n estUrlVideo(construirUrlVideo(urlVideo));\r\n }\r\n\r\n useEffect(() => {\r\n estCargandoEpisodios(true);\r\n obtClasesCurso(idCurso)\r\n .then(episodios => {\r\n estEpisodios(episodios.reverse());\r\n estUrlVideo(construirUrlVideo(obtUrlPorIdVideo(episodios, idEpisodio)));\r\n estCargandoEpisodios(false);\r\n })\r\n }, [idCurso, idEpisodio])\r\n\r\n useEffect(() => {\r\n const player = new Plyr('#player', {\r\n controls: ['play-large', 'play', 'progress', 'current-time', 'volume', 'captions', 'settings', 'pip', 'airplay', 'fullscreen', 'quality'],\r\n tooltips: { controls: false, seek: false },\r\n settings: ['captions', 'quality', 'speed', 'loop']\r\n });\r\n window.player = player;\r\n }, [urlVideo]);\r\n\r\n return (\r\n <div>\r\n <Navbar />\r\n <div className=\"cuerpo-pagina\">\r\n <div className=\"contenedor-reproductor\">\r\n <div className=\"contenedor-video\">\r\n <div key={idVideo} className=\"plyr__video-embed\" id=\"player\">\r\n <iframe\r\n title=\"...\"\r\n width=\"100%\"\r\n frameBorder=\"0\"\r\n src={urlVideo}\r\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\r\n allowFullScreen></iframe>\r\n </div>\r\n </div>\r\n <div className=\"contenedor-acordeon\">\r\n <AcordeonEpisodio\r\n invertir={true}\r\n episodios={episodios}\r\n idActivo={idVideo}\r\n machucar={seleccionarEpisodio} />\r\n </div>\r\n </div>\r\n </div>\r\n <Footer />\r\n </div>\r\n )\r\n}","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\course.js",["215"],"import React, { useState, useEffect } from \"react\"\r\nimport Navbar from \"../components/navbar/navbar\"\r\nimport Footer from \"../components/footer/footer\"\r\nimport AcordeonEpisodio from \"../components/episodio/acordeon_episodios\"\r\nimport queryString from 'query-string'\r\nimport GridLoader from \"react-spinners/GridLoader\"\r\nimport Fade from 'react-reveal/Fade'\r\nimport Avatar from \"../components/avatar\"\r\nimport { css } from \"@emotion/core\"\r\nimport { obtCursoExtendido } from '../api'\r\nimport { Link, useHistory } from \"react-router-dom\"\r\n\r\nconst override = css`\r\n display: block;\r\n margin: 50px auto;\r\n background-color: 'green';\r\n`;\r\n\r\nconst calcularTotalHoras = (clases) => {\r\n let totalMinutos = 0;\r\n\r\n // Sumo todas las horas y minutos\r\n clases.map(clase => {\r\n const hm = clase.duracion.split(' ');\r\n const horas = parseInt(hm[0], 10);\r\n const minutos = parseInt(hm[1], 10);\r\n totalMinutos += minutos;\r\n totalMinutos += (horas * 60);\r\n return { totalMinutos }\r\n })\r\n\r\n // Obtengo las horas y minutos completos\r\n const horas = totalMinutos / 60;\r\n const horasCompletas = Math.trunc(horas); // Parte entera\r\n const minutosCompletos = Math.trunc((horas % 1) * 60); // Parte decimal\r\n\r\n // Lo paso a formato horario\r\n return `${horasCompletas}h ${minutosCompletos}m`;\r\n}\r\n\r\nexport default function Course(props) {\r\n const idCurso = queryString.parse(props.location.search).id;\r\n const [curso, estCurso] = useState({});\r\n const [cargando, estCargando] = useState(true);\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n estCargando(true);\r\n obtCursoExtendido(idCurso)\r\n .then(curso => {\r\n estCurso(curso);\r\n estCargando(false);\r\n })\r\n }, [idCurso]);\r\n\r\n const navegar = (idEpisodio) => {\r\n history.push(`/course-player/?id=${idCurso}&episode=${idEpisodio}`);\r\n }\r\n\r\n return (\r\n <div>\r\n <Navbar />\r\n <div className=\"contenedor contenedor-60 cuerpo-pagina\">\r\n <GridLoader css={override} loading={cargando} size={20} />\r\n {\r\n !cargando && curso.id\r\n &&\r\n <Fade bottom>\r\n <h2 className=\"titulo-seccion mt-5 mb-5 text-left titulo-curso\">{curso.titulo}</h2>\r\n <div className=\"contenedor-controles-curso\">\r\n <a target=\"_blank\" className=\"boton btn-principal btn-rep-curso d-block\" href={curso.urlInscripcion}>\r\n <i className=\"fas fa-edit mr-3\"></i>\r\n Inscribirme\r\n </a>\r\n <div className=\"contenedor-data-cursos\">\r\n <div className=\"mr-md-5\">\r\n <i className=\"fas fa-layer-group\"></i>{' '}\r\n {curso.clases && curso.clases.length} Clases\r\n </div>\r\n <div>\r\n <i className=\"far fa-clock\"></i>{' '}\r\n {calcularTotalHoras(curso.clases)}\r\n </div>\r\n </div>\r\n </div>\r\n <p className=\"descripcion-curso\">\r\n {curso.descExtendida}\r\n </p>\r\n <h3 className=\"subtitulo-descripcion-curso\">¿Qué aprenderás?</h3>\r\n <p className=\"descripcion-curso\">\r\n {curso.objetivo}\r\n </p>\r\n <h3 className=\"subtitulo-descripcion-curso\">Requisitos</h3>\r\n <ul className=\"requisitos-curso\">\r\n {\r\n curso.requisitos.map((requisito, indice) => (\r\n <li key={indice}>{requisito}</li>\r\n ))\r\n }\r\n </ul>\r\n <div className=\"contenedor-curso-profesor\">\r\n <div className=\"contenedor-img\">\r\n <Avatar img={curso.profesor.img} />\r\n </div>\r\n <div className=\"contenedor-descripcion\">\r\n <h4>\r\n <Link to={`/teacher-detail/?id=${curso.profesor.id}`}>\r\n {curso.profesor.nombres + ' ' + curso.profesor.apellidos}\r\n </Link>\r\n </h4>\r\n <p className=\"descripcion-curso\">\r\n {curso.profesor.sobreMi}\r\n </p>\r\n </div>\r\n </div>\r\n <h3 className=\"subtitulo-descripcion-curso\">Lista de clases</h3>\r\n {\r\n curso.clases && curso.clases.length > 0\r\n ?\r\n <AcordeonEpisodio\r\n episodios={curso.clases}\r\n machucar={navegar} />\r\n :\r\n <p className=\"descripcion-curso\">Aún no hay videos</p>\r\n }\r\n </Fade>\r\n }\r\n {\r\n !cargando && !curso.id\r\n &&\r\n <p>No se pudo cargar el curso</p>\r\n }\r\n </div>\r\n <Footer />\r\n </div>\r\n )\r\n}","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\pages\\teacher_detail.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\customRouter\\privateRoute.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\firebase.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\helpers\\obtUsuarioStorage.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\tabla\\docentes.js",["216","217","218","219","220","221","222"],"import React, { useState, useEffect } from 'react'\r\nimport ModalEdicion from '../../components/modal/edicionProfesor'\r\nimport ModalConfirmacion from '../../components/modal/confirmacion'\r\nimport { obtRegistrosPaginadosAdmin, actEstadoProfesorAdmin } from '../../api'\r\n\r\nconst regMaximo = 10;\r\nconst coleccion = 'docentes';\r\nconst campo = 'nombres';\r\n\r\nconst Docentes = () => {\r\n\r\n const [pagina, estPagina] = useState(1);\r\n const [profesores, estProfesores] = useState([]);\r\n const [cargando, estCargando] = useState(false);\r\n const [registro, estRegistro] = useState(null); // Establece el registro seleecionado para hacer ediciones o eliminaciones\r\n const [modo, estModo] = useState(null); // Establece si se está editando o creando un registro\r\n const [haySiguiente, estHaySiguiente] = useState(false); // Para la paginación\r\n\r\n // Modal\r\n const [mostrarEdicion, estMostrarEdicion] = useState(false);\r\n const [mostrarConfirmacion, estmostrarConfirmacion] = useState(false);\r\n\r\n useEffect(() => {\r\n estCargando(true);\r\n obtenerProfesores();\r\n }, []);\r\n\r\n const obtenerProfesores = (reinicio) => {\r\n // El parámetro reinicio se usa después de editar o crear un registro, para que empiece\r\n // a mostrar todo desde la primera página\r\n obtRegistrosPaginadosAdmin(coleccion, campo, regMaximo, null, reinicio ? null : profesores[0], true) // Este parámetro true es para que no se cambien las posiciones cuando haga un cambio de estado\r\n .then(({ lista, haySiguiente }) => {\r\n if (reinicio) {\r\n estPagina(1);\r\n }\r\n estHaySiguiente(haySiguiente);\r\n estProfesores(lista);\r\n estCargando(false);\r\n })\r\n }\r\n\r\n // Modal creación/edicion\r\n const abrirModalEdicion = (registro) => {\r\n estRegistro(registro);\r\n estModo('EDICION');\r\n estMostrarEdicion(true);\r\n }\r\n const cerrarModalEdicion = () => {\r\n estMostrarEdicion(false);\r\n }\r\n const abrirModalCreacion = (e) => {\r\n e.preventDefault();\r\n estRegistro(undefined);\r\n estModo('CREACION');\r\n estMostrarEdicion(true);\r\n }\r\n const guardarCambiosEdicion = () => {\r\n cerrarModalEdicion();\r\n obtenerProfesores(true);\r\n }\r\n\r\n // Modal confirmación\r\n const abrirModalConfirmacion = (registro) => {\r\n estRegistro(registro);\r\n estmostrarConfirmacion(true);\r\n }\r\n\r\n const cerrarModalConfirmacion = () => {\r\n estmostrarConfirmacion(false);\r\n }\r\n\r\n const actualizarEstado = () => {\r\n cerrarModalConfirmacion();\r\n const nuevoEstado = registro.activo ? 0 : 1;\r\n actEstadoProfesorAdmin(registro.id, nuevoEstado).then(() => {\r\n obtenerProfesores();\r\n });\r\n }\r\n\r\n const retroceder = () => {\r\n obtRegistrosPaginadosAdmin(coleccion, campo, regMaximo, profesores[0])\r\n .then(({ lista }) => {\r\n estHaySiguiente(true); // Si retrocedo, es porque siempre hay un siguiente\r\n estProfesores(lista);\r\n estPagina(pagina - 1);\r\n })\r\n }\r\n\r\n const avanzar = () => {\r\n obtRegistrosPaginadosAdmin(coleccion, campo, regMaximo, null, profesores[profesores.length - 1])\r\n .then(({ lista, haySiguiente }) => {\r\n estHaySiguiente(haySiguiente);\r\n estProfesores(lista);\r\n estPagina(pagina + 1);\r\n })\r\n }\r\n\r\n return (\r\n <div>\r\n {\r\n mostrarConfirmacion\r\n &&\r\n <ModalConfirmacion\r\n mostrar={mostrarConfirmacion}\r\n texto={`¿Quieres ${registro?.activo ? ' desactivar' : ' activar'} este profesor?`}\r\n confirmar={actualizarEstado}\r\n cancelar={cerrarModalConfirmacion} />\r\n }\r\n\r\n {\r\n mostrarEdicion\r\n &&\r\n <ModalEdicion\r\n mostrar={mostrarEdicion}\r\n modo={modo}\r\n data={registro}\r\n guardarCambios={guardarCambiosEdicion}\r\n cancelar={cerrarModalEdicion} />\r\n }\r\n\r\n <div className=\"table-responsive-md\">\r\n <table className=\"table table-hover\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">#</th>\r\n <th scope=\"col\">Nombres</th>\r\n <th scope=\"col\">Apellidos</th>\r\n <th scope=\"col\">Activo</th>\r\n <th scope=\"col\">Acciones</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {\r\n profesores.map((profesor, indice) => (\r\n <tr key={profesor.id} className={profesor.activo ? '' : 'table-danger'}>\r\n <th scope=\"row\">{indice + 1}</th>\r\n <td>{profesor.nombres}</td>\r\n <td>{profesor.apellidos}</td>\r\n <td>{profesor.activo ? 'Sí' : 'No'}</td>\r\n <td>\r\n <button onClick={() => abrirModalEdicion(profesor)} className='btn btn-secondary'>\r\n <i className='fa fa-edit'></i>\r\n </button>\r\n {\r\n profesor.activo\r\n ?\r\n <button onClick={() => abrirModalConfirmacion(profesor)} className='btn btn-danger ml-3'>\r\n <i className='fa fa-power-off'></i>\r\n </button>\r\n :\r\n <button onClick={() => abrirModalConfirmacion(profesor)} className='btn btn-success ml-3'>\r\n <i className='fa fa-power-off'></i>\r\n </button>\r\n }\r\n </td>\r\n </tr>\r\n ))\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n <a onClick={abrirModalCreacion} className=\"boton btn-principal d-block mt-4\">\r\n {'Agregar '}<i className=\"fas fa-plus\" style={{ fontSize: '12px' }}></i>\r\n </a>\r\n <ul className=\"pagination pagination-lg justify-content-center mt-4\">\r\n {\r\n pagina > 1 &&\r\n <li className=\"page-item\"><a className=\"page-link\" onClick={retroceder}>Anterior</a></li>\r\n }\r\n <li className=\"page-item active\"><a className=\"page-link\" href=\"javascript:void(0);\">{pagina}</a></li>\r\n {\r\n haySiguiente\r\n &&\r\n <li className=\"page-item\"><a className=\"page-link\" onClick={avanzar}>Siguiente</a></li>\r\n }\r\n </ul>\r\n </div>\r\n )\r\n}\r\n\r\nexport default Docentes;","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\api.js",["223","224"],"//import 'babel-polyfill';\r\nimport firebase from './firebase';\r\n\r\nconst firestore = firebase.firestore();\r\nconst auth = firebase.auth();\r\nconst storage = firebase.storage();\r\n\r\n// Profesor\r\nexport const obtProfesoresMuestra = async () => {\r\n return firestore.collection('docentes').where('activo', '==', 1).orderBy('nombres', 'asc').get()\r\n .then(qsn => {\r\n let lista = [];\r\n qsn.forEach(doc => {\r\n const { img, nombres, apellidos, sobreMi, etiquetas, likes, redes } = doc.data();\r\n lista.push({ id: doc.id, img, nombres, apellidos, sobreMi, etiquetas, likes, redes });\r\n });\r\n return lista;\r\n })\r\n .catch(error => {\r\n console.log(error);\r\n return [];\r\n });\r\n}\r\n\r\nexport const obtProfesoresCombo = async () => {\r\n return firestore.collection('docentes').where('activo', '==', 1).orderBy('nombres', 'asc').get()\r\n .then(qsn => {\r\n let lista = [];\r\n qsn.forEach(doc => {\r\n const { nombres, apellidos } = doc.data();\r\n lista.push({ id: doc.id, nombres, apellidos });\r\n });\r\n return lista;\r\n })\r\n .catch(error => {\r\n console.log(error);\r\n return [];\r\n });\r\n}\r\n\r\nexport const obtPerfilProfesor = async idProfesor => {\r\n return firestore.collection('docentes').doc(idProfesor).get()\r\n .then(async doc => {\r\n if (doc.exists) {\r\n const { img, nombres, apellidos, sobreMi, logros, pais, experiencia, etiquetas, likes, redes } = doc.data();\r\n return {\r\n id: doc.id,\r\n cursos: await obtCursosPorProfesor(idProfesor),\r\n img,\r\n nombres,\r\n apellidos,\r\n sobreMi,\r\n logros,\r\n pais,\r\n experiencia,\r\n etiquetas,\r\n likes,\r\n redes\r\n };\r\n } else {\r\n return {};\r\n }\r\n })\r\n .catch(error => {\r\n console.log(error);\r\n return {};\r\n });\r\n}\r\n\r\nconst obtProfesorCurso = async (idProfesor) => {\r\n return firestore.collection('docentes').doc(idProfesor).get()\r\n .then(doc => {\r\n if (doc.exists) {\r\n const { img, nombres, apellidos, sobreMi } = doc.data();\r\n return {\r\n id: doc.id, img, nombres, apellidos, sobreMi\r\n };\r\n } else {\r\n return {};\r\n }\r\n })\r\n .catch(error => {\r\n console.log(error);\r\n return {};\r\n });\r\n}\r\n\r\n// Curso\r\nexport const obtCursosCalendario = async () => {\r\n return firestore.collection('cursos').where('activo', '==', 1).get()\r\n .then(qsn => {\r\n let lista = [];\r\n qsn.forEach(doc => {\r\n const { id, titulo, dias, hInicioFin, fInicioFin, excepciones, cancelaciones, urlInscripcion } = doc.data();\r\n lista.push({ id, titulo, dias, hInicioFin, fInicioFin, excepciones, cancelaciones, urlInscripcion });\r\n });\r\n return lista;\r\n })\r\n .catch(error => {\r\n console.log(error);\r\n return [];\r\n });\r\n}\r\n\r\nexport const obtCursosMuestra = async () => {\r\n return firestore.collection('cursos').where('activo', '==', 1).get()\r\n .then(qsn => {\r\n let lista = [];\r\n qsn.forEach(doc => {\r\n const { titulo, urlImg, descBreve } = doc.data();\r\n lista.push({ id: doc.id, titulo, urlImg, descBreve });\r\n });\r\n return lista;\r\n })\r\n .catch(error => {\r\n console.log(error);\r\n return [];\r\n });\r\n //firestore.collection('episodios').doc('88Ec4OtP23y1IQxf7c0o').set(episodios)\r\n //return cursos.map(({ id, titulo, urlImg, descBreve }) => ({ id, titulo, urlImg, descBreve }));\r\n}\r\n\r\nexport const obtCursoExtendido = async (idCurso) => {\r\n return firestore.collection('cursos').doc(idCurso).get()\r\n .then(async doc => {\r\n if (doc.exists) {\r\n const { idProfesor, titulo, urlImg, dias, hInicioFin, fInicioFin, excepciones, cancelaciones, urlInscripcion, descBreve, descExtendida, objetivo, requisitos } = doc.data();\r\n return {\r\n id: doc.id,\r\n titulo,\r\n urlImg,\r\n dias,\r\n hInicioFin,\r\n fInicioFin,\r\n excepciones,\r\n cancelaciones,\r\n urlInscripcion,\r\n descBreve,\r\n descExtendida,\r\n objetivo,\r\n profesor: await obtProfesorCurso(idProfesor),\r\n clases: await obtClasesCurso(idCurso),\r\n requisitos\r\n };\r\n } else {\r\n return {};\r\n }\r\n })\r\n .catch(error => {\r\n console.log(error);\r\n return {};\r\n });\r\n}\r\n\r\nconst obtCursosPorProfesor = async (idProfesor) => {\r\n return firestore.collection('cursos').where('idProfesor', '==', idProfesor).get()\r\n .then(qsn => {\r\n let lista = [];\r\n qsn.forEach(doc => {\r\n const { titulo, urlImg, descBreve } = doc.data();\r\n lista.push({ id: doc.id, titulo, urlImg, descBreve });\r\n });\r\n return lista;\r\n })\r\n .catch(error => {\r\n console.log(error);\r\n return [];\r\n });\r\n}\r\n\r\n// Clase\r\nexport const obtClasesCurso = async (idCurso) => {\r\n return firestore.collection('episodios')\r\n .where('idCurso', '==', idCurso)\r\n .orderBy('orden', 'desc')\r\n .get()\r\n .then(qsn => {\r\n let lista = [];\r\n qsn.forEach(doc => {\r\n const data = doc.data();\r\n lista.push({ id: doc.id, ...data });\r\n });\r\n return lista;\r\n })\r\n .catch(error => {\r\n console.log(error);\r\n return [];\r\n });\r\n}\r\n\r\n// Sesión\r\nexport const iniciarSesion = async (usuario, contrasena) => {\r\n return auth.signInWithEmailAndPassword(usuario, contrasena)\r\n .then((user) => {\r\n return user;\r\n })\r\n .catch((error) => {\r\n console.log(error.message);\r\n //var errorCode = error.code;\r\n //var errorMessage = error.message;\r\n });\r\n}\r\n\r\nexport const cerrarSesion = async () => {\r\n return auth.signOut().then(function () {\r\n return true;\r\n }).catch(function (error) {\r\n console.log(error.message);\r\n });\r\n}\r\n\r\n// País\r\nexport const obtPais = (prefijo) => {\r\n return fetch('https://restcountries.eu/rest/v2/alpha/' + prefijo)\r\n .then(response => response.json())\r\n .then(pais => pais);\r\n}\r\n\r\n// Admin\r\n\r\n// Profesor\r\nexport const obtRegistrosPaginadosAdmin = async (coleccion, campo, limite = 10, antesDe, despuesDe, incluirRegistro) => {\r\n\r\n const campoConsulta = campo;\r\n\r\n let ref = firestore.collection(coleccion).orderBy(campoConsulta).limit(limite + 1);\r\n\r\n if (antesDe) {\r\n ref = ref.endBefore(antesDe[campoConsulta]).limitToLast(limite + 1);\r\n }\r\n\r\n if (despuesDe) {\r\n if (incluirRegistro) {\r\n ref = ref.startAt(despuesDe[campoConsulta]);\r\n } else {\r\n ref = ref.startAfter(despuesDe[campoConsulta]);\r\n }\r\n\r\n }\r\n\r\n return ref\r\n .get()\r\n .then(qsn => {\r\n let lista = [];\r\n qsn.forEach(doc => {\r\n lista.push({ ...doc.data(), id: doc.id });\r\n });\r\n\r\n let haySiguiente = false;\r\n if (lista.length == limite + 1) { // Esto significa que hay siguiente\r\n haySiguiente = true;\r\n if (antesDe) {\r\n lista.shift(); // Elimino el primero, porque he retrocedido\r\n }\r\n else {\r\n lista.pop(); // Elimino el último\r\n }\r\n }\r\n return {\r\n lista,\r\n haySiguiente\r\n };\r\n })\r\n .catch(error => {\r\n console.log(error);\r\n return {\r\n lista: []\r\n };\r\n });\r\n}\r\n\r\nexport const actEstadoProfesorAdmin = async (id, estado) => {\r\n return firestore.collection('docentes').doc(id).set(\r\n {\r\n activo: estado\r\n }, { merge: true });\r\n}\r\n\r\nexport const actProfesorAdmin = async (profesor) => {\r\n return firestore.collection('docentes').doc(profesor.id).set(\r\n profesor, { merge: true });\r\n}\r\n\r\n/*export const guardarProfesorAdmin = async (profesor) => {\r\n return firestore.collection('docentes').add({ ...profesor, activo: 1 });\r\n}*/\r\n\r\n// Curso\r\nexport const actEstadoCursoAdmin = async (id, estado) => {\r\n return firestore.collection('cursos').doc(id).set(\r\n {\r\n activo: estado\r\n }, { merge: true });\r\n}\r\n\r\nexport const actCursoAdmin = async (curso) => {\r\n return firestore.collection('cursos').doc(curso.id).set(\r\n curso, { merge: true });\r\n}\r\n\r\n/*export const guardarCursoAdmin = async (curso) => {\r\n return firestore.collection('cursos').add({ ...curso, activo: 1 });\r\n}*/\r\n\r\n// Clase\r\nexport const guardarClaseAdmin = async (clase) => {\r\n return firestore.collection('episodios').add(clase);\r\n}\r\n\r\nexport const actClaseAdmin = async (clase) => {\r\n return firestore.collection('episodios').doc(clase.id).set(\r\n clase, { merge: true });\r\n}\r\n\r\nexport const eliminarClaseAdmin = async (idClase) => {\r\n return firestore.collection('episodios').doc(idClase).delete();\r\n}\r\n\r\n// Archivos\r\nexport const subirImagen = async (ruta, id, archivo) => {\r\n return new Promise((resolve, reject) => {\r\n let storageRef = storage.ref();\r\n let imgRef = storageRef.child(`${ruta}/${id}`);\r\n const task = imgRef.put(archivo);\r\n\r\n task.on('state_changed', function (snapshot) {\r\n var progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;\r\n console.log('Upload is ' + progress + '% done');\r\n switch (snapshot.state) {\r\n case firebase.storage.TaskState.PAUSED: // or 'paused'\r\n console.log('Upload is paused');\r\n break;\r\n case firebase.storage.TaskState.RUNNING: // or 'running'\r\n console.log('Upload is running');\r\n break;\r\n }\r\n }, function (error) {\r\n reject(error);\r\n }, function () {\r\n task.snapshot.ref.getDownloadURL().then(function (downloadURL) {\r\n resolve(downloadURL);\r\n });\r\n });\r\n })\r\n}\r\n\r\n// Funciones firestore\r\nexport const obtIdGenerado = (coleccion) => {\r\n return firestore.collection(coleccion).doc().id;\r\n}","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\tabla\\cursos.js",["225","226","227","228","229","230","231"],"import React, { useState, useEffect } from 'react'\r\nimport ModalEdicion from '../../components/modal/edicionCurso'\r\nimport ModalConfirmacion from '../../components/modal/confirmacion'\r\nimport ModalClases from '../../components/modal/edicionClases'\r\nimport { obtClasesCurso, obtRegistrosPaginadosAdmin, actEstadoCursoAdmin } from '../../api'\r\n\r\nconst regMaximo = 10;\r\nconst coleccion = 'cursos';\r\nconst campo = 'titulo';\r\n\r\nconst Cursos = () => {\r\n\r\n // Página\r\n const [pagina, estPagina] = useState(1);\r\n\r\n // Cursos\r\n const [cursos, estCursos] = useState([]);\r\n const [cargando, estCargando] = useState(false);\r\n\r\n // Clases por curso\r\n const [clases, estClases] = useState([]);\r\n const [cargandoClases, estCargandoClases] = useState(false);\r\n\r\n const [registro, estRegistro] = useState(null); // Establece el registro seleecionado para hacer ediciones o eliminaciones\r\n const [modo, estModo] = useState(null); // Establece si se está editando o creando un registro\r\n const [haySiguiente, estHaySiguiente] = useState(false); // Para la paginación\r\n\r\n // Refs\r\n // Modal\r\n const [mostrarEdicion, estMostrarEdicion] = useState(false);\r\n const [mostrarConfirmacion, estmostrarConfirmacion] = useState(false);\r\n const [mostrarClases, estMostrarClases] = useState(false);\r\n\r\n useEffect(() => {\r\n estCargando(true);\r\n obtenerCursos();\r\n }, []);\r\n\r\n const actualizarEstado = () => {\r\n cerrarModalConfirmacion();\r\n const nuevoEstado = registro.activo ? 0 : 1;\r\n actEstadoCursoAdmin(registro.id, nuevoEstado).then(() => {\r\n obtenerCursos();\r\n });\r\n }\r\n\r\n const retroceder = () => {\r\n obtRegistrosPaginadosAdmin(coleccion, campo, regMaximo, cursos[0])\r\n .then(({ lista }) => {\r\n estHaySiguiente(true); // Si retrocedo, es porque siempre hay un siguiente\r\n estCursos(lista);\r\n estPagina(pagina - 1);\r\n })\r\n }\r\n\r\n const obtenerCursos = (reinicio) => {\r\n // El parámetro reinicio se usa después de editar o crear un registro, para que empiece\r\n // a mostrar todo desde la primera página\r\n obtRegistrosPaginadosAdmin(coleccion, campo, regMaximo, null, reinicio ? null : cursos[0], true) // Este parámetro true es para que no se cambien las posiciones cuando haga un cambio de estado\r\n .then(({ lista, haySiguiente }) => {\r\n if (reinicio) {\r\n estPagina(1);\r\n }\r\n estHaySiguiente(haySiguiente);\r\n estCursos(lista);\r\n estCargando(false);\r\n })\r\n }\r\n\r\n const obtClases = (curso) => {\r\n estCargandoClases(true);\r\n obtClasesCurso(curso.id)\r\n .then(clases => {\r\n estClases(clases);\r\n estCargandoClases(false);\r\n })\r\n .catch(error => {\r\n estClases([]);\r\n estCargandoClases(false);\r\n })\r\n }\r\n\r\n // Modal creación/edicion\r\n const abrirModalEdicion = (registro) => {\r\n estRegistro(registro);\r\n estModo('EDICION');\r\n estMostrarEdicion(true);\r\n }\r\n const cerrarModalEdicion = () => {\r\n estMostrarEdicion(false);\r\n }\r\n const abrirModalCreacion = (e) => {\r\n e.preventDefault();\r\n estRegistro(undefined);\r\n estModo('CREACION');\r\n estMostrarEdicion(true);\r\n }\r\n const guardarCambiosEdicion = () => {\r\n cerrarModalEdicion();\r\n obtenerCursos(true);\r\n }\r\n\r\n // Modal confirmación\r\n const abrirModalConfirmacion = (registro) => {\r\n estRegistro(registro);\r\n estmostrarConfirmacion(true);\r\n }\r\n\r\n const cerrarModalConfirmacion = () => {\r\n estmostrarConfirmacion(false);\r\n }\r\n\r\n // Modal clases\r\n const abrirModalClases = (curso) => {\r\n estRegistro(curso);\r\n obtClases(curso);\r\n estMostrarClases(true);\r\n }\r\n\r\n const cerrarModalClases = (e) => {\r\n estMostrarClases(false);\r\n }\r\n\r\n const guardarCambiosClases = () => {\r\n obtClases(registro);\r\n }\r\n\r\n // Funciones\r\n const avanzar = () => {\r\n obtRegistrosPaginadosAdmin(coleccion, campo, regMaximo, null, cursos[cursos.length - 1])\r\n .then(({ lista, haySiguiente }) => {\r\n estHaySiguiente(haySiguiente);\r\n estCursos(lista);\r\n estPagina(pagina + 1);\r\n })\r\n }\r\n\r\n return (\r\n <div>\r\n {\r\n mostrarConfirmacion\r\n &&\r\n <ModalConfirmacion\r\n mostrar={mostrarConfirmacion}\r\n texto={`¿Quieres ${registro?.activo ? ' desactivar' : ' activar'} este curso?`}\r\n confirmar={actualizarEstado}\r\n cancelar={cerrarModalConfirmacion} />\r\n }\r\n {\r\n mostrarEdicion\r\n &&\r\n <ModalEdicion\r\n mostrar={mostrarEdicion}\r\n modo={modo}\r\n data={registro}\r\n guardarCambios={guardarCambiosEdicion}\r\n cancelar={cerrarModalEdicion} />\r\n }\r\n {\r\n mostrarClases\r\n &&\r\n <ModalClases\r\n mostrar={mostrarClases}\r\n idCurso={registro?.id}\r\n clases={clases}\r\n cargandoClases={cargandoClases}\r\n guardarCambios={guardarCambiosClases}\r\n cancelar={cerrarModalClases} />\r\n }\r\n\r\n\r\n <div className=\"table-responsive-md\">\r\n <table className=\"table table-hover\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">#</th>\r\n <th scope=\"col\">Título</th>\r\n <th scope=\"col\">Días</th>\r\n <th scope=\"col\">Horas</th>\r\n <th scope=\"col\">Activo</th>\r\n <th scope=\"col\">Acciones</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {\r\n cursos.map((curso, indice) => (\r\n <tr key={curso.id} className={curso.activo ? '' : 'table-danger'}>\r\n <th scope=\"row\">{indice + 1}</th>\r\n <td>{curso.titulo}</td>\r\n <td>{curso.dias.join(', ')}</td>\r\n <td>{curso.hInicioFin.join(' a ')}</td>\r\n <td>{curso.activo ? 'Sí' : 'No'}</td>\r\n <td>\r\n <button onClick={() => abrirModalEdicion(curso)} className='btn btn-secondary'>\r\n <i className='fa fa-edit'></i>\r\n </button>\r\n <button onClick={() => abrirModalClases(curso)} className='btn btn-primary ml-3'>\r\n <i className='fas fa-video'></i>\r\n </button>\r\n {\r\n curso.activo\r\n ?\r\n <button onClick={() => abrirModalConfirmacion(curso)} className='btn btn-danger ml-3'>\r\n <i className='fa fa-power-off'></i>\r\n </button>\r\n :\r\n <button onClick={() => abrirModalConfirmacion(curso)} className='btn btn-success ml-3'>\r\n <i className='fa fa-power-off'></i>\r\n </button>\r\n }\r\n </td>\r\n </tr>\r\n ))\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n <a onClick={abrirModalCreacion} className=\"boton btn-principal d-block mt-4\">\r\n {'Agregar '}<i className=\"fas fa-plus\" style={{ fontSize: '12px' }}></i>\r\n </a>\r\n <ul className=\"pagination pagination-lg justify-content-center mt-4\">\r\n {\r\n pagina > 1 &&\r\n <li className=\"page-item\"><a className=\"page-link\" onClick={retroceder}>Anterior</a></li>\r\n }\r\n <li className=\"page-item active\"><a className=\"page-link\" href=\"javascript:void(0);\">{pagina}</a></li>\r\n {\r\n haySiguiente\r\n &&\r\n <li className=\"page-item\"><a className=\"page-link\" onClick={avanzar}>Siguiente</a></li>\r\n }\r\n </ul>\r\n </div >\r\n )\r\n}\r\n\r\nexport default Cursos;","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\nuestroscursos\\nuestroscursos.jsx",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\testimonios\\testimonios.jsx",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\footer\\footer.jsx",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\navbar\\navbar.jsx",["232","233"],"import React, { useState, useEffect } from \"react\"\r\nimport { Link, useHistory } from \"react-router-dom\"\r\nimport { obtUsuarioStorage } from '../../helpers/obtUsuarioStorage'\r\nimport { cerrarSesion } from \"../../api\"\r\nimport Logo from \"../../img/logo.png\"\r\nimport \"./navbar.css\"\r\n\r\nconst Navbar = ({ usarTransparencia, currentPage }) => {\r\n\r\n const [scrolled, setScrolled] = React.useState(false);\r\n const [usuario] = useState(obtUsuarioStorage());\r\n let history = useHistory();\r\n\r\n useEffect(() => {\r\n window.addEventListener(\"scroll\", handleScroll)\r\n return () => window.removeEventListener(\"scroll\", handleScroll)\r\n }, [scrolled])\r\n let x = [\"fixed-top\"]\r\n if (!usarTransparencia || scrolled) {\r\n x.push(\"scrolled\")\r\n }\r\n\r\n const handleScroll = () => {\r\n const offset = window.scrollY\r\n if (offset > 20) {\r\n setScrolled(true)\r\n } else {\r\n setScrolled(false)\r\n }\r\n }\r\n\r\n const salir = (e) => {\r\n e.preventDefault();\r\n cerrarSesion()\r\n .then(res => {\r\n if (res) {\r\n localStorage.removeItem('usuario');\r\n history.push('/login');\r\n }\r\n })\r\n }\r\n\r\n return (\r\n <div className={x.join(\" \")}>\r\n <div className=\"contenedor contenedor-navbar\">\r\n <nav className=\"navbar navbar-expand-md navbar-dark\">\r\n <Link className=\"navbar-brand logo\" to=\"/\">\r\n <img src={Logo} alt=\"Logo\" title=\"Logo\" />\r\n </Link>\r\n <button\r\n className=\"navbar-toggler\"\r\n type=\"button\"\r\n data-toggle=\"collapse\"\r\n data-target=\"#collapsibleNavbar\">\r\n <span className=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div className=\"collapse navbar-collapse\" id=\"collapsibleNavbar\">\r\n <ul className=\"navbar-nav ml-auto mr-5\">\r\n {\r\n usuario && currentPage && currentPage == '/admin'\r\n ?\r\n <li className=\"nav-item\">\r\n <a onClick={salir}>Salir</a>\r\n </li>\r\n :\r\n <>\r\n <li className=\"nav-item\">\r\n <Link to=\"/\">Inicio</Link>\r\n </li>\r\n <li className=\"nav-item\">\r\n <Link to=\"/courses\">Cursos</Link>\r\n </li>\r\n <li className=\"nav-item\">\r\n <Link to=\"/teachers\">Docentes</Link>\r\n </li>\r\n <li className=\"nav-item\">\r\n <Link to=\"/login\">Login</Link>\r\n </li>\r\n </>\r\n }\r\n </ul>\r\n </div>\r\n </nav>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default Navbar\r\n","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\carrusel\\carrusele.jsx",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\episodio\\acordeon_episodios.jsx",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\estadisticas\\estadisticas.jsx",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\cursos\\card\\card.jsx",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\parrafo_teacher\\parrafo_teacher.jsx",["234"],"import React, { useState } from \"react\"\r\nimport \"./parrafo_teacher.css\"\r\n\r\nexport default prop => {\r\n const [mostrarMas, setMostrarMas] = useState(true);\r\n const [mostrarMenos, setMostrarMenos] = useState(false);\r\n\r\n return (\r\n <div className=\"container-info\">\r\n <div className=\"container-title\">\r\n <h2 className=\"titulo-docente\">\r\n {prop.titulo}\r\n {prop.parrafo && (\r\n <div className=\"Detalle\">\r\n <button\r\n className={!mostrarMas ? \"Ocultar\" : \"\"}\r\n onClick={() => {\r\n setMostrarMas(false)\r\n setMostrarMenos(true)\r\n }}\r\n >\r\n <i className=\"fa fa-angle-down\"></i>\r\n </button>\r\n <button\r\n className={!mostrarMenos ? \"Ocultar\" : \"\"}\r\n onClick={() => {\r\n setMostrarMas(true)\r\n setMostrarMenos(false)\r\n }}>\r\n <i className=\"fa fa-angle-up\"></i>\r\n </button>\r\n </div>\r\n )}\r\n </h2>\r\n </div>\r\n {prop.parrafo && (\r\n <div>\r\n <p\r\n className={\r\n !mostrarMenos ? \"Semi-Oculto text-content\" : \"text-content\"\r\n }>\r\n {prop.parrafo}\r\n </p>\r\n <p className={!mostrarMenos ? \"Ocultar text-content\" : \"text-content\"}>\r\n {prop.parrafo}\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\course_teacher\\course_teacher.jsx",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\docentes\\card\\card_teacher.jsx",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\navbar\\index.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\footer\\index.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\panoramaInicio\\index.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\calendario\\index.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\pestanas\\index.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\avatar\\index.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\modal\\confirmacion.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\modal\\edicionClases.js",["235"],"import React, { useState, useEffect } from 'react'\r\nimport TarjetaEdicion from './tarjeta_edicion_clase'\r\nimport GridLoader from \"react-spinners/GridLoader\"\r\nimport { css } from \"@emotion/core\"\r\nimport { guardarClaseAdmin, actClaseAdmin, eliminarClaseAdmin } from '../../api'\r\nimport PropTypes from 'prop-types';\r\nimport Modal from 'react-bootstrap/Modal'\r\n\r\nconst override = css`\r\n display: block;\r\n margin: 50px auto;\r\n background-color: 'green';\r\n`;\r\n\r\nconst Edicion = (props) => {\r\n\r\n const [clases, estClases] = useState([]);\r\n const [ordenCorrelativo, estOrdenCorrelativo] = useState(0);\r\n\r\n const obtenerOrdenCorrelativo = (clases) => {\r\n if (clases) {\r\n let max = 0;\r\n clases.map(clase => {\r\n if (clase.orden > max) {\r\n max = clase.orden;\r\n }\r\n })\r\n return max + 1;\r\n }\r\n return 0;\r\n }\r\n\r\n useEffect(() => {\r\n estClases(props.clases);\r\n estOrdenCorrelativo(obtenerOrdenCorrelativo(props.clases));\r\n }, [props.clases]);\r\n\r\n const agregar = (clase) => {\r\n guardarClaseAdmin(clase)\r\n .then(() => {\r\n props.guardarCambios();\r\n });\r\n }\r\n\r\n const actualizar = (clase) => {\r\n actClaseAdmin(clase)\r\n .then(() => {\r\n props.guardarCambios();\r\n });\r\n }\r\n\r\n const eliminar = (id) => {\r\n eliminarClaseAdmin(id)\r\n .then(() => {\r\n props.guardarCambios();\r\n })\r\n }\r\n\r\n return (\r\n <Modal show={props.mostrar} onHide={props.cancelar} backdrop={'static'} keyboard={false} size={'xl'}>\r\n <Modal.Header closeButton>\r\n <Modal.Title>Editar clases</Modal.Title>\r\n </Modal.Header>\r\n <Modal.Body>\r\n {\r\n props.cargandoClases\r\n ?\r\n <GridLoader css={override} loading={props.cargandoClases} size={10} />\r\n :\r\n props.clases && props.clases.length > 0\r\n ?\r\n <>\r\n <TarjetaEdicion\r\n idCurso={props.idCurso}\r\n agregar={agregar}\r\n correlativo={ordenCorrelativo}\r\n nueva />\r\n {\r\n clases.map(clase => (\r\n <TarjetaEdicion\r\n idCurso={props.idCurso}\r\n actualizar={actualizar}\r\n eliminar={eliminar}\r\n clase={clase}\r\n key={clase.id} />\r\n ))\r\n }\r\n </>\r\n :\r\n <>\r\n <TarjetaEdicion\r\n idCurso={props.idCurso}\r\n agregar={agregar}\r\n correlativo={1}\r\n nueva />\r\n <p>No hay clases registradas</p>\r\n </>\r\n }\r\n </Modal.Body>\r\n <Modal.Footer>\r\n <button type=\"button\" className=\"btn btn-danger\" onClick={props.cancelar}>Cerrar</button>\r\n </Modal.Footer>\r\n </Modal>\r\n )\r\n}\r\n\r\nEdicion.propTypes = {\r\n data: PropTypes.shape({\r\n id: PropTypes.string,\r\n titulo: PropTypes.string,\r\n ulrImg: PropTypes.string,\r\n urlInscripcion: PropTypes.string,\r\n objetivo: PropTypes.string,\r\n descBreve: PropTypes.string,\r\n descExtendida: PropTypes.string,\r\n requisitos: PropTypes.arrayOf(PropTypes.string),\r\n dias: PropTypes.arrayOf(PropTypes.string),\r\n fInicioFin: PropTypes.arrayOf(PropTypes.string),\r\n hInicioFin: PropTypes.arrayOf(PropTypes.string),\r\n excepciones: PropTypes.arrayOf(PropTypes.string),\r\n cancelaciones: PropTypes.arrayOf(PropTypes.string),\r\n idProfesor: PropTypes.string,\r\n clases: PropTypes.arrayOf(PropTypes.object)\r\n })\r\n}\r\n\r\nEdicion.defaultProps = {\r\n data: {\r\n id: null,\r\n titulo: '',\r\n urlImg: '',\r\n urlInscripcion: '',\r\n objetivo: '',\r\n descBreve: '',\r\n descExtendida: '',\r\n requisitos: [],\r\n dias: [],\r\n fInicioFin: [],\r\n hInicioFin: [],\r\n excepciones: [],\r\n cancelaciones: [],\r\n idProfesor: '',\r\n clases: []\r\n }\r\n}\r\n\r\nexport default Edicion;","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\modal\\edicionProfesor.js",["236","237"],"import React, { useRef, useState, useEffect } from 'react'\r\nimport { subirImagen, actProfesorAdmin, obtIdGenerado } from '../../api'\r\nimport { arrayToStringList, stringToArray } from '../../helpers/funcionesArreglo'\r\nimport PropTypes from 'prop-types';\r\nimport Modal from 'react-bootstrap/Modal'\r\n\r\nconst Edicion = React.forwardRef((props, ref) => {\r\n\r\n let reftxtNombres = useRef();\r\n\r\n const [nombres, estNombres] = useState('');\r\n const [apellidos, estApellidos] = useState('');\r\n const [img, estImg] = useState(null);\r\n const [pais, estPais] = useState('');\r\n const [likes, estLikes] = useState(0);\r\n const [etiquetas, estEtiquetas] = useState('');\r\n const [logros, estLogros] = useState('');\r\n const [sobreMi, estSobreMi] = useState('');\r\n const [experiencia, estExperiencia] = useState('');\r\n const [github, estGithub] = useState('');\r\n const [patreon, estPatreon] = useState('');\r\n const [youtube, estYoutube] = useState('');\r\n\r\n useEffect(() => {\r\n reftxtNombres.current?.focus();\r\n }, [])\r\n\r\n useEffect(() => {\r\n estNombres(props.data?.nombres);\r\n estApellidos(props.data?.apellidos);\r\n estPais(props.data?.pais);\r\n estLikes(parseInt(props.data?.likes));\r\n estEtiquetas(arrayToStringList(props.data?.etiquetas));\r\n estLogros(arrayToStringList(props.data?.logros));\r\n estSobreMi(props.data?.sobreMi);\r\n estExperiencia(props.data?.experiencia);\r\n estGithub(props.data?.redes?.gh);\r\n estPatreon(props.data?.redes?.pt);\r\n estYoutube(props.data?.redes?.yt);\r\n }, [props.data]);\r\n\r\n const actNombres = (ev) => {\r\n estNombres(ev.target.value);\r\n }\r\n const actApellidos = (ev) => {\r\n estApellidos(ev.target.value);\r\n }\r\n const actImg = (ev) => {\r\n estImg(ev.target.files[ev.target.files.length - 1]);\r\n }\r\n const actPais = (ev) => {\r\n estPais(ev.target.value);\r\n }\r\n const actLikes = (ev) => {\r\n estLikes(ev.target.value);\r\n }\r\n const actEtiquetas = (ev) => {\r\n estEtiquetas(ev.target.value);\r\n }\r\n const actLogros = (ev) => {\r\n estLogros(ev.target.value);\r\n }\r\n const actSobreMi = (ev) => {\r\n estSobreMi(ev.target.value);\r\n }\r\n const actExperiencia = (ev) => {\r\n estExperiencia(ev.target.value);\r\n }\r\n const actGithub = (ev) => {\r\n estGithub(ev.target.value);\r\n }\r\n const actPatreon = (ev) => {\r\n estPatreon(ev.target.value);\r\n }\r\n const actYoutube = (ev) => {\r\n estYoutube(ev.target.value);\r\n }\r\n\r\n const guardarPerfil = (url, idGenerado) => {\r\n\r\n const dataNueva = {\r\n nombres,\r\n apellidos,\r\n pais,\r\n likes: parseInt(likes),\r\n etiquetas: stringToArray(etiquetas),\r\n logros: stringToArray(logros),\r\n sobreMi,\r\n experiencia,\r\n img: url,\r\n redes: {\r\n gh: github,\r\n pt: patreon,\r\n yt: youtube\r\n },\r\n };\r\n\r\n switch (props.modo) {\r\n case 'CREACION':\r\n actProfesorAdmin({ ...dataNueva, id: idGenerado, activo: 1 }).then(() => {\r\n props.guardarCambios();\r\n })\r\n break;\r\n\r\n case 'EDICION':\r\n actProfesorAdmin({\r\n ...props.data,\r\n ...dataNueva\r\n }).then(() => {\r\n props.guardarCambios();\r\n })\r\n break;\r\n }\r\n }\r\n\r\n const guardarCambios = () => {\r\n if (nombres && apellidos && pais && !isNaN(likes) && etiquetas && sobreMi) {\r\n const idGenerado = props.data.id || obtIdGenerado('docentes');\r\n if (img) {\r\n subirImagen('profesores', idGenerado, img)\r\n .then(url => {\r\n guardarPerfil(url, idGenerado);\r\n })\r\n .catch(error => {\r\n alert('Error al subir la imagen. Reintente')\r\n console.log(error);\r\n })\r\n } else {\r\n guardarPerfil(props.data.img, idGenerado);\r\n }\r\n } else {\r\n alert('Hay campos obligatorios inválidos');\r\n }\r\n }\r\n\r\n const encabezado = props.modo == 'CREACION' ? 'Crear profesor' : 'Editar profesor';\r\n\r\n return (\r\n <Modal show={props.mostrar} onHide={props.cancelar} backdrop={'static'} keyboard={false} size={'xl'}>\r\n <Modal.Header closeButton>\r\n <Modal.Title>\r\n {encabezado}\r\n </Modal.Title>\r\n </Modal.Header>\r\n <Modal.Body>\r\n <form>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtNombres\">Nombres*</label>\r\n <input ref={reftxtNombres} type=\"text\" value={nombres} onChange={actNombres} className=\"form-control form-control-lg\" id=\"txtNombres\" placeholder=\"Ingresa los nombres\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtApellidos\">Apellidos*</label>\r\n <input type=\"text\" value={apellidos} onChange={actApellidos} className=\"form-control form-control-lg\" id=\"txtApellidos\" placeholder=\"Ingresa los apellidos\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"imgProfesor\">Imagen profesor</label>\r\n <input type=\"file\" accept=\"image/*\" onChange={actImg} className=\"form-control-file\" id=\"imgProfesor\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtPais\">País (Prefijo)*</label>\r\n <input type=\"text\" value={pais} onChange={actPais} className=\"form-control form-control-lg\" id=\"txtPais\" placeholder=\"Ejemplo: MX, PE, SV\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtLikes\">Likes*</label>\r\n <input type=\"number\" min={0} max={99} value={likes} onChange={actLikes} className=\"form-control form-control-lg\" id=\"txtLikes\" placeholder=\"0-99\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtEtiquetas\">Etiquetas*</label>\r\n <input type=\"text\" value={etiquetas} onChange={actEtiquetas} className=\"form-control form-control-lg\" id=\"txtEtiquetas\" placeholder=\"Ejemplo: C++, Java, Javascript\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtLogros\">Logros</label>\r\n <input type=\"text\" value={logros} onChange={actLogros} className=\"form-control form-control-lg\" id=\"txtLogros\" placeholder=\"Logro 1, Logro 2, Logro 3\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtSobreMi\">Sobre mí*</label>\r\n <textarea value={sobreMi} onChange={actSobreMi} className=\"form-control\" id=\"txtSobreMi\" rows=\"3\"></textarea>\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtExperiencia\">Experiencia</label>\r\n <textarea value={experiencia} onChange={actExperiencia} className=\"form-control\" id=\"txtExperiencia\" rows=\"3\"></textarea>\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtGithub\">Github</label>\r\n <input type=\"text\" value={github} onChange={actGithub} className=\"form-control form-control-lg\" id=\"txtGithub\" placeholder=\"Ejemplo: C++, Java, Javascript\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtPatreon\">Patreon</label>\r\n <input type=\"text\" value={patreon} onChange={actPatreon} className=\"form-control form-control-lg\" id=\"txtPatreon\" placeholder=\"Ejemplo: C++, Java, Javascript\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtYoutube\">Youtube</label>\r\n <input type=\"text\" value={youtube} onChange={actYoutube} className=\"form-control form-control-lg\" id=\"txtYoutube\" placeholder=\"Ejemplo: C++, Java, Javascript\" />\r\n </div>\r\n </form>\r\n </Modal.Body>\r\n <Modal.Footer>\r\n <button type=\"button\" className=\"btn btn-primary\" onClick={guardarCambios}>Guardar</button>\r\n <button type=\"button\" className=\"btn btn-danger\" onClick={props.cancelar}>Cerrar</button>\r\n </Modal.Footer>\r\n </Modal>\r\n )\r\n})\r\n\r\nEdicion.propTypes = {\r\n data: PropTypes.shape({\r\n id: PropTypes.string,\r\n nombres: PropTypes.string,\r\n apellidos: PropTypes.string,\r\n pais: PropTypes.string,\r\n likes: PropTypes.number,\r\n etiquetas: PropTypes.arrayOf(PropTypes.string),\r\n logros: PropTypes.arrayOf(PropTypes.string),\r\n sobreMi: PropTypes.string,\r\n experiencia: PropTypes.string,\r\n img: PropTypes.string,\r\n redes: PropTypes.shape({\r\n github: PropTypes.string,\r\n patreon: PropTypes.string,\r\n youtube: PropTypes.string,\r\n })\r\n })\r\n}\r\n\r\nEdicion.defaultProps = {\r\n data: {\r\n id: null,\r\n nombres: '',\r\n apellidos: '',\r\n pais: '',\r\n likes: 0,\r\n etiquetas: [],\r\n logros: [],\r\n sobreMi: '',\r\n experiencia: '',\r\n img: '',\r\n redes: {\r\n gh: '',\r\n pt: '',\r\n yt: ''\r\n }\r\n }\r\n}\r\n\r\nexport default Edicion;","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\modal\\edicionCurso.js",["238","239"],"import React, { useRef, useState, useEffect } from 'react'\r\nimport { actCursoAdmin, obtProfesoresCombo, subirImagen, obtIdGenerado } from '../../api'\r\nimport { arrayToStringList, stringToArray } from '../../helpers/funcionesArreglo'\r\nimport PropTypes from 'prop-types';\r\nimport Modal from 'react-bootstrap/Modal'\r\n\r\nconst Edicion = (props) => {\r\n\r\n let refTxtTitulo = useRef();\r\n\r\n const [profesores, estProfesores] = useState([]);\r\n\r\n const [titulo, estTitulo] = useState('');\r\n const [img, estImg] = useState(null);\r\n const [urlInscripcion, estUrlInscripcion] = useState('');\r\n const [objetivo, estObjetivo] = useState('');\r\n const [descBreve, estDescBreve] = useState('');\r\n const [descExtendida, estDescExtendida] = useState('');\r\n const [requisitos, estRequisitos] = useState('');\r\n\r\n const [dias, estDias] = useState('');\r\n const [fInicioFin, estFInicioFin] = useState('');\r\n const [hInicioFin, estHInicioFin] = useState('');\r\n const [excepciones, estExcepciones] = useState('');\r\n const [cancelaciones, estCancelaciones] = useState('');\r\n const [idProfesor, estIdProfesor] = useState('');\r\n\r\n useEffect(() => {\r\n refTxtTitulo.current?.focus();\r\n obtProfesoresCombo().then((profesores) => {\r\n estProfesores(profesores);\r\n estIdProfesor(profesores[0].id);\r\n })\r\n }, [])\r\n\r\n useEffect(() => {\r\n estTitulo(props.data?.titulo);\r\n estUrlInscripcion(props.data?.urlInscripcion);\r\n estObjetivo(props.data?.objetivo);\r\n estDescBreve(props.data?.descBreve);\r\n estDescExtendida(props.data?.descExtendida);\r\n estRequisitos(arrayToStringList(props.data?.requisitos));\r\n estDias(arrayToStringList(props.data?.dias));\r\n estFInicioFin(arrayToStringList(props.data?.fInicioFin));\r\n estHInicioFin(arrayToStringList(props.data?.hInicioFin));\r\n estExcepciones(arrayToStringList(props.data?.excepciones));\r\n estCancelaciones(arrayToStringList(props.data?.cancelaciones));\r\n estIdProfesor(props.data?.idProfesor);\r\n }, [props.data]);\r\n\r\n const actTitulo = (ev) => {\r\n estTitulo(ev.target.value);\r\n }\r\n const actImg = (ev) => {\r\n estImg(ev.target.files[ev.target.files.length - 1]);\r\n }\r\n const actUrlInscripcion = (ev) => {\r\n estUrlInscripcion(ev.target.value);\r\n }\r\n const actObjetivos = (ev) => {\r\n estObjetivo(ev.target.value);\r\n }\r\n const actDescBreve = (ev) => {\r\n estDescBreve(ev.target.value);\r\n }\r\n const actDescExtendida = (ev) => {\r\n estDescExtendida(ev.target.value);\r\n }\r\n const actRequisitos = (ev) => {\r\n estRequisitos(ev.target.value);\r\n }\r\n const actDias = (ev) => {\r\n estDias(ev.target.value);\r\n }\r\n const actFinicioFin = (ev) => {\r\n estFInicioFin(ev.target.value);\r\n }\r\n const actHInicioFin = (ev) => {\r\n estHInicioFin(ev.target.value);\r\n }\r\n const actExcepciones = (ev) => {\r\n estExcepciones(ev.target.value);\r\n }\r\n const actCancelaciones = (ev) => {\r\n estCancelaciones(ev.target.value);\r\n }\r\n const actIdProfesor = (ev) => {\r\n estIdProfesor(ev.target.value);\r\n }\r\n\r\n const guardarCurso = (url, idGenerado) => {\r\n const dataNueva = {\r\n titulo,\r\n urlImg: url,\r\n urlInscripcion,\r\n objetivo,\r\n descBreve,\r\n descExtendida,\r\n requisitos: stringToArray(requisitos),\r\n dias: stringToArray(dias),\r\n fInicioFin: stringToArray(fInicioFin),\r\n hInicioFin: stringToArray(hInicioFin),\r\n excepciones: stringToArray(excepciones),\r\n cancelaciones: stringToArray(cancelaciones),\r\n idProfesor: idProfesor ? idProfesor : profesores[0].id\r\n };\r\n\r\n switch (props.modo) {\r\n case 'CREACION':\r\n actCursoAdmin({ ...dataNueva, id: idGenerado, activo: 1 }).then(() => {\r\n props.guardarCambios();\r\n })\r\n break;\r\n\r\n case 'EDICION':\r\n actCursoAdmin({\r\n ...props.data,\r\n ...dataNueva\r\n }).then(() => {\r\n props.guardarCambios();\r\n })\r\n break;\r\n }\r\n }\r\n\r\n const guardarCambios = () => {\r\n if (titulo && urlInscripcion && objetivo && descBreve && descExtendida && dias && fInicioFin && hInicioFin && idProfesor) {\r\n const idGenerado = props.data.id || obtIdGenerado('cursos');\r\n if (img) {\r\n subirImagen('cursos', idGenerado, img)\r\n .then(url => {\r\n guardarCurso(url, idGenerado);\r\n })\r\n .catch(error => {\r\n alert('Error al subir la imagen. Reintente')\r\n console.log(error);\r\n })\r\n } else {\r\n guardarCurso(props.data.urlImg, idGenerado);\r\n }\r\n } else {\r\n alert('Hay campos obligatorios inválidos');\r\n }\r\n }\r\n\r\n const encabezado = props.modo == 'CREACION' ? 'Crear curso' : 'Editar curso';\r\n\r\n return (\r\n <Modal show={props.mostrar} onHide={props.cancelar} backdrop={'static'} keyboard={false} size={'xl'}>\r\n <Modal.Header closeButton>\r\n <Modal.Title>\r\n {encabezado}\r\n </Modal.Title>\r\n </Modal.Header>\r\n <Modal.Body>\r\n <form>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtTitulo\">Título*</label>\r\n <input ref={refTxtTitulo} type=\"text\" value={titulo} onChange={actTitulo} className=\"form-control form-control-lg\" id=\"txtTitulo\" placeholder=\"Ingresa el título\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"imgCurso\">Imagen curso</label>\r\n <input type=\"file\" accept=\"image/*\" onChange={actImg} className=\"form-control-file\" id=\"imgCurso\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtUrlInscripcion\">URL inscripción*</label>\r\n <input type=\"text\" value={urlInscripcion} onChange={actUrlInscripcion} className=\"form-control form-control-lg\" id=\"txtUrlInscripcion\" placeholder=\"htpps://docs.google...\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtObjetivo\">Objetivo*</label>\r\n <input type=\"text\" value={objetivo} onChange={actObjetivos} className=\"form-control form-control-lg\" id=\"txtObjetivo\" placeholder=\"Ingresa solo un objetivo\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtDescBreve\">Descripción breve*</label>\r\n <textarea value={descBreve} onChange={actDescBreve} className=\"form-control\" id=\"txtDescBreve\" rows=\"3\"></textarea>\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtDescExtendida\">Descripción extendida*</label>\r\n <textarea value={descExtendida} onChange={actDescExtendida} className=\"form-control\" id=\"txtDescExtendida\" rows=\"3\"></textarea>\r\n </div>\r\n <legend class=\"col-form-label mt-4 mb-4\">Horarios</legend>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtRequisitos\">Requisitos</label>\r\n <input type=\"text\" value={requisitos} onChange={actRequisitos} className=\"form-control form-control-lg\" id=\"txtRequisitos\" placeholder=\"Requisito 1, requisito 2\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtDias\">Días*</label>\r\n <input type=\"text\" value={dias} onChange={actDias} className=\"form-control form-control-lg\" id=\"txtDias\" placeholder=\"LU, MA, MI, JU, VI, SA, DO\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtFInicioFin\">Fecha inicio y fin*</label>\r\n <input type=\"text\" value={fInicioFin} onChange={actFinicioFin} className=\"form-control form-control-lg\" id=\"txtFInicioFin\" placeholder=\"dd/mm/yyyy, dd/mm/yyyy\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtHInicioFin\">Hora inicio y fin (Formato 24h)*</label>\r\n <input type=\"text\" value={hInicioFin} onChange={actHInicioFin} className=\"form-control form-control-lg\" id=\"txtHInicioFin\" placeholder=\"hh:mm, hh:mm\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtExcepciones\">Fechas excepciones</label>\r\n <input type=\"text\" value={excepciones} onChange={actExcepciones} className=\"form-control form-control-lg\" id=\"txtExcepciones\" placeholder=\"dd/mm/yyyy, dd/mm/yyyy, dd/mm/yyyy, etc\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtCancelaciones\">Fechas cancelaciones</label>\r\n <input type=\"text\" value={cancelaciones} onChange={actCancelaciones} className=\"form-control form-control-lg\" id=\"txtCancelaciones\" placeholder=\"dd/mm/yyyy, dd/mm/yyyy, dd/mm/yyyy, etc\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"cboProfesores\">Profesor*</label>\r\n <select onChange={actIdProfesor} value={idProfesor} class=\"form-control form-control-lg\" id=\"cboProfesores\">\r\n {\r\n profesores.map(profesor => (\r\n <option value={profesor.id}>{profesor.nombres + ' ' + profesor.apellidos}</option>\r\n ))\r\n }\r\n </select>\r\n </div>\r\n </form>\r\n </Modal.Body>\r\n <Modal.Footer>\r\n <button type=\"button\" className=\"btn btn-primary\" onClick={guardarCambios}>Guardar</button>\r\n <button type=\"button\" className=\"btn btn-danger\" onClick={props.cancelar}>Cerrar</button>\r\n </Modal.Footer>\r\n\r\n </Modal>\r\n )\r\n}\r\n\r\nEdicion.propTypes = {\r\n data: PropTypes.shape({\r\n id: PropTypes.string,\r\n titulo: PropTypes.string,\r\n ulrImg: PropTypes.string,\r\n urlInscripcion: PropTypes.string,\r\n objetivo: PropTypes.string,\r\n descBreve: PropTypes.string,\r\n descExtendida: PropTypes.string,\r\n requisitos: PropTypes.arrayOf(PropTypes.string),\r\n dias: PropTypes.arrayOf(PropTypes.string),\r\n fInicioFin: PropTypes.arrayOf(PropTypes.string),\r\n hInicioFin: PropTypes.arrayOf(PropTypes.string),\r\n excepciones: PropTypes.arrayOf(PropTypes.string),\r\n cancelaciones: PropTypes.arrayOf(PropTypes.string),\r\n idProfesor: PropTypes.string,\r\n clases: PropTypes.arrayOf(PropTypes.object)\r\n })\r\n}\r\n\r\nEdicion.defaultProps = {\r\n data: {\r\n id: null,\r\n titulo: '',\r\n urlImg: '',\r\n urlInscripcion: '',\r\n objetivo: '',\r\n descBreve: '',\r\n descExtendida: '',\r\n requisitos: [],\r\n dias: [],\r\n fInicioFin: [],\r\n hInicioFin: [],\r\n excepciones: [],\r\n cancelaciones: [],\r\n idProfesor: '',\r\n clases: []\r\n }\r\n}\r\n\r\nexport default Edicion;","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\testimonios\\testimonios-data.jsx",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\episodio\\card\\card_episodio.jsx",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\pestanas\\pestanas.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\avatar\\avatar.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\panoramaInicio\\panorama.jsx",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\calendario\\calendario.jsx",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\modal\\tarjeta_edicion_clase.js",["240"],"import React, { useState, useEffect } from 'react'\r\nimport { stringToArray, arrayToStringList } from '../../helpers/funcionesArreglo'\r\nimport PropTypes from 'prop-types';\r\n\r\nconst TarjetaEdicion = ({ nueva, clase, idCurso, correlativo, agregar, actualizar, eliminar }) => {\r\n\r\n const [orden, estOrden] = useState(0);\r\n const [titulo, estTitulo] = useState('');\r\n const [descripcion, estDescripcion] = useState('');\r\n const [duracion, estDuracion] = useState('');\r\n const [link, estLink] = useState('');\r\n const [recursos, estRecursos] = useState('');\r\n\r\n const actOrden = (ev) => {\r\n estOrden(parseInt(ev.target.value));\r\n }\r\n const actTitulo = (ev) => {\r\n estTitulo(ev.target.value);\r\n }\r\n const actDescripcion = (ev) => {\r\n estDescripcion(ev.target.value);\r\n }\r\n const actDuracion = (ev) => {\r\n estDuracion(ev.target.value);\r\n }\r\n const actLink = (ev) => {\r\n estLink(ev.target.value);\r\n }\r\n const actRecursos = (ev) => {\r\n estRecursos(ev.target.value);\r\n }\r\n\r\n const cadenaAObjRecursos = (cadena) => {\r\n if (cadena) {\r\n let regFinal = [];\r\n try {\r\n const regRecursos = stringToArray(cadena);\r\n regFinal = regRecursos.map(reg => {\r\n const objRecurso = stringToArray(reg, '--');\r\n var nombre = objRecurso[0].replace(\"titulo:\", \"\").trim();\r\n var url = objRecurso[1].replace(\"link:\", \"\").trim();\r\n return { nombre, url };\r\n })\r\n } catch (error) {\r\n return { error, lista: [] };\r\n }\r\n return { lista: regFinal };\r\n } else {\r\n return { lista: [] };\r\n }\r\n }\r\n\r\n const agregarClase = () => {\r\n if (!isNaN(orden) && orden && titulo && duracion && link) {\r\n const { lista, error } = cadenaAObjRecursos(recursos);\r\n if (!error) {\r\n const nuevaData = {\r\n descripcion,\r\n duracion,\r\n idCurso: idCurso,\r\n orden: parseInt(orden),\r\n titulo,\r\n urlVideo: link,\r\n recursos: lista\r\n };\r\n agregar(nuevaData);\r\n } else {\r\n alert('Recursos de clase ' + orden + ' no válido');\r\n }\r\n } else {\r\n alert('Hay campos inválidos en la clase ' + orden);\r\n }\r\n }\r\n\r\n const actualizarClase = () => {\r\n if (!isNaN(orden) && orden && titulo && duracion && link) {\r\n const { lista, error } = cadenaAObjRecursos(recursos);\r\n if (!error) {\r\n const nuevaData = {\r\n id: clase.id,\r\n descripcion,\r\n duracion,\r\n idCurso: clase.idCurso,\r\n orden: parseInt(orden),\r\n titulo,\r\n urlVideo: link,\r\n recursos: lista\r\n };\r\n actualizar(nuevaData);\r\n } else {\r\n alert('Recursos de clase ' + orden + ' no válido');\r\n }\r\n } else {\r\n alert('Hay campos inválidos en la clase ' + orden);\r\n }\r\n }\r\n\r\n const eliminarClase = () => {\r\n eliminar(clase.id);\r\n }\r\n\r\n useEffect(() => {\r\n estOrden(correlativo ? correlativo : clase.orden);\r\n estTitulo(clase?.titulo);\r\n estDescripcion(clase?.descripcion);\r\n estDuracion(clase?.duracion);\r\n estLink(clase?.urlVideo);\r\n estRecursos(arrayToStringList(clase?.recursos));\r\n }, [clase]);\r\n\r\n return (\r\n <form>\r\n <legend class=\"col-form-label mb-4\">{nueva ? 'Nueva clase' : 'Clase N° ' + orden}</legend>\r\n <div class=\"form-row\">\r\n <div className=\"form-group col-3\">\r\n <label htmlFor=\"txtOrden\">Orden*</label>\r\n <input min=\"1\" type=\"number\" value={orden} onChange={actOrden} className=\"form-control form-control-lg\" id=\"txtOrden\" placeholder=\"Ingresa el número de orden\" />\r\n </div>\r\n <div className=\"form-group col-9\">\r\n <label htmlFor=\"txtTitulo\">Título*</label>\r\n <input type=\"text\" value={titulo} onChange={actTitulo} className=\"form-control form-control-lg\" id=\"txtTitulo\" placeholder=\"Ingresa el título\" />\r\n </div>\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtDescripcion\">Descripción</label>\r\n <textarea value={descripcion} onChange={actDescripcion} className=\"form-control\" id=\"txtDescripcion\" rows=\"3\"></textarea>\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtDuracion\">Duración (Xh Ym)*</label>\r\n <input type=\"text\" value={duracion} onChange={actDuracion} className=\"form-control form-control-lg\" id=\"txtDuracion\" placeholder=\"Ejemplo: 1h 50m\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtLink\">Id video Youtube*</label>\r\n <input type=\"text\" value={link} onChange={actLink} className=\"form-control form-control-lg\" id=\"txtLink\" placeholder=\"Ejemplo: KxWQCsE_GTo\" />\r\n </div>\r\n <div className=\"form-group\">\r\n <label htmlFor=\"txtRecursos\">Recursos (titulo: A1 -- link: B1, titulo: A2 -- link: B2)</label>\r\n <textarea value={recursos} onChange={actRecursos} className=\"form-control\" id=\"txtRecursos\" rows=\"3\"></textarea>\r\n </div>\r\n {\r\n nueva\r\n ?\r\n <button type=\"button\" className=\"btn btn-success btn-block mb-4\" onClick={agregarClase}>Agregar</button>\r\n :\r\n <>\r\n <button type=\"button\" className=\"btn btn-primary btn-block mb-4\" onClick={actualizarClase}>Actualizar</button>\r\n <button type=\"button\" className=\"btn btn-danger btn-block mb-4\" onClick={eliminarClase}>Eliminar</button>\r\n </>\r\n }\r\n </form>\r\n )\r\n}\r\n\r\nTarjetaEdicion.propTypes = {\r\n clase: PropTypes.shape({\r\n id: PropTypes.string,\r\n descripcion: PropTypes.string,\r\n duracion: PropTypes.string,\r\n idCurso: PropTypes.string,\r\n orden: PropTypes.number,\r\n titulo: PropTypes.string,\r\n urlVideo: PropTypes.string,\r\n recursos: PropTypes.arrayOf(PropTypes.shape({\r\n nombre: PropTypes.string,\r\n url: PropTypes.string\r\n }))\r\n })\r\n}\r\n\r\nTarjetaEdicion.defaultProps = {\r\n clase: {\r\n id: '',\r\n descripcion: '',\r\n duracion: '0h 0m',\r\n idCurso: '',\r\n orden: 1,\r\n titulo: '',\r\n urlVideo: '',\r\n recursos: []\r\n }\r\n}\r\n\r\nexport default TarjetaEdicion;","C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\helpers\\funcionesArreglo.js",[],"C:\\Users\\Gricardov\\Desktop\\Temple Web React\\templeweb\\src\\components\\cursos\\cursos-data.jsx",[],{"ruleId":"241","replacedBy":"242"},{"ruleId":"243","replacedBy":"244"},{"ruleId":"245","severity":1,"message":"246","line":11,"column":12,"nodeType":"247","messageId":"248","endLine":11,"endColumn":18},{"ruleId":"245","severity":1,"message":"249","line":17,"column":12,"nodeType":"247","messageId":"248","endLine":17,"endColumn":29},{"ruleId":"250","severity":1,"message":"251","line":71,"column":29,"nodeType":"252","endLine":71,"endColumn":130},{"ruleId":"245","severity":1,"message":"253","line":14,"column":12,"nodeType":"247","messageId":"248","endLine":14,"endColumn":20},{"ruleId":"254","severity":1,"message":"255","line":26,"column":8,"nodeType":"256","endLine":26,"endColumn":10,"suggestions":"257"},{"ruleId":"258","severity":1,"message":"259","line":162,"column":13,"nodeType":"252","endLine":162,"endColumn":90},{"ruleId":"258","severity":1,"message":"259","line":168,"column":47,"nodeType":"252","endLine":168,"endColumn":93},{"ruleId":"258","severity":1,"message":"260","line":170,"column":50,"nodeType":"252","endLine":170,"endColumn":102},{"ruleId":"261","severity":1,"message":"262","line":170,"column":80,"nodeType":"263","messageId":"264","endLine":170,"endColumn":101},{"ruleId":"258","severity":1,"message":"259","line":174,"column":47,"nodeType":"252","endLine":174,"endColumn":90},{"ruleId":"265","severity":1,"message":"266","line":250,"column":30,"nodeType":"267","messageId":"268","endLine":250,"endColumn":32},{"ruleId":"269","severity":1,"message":"270","line":329,"column":13,"nodeType":"271","messageId":"272","endLine":336,"endColumn":14},{"ruleId":"245","severity":1,"message":"253","line":18,"column":12,"nodeType":"247","messageId":"248","endLine":18,"endColumn":20},{"ruleId":"254","severity":1,"message":"273","line":37,"column":8,"nodeType":"256","endLine":37,"endColumn":10,"suggestions":"274"},{"ruleId":"258","severity":1,"message":"259","line":218,"column":13,"nodeType":"252","endLine":218,"endColumn":90},{"ruleId":"258","severity":1,"message":"259","line":224,"column":47,"nodeType":"252","endLine":224,"endColumn":93},{"ruleId":"258","severity":1,"message":"260","line":226,"column":50,"nodeType":"252","endLine":226,"endColumn":102},{"ruleId":"261","severity":1,"message":"262","line":226,"column":80,"nodeType":"263","messageId":"264","endLine":226,"endColumn":101},{"ruleId":"258","severity":1,"message":"259","line":230,"column":47,"nodeType":"252","endLine":230,"endColumn":90},{"ruleId":"265","severity":1,"message":"266","line":61,"column":55,"nodeType":"267","messageId":"268","endLine":61,"endColumn":57},{"ruleId":"258","severity":1,"message":"259","line":64,"column":21,"nodeType":"252","endLine":64,"endColumn":40},{"ruleId":"275","severity":1,"message":"276","line":4,"column":1,"nodeType":"277","endLine":51,"endColumn":2},{"ruleId":"278","severity":1,"message":"279","line":23,"column":30,"nodeType":"280","messageId":"281","endLine":23,"endColumn":32},{"ruleId":"269","severity":1,"message":"270","line":98,"column":9,"nodeType":"271","messageId":"272","endLine":113,"endColumn":10},{"ruleId":"265","severity":1,"message":"266","line":136,"column":35,"nodeType":"267","messageId":"268","endLine":136,"endColumn":37},{"ruleId":"269","severity":1,"message":"270","line":108,"column":9,"nodeType":"271","messageId":"272","endLine":123,"endColumn":10},{"ruleId":"265","severity":1,"message":"266","line":146,"column":35,"nodeType":"267","messageId":"268","endLine":146,"endColumn":37},{"ruleId":"254","severity":1,"message":"282","line":109,"column":8,"nodeType":"256","endLine":109,"endColumn":15,"suggestions":"283"},"no-native-reassign",["284"],"no-negated-in-lhs",["285"],"no-unused-vars","'cursos' is assigned a value but never used.","Identifier","unusedVar","'cargandoEpisodios' is assigned a value but never used.","react/jsx-no-target-blank","Using target=\"_blank\" without rel=\"noreferrer\" is a security risk: see https://html.spec.whatwg.org/multipage/links.html#link-type-noopener","JSXOpeningElement","'cargando' is assigned a value but never used.","react-hooks/exhaustive-deps","React Hook useEffect has a missing dependency: 'obtenerProfesores'. Either include it or remove the dependency array.","ArrayExpression",["286"],"jsx-a11y/anchor-is-valid","The href attribute is required for an anchor to be keyboard accessible. Provide a valid, navigable address as the href value. If you cannot provide an href, but still need the element to resemble a link, use a button and change it with appropriate styles. Learn more: https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-is-valid.md","The href attribute requires a valid value to be accessible. Provide a valid, navigable address as the href value. If you cannot provide a valid href, but still need the element to resemble a link, use a button and change it with appropriate styles. Learn more: https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-is-valid.md","no-script-url","Script URL is a form of eval.","Literal","unexpectedScriptURL","eqeqeq","Expected '===' and instead saw '=='.","BinaryExpression","unexpected","default-case","Expected a default case.","SwitchStatement","missingDefaultCase","React Hook useEffect has a missing dependency: 'obtenerCursos'. Either include it or remove the dependency array.",["287"],"import/no-anonymous-default-export","Assign arrow function to a variable before exporting as module default","ExportDefaultDeclaration","array-callback-return","Array.prototype.map() expects a return value from arrow function.","ArrowFunctionExpression","expectedInside","React Hook useEffect has a missing dependency: 'correlativo'. Either include it or remove the dependency array. If 'estOrden' needs the current value of 'correlativo', you can also switch to useReducer instead of useState and read 'correlativo' in the reducer.",["288"],"no-global-assign","no-unsafe-negation",{"desc":"289","fix":"290"},{"desc":"291","fix":"292"},{"desc":"293","fix":"294"},"Update the dependencies array to be: [obtenerProfesores]",{"range":"295","text":"296"},"Update the dependencies array to be: [obtenerCursos]",{"range":"297","text":"298"},"Update the dependencies array to be: [clase, correlativo]",{"range":"299","text":"300"},[1095,1097],"[obtenerProfesores]",[1403,1405],"[obtenerCursos]",[3709,3716],"[clase, correlativo]"]