@chimera-pe/react-saas 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/react-saas.js +1 -1
- package/dist/react-saas.umd.cjs +1 -1
- package/package.json +5 -3
package/dist/react-saas.js
CHANGED
|
@@ -301,7 +301,7 @@ Q.propTypes = {
|
|
|
301
301
|
children: t.element.isRequired
|
|
302
302
|
};
|
|
303
303
|
const Y = (o) => {
|
|
304
|
-
const e = f(), n = u((i) => i.
|
|
304
|
+
const e = f(), n = u((i) => i.login), r = u((i) => i.aplicacion.instancia);
|
|
305
305
|
return T(() => {
|
|
306
306
|
if (n.autenticado)
|
|
307
307
|
n.expiracion && new Date(n.expiracion) < /* @__PURE__ */ new Date() && (n.refreshToken ? e(C(o, r.clientCredentials, n.refreshToken)) : e(F()));
|
package/dist/react-saas.umd.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(a,o){typeof exports=="object"&&typeof module<"u"?o(exports,require("react/jsx-runtime"),require("@mui/material"),require("react-polyglot"),require("prop-types"),require("react-redux"),require("@reduxjs/toolkit"),require("axios"),require("jwt-decode"),require("react"),require("date-fns/locale"),require("@mui/x-date-pickers"),require("@mui/x-date-pickers/AdapterDateFns"),require("navigator-languages"),require("@mui/material/styles"),require("@mui/material/colors"),require("react-router-dom"),require("@mui/icons-material"),require("react-final-form"),require("mui-rff"),require("lodash/memoize")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","@mui/material","react-polyglot","prop-types","react-redux","@reduxjs/toolkit","axios","jwt-decode","react","date-fns/locale","@mui/x-date-pickers","@mui/x-date-pickers/AdapterDateFns","navigator-languages","@mui/material/styles","@mui/material/colors","react-router-dom","@mui/icons-material","react-final-form","mui-rff","lodash/memoize"],o):(a=typeof globalThis<"u"?globalThis:a||self,o(a["react-saas"]={},a.ReactJSX,a.MuiMaterial,a.ReactPolyglot,a.PropTypes,a.ReactRedux,a.ReduxToolkit,a.Axios,a.JWTDecode,a.React,a.DateFNSLocale,a.MuiXDatePickers,a.MuiXDatePickersAdapter,a.NavigatorLanguages,a.MuiMaterialStyles,a.MuiMaterialColors,a.ReactRouterDom,a.MuiIconsMaterial,a.ReactFinalForm,a.MUIRFF,a.LodashMemoize))})(this,function(a,o,d,q,t,u,S,j,N,p,F,oe,se,ae,E,M,k,_,te,O,U){"use strict";const B=()=>o.jsx(d.Box,{sx:{display:"flex",flexDirection:"column",flexGrow:1,justifyContent:"center",alignItems:"center"},children:o.jsx(d.CircularProgress,{})}),v=({titulo:n,texto:e,align:i="center",severity:r="error"})=>{const s=q.useTranslate();return o.jsx(d.Box,{sx:{display:"flex",flexDirection:"column",flexGrow:1,justifyContent:"center",alignItems:i},children:o.jsxs(d.Alert,{severity:r,children:[o.jsx(d.AlertTitle,{children:s(n)}),e&&s(e)]})})};v.propTypes={titulo:t.string.isRequired,texto:t.string,align:t.string,severity:t.string};const G=S.createSlice({name:"ui",initialState:{tema:"light",temaSeleccionado:!1,idioma:"es"},reducers:{cambiarTema:(n,e)=>{n.tema=e.payload,n.temaSeleccionado=!0,localStorage.setItem("tema",e.payload)},cambiarIdioma:(n,e)=>{n.idioma=e.payload}}}),{cambiarTema:ce,cambiarIdioma:de}=G.actions,le=G.reducer,ue="https://saas.chimera.com.pe/backend",fe="https://saas.chimera.com.pe/oauth",y="saas-token",w="saas-token-expiration",x="saas-refresh-token",$=(n=fe)=>({login:(e,i)=>j({url:`${n}/oauth/token`,headers:{"content-type":"application/x-www-form-urlencoded",Authorization:`Basic ${e}`},method:"post",data:{username:i.correo,password:i.password,grant_type:"password"}}),refreshToken:(e,i)=>j({url:`${n}/oauth/token`,headers:{"content-type":"application/x-www-form-urlencoded",Authorization:`Basic ${e}`},method:"post",data:{refresh_token:i,grant_type:"refresh_token"}})}),H=S.createSlice({name:"login",initialState:{cargando:!1,autenticado:!1,token:null,refreshToken:null,expiracion:null,usuario:null,perfiles:[],error:null},reducers:{login:(n,e)=>{const i=e.payload.token,r=N.jwtDecode(i),s=new Date;s.setSeconds(s.getSeconds()+e.payload.expiracion),n.cargando=!1,n.autenticado=!0,n.token=i,n.refreshToken=e.payload.refreshToken,n.expiracion=s.getTime(),n.usuario=r.name,n.perfiles=r.authorities},logout:n=>{n.cargando=!1,n.autenticado=!1,n.token=null,n.refreshToken=null,n.expiracion=null,n.usuario=null,n.perfiles=[],n.error=null,sessionStorage.removeItem(y),sessionStorage.removeItem(x),sessionStorage.removeItem(w)}},extraReducers(n){n.addCase(I.pending,e=>{e.cargando=!0,e.error=null}).addCase(I.fulfilled,(e,i)=>{const r=i.payload.access_token,s=N.jwtDecode(r),l=new Date;l.setSeconds(l.getSeconds()+i.payload.expires_in),e.cargando=!1,e.autenticado=!0,e.token=r,e.refreshToken=i.payload.refresh_token,e.expiracion=l.getTime(),e.usuario=s.name,e.perfiles=s.authorities,sessionStorage.setItem(y,r),sessionStorage.setItem(x,i.payload.refresh_token),sessionStorage.setItem(w,l.getTime())}).addCase(I.rejected,(e,i)=>{var r;console.log(i),e.cargando=!1,e.autenticado=!1,e.token=null,e.refreshToken=null,e.expiracion=null,e.usuario=null,e.perfiles=[],e.error=(r=i.error)==null?void 0:r.message,sessionStorage.removeItem(y),sessionStorage.removeItem(x),sessionStorage.removeItem(w)}).addCase(b.pending,e=>{e.cargando=!0}).addCase(b.fulfilled,(e,i)=>{const r=new Date;r.setSeconds(r.getSeconds()+i.payload.expires_in),e.token=i.payload.access_token,e.refreshToken=i.payload.refresh_token,e.expiracion=r.getTime(),sessionStorage.setItem(y,i.payload.access_token),sessionStorage.setItem(x,i.payload.refresh_token),sessionStorage.setItem(w,r.getTime())}).addCase(b.rejected,(e,i)=>{var r;e.cargando=!1,e.autenticado=!1,e.token=null,e.refreshToken=null,e.expiracion=null,e.usuario=null,e.perfiles=[],e.error=(r=i.error)==null?void 0:r.message,sessionStorage.removeItem(y),sessionStorage.removeItem(x),sessionStorage.removeItem(w)})}}),I=S.createAsyncThunk("login/requestToken",async n=>(await $(n.devURL).login(n.clientCredentials,n.data)).data),b=S.createAsyncThunk("login/refreshToken",async(n,e,i)=>(await $(n).refreshToken(e,i)).data),{login:ge,logout:T}=H.actions,pe=n=>n.login.token,he=n=>n.login.usuario,me=n=>n.login.perfiles,Se=H.reducer,X=S.createSlice({name:"notificacion",initialState:[],reducers:{mostrarNotificacion:(n,e)=>{n.push(e.payload)},ocultarNotificacion:n=>{n.pop()}}}),{mostrarNotificacion:ke,ocultarNotificacion:ye}=X.actions,we=X.reducer,xe=(n=ue,e)=>j({url:`${n}/identidad/`,params:{codigoAplicacion:e}}),L={primary:"#1C6CCC",secondary:"#17A7FF",error:"#f44336",warning:"#ff9800",info:"#2196f3",success:"#4caf50"},Ce=S.createSlice({name:"inicializar",initialState:{inicializando:!0,inicializado:!1,instancia:{color:L},error:null},extraReducers(n){n.addCase(A.pending,e=>{e.inicializando=!0}).addCase(A.fulfilled,(e,i)=>{e.inicializando=!1,e.inicializado=!0,e.instancia={...i.payload,abreviatura:i.payload.nombre.match(/\b([A-Z])/g).join(""),color:{...L,...i.payload.color}},e.error=null}).addCase(A.rejected,(e,i)=>{e.inicializando=!1,e.inicializado=!1,e.instancia={color:L},e.error=i.payload})}}),A=S.createAsyncThunk("inicializar",async n=>(await xe(n.devURL,n.aplicacion)).data),qe=n=>n.aplicacion.instancia,Ie=Ce.reducer,be=n=>S.configureStore({reducer:{ui:le,aplicacion:Ie,login:Se,notificaciones:we,...n}}),Ae=()=>{const[n,e]=p.useState(!1),i=u.useDispatch(),r=q.useTranslate(),s=u.useSelector(c=>c.notificaciones[0]);p.useEffect(()=>{e(!!s)},[s]);const l=()=>{e(!1),i(ye())};return o.jsx(d.Snackbar,{open:n,message:(s==null?void 0:s.mensaje)&&s.tipo==="default"&&r(s.mensaje),autoHideDuration:5e3,onClose:l,children:(s==null?void 0:s.mensaje)&&s.tipo!=="default"&&o.jsx(d.Alert,{severity:s.tipo,children:r(s.mensaje)})})},je={es:{inicializar:{error:{titulo:"Error iniciando aplicación",mensaje:"No fue posible conectarnos con el servicio"}},login:{titulo:"Acceder al sistema",correo:"Correo electrónico",password:"Contraseña",ingresar:"Acceder",validacion:{correo:"Debe ingresar una dirección de correo",password:"Debe ingresar una contraseña"},error:"Usuario o contraseña incorrectos"},copy:"Todos los derechos reservados "}},ve={en:F.enGB,es:F.es},K=({messages:n,children:e})=>{const i=u.useSelector(r=>r.ui.idioma);return o.jsx(q.I18n,{locale:i,messages:n[i],children:o.jsx(oe.LocalizationProvider,{dateAdapter:se.AdapterDateFns,adapterLocale:ve[i],children:e})})};K.propTypes={messages:t.object,children:t.element.isRequired};const Te=()=>{const n=ae();if(!(n!=null&&n.length))return;const e=n[0];return e.indexOf("-")?e.substring(0,e.indexOf("-")):e},V=({messages:n,idiomaDefecto:e,children:i})=>{const r=u.useDispatch(),s=Te();p.useEffect(()=>{let c=Reflect.ownKeys(n)[0];s&&Object.hasOwn(n,s)?c=s:e&&Object.hasOwn(n,e)&&(c=e),r(de(c))},[r,n,e,s]);const l={};return Object.keys(n).forEach(c=>{l[c]={...n[c],saas:je[c]}}),o.jsx(K,{messages:l,children:i})};V.propTypes={messages:t.object,idiomaDefecto:t.string,children:t.element.isRequired};const J=({children:n})=>{const e=u.useDispatch(),{instancia:i}=u.useSelector(c=>c.aplicacion),r=u.useSelector(c=>c.ui.tema),s=d.useMediaQuery("(prefers-color-scheme: dark)");p.useEffect(()=>{e(ce(s?"dark":"light"))},[e,s]);const l=p.useMemo(()=>E.createTheme({palette:{mode:r,primary:{main:i.color.primary},secondary:{main:i.color.secondary},error:{main:i.color.error},warning:{main:i.color.warning},info:{main:i.color.info},success:{main:i.color.success},...r==="light"&&{background:{default:M.grey.A200,paper:M.grey[100]}}},shape:{borderRadius:6}}),[r,i]);return o.jsxs(E.ThemeProvider,{theme:l,children:[o.jsx(d.CssBaseline,{}),n]})};J.propTypes={children:t.element.isRequired};const W=n=>{const e=u.useDispatch(),i=u.useSelector(s=>s.loginStatus),r=u.useSelector(s=>s.aplicacion.instancia);return p.useEffect(()=>{if(i.autenticado)i.expiracion&&new Date(i.expiracion)<new Date&&(i.refreshToken?e(b(n,r.clientCredentials,i.refreshToken)):e(T()));else{const s=sessionStorage.getItem(y),l=sessionStorage.getItem(w),c=sessionStorage.getItem(x);s&&l&&(new Date(l)<new Date?e(c?c(n,r.clientCredentials,c):T()):e(ge({token:s,expiracion:l,refreshToken:c})))}},[n,r.clientCredentials,i,e]),i.autenticado},Z=()=>{const n=u.useDispatch();return p.useCallback((e,i="default")=>{n(ke({mensaje:e,tipo:i}))},[n])},Q=({devURL:n})=>{const e=u.useDispatch(),i=q.useTranslate(),r=Z(),{cargando:s,error:l}=u.useSelector(f=>f.login),c=u.useSelector(f=>f.aplicacion.instancia),C=f=>{e(I({devURL:n,clientCredentials:c.clientCredentials,data:{correo:f.correo,password:f.password}}))},z=f=>{const D={correo:void 0,password:void 0};return f.correo||(D.correo=i("saas.login.validacion.correo")),f.password||(D.password=i("saas.login.validacion.password")),D};return p.useEffect(()=>{l&&r("saas.login.error","error")},[r,l]),o.jsx(te.Form,{onSubmit:C,validate:z,render:({handleSubmit:f})=>o.jsxs("form",{onSubmit:f,children:[o.jsx(O.TextField,{id:"correo",name:"correo",label:i("saas.login.correo"),variant:"outlined",autoComplete:"off",disabled:s,autoFocus:!0,InputProps:{startAdornment:o.jsx(d.InputAdornment,{position:"start",children:o.jsx(_.Email,{color:"primary"})})}}),o.jsx(O.TextField,{id:"password",name:"password",type:"password",label:i("saas.login.password"),variant:"outlined",autoComplete:"current-password",disabled:s,InputProps:{startAdornment:o.jsx(d.InputAdornment,{position:"start",children:o.jsx(_.Lock,{color:"primary"})})}}),o.jsxs(d.Grid,{container:!0,children:[o.jsx(d.Grid,{item:!0,xs:6}),o.jsx(d.Grid,{item:!0,xs:6,align:"right",children:o.jsx(d.Button,{variant:"contained",color:"primary",type:"submit",disabled:s,children:s?o.jsx(d.CircularProgress,{size:24,thickness:4}):i("saas.login.ingresar")})})]})]})})};Q.propTypes={devURL:t.string};const Y=({devURL:n})=>{const e=u.useSelector(c=>c.aplicacion.instancia),i=q.useTranslate(),r=k.useLocation(),s=W(n),{from:l}=r.state||{from:{pathname:"/"}};return!e.requiereLogin||s?o.jsx(k.Navigate,{to:l}):o.jsxs(d.Box,{sx:{position:"relative",display:"flex",flexDirection:"column",flexGrow:1,minHeight:"100vh",backgroundColor:"primary.main","&::before":{content:'""',backgroundImage:`url(${e.logo})`,backgroundSize:"contain",backgroundRepeat:"no-repeat",backgroundPosition:"right",position:"absolute",top:"20%",bottom:0,right:0,width:"50%",opacity:.02,filter:"grayscale(100%)"}},children:[o.jsx(d.Box,{sx:{display:"flex",justifyContent:"center",alignItems:"center",flexGrow:1},children:o.jsx(d.Container,{maxWidth:"md",children:o.jsxs(d.Grid,{container:!0,spacing:3,children:[o.jsxs(d.Grid,{item:!0,xs:12,lg:5,align:"center",children:[o.jsx("img",{src:e.logo,alt:e.nombre,style:{maxWidth:"100%"}}),o.jsx(d.Typography,{variant:"h3",align:"center",children:i("aplicacion.nombre",{smart_count:1})}),o.jsx(d.Typography,{variant:"h5",align:"center",children:e.nombre})]}),o.jsx(d.Grid,{item:!0,xs:12,lg:7,sx:{display:"flex",alignItems:"center",justifyContent:"center",zIndex:5},children:o.jsxs(d.Card,{elevation:5,children:[o.jsx(d.CardHeader,{title:i("saas.login.titulo"),titleTypographyProps:{align:"center"}}),o.jsx(d.CardContent,{sx:{"& .MuiTextField-root":{mb:2}},children:o.jsx(Q,{devURL:n})})]})})]})})}),o.jsx(d.AppBar,{position:"static",color:"primary",children:o.jsx(d.Toolbar,{sx:{justifyContent:"center"},children:o.jsxs(d.Typography,{variant:"caption",children:[i("saas.copy"),o.jsx(d.Link,{href:"//chimera.com.pe",color:"inherit",target:"_blank",rel:"noreferrer",children:"Chimera Software"})]})})})]})};Y.propTypes={devURL:t.string};const P=({devURL:n,redirectTo:e,children:i})=>{const r=k.useLocation();return W(n)?i:o.jsx(k.Navigate,{to:e,state:{from:r},replace:!0})};P.propTypes={devURL:t.string,redirectTo:t.string.isRequired,children:t.element.isRequired};const R=({devURL:n,requiereLogin:e,basename:i,children:r})=>o.jsx(k.BrowserRouter,{basename:i,children:o.jsxs(k.Routes,{children:[o.jsx(k.Route,{path:"/login",element:o.jsx(Y,{devURL:n})}),o.jsx(k.Route,{path:"/*",element:e?o.jsx(P,{devURL:n,redirectTo:"/login",children:r}):r})]})});R.propTypes={devURL:t.string,requiereLogin:t.bool,basename:t.string,children:t.element.isRequired};const ee=({devURL:n,basename:e,children:i})=>{const r=u.useSelector(s=>s.aplicacion);return o.jsx(d.Box,{sx:{display:"flex",flexDirection:"column",minHeight:"100vh",justifyContent:"flex-start",backgroundColor:"background.default"},children:r.inicializando?o.jsx(B,{}):r.error||!r.inicializado?o.jsx(v,{titulo:"saas.inicializar.error.titulo",texto:"saas.inicializar.error.mensaje"}):o.jsxs(o.Fragment,{children:[o.jsx(R,{devURL:n,requiereLogin:r.instancia.requiereLogin,basename:e,children:i}),o.jsx(Ae,{})]})})};ee.propTypes={devURL:t.string,basename:t.string,children:t.element.isRequired};const ne=({aplicacion:n,devSaasURL:e,devAuthURL:i,messages:r,idiomaDefecto:s,basename:l,children:c})=>{const C=u.useDispatch();return p.useEffect(()=>{C(A({devURL:e,aplicacion:n}))},[C,n,e]),o.jsx(V,{messages:r,idiomaDefecto:s,children:o.jsx(J,{children:o.jsx(ee,{devURL:i,basename:l,children:c})})})};ne.propTypes={aplicacion:t.string.isRequired,devSaasURL:t.string,devAuthURL:t.string,messages:t.object.isRequired,idiomaDefecto:t.string,basename:t.string,children:t.element.isRequired};const ie=({customReducers:n,aplicacion:e,devSaasURL:i,devAuthURL:r,dev:s=!1,idiomaDefecto:l,messages:c,basename:C,children:z})=>o.jsx(u.Provider,{store:be(n),children:o.jsx(ne,{aplicacion:e,devSaasURL:s?i:void 0,devAuthURL:s?r:void 0,idiomaDefecto:l,messages:c,basename:C,children:z})});ie.propTypes={customReducers:t.object,aplicacion:t.string.isRequired,devSaasURL:t.string,devAuthURL:t.string,dev:t.bool,idiomaDefecto:t.string,messages:t.object,basename:t.string,children:t.element.isRequired};const Le=/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,h=n=>typeof n>"u"||n===null||n===""||Array.isArray(n)&&n.length===0,g=(n,e,i,r)=>typeof n=="function"?n({args:e,value:i,values:r}):e?{message:n,args:e}:n,m=n=>U(n,(...e)=>JSON.stringify(e)),ze=(...n)=>(e,i,r)=>(Array.isArray(n[0])?n[0]:n).reduce((l,c)=>l||typeof c=="function"&&c(e,i,r),void 0),De=m((n="validacion.obligatorio")=>Object.assign((e,i)=>h(e)?g(n,void 0,e,i):void 0,{isRequired:!0})),Ne=m((n="validacion.obligatorio")=>Object.assign((e,i)=>h(e)||!e?g(n,void 0,e,i):void 0,{isRequired:!0})),Fe=m((n="validacion.numero")=>(e,i)=>!h(e)&&isNaN(e)?g(n,void 0,e,i):void 0),Ee=m((n,e="validacion.longitud.minima")=>(i,r)=>!h(i)&&i.length<n?g(e,void 0,i,r):void 0),Me=m((n,e="validacion.longitud.maxima")=>(i,r)=>!h(i)&&i.length>n?g(e,void 0,i,r):void 0),_e=m((n,e="validacion.minimo")=>(i,r)=>!h(i)&&parseFloat(i)<n?g(e,void 0,i,r):void 0),Oe=m((n,e="validacion.maximo")=>(i,r)=>!h(i)&&parseFloat(i)>n?g(e,void 0,i,r):void 0),re=U((n,e="validacion.regex")=>(i,r)=>!h(i)&&typeof i=="string"&&!n.test(i)?g(e,void 0,i,r):void 0,(n,e)=>n.toString()+e),Ue=m((n="validacion.correo")=>re(Le,n)),Be=m((n,e,i="validacion.remote")=>(r,s,l)=>l.active&&!h(r)&&n(r,e).then(c=>c?g(i,void 0,r,s):void 0).catch(c=>g(c.message,void 0,r,s)));a.Cargando=B,a.Error=v,a.SaasApp=ie,a.composeValidators=ze,a.email=Ue,a.getInstancia=qe,a.getPerfiles=me,a.getToken=pe,a.getUsuario=he,a.logout=T,a.max=Oe,a.maxLength=Me,a.min=_e,a.minLength=Ee,a.number=Fe,a.regex=re,a.remote=Be,a.required=De,a.requiredNotFalse=Ne,a.useNotificar=Z,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
(function(a,o){typeof exports=="object"&&typeof module<"u"?o(exports,require("react/jsx-runtime"),require("@mui/material"),require("react-polyglot"),require("prop-types"),require("react-redux"),require("@reduxjs/toolkit"),require("axios"),require("jwt-decode"),require("react"),require("date-fns/locale"),require("@mui/x-date-pickers"),require("@mui/x-date-pickers/AdapterDateFns"),require("navigator-languages"),require("@mui/material/styles"),require("@mui/material/colors"),require("react-router-dom"),require("@mui/icons-material"),require("react-final-form"),require("mui-rff"),require("lodash/memoize")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","@mui/material","react-polyglot","prop-types","react-redux","@reduxjs/toolkit","axios","jwt-decode","react","date-fns/locale","@mui/x-date-pickers","@mui/x-date-pickers/AdapterDateFns","navigator-languages","@mui/material/styles","@mui/material/colors","react-router-dom","@mui/icons-material","react-final-form","mui-rff","lodash/memoize"],o):(a=typeof globalThis<"u"?globalThis:a||self,o(a["react-saas"]={},a.ReactJSX,a.MuiMaterial,a.ReactPolyglot,a.PropTypes,a.ReactRedux,a.ReduxToolkit,a.Axios,a.JWTDecode,a.React,a.DateFNSLocale,a.MuiXDatePickers,a.MuiXDatePickersAdapter,a.NavigatorLanguages,a.MuiMaterialStyles,a.MuiMaterialColors,a.ReactRouterDom,a.MuiIconsMaterial,a.ReactFinalForm,a.MUIRFF,a.LodashMemoize))})(this,function(a,o,d,q,t,u,S,j,N,p,F,oe,se,ae,E,M,k,_,te,O,U){"use strict";const B=()=>o.jsx(d.Box,{sx:{display:"flex",flexDirection:"column",flexGrow:1,justifyContent:"center",alignItems:"center"},children:o.jsx(d.CircularProgress,{})}),v=({titulo:n,texto:e,align:i="center",severity:r="error"})=>{const s=q.useTranslate();return o.jsx(d.Box,{sx:{display:"flex",flexDirection:"column",flexGrow:1,justifyContent:"center",alignItems:i},children:o.jsxs(d.Alert,{severity:r,children:[o.jsx(d.AlertTitle,{children:s(n)}),e&&s(e)]})})};v.propTypes={titulo:t.string.isRequired,texto:t.string,align:t.string,severity:t.string};const G=S.createSlice({name:"ui",initialState:{tema:"light",temaSeleccionado:!1,idioma:"es"},reducers:{cambiarTema:(n,e)=>{n.tema=e.payload,n.temaSeleccionado=!0,localStorage.setItem("tema",e.payload)},cambiarIdioma:(n,e)=>{n.idioma=e.payload}}}),{cambiarTema:ce,cambiarIdioma:de}=G.actions,le=G.reducer,ue="https://saas.chimera.com.pe/backend",fe="https://saas.chimera.com.pe/oauth",y="saas-token",w="saas-token-expiration",x="saas-refresh-token",$=(n=fe)=>({login:(e,i)=>j({url:`${n}/oauth/token`,headers:{"content-type":"application/x-www-form-urlencoded",Authorization:`Basic ${e}`},method:"post",data:{username:i.correo,password:i.password,grant_type:"password"}}),refreshToken:(e,i)=>j({url:`${n}/oauth/token`,headers:{"content-type":"application/x-www-form-urlencoded",Authorization:`Basic ${e}`},method:"post",data:{refresh_token:i,grant_type:"refresh_token"}})}),H=S.createSlice({name:"login",initialState:{cargando:!1,autenticado:!1,token:null,refreshToken:null,expiracion:null,usuario:null,perfiles:[],error:null},reducers:{login:(n,e)=>{const i=e.payload.token,r=N.jwtDecode(i),s=new Date;s.setSeconds(s.getSeconds()+e.payload.expiracion),n.cargando=!1,n.autenticado=!0,n.token=i,n.refreshToken=e.payload.refreshToken,n.expiracion=s.getTime(),n.usuario=r.name,n.perfiles=r.authorities},logout:n=>{n.cargando=!1,n.autenticado=!1,n.token=null,n.refreshToken=null,n.expiracion=null,n.usuario=null,n.perfiles=[],n.error=null,sessionStorage.removeItem(y),sessionStorage.removeItem(x),sessionStorage.removeItem(w)}},extraReducers(n){n.addCase(I.pending,e=>{e.cargando=!0,e.error=null}).addCase(I.fulfilled,(e,i)=>{const r=i.payload.access_token,s=N.jwtDecode(r),l=new Date;l.setSeconds(l.getSeconds()+i.payload.expires_in),e.cargando=!1,e.autenticado=!0,e.token=r,e.refreshToken=i.payload.refresh_token,e.expiracion=l.getTime(),e.usuario=s.name,e.perfiles=s.authorities,sessionStorage.setItem(y,r),sessionStorage.setItem(x,i.payload.refresh_token),sessionStorage.setItem(w,l.getTime())}).addCase(I.rejected,(e,i)=>{var r;console.log(i),e.cargando=!1,e.autenticado=!1,e.token=null,e.refreshToken=null,e.expiracion=null,e.usuario=null,e.perfiles=[],e.error=(r=i.error)==null?void 0:r.message,sessionStorage.removeItem(y),sessionStorage.removeItem(x),sessionStorage.removeItem(w)}).addCase(b.pending,e=>{e.cargando=!0}).addCase(b.fulfilled,(e,i)=>{const r=new Date;r.setSeconds(r.getSeconds()+i.payload.expires_in),e.token=i.payload.access_token,e.refreshToken=i.payload.refresh_token,e.expiracion=r.getTime(),sessionStorage.setItem(y,i.payload.access_token),sessionStorage.setItem(x,i.payload.refresh_token),sessionStorage.setItem(w,r.getTime())}).addCase(b.rejected,(e,i)=>{var r;e.cargando=!1,e.autenticado=!1,e.token=null,e.refreshToken=null,e.expiracion=null,e.usuario=null,e.perfiles=[],e.error=(r=i.error)==null?void 0:r.message,sessionStorage.removeItem(y),sessionStorage.removeItem(x),sessionStorage.removeItem(w)})}}),I=S.createAsyncThunk("login/requestToken",async n=>(await $(n.devURL).login(n.clientCredentials,n.data)).data),b=S.createAsyncThunk("login/refreshToken",async(n,e,i)=>(await $(n).refreshToken(e,i)).data),{login:ge,logout:T}=H.actions,pe=n=>n.login.token,he=n=>n.login.usuario,me=n=>n.login.perfiles,Se=H.reducer,X=S.createSlice({name:"notificacion",initialState:[],reducers:{mostrarNotificacion:(n,e)=>{n.push(e.payload)},ocultarNotificacion:n=>{n.pop()}}}),{mostrarNotificacion:ke,ocultarNotificacion:ye}=X.actions,we=X.reducer,xe=(n=ue,e)=>j({url:`${n}/identidad/`,params:{codigoAplicacion:e}}),L={primary:"#1C6CCC",secondary:"#17A7FF",error:"#f44336",warning:"#ff9800",info:"#2196f3",success:"#4caf50"},Ce=S.createSlice({name:"inicializar",initialState:{inicializando:!0,inicializado:!1,instancia:{color:L},error:null},extraReducers(n){n.addCase(A.pending,e=>{e.inicializando=!0}).addCase(A.fulfilled,(e,i)=>{e.inicializando=!1,e.inicializado=!0,e.instancia={...i.payload,abreviatura:i.payload.nombre.match(/\b([A-Z])/g).join(""),color:{...L,...i.payload.color}},e.error=null}).addCase(A.rejected,(e,i)=>{e.inicializando=!1,e.inicializado=!1,e.instancia={color:L},e.error=i.payload})}}),A=S.createAsyncThunk("inicializar",async n=>(await xe(n.devURL,n.aplicacion)).data),qe=n=>n.aplicacion.instancia,Ie=Ce.reducer,be=n=>S.configureStore({reducer:{ui:le,aplicacion:Ie,login:Se,notificaciones:we,...n}}),Ae=()=>{const[n,e]=p.useState(!1),i=u.useDispatch(),r=q.useTranslate(),s=u.useSelector(c=>c.notificaciones[0]);p.useEffect(()=>{e(!!s)},[s]);const l=()=>{e(!1),i(ye())};return o.jsx(d.Snackbar,{open:n,message:(s==null?void 0:s.mensaje)&&s.tipo==="default"&&r(s.mensaje),autoHideDuration:5e3,onClose:l,children:(s==null?void 0:s.mensaje)&&s.tipo!=="default"&&o.jsx(d.Alert,{severity:s.tipo,children:r(s.mensaje)})})},je={es:{inicializar:{error:{titulo:"Error iniciando aplicación",mensaje:"No fue posible conectarnos con el servicio"}},login:{titulo:"Acceder al sistema",correo:"Correo electrónico",password:"Contraseña",ingresar:"Acceder",validacion:{correo:"Debe ingresar una dirección de correo",password:"Debe ingresar una contraseña"},error:"Usuario o contraseña incorrectos"},copy:"Todos los derechos reservados "}},ve={en:F.enGB,es:F.es},K=({messages:n,children:e})=>{const i=u.useSelector(r=>r.ui.idioma);return o.jsx(q.I18n,{locale:i,messages:n[i],children:o.jsx(oe.LocalizationProvider,{dateAdapter:se.AdapterDateFns,adapterLocale:ve[i],children:e})})};K.propTypes={messages:t.object,children:t.element.isRequired};const Te=()=>{const n=ae();if(!(n!=null&&n.length))return;const e=n[0];return e.indexOf("-")?e.substring(0,e.indexOf("-")):e},V=({messages:n,idiomaDefecto:e,children:i})=>{const r=u.useDispatch(),s=Te();p.useEffect(()=>{let c=Reflect.ownKeys(n)[0];s&&Object.hasOwn(n,s)?c=s:e&&Object.hasOwn(n,e)&&(c=e),r(de(c))},[r,n,e,s]);const l={};return Object.keys(n).forEach(c=>{l[c]={...n[c],saas:je[c]}}),o.jsx(K,{messages:l,children:i})};V.propTypes={messages:t.object,idiomaDefecto:t.string,children:t.element.isRequired};const J=({children:n})=>{const e=u.useDispatch(),{instancia:i}=u.useSelector(c=>c.aplicacion),r=u.useSelector(c=>c.ui.tema),s=d.useMediaQuery("(prefers-color-scheme: dark)");p.useEffect(()=>{e(ce(s?"dark":"light"))},[e,s]);const l=p.useMemo(()=>E.createTheme({palette:{mode:r,primary:{main:i.color.primary},secondary:{main:i.color.secondary},error:{main:i.color.error},warning:{main:i.color.warning},info:{main:i.color.info},success:{main:i.color.success},...r==="light"&&{background:{default:M.grey.A200,paper:M.grey[100]}}},shape:{borderRadius:6}}),[r,i]);return o.jsxs(E.ThemeProvider,{theme:l,children:[o.jsx(d.CssBaseline,{}),n]})};J.propTypes={children:t.element.isRequired};const W=n=>{const e=u.useDispatch(),i=u.useSelector(s=>s.login),r=u.useSelector(s=>s.aplicacion.instancia);return p.useEffect(()=>{if(i.autenticado)i.expiracion&&new Date(i.expiracion)<new Date&&(i.refreshToken?e(b(n,r.clientCredentials,i.refreshToken)):e(T()));else{const s=sessionStorage.getItem(y),l=sessionStorage.getItem(w),c=sessionStorage.getItem(x);s&&l&&(new Date(l)<new Date?e(c?c(n,r.clientCredentials,c):T()):e(ge({token:s,expiracion:l,refreshToken:c})))}},[n,r.clientCredentials,i,e]),i.autenticado},Z=()=>{const n=u.useDispatch();return p.useCallback((e,i="default")=>{n(ke({mensaje:e,tipo:i}))},[n])},Q=({devURL:n})=>{const e=u.useDispatch(),i=q.useTranslate(),r=Z(),{cargando:s,error:l}=u.useSelector(f=>f.login),c=u.useSelector(f=>f.aplicacion.instancia),C=f=>{e(I({devURL:n,clientCredentials:c.clientCredentials,data:{correo:f.correo,password:f.password}}))},z=f=>{const D={correo:void 0,password:void 0};return f.correo||(D.correo=i("saas.login.validacion.correo")),f.password||(D.password=i("saas.login.validacion.password")),D};return p.useEffect(()=>{l&&r("saas.login.error","error")},[r,l]),o.jsx(te.Form,{onSubmit:C,validate:z,render:({handleSubmit:f})=>o.jsxs("form",{onSubmit:f,children:[o.jsx(O.TextField,{id:"correo",name:"correo",label:i("saas.login.correo"),variant:"outlined",autoComplete:"off",disabled:s,autoFocus:!0,InputProps:{startAdornment:o.jsx(d.InputAdornment,{position:"start",children:o.jsx(_.Email,{color:"primary"})})}}),o.jsx(O.TextField,{id:"password",name:"password",type:"password",label:i("saas.login.password"),variant:"outlined",autoComplete:"current-password",disabled:s,InputProps:{startAdornment:o.jsx(d.InputAdornment,{position:"start",children:o.jsx(_.Lock,{color:"primary"})})}}),o.jsxs(d.Grid,{container:!0,children:[o.jsx(d.Grid,{item:!0,xs:6}),o.jsx(d.Grid,{item:!0,xs:6,align:"right",children:o.jsx(d.Button,{variant:"contained",color:"primary",type:"submit",disabled:s,children:s?o.jsx(d.CircularProgress,{size:24,thickness:4}):i("saas.login.ingresar")})})]})]})})};Q.propTypes={devURL:t.string};const Y=({devURL:n})=>{const e=u.useSelector(c=>c.aplicacion.instancia),i=q.useTranslate(),r=k.useLocation(),s=W(n),{from:l}=r.state||{from:{pathname:"/"}};return!e.requiereLogin||s?o.jsx(k.Navigate,{to:l}):o.jsxs(d.Box,{sx:{position:"relative",display:"flex",flexDirection:"column",flexGrow:1,minHeight:"100vh",backgroundColor:"primary.main","&::before":{content:'""',backgroundImage:`url(${e.logo})`,backgroundSize:"contain",backgroundRepeat:"no-repeat",backgroundPosition:"right",position:"absolute",top:"20%",bottom:0,right:0,width:"50%",opacity:.02,filter:"grayscale(100%)"}},children:[o.jsx(d.Box,{sx:{display:"flex",justifyContent:"center",alignItems:"center",flexGrow:1},children:o.jsx(d.Container,{maxWidth:"md",children:o.jsxs(d.Grid,{container:!0,spacing:3,children:[o.jsxs(d.Grid,{item:!0,xs:12,lg:5,align:"center",children:[o.jsx("img",{src:e.logo,alt:e.nombre,style:{maxWidth:"100%"}}),o.jsx(d.Typography,{variant:"h3",align:"center",children:i("aplicacion.nombre",{smart_count:1})}),o.jsx(d.Typography,{variant:"h5",align:"center",children:e.nombre})]}),o.jsx(d.Grid,{item:!0,xs:12,lg:7,sx:{display:"flex",alignItems:"center",justifyContent:"center",zIndex:5},children:o.jsxs(d.Card,{elevation:5,children:[o.jsx(d.CardHeader,{title:i("saas.login.titulo"),titleTypographyProps:{align:"center"}}),o.jsx(d.CardContent,{sx:{"& .MuiTextField-root":{mb:2}},children:o.jsx(Q,{devURL:n})})]})})]})})}),o.jsx(d.AppBar,{position:"static",color:"primary",children:o.jsx(d.Toolbar,{sx:{justifyContent:"center"},children:o.jsxs(d.Typography,{variant:"caption",children:[i("saas.copy"),o.jsx(d.Link,{href:"//chimera.com.pe",color:"inherit",target:"_blank",rel:"noreferrer",children:"Chimera Software"})]})})})]})};Y.propTypes={devURL:t.string};const P=({devURL:n,redirectTo:e,children:i})=>{const r=k.useLocation();return W(n)?i:o.jsx(k.Navigate,{to:e,state:{from:r},replace:!0})};P.propTypes={devURL:t.string,redirectTo:t.string.isRequired,children:t.element.isRequired};const R=({devURL:n,requiereLogin:e,basename:i,children:r})=>o.jsx(k.BrowserRouter,{basename:i,children:o.jsxs(k.Routes,{children:[o.jsx(k.Route,{path:"/login",element:o.jsx(Y,{devURL:n})}),o.jsx(k.Route,{path:"/*",element:e?o.jsx(P,{devURL:n,redirectTo:"/login",children:r}):r})]})});R.propTypes={devURL:t.string,requiereLogin:t.bool,basename:t.string,children:t.element.isRequired};const ee=({devURL:n,basename:e,children:i})=>{const r=u.useSelector(s=>s.aplicacion);return o.jsx(d.Box,{sx:{display:"flex",flexDirection:"column",minHeight:"100vh",justifyContent:"flex-start",backgroundColor:"background.default"},children:r.inicializando?o.jsx(B,{}):r.error||!r.inicializado?o.jsx(v,{titulo:"saas.inicializar.error.titulo",texto:"saas.inicializar.error.mensaje"}):o.jsxs(o.Fragment,{children:[o.jsx(R,{devURL:n,requiereLogin:r.instancia.requiereLogin,basename:e,children:i}),o.jsx(Ae,{})]})})};ee.propTypes={devURL:t.string,basename:t.string,children:t.element.isRequired};const ne=({aplicacion:n,devSaasURL:e,devAuthURL:i,messages:r,idiomaDefecto:s,basename:l,children:c})=>{const C=u.useDispatch();return p.useEffect(()=>{C(A({devURL:e,aplicacion:n}))},[C,n,e]),o.jsx(V,{messages:r,idiomaDefecto:s,children:o.jsx(J,{children:o.jsx(ee,{devURL:i,basename:l,children:c})})})};ne.propTypes={aplicacion:t.string.isRequired,devSaasURL:t.string,devAuthURL:t.string,messages:t.object.isRequired,idiomaDefecto:t.string,basename:t.string,children:t.element.isRequired};const ie=({customReducers:n,aplicacion:e,devSaasURL:i,devAuthURL:r,dev:s=!1,idiomaDefecto:l,messages:c,basename:C,children:z})=>o.jsx(u.Provider,{store:be(n),children:o.jsx(ne,{aplicacion:e,devSaasURL:s?i:void 0,devAuthURL:s?r:void 0,idiomaDefecto:l,messages:c,basename:C,children:z})});ie.propTypes={customReducers:t.object,aplicacion:t.string.isRequired,devSaasURL:t.string,devAuthURL:t.string,dev:t.bool,idiomaDefecto:t.string,messages:t.object,basename:t.string,children:t.element.isRequired};const Le=/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,h=n=>typeof n>"u"||n===null||n===""||Array.isArray(n)&&n.length===0,g=(n,e,i,r)=>typeof n=="function"?n({args:e,value:i,values:r}):e?{message:n,args:e}:n,m=n=>U(n,(...e)=>JSON.stringify(e)),ze=(...n)=>(e,i,r)=>(Array.isArray(n[0])?n[0]:n).reduce((l,c)=>l||typeof c=="function"&&c(e,i,r),void 0),De=m((n="validacion.obligatorio")=>Object.assign((e,i)=>h(e)?g(n,void 0,e,i):void 0,{isRequired:!0})),Ne=m((n="validacion.obligatorio")=>Object.assign((e,i)=>h(e)||!e?g(n,void 0,e,i):void 0,{isRequired:!0})),Fe=m((n="validacion.numero")=>(e,i)=>!h(e)&&isNaN(e)?g(n,void 0,e,i):void 0),Ee=m((n,e="validacion.longitud.minima")=>(i,r)=>!h(i)&&i.length<n?g(e,void 0,i,r):void 0),Me=m((n,e="validacion.longitud.maxima")=>(i,r)=>!h(i)&&i.length>n?g(e,void 0,i,r):void 0),_e=m((n,e="validacion.minimo")=>(i,r)=>!h(i)&&parseFloat(i)<n?g(e,void 0,i,r):void 0),Oe=m((n,e="validacion.maximo")=>(i,r)=>!h(i)&&parseFloat(i)>n?g(e,void 0,i,r):void 0),re=U((n,e="validacion.regex")=>(i,r)=>!h(i)&&typeof i=="string"&&!n.test(i)?g(e,void 0,i,r):void 0,(n,e)=>n.toString()+e),Ue=m((n="validacion.correo")=>re(Le,n)),Be=m((n,e,i="validacion.remote")=>(r,s,l)=>l.active&&!h(r)&&n(r,e).then(c=>c?g(i,void 0,r,s):void 0).catch(c=>g(c.message,void 0,r,s)));a.Cargando=B,a.Error=v,a.SaasApp=ie,a.composeValidators=ze,a.email=Ue,a.getInstancia=qe,a.getPerfiles=me,a.getToken=pe,a.getUsuario=he,a.logout=T,a.max=Oe,a.maxLength=Me,a.min=_e,a.minLength=Ee,a.number=Fe,a.regex=re,a.remote=Be,a.required=De,a.requiredNotFalse=Ne,a.useNotificar=Z,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chimera-pe/react-saas",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"dev": "vite",
|
|
@@ -19,10 +19,8 @@
|
|
|
19
19
|
"axios": "^1.7.2",
|
|
20
20
|
"date-fns": "^2.30.0",
|
|
21
21
|
"final-form": "^4.20.10",
|
|
22
|
-
"jwt-decode": "^4.0.0",
|
|
23
22
|
"lodash": "^4.17.21",
|
|
24
23
|
"mui-rff": "^7.4.1",
|
|
25
|
-
"navigator-languages": "^2.0.2",
|
|
26
24
|
"node-polyglot": "^2.6.0",
|
|
27
25
|
"react": "^18.3.1",
|
|
28
26
|
"react-dom": "^18.3.1",
|
|
@@ -31,6 +29,10 @@
|
|
|
31
29
|
"react-redux": "^9.1.2",
|
|
32
30
|
"react-router-dom": "^6.25.1"
|
|
33
31
|
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"jwt-decode": "^4.0.0",
|
|
34
|
+
"navigator-languages": "^2.0.2"
|
|
35
|
+
},
|
|
34
36
|
"devDependencies": {
|
|
35
37
|
"@types/react": "^18.3.3",
|
|
36
38
|
"@types/react-dom": "^18.3.0",
|