diff --git a/package.json b/package.json index 8db1873..911ad70 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "jwt-decode": "3.1.2", "react": "^18.3.1", "react-bootstrap": "^2.10.4", + "react-captchaa": "^1.0.13", "react-data-table-component": "^7.6.2", "react-dom": "^18.3.1", "react-icons": "^5.2.1", diff --git a/src/Componest/Catalogos/CatWorkingHours/FileUploadExelWorkingHours.tsx b/src/Componest/Catalogos/CatWorkingHours/FileUploadExelWorkingHours.tsx index 0e3bcff..26467c4 100644 --- a/src/Componest/Catalogos/CatWorkingHours/FileUploadExelWorkingHours.tsx +++ b/src/Componest/Catalogos/CatWorkingHours/FileUploadExelWorkingHours.tsx @@ -1,8 +1,8 @@ import * as React from 'react'; import { useState } from 'react'; -import { Button, Card, Form, Col, Row, ToastHeader, } from 'react-bootstrap'; -import { BsSearch, BsFileEarmarkExcel } from 'react-icons/bs' +import { Button, Card, Form, Col, Row, ToastHeader, Modal, Alert, FormGroup, FormLabel, } from 'react-bootstrap'; +import { BsSearch, BsFileEarmarkExcel, BsFillPencilFill } from 'react-icons/bs' import ExelServices from '../../../Utils/ExelFiles/Exel.services'; import { FiSend } from "react-icons/fi"; import { MsgInformativo } from '../../../Utils/Toast/msgInformativo'; @@ -10,6 +10,9 @@ import * as XLSX from 'xlsx'; import DataTable from 'react-data-table-component'; import { DTOWorkingHours } from '../../../DTO/DTOWorkingHours'; import reportesServices from '../../../Services/Reportes/reportes.services'; +import { IconContext } from 'react-icons'; +import { date } from 'yup'; +import { DTOClocks } from '../../../DTO/Reportes/DTOClocks'; export default function FileUploadExel() { @@ -26,8 +29,21 @@ export default function FileUploadExel() { const [filteredData, setFilteredData] = useState>( [] ) - - + const [ModalEdit, setModalEdit ] = useState(false) + const [EmpNo, setEmpNo] = useState('') + const [Datee, setDate] = useState('') + const [ClockIn1 , setClockIn1] = useState ('') + const [ClockOut1, setClockOut1] = useState('') + const [ClockIn2 , setClockIn2] = useState ('') + const [ClockOut2, setClockOut2] = useState('') + const [ClockIn3 , setClockIn3] = useState ('') + const [ClockOut3, setClockOut3] = useState('') + const [ClockIn4 , setClockIn4] = useState ('') + const [ClockOut4, setClockOut4] = useState('') + const [ClockIn5 , setClockIn5] = useState ('') + const [ClockOut5, setClockOut5] = useState('') + + const handleFileChange = async (event: React.ChangeEvent) => { @@ -165,20 +181,110 @@ export default function FileUploadExel() { { name: 'TotalHoursWorked', - width: '130px', + width: '150px', selector : (row : DTOWorkingHours) => row.totalHoursWorked, sortable : true, filter : true - } + }, + + { + name: 'Edita', + width: '60px', + cell: (row: DTOWorkingHours) => ( + + ), + }, ] + + + + const handleEdit = (row: DTOWorkingHours) => { + setEmpNo(row.empNo); + setDate(row.date); + setClockIn1(row.clockIn1); + setClockOut1(row.clockOut1); + setClockIn2(row.clockIn2); + setClockOut2(row.clockOut2); + setClockIn3(row.clockIn3); + setClockOut3(row.clockOut3); + setClockIn4(row.clockIn4); + setClockOut4(row.clockOut4); + setClockIn5(row.clockIn5); + setClockOut5(row.clockOut5); + setModalEdit(true); + }; + + + + + + + + + const haveSaveChanges = () => { + const data: DTOWorkingHours = { + empNo: EmpNo, + date: Datee, + clockIn1: ClockIn1, + clockOut1: ClockOut1, + clockIn2: ClockIn2, + clockOut2: ClockOut2, + clockIn3: ClockIn3, + clockOut3: ClockOut3, + clockIn4: ClockIn4, + clockOut4: ClockOut4, + clockIn5: ClockIn5, + clockOut5: ClockOut5, + acNo: '', + no: '', + name: '', + totalInTime: '', + totalHoursWorked: '' + }; + + reportesServices.PostTotalHours(data) + .then((response ) => { + setToastMsg('Se actualizó el campo'); + setToastHeader('Informativo'); + setToastColor('Success'); + setShowMsg(true); + generarReporte() + + + }) + .catch((e: Error) => { + setToastMsg('No se ha podido actualizar los datos'); + setToastHeader('Error'); + setToastColor('danger'); + setShowToast(true); + }); + + + }; + + + function currentDate (): string { var today = new Date() var dd = String(today.getDate()).padEnd(2,'0') @@ -208,18 +314,18 @@ export default function FileUploadExel() { } ) - } + + } const donwloadExel = () => { exportExcel(filteredData, 'Reportes de Horas Trabajadas') } - - + const filtraReporte = (e: any ) => { const searchText = e.target.value.toLowerCase(); @@ -285,11 +391,6 @@ export default function FileUploadExel() { - - - - - const handleSendFiles = async () => { if (!WorkingHoursFile) { setToastMsg('No hay archivos para enviar'); @@ -326,6 +427,26 @@ export default function FileUploadExel() { + + const horas = Array.from({ length: 24 }, (_, i) => i); + const minutos = Array.from({ length: 60 }, (_, i) => i); + const formatHora = (hora: any, minuto: any) => { + const suffix = hora < 12 ? 'AM' : 'PM'; + hora = hora % 12 || 12; + return `${hora}:${minuto.toString().padStart(2, '0')}:00 ${suffix}`; + }; + + + + + + + + + + + + return (
@@ -450,6 +571,405 @@ return ( + + + + {/* setModalEdit(false)}> + + Editar Registro + + + +
+ + + + EmpNo + setEmpNo(e.target.value)} + /> + + + + + Date + setDate(e.target.value)} + /> + + + + + + + ClockIn1 + setClockIn1(e.target.value)} + /> + + + + + ClockOut1 + setClockOut1(e.target.value)} + /> + + + + + + + ClockIn2 + setClockIn2(e.target.value)} + /> + + + + + ClockOut2 + setClockOut2(e.target.value)} + /> + + + + + + + ClockIn3 + setClockIn3(e.target.value)} + /> + + + + + ClockOut3 + setClockOut3(e.target.value)} + /> + + + + + + + ClockIn4 + setClockIn4(e.target.value)} + /> + + + + + ClockOut4 + setClockOut4(e.target.value)} + /> + + + + + + + ClockIn5 + setClockIn5(e.target.value)} + /> + + + + + ClockOut5 + setClockOut5(e.target.value)} + /> + + + +
+
+ + + + +
*/} + + + setModalEdit(false)}> + + Editar Registro + + +
+ + + + EmpNo + setEmpNo(e.target.value)} + disabled={EmpNo !== ""} // Deshabilita el campo si ya tiene valor + /> + + + + + Date + setDate(e.target.value)} + disabled={Datee !== ""} // Deshabilita el campo si ya tiene valor + /> + + + + + + + ClockIn1 + setClockIn1(e.target.value)} + disabled={ClockIn1 !== ""}> + + + {horas.map((hora) => + minutos.map((minuto) => ( + + )) + )} + + + + + + + + ClockOut1 + setClockOut1(e.target.value)} disabled={ClockOut1 !== ""} > + + {horas.map((hora) => + minutos.map((minuto) => ( + + )) + )} + + + + + + + + + + + ClockIn2 + setClockIn2(e.target.value) } > + + {horas.map((hora) => + minutos.map((minuto) => ( + + )) + )} + + + + + + + + ClockOut2 + setClockOut2(e.target.value) } > + + {horas.map((hora) => + minutos.map((minuto) => ( + + )) + )} + + + + + + + + + + + + + + ClockIn3 + setClockIn3(e.target.value) } > + + {horas.map((hora) => + minutos.map((minuto) => ( + + )) + )} + + + + + + + ClockOut3 + setClockOut3(e.target.value) }> + + {horas.map((hora) => + minutos.map((minuto) => ( + + )) + )} + + + + + + + + + + + + ClockIn4 + setClockIn4(e.target.value) }> + + {horas.map((hora) => + minutos.map((minuto) => ( + + )) + )} + + + + + + + + ClockOut4 + setClockOut4(e.target.value) } > + + {horas.map((hora) => + minutos.map((minuto) => ( + + )) + )} + + + + + + + + + + + + + ClockIn5 + setClockIn5(e.target.value) } > + + {horas.map((hora) => + minutos.map((minuto) => ( + + )) + )} + + + + + + + + ClockOut5 + setClockOut5(e.target.value) } > + + {horas.map((hora) => + minutos.map((minuto) => ( + + )) + )} + + + + + +
+
+ + + + +
+ + + + + + + + + + + + +
@@ -472,3 +992,86 @@ return (
); } + + + + + + + + +// return ( +// setModalEdit(false)}> +// +// Editar Registro +// +// +//
+// +// +// +// EmpNo +// setEmpNo(e.target.value)} +// /> +// +// +// +// +// Date +// setDate(e.target.value)} +// /> +// +// +// +// +// +// +// ClockIn1 +// setClockIn1(e.target.value)}> +// +// {horas.map((hora) => +// minutos.map((minuto) => ( +// +// )) +// )} +// +// +// +// +// +// ClockOut1 +// setClockOut1(e.target.value)}> +// +// {horas.map((hora) => +// minutos.map((minuto) => ( +// +// )) +// )} +// +// +// +// +// {/* Repetir para ClockIn2, ClockOut2, etc. */} +//
+//
+// +// +// +// +//
+// ); +// }; \ No newline at end of file diff --git a/src/Componest/Loging/ForgotPassword.tsx b/src/Componest/Loging/ForgotPassword.tsx index 9f771d8..906ad79 100644 --- a/src/Componest/Loging/ForgotPassword.tsx +++ b/src/Componest/Loging/ForgotPassword.tsx @@ -1,162 +1,162 @@ -import * as React from 'react' -import { Button, Card, Col, Form, Row } from 'react-bootstrap' -import logo from '../../images/grupo-promax-b.png' -import { MsgInformativo } from '../../Utils/Toast/msgInformativo' -import ReactCaptchaa from 'react-captchaa' -import AuthDS from '../../Services/Auth/Auth.Service' -import 'react-captchaa/dist/index.css' -import '../../css/reactCaptcha.css' -import ILogin from '../../interfaces/Ilogin' -import { AxiosError } from 'axios' -import { useNavigate } from 'react-router-dom' -import { useState } from 'react' +import * as React from "react"; +import { Button, Card, Col, Form, Row } from "react-bootstrap"; +import logo from "../../images/grupo-promax-b.png"; +import { MsgInformativo } from "../../Utils/Toast/msgInformativo"; +import ReactCaptchaa from "react-captchaa"; +import AuthDS from "../../Services/Auth/Auth.Service"; +import "react-captchaa/dist/index.css"; +import "../../css/reactCaptcha.css"; +import ILogin from "../../interfaces/Ilogin"; +import { AxiosError } from "axios"; +import { useNavigate } from "react-router-dom"; +import { useState } from "react"; export interface IForgotPasswordProps {} export default function ForgotPassword(props: IForgotPasswordProps) { - const navigate = useNavigate() - const [Usuario, setUsuario] = useState('') - const [Contrasenia, setContrasenia] = useState('') - const [Captcha, setCaptcha] = useState('') - const [CaptchaText, setCaptchaText] = useState('') - const [show, setShow] = useState(false) - const [msg, setMsg] = useState('') - const [header, setHeader] = useState('') - const [msgColor, setMsgColor] = useState('primary') + const navigate = useNavigate(); + const [Usuario, setUsuario] = useState(""); + const [Contrasenia, setContrasenia] = useState(""); + const [Captcha, setCaptcha] = useState(""); + const [CaptchaText, setCaptchaText] = useState(""); + const [show, setShow] = useState(false); + const [msg, setMsg] = useState(""); + const [header, setHeader] = useState(""); + const [msgColor, setMsgColor] = useState("primary"); const validateCaptcha = () => { if (!Usuario.length) { - setShow(true) - setMsg('El campo usuario no puede estar vacio') - setHeader('Error') - return + setShow(true); + setMsg("El campo usuario no puede estar vacio"); + setHeader("Error"); + return; } if (Captcha !== CaptchaText) { - setShow(true) - setMsg('Captcha o usuario incorrecto') - setHeader('Error') - return + setShow(true); + setMsg("Captcha o usuario incorrecto"); + setHeader("Error"); + return; } const data: ILogin = { Usuario: Usuario, Contrasena: Contrasenia, - } + }; AuthDS.forgotPassword(data) .then((response: any) => { - localStorage.setItem('User', JSON.stringify(Usuario)) - navigate('/PIN') + localStorage.setItem("User", JSON.stringify(Usuario)); + navigate("/PIN"); }) .catch((e: AxiosError) => { - setShow(true) - setMsg('Usuario no existe') - setHeader('Error') - }) - } + setShow(true); + setMsg("Usuario no existe"); + setHeader("Error"); + }); + }; return (
- +   -
- - - - - ZINC Internacional - +
+ + + + + Adminusa + + + + + + +   - - - +
+ + + { + setUsuario(e.target.value); + }} + /> + + + +   + + + + { + setCaptchaText(captchaText); + }} + captchaLength={6} + captchaButtonClick={(e: any) => {}} + onCanvasClick={(e: any) => {}} + height={150} + width={200} + iconName={"FiRefreshCw"} + iconColor={"#fff"} + fontSize={"3em"} + iconSize={"1em"} + containerClassName={"react-captcha"} + iconWrapperClassName={"react-captcha-icon-wrapper"} + canvasClassName={"react-captcha-canvas"} + iconClassName={"react-captcha-icon"} + charactersInclude={ + "0123456789abcdefghijklmnopqrstuvwxzABCDEFGHIJKLMNOPQRSTUVWXYZ" + } + /> + + + + + { + setCaptcha(e.target.value); + }} + /> + +   - - - - { - setUsuario(e.target.value) - }} - /> - - - -   - - - - { - setCaptchaText(captchaText) - }} - captchaLength={6} - captchaButtonClick={(e: any) => {}} - onCanvasClick={(e: any) => {}} - height={150} - width={200} - iconName={'FiRefreshCw'} - iconColor={'#fff'} - fontSize={'3em'} - iconSize={'1em'} - containerClassName={'react-captcha'} - iconWrapperClassName={'react-captcha-icon-wrapper'} - canvasClassName={'react-captcha-canvas'} - iconClassName={'react-captcha-icon'} - charactersInclude={ - '0123456789abcdefghijklmnopqrstuvwxzABCDEFGHIJKLMNOPQRSTUVWXYZ' - } - /> - - - - - { - setCaptcha(e.target.value) - }} - /> - - - -   - -
-
-
-
- -
-
-
-
+ + +
+
+ +
+ +
+
 
@@ -167,9 +167,9 @@ export default function ForgotPassword(props: IForgotPasswordProps) { msgColor={msgColor} time={2000} closeToast={function (arg: boolean): void { - setShow(false) + setShow(false); }} />
- ) + ); } diff --git a/src/Componest/Loging/ResetCredentials.tsx b/src/Componest/Loging/ResetCredentials.tsx index 53baaaf..e4ba574 100644 --- a/src/Componest/Loging/ResetCredentials.tsx +++ b/src/Componest/Loging/ResetCredentials.tsx @@ -1,4 +1,4 @@ -import React, { FC, useState } from 'react' +import React, { FC, useState } from "react"; import { Button, Card, @@ -7,89 +7,89 @@ import { Row, Toast, ToastContainer, -} from 'react-bootstrap' -import { MsgInformativo } from '../../Utils/Toast/msgInformativo' -import DTOUsuario from '../../DTO/DTOUsuario' -import logo from '../../images/grupo-promax-b.png' -import AuthDS from '../../Services/Auth/Auth.Service' -import { DTOResetPassword } from '../../DTO/DTOResetPassword' +} from "react-bootstrap"; +import { MsgInformativo } from "../../Utils/Toast/msgInformativo"; +import DTOUsuario from "../../DTO/DTOUsuario"; +import logo from "../../images/grupo-promax-b.png"; +import AuthDS from "../../Services/Auth/Auth.Service"; +import { DTOResetPassword } from "../../DTO/DTOResetPassword"; interface IProps {} export default function ResetCredentials(props: IProps) { const [User, setUser] = useState(() => { - const stickyValue = window.localStorage.getItem('User') - return stickyValue !== null ? JSON.parse(stickyValue) : '' - }) + const stickyValue = window.localStorage.getItem("User"); + return stickyValue !== null ? JSON.parse(stickyValue) : ""; + }); const [PIN, setPIN] = useState(() => { - const stickyValue = window.localStorage.getItem('PIN') - return stickyValue !== null ? JSON.parse(stickyValue) : '' - }) - const [header, setHeader] = useState('Error!') - const [msgColor, setMsgColor] = useState('primary') - const [showMsg, setShowMsg] = useState(false) - const [msg, setMsg] = useState('') - const [Usuario, setUsuario] = useState(User) - const [Contrasena, setContrasena] = useState('') - const [ConfirmaContrasena, setConfirmaContrasena] = useState('') - const [show, setShow] = useState(false) + const stickyValue = window.localStorage.getItem("PIN"); + return stickyValue !== null ? JSON.parse(stickyValue) : ""; + }); + const [header, setHeader] = useState("Error!"); + const [msgColor, setMsgColor] = useState("primary"); + const [showMsg, setShowMsg] = useState(false); + const [msg, setMsg] = useState(""); + const [Usuario, setUsuario] = useState(User); + const [Contrasena, setContrasena] = useState(""); + const [ConfirmaContrasena, setConfirmaContrasena] = useState(""); + const [show, setShow] = useState(false); const validaFormulario = () => { - if (Contrasena.length===0 || ConfirmaContrasena.length===0) { - setShow(true) - setMsg('La contraseña no puede estar vacia!') - setHeader('Error') - return + if (Contrasena.length === 0 || ConfirmaContrasena.length === 0) { + setShow(true); + setMsg("La contraseña no puede estar vacia!"); + setHeader("Error"); + return; } if (Contrasena !== ConfirmaContrasena) { - setShow(true) - setMsg('Contraseña no coincide con la confirmacion!') - setHeader('Error') - return + setShow(true); + setMsg("Contraseña no coincide con la confirmacion!"); + setHeader("Error"); + return; } const data: DTOResetPassword = { pin: PIN, contrasena: Contrasena, - } + }; AuthDS.resetPassword(data) .then((response) => { if (response.status == 200) { - setShow(true) - setMsg('La contraseña se cambio exitosamente!') - setHeader('Confirmacion') - return false + setShow(true); + setMsg("La contraseña se cambio exitosamente!"); + setHeader("Confirmacion"); + return false; } }) .catch((e: Error) => { - setShow(true) - setMsg('Ocurrio un error') - setHeader('Error') - return false - }) - } + setShow(true); + setMsg("Ocurrio un error"); + setHeader("Error"); + return false; + }); + }; const closeToast = (show: boolean): void => { - setShowMsg(false) - } + setShowMsg(false); + }; return (
- +   -
- +
+ - +  BookPrecta Internacional @@ -98,9 +98,9 @@ export default function ResetCredentials(props: IProps) { Proporcione su nueva contraseña? @@ -108,14 +108,14 @@ export default function ResetCredentials(props: IProps) {   -
- + + @@ -123,13 +123,13 @@ export default function ResetCredentials(props: IProps) { { - setContrasena(e.target.value) + setContrasena(e.target.value); }} /> @@ -140,13 +140,13 @@ export default function ResetCredentials(props: IProps) { { - setConfirmaContrasena(e.target.value) + setConfirmaContrasena(e.target.value); }} /> @@ -156,12 +156,12 @@ export default function ResetCredentials(props: IProps) {
-
+
- {/* */}
- ) + ); } diff --git a/src/DTO/Reportes/DTOClocks.ts b/src/DTO/Reportes/DTOClocks.ts new file mode 100644 index 0000000..3c69732 --- /dev/null +++ b/src/DTO/Reportes/DTOClocks.ts @@ -0,0 +1,16 @@ +export interface DTOClocks { + + + empNo : string, + date : string, + clockIn1 : string, + clockOut1 : string, + clockIn2 : string, + clockOut2 : string, + clockIn3 : string, + clockOut3 : string, + clockIn4 : string, + clockOut4 : string, + clockIn5 : string, + clockOut5 : string +} \ No newline at end of file diff --git a/src/Services/Reportes/reportes.services.ts b/src/Services/Reportes/reportes.services.ts index 80e94ad..2005c72 100644 --- a/src/Services/Reportes/reportes.services.ts +++ b/src/Services/Reportes/reportes.services.ts @@ -2,6 +2,7 @@ import DtoPrecuentaCheques from '../../Componest/Catalogos/CatRelacionBookPrecta import { DTORelPreChe } from '../../DTO/DTORelPreChe' import { DTOWorkingHours } from '../../DTO/DTOWorkingHours' import { DTOTotalHours } from '../../DTO/Reportes/DTOTotalHours' +import { DTOClocks } from '../../DTO/Reportes/DTOClocks' import http from '../common/http-common' @@ -45,8 +46,14 @@ class reportsDataService { `/Reportes/TotalHours?Inicio=${Inicio}&Fin=${Fin}`) } + + PostTotalHours(data: DTOWorkingHours) { + return http.post> + ( "/Reportes/UpdateWorkingHours", data) + } + } export default new reportsDataService() \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index c2ec3b9..ce59d7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3269,7 +3269,7 @@ camelcase-css@^2.0.1: resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== -camelcase@^5.3.1: +camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -8213,6 +8213,13 @@ react-bootstrap@^2.10.4: uncontrollable "^7.2.1" warning "^4.0.3" +react-captchaa@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/react-captchaa/-/react-captchaa-1.0.13.tgz#ee1d95e4d2ed11481c11c462881a897820b6fe0f" + integrity sha512-3z/734oX4PzCs9DlNbkroaFlPGTI0skPSFW2HrM+5I5wS0Mjo3nbDMxuFy/YjUXIuqV0C/Lgdfb0saGkkMnUgg== + dependencies: + react-icons-wrapper "^1.0.8" + react-data-table-component@^7.6.2: version "7.6.2" resolved "https://registry.yarnpkg.com/react-data-table-component/-/react-data-table-component-7.6.2.tgz#298e3f9c27d42fb5ae06c2af6b13663c15577faf" @@ -8268,6 +8275,20 @@ react-fast-compare@^2.0.1: resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== +react-icons-wrapper@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/react-icons-wrapper/-/react-icons-wrapper-1.0.8.tgz#5d2a9447bc13fcdef405a84ef622b04daf697a37" + integrity sha512-6nO/Z5+l/5MxXS6LeMKNoaYBo8MFKg+mC4/ZAJ6q2EGfTg6LoOarcOWHyYF7oNbGPG3jv0/UyA2CkwfpT7eqpw== + dependencies: + react-icons "^3.10.0" + +react-icons@^3.10.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-3.11.0.tgz#2ca2903dfab8268ca18ebd8cc2e879921ec3b254" + integrity sha512-JRgiI/vdF6uyBgyZhVyYJUZAop95Sy4XDe/jmT3R/bKliFWpO/uZBwvSjWEdxwzec7SYbEPNPck0Kff2tUGM2Q== + dependencies: + camelcase "^5.0.0" + react-icons@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.2.1.tgz#28c2040917b2a2eda639b0f797bff1888e018e4a"