@nocios/crudify-ui 4.0.9 → 4.0.94
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/README.md +12 -0
- package/dist/chunk-2OSNNNID.js +1 -0
- package/dist/{chunk-YICJIX2K.js → chunk-3SLGRD36.js} +1 -1
- package/dist/{chunk-D3OQLCQW.mjs → chunk-5INZZQD6.mjs} +1 -1
- package/dist/{chunk-JZVX4CN3.mjs → chunk-5PZJJNHP.mjs} +1 -1
- package/dist/{chunk-TAEX76JC.js → chunk-Q7FTH5JW.js} +1 -1
- package/dist/chunk-VVXZWBHL.mjs +1 -0
- package/dist/components.js +1 -1
- package/dist/components.mjs +1 -1
- package/dist/hooks.d.mts +1 -1
- package/dist/hooks.d.ts +1 -1
- package/dist/hooks.js +1 -1
- package/dist/hooks.mjs +1 -1
- package/dist/{index-FiBZQvXG.d.mts → index-BoWx_rFw.d.mts} +23 -1
- package/dist/{index-CjC4JwH9.d.ts → index-CQttyYlB.d.ts} +23 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
- package/dist/chunk-FBT222LR.mjs +0 -1
- package/dist/chunk-OGQX5FM5.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkOGQX5FM5js = require('./chunk-OGQX5FM5.js');var _chunkYIIUEOXCjs = require('./chunk-YIIUEOXC.js');var _chunk6EBMA4HZjs = require('./chunk-6EBMA4HZ.js');var _material = require('@mui/material');var _react = require('react');var eo=(e,t)=>{let[s,a]=_react.useState.call(void 0, {}),[m,n]=_react.useState.call(void 0, !1),[i,p]=_react.useState.call(void 0, null);return _react.useEffect.call(void 0, ()=>{if(console.log("\u{1F527} [I18nProvider] Hybrid translation loading:",{hasProvidedTranslations:!!t&&Object.keys(t).length>0,hasUrl:!!e,providedKeys:t?Object.keys(t).length:0}),t&&Object.keys(t).length>0){console.log("\u2705 [I18nProvider] Using provided translations (highest priority)"),a(t),n(!1),p(null);return}if(!e){console.log("\u26A0\uFE0F [I18nProvider] No translations provided, using empty object (keys will show as-is)"),a({}),n(!1),p(null);return}console.log("\u{1F310} [I18nProvider] Loading translations from URL:",e);let l=!1;return n(!0),p(null),fetch(e).then(y=>{if(!y.ok)throw new Error(`Failed to load translations: ${y.status}`);return y.json()}).then(y=>{l||(console.log("\u2705 [I18nProvider] Translations loaded successfully from URL:",{url:e,keysLoaded:Object.keys(y).length}),a(y),n(!1))}).catch(y=>{l||(console.error("\u274C [I18nProvider] Failed to load translations from URL:",e,y),p(y.message),console.log("\u{1F504} [I18nProvider] Falling back to empty translations (keys will show as-is)"),a({}),n(!1))}),()=>{l=!0}},[e,t]),{translations:s,loading:m,error:i}};var _jsxruntime = require('react/jsx-runtime');var to=_react.createContext.call(void 0, null),Ko=(e,t)=>e&&e[t]?e[t]:t.split(".").reduce((s,a)=>s&&typeof s=="object"?s[a]:void 0,e),no=({children:e,translations:t,translationsUrl:s,language:a="en"})=>{let{translations:m,loading:n}=eo(s,t),i=_react.useMemo.call(void 0, ()=>(l,y)=>{let c=Ko(m,l);return c==null&&(console.log(`\u{1F50D} [I18nProvider] Translation not found for key: "${l}" - showing key as-is`),c=l),y&&typeof c=="string"&&Object.entries(y).forEach(([x,d])=>{c=c.replace(new RegExp(`{{${x}}}`,"g"),d)}),typeof c=="string"?c:l},[m]),p=_react.useMemo.call(void 0, ()=>({t:i,language:a}),[i,a]);return n?_jsxruntime.jsx.call(void 0, "div",{children:"Loading translations..."}):_jsxruntime.jsx.call(void 0, to.Provider,{value:p,children:e})},U=()=>{let e=_react.useContext.call(void 0, to);if(!e)throw new Error("useTranslation must be used within I18nProvider");return e};var _crudifybrowser = require('@nocios/crudify-browser'); var _crudifybrowser2 = _interopRequireDefault(_crudifybrowser);var io=_react.createContext.call(void 0, void 0),so=({config:e,children:t})=>{let[s,a]=_react.useState.call(void 0, !0),[m,n]=_react.useState.call(void 0, null),[i,p]=_react.useState.call(void 0, !1),[l,y]=_react.useState.call(void 0, "");console.log("\u{1F50D} CrudifyProvider - Received config:",e),_react.useEffect.call(void 0, ()=>{if(console.log("\u{1F50D} CrudifyProvider - useEffect - config.publicApiKey:",e.publicApiKey),console.log("\u{1F50D} CrudifyProvider - useEffect - full config:",e),!e.publicApiKey){console.log("\u274C CrudifyProvider - No publicApiKey provided, setting error"),n("No publicApiKey provided"),a(!1),p(!1);return}console.log("\u2705 CrudifyProvider - publicApiKey found, proceeding with initialization");let x=`${e.publicApiKey}-${e.env}`;if(x===l&&i){a(!1);return}(async()=>{a(!0),n(null),p(!1);try{if(_crudifybrowser2.default.config(e.env||"prod"),await _crudifybrowser2.default.init(e.publicApiKey,"none"),typeof _crudifybrowser2.default.transaction=="function"&&typeof _crudifybrowser2.default.login=="function")p(!0),y(x);else throw new Error("Crudify methods not properly initialized")}catch(o){let r=o instanceof Error?o.message:"Failed to initialize Crudify";n(r),p(!1)}finally{a(!1)}})()},[e.publicApiKey,e.env,l,i]);let c={crudify:i?_crudifybrowser2.default:null,isLoading:s,error:m,isInitialized:i};return _jsxruntime.jsx.call(void 0, io.Provider,{value:c,children:t})},q=()=>{let e=_react.useContext.call(void 0, io);if(e===void 0)throw new Error("useCrudify must be used within a CrudifyProvider");return e};var lo={currentScreen:"login",searchParams:{},formData:{username:"",password:"",email:"",code:"",newPassword:"",confirmPassword:""},loading:!1,errors:{global:[]},emailSent:!1,codeAlreadyExists:!1,codeValidated:!1,fromCodeVerification:!1,config:{}};function Zo(e,t){switch(t.type){case"SET_SCREEN":let s={...e,currentScreen:t.payload.screen,searchParams:t.payload.params||e.searchParams,errors:{global:[]}},a=new URLSearchParams(s.searchParams),m=a.toString()?`?${a.toString()}`:window.location.pathname;try{window.history.replaceState({},"",m)}catch (e2){}return s;case"SET_SEARCH_PARAMS":return{...e,searchParams:t.payload};case"UPDATE_FORM_DATA":return{...e,formData:{...e.formData,...t.payload},errors:{...e.errors,...Object.keys(t.payload).reduce((n,i)=>({...n,[i]:void 0}),{})}};case"SET_LOADING":return{...e,loading:t.payload};case"SET_ERRORS":return{...e,errors:{...e.errors,...t.payload}};case"CLEAR_ERRORS":return{...e,errors:{global:[]}};case"SET_EMAIL_SENT":return{...e,emailSent:t.payload};case"SET_CODE_ALREADY_EXISTS":return{...e,codeAlreadyExists:t.payload};case"SET_CODE_VALIDATED":return{...e,codeValidated:t.payload};case"SET_FROM_CODE_VERIFICATION":return{...e,fromCodeVerification:t.payload};case"RESET_FORM":return{...e,formData:lo.formData,errors:{global:[]},loading:!1,emailSent:!1,codeAlreadyExists:!1,codeValidated:!1,fromCodeVerification:!1};case"INIT_CONFIG":return{...e,config:t.payload};default:return e}}var co=_react.createContext.call(void 0, void 0),uo=({children:e,initialScreen:t="login",config:s,autoReadFromCookies:a=!0})=>{let[m,n]=_react.useReducer.call(void 0, Zo,{...lo,currentScreen:t});_react.useEffect.call(void 0, ()=>{n({type:"INIT_CONFIG",payload:(()=>{let o={};if(a)try{let r=_chunk6EBMA4HZjs.a.call(void 0, "logo");if(r){let u=decodeURIComponent(r);u.startsWith("http")&&(o.logo=u)}}catch(r){console.error("Error reading configuration from cookies:",r)}return{publicApiKey:_optionalChain([s, 'optionalAccess', _2 => _2.publicApiKey]),env:_optionalChain([s, 'optionalAccess', _3 => _3.env]),appName:_optionalChain([s, 'optionalAccess', _4 => _4.appName]),logo:_optionalChain([s, 'optionalAccess', _5 => _5.logo])||o.logo,loginActions:_optionalChain([s, 'optionalAccess', _6 => _6.loginActions])}})()})},[s,a]),_react.useEffect.call(void 0, ()=>{let d=new URLSearchParams(window.location.search),o={};d.forEach((r,u)=>{o[u]=r}),Object.keys(o).length>0&&n({type:"SET_SEARCH_PARAMS",payload:o}),t==="checkCode"&&o.email&&n({type:"UPDATE_FORM_DATA",payload:{email:o.email,code:o.code||""}}),t==="resetPassword"&&o.link&&n({type:"SET_SEARCH_PARAMS",payload:o})},[t]);let x={state:m,dispatch:n,setScreen:(d,o)=>{n({type:"SET_SCREEN",payload:{screen:d,params:o}})},updateFormData:d=>{n({type:"UPDATE_FORM_DATA",payload:d})},setFieldError:(d,o)=>{n({type:"SET_ERRORS",payload:{[d]:o}})},clearErrors:()=>{n({type:"CLEAR_ERRORS"})},setLoading:d=>{n({type:"SET_LOADING",payload:d})}};return _jsxruntime.jsx.call(void 0, co.Provider,{value:x,children:e})},Te=()=>{let e=_react.useContext.call(void 0, co);if(e===void 0)throw new Error("useLoginState must be used within a LoginStateProvider");return e};var sr=({onScreenChange:e,onExternalNavigate:t,onLoginSuccess:s,onError:a,redirectUrl:m="/"})=>{let{crudify:n}=q(),{state:i,updateFormData:p,setFieldError:l,clearErrors:y,setLoading:c}=Te(),{login:x}=_chunkOGQX5FM5js.g.call(void 0, ),d=U(),{t:o}=d,r=d.i18n,u=_react.useRef.call(void 0, null),C=_chunk6EBMA4HZjs.e.call(void 0, o,{currentLanguage:_optionalChain([r, 'optionalAccess', _7 => _7.language]),enableDebug:!1}),P=()=>{if(i.searchParams.redirect)try{let g=decodeURIComponent(i.searchParams.redirect);if(g.startsWith("/")&&!g.startsWith("//"))return g}catch (e3){}return m||"/"};_react.useEffect.call(void 0, ()=>{let g=setTimeout(()=>{u.current&&u.current.focus()},100);return()=>clearTimeout(g)},[]);let f=g=>{console.log("\u{1F50D} [LoginForm] Translating parsed error:",g);let S=C.translateError({code:g.code,message:g.message,field:g.field});return console.log("\u{1F50D} [LoginForm] Translation result:",S),S},h=async()=>{if(!i.loading){if(!i.formData.username.trim()){l("username",o("login.usernameRequired"));return}if(!i.formData.password.trim()){l("password",o("login.passwordRequired"));return}y(),c(!0);try{let g=await x(i.formData.username,i.formData.password);if(c(!1),g.success){console.log("\u{1F510} LoginForm - Login successful via SessionProvider, calling onLoginSuccess");let S=P();s&&s(g.data,S)}else{let S=g.rawResponse||g;w(S)}}catch(g){c(!1);let J=_chunkYIIUEOXCjs.g.call(void 0, g).map(f);l("global",J),a&&a(J.join(", "))}}},w=g=>{_chunkYIIUEOXCjs.g.call(void 0, g).forEach(J=>{if(J.field)l(J.field,f(J));else{let de=i.errors.global||[];l("global",[...de,f(J)])}})};return _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsxs.call(void 0, _material.Box,{component:"form",noValidate:!0,onSubmit:g=>{g.preventDefault(),h()},onKeyDown:g=>{g.key==="Enter"&&!i.loading&&(g.preventDefault(),h())},sx:{width:"100%",display:"flex",flexDirection:"column",gap:2},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:1},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",component:"label",htmlFor:"email",sx:{display:"block",fontWeight:500,color:"grey.700",mb:.5},children:o("login.usernameOrEmailLabel")}),_jsxruntime.jsx.call(void 0, _material.TextField,{fullWidth:!0,id:"email",name:"email",type:"email",value:i.formData.username,disabled:i.loading,onChange:g=>p({username:g.target.value}),error:!!i.errors.username,helperText:i.errors.username,autoComplete:"email",placeholder:o("login.usernameOrEmailPlaceholder"),inputRef:u,required:!0})]}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:1},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",component:"label",htmlFor:"password",sx:{display:"block",fontWeight:500,color:"grey.700",mb:.5},children:o("login.passwordLabel")}),_jsxruntime.jsx.call(void 0, _material.TextField,{fullWidth:!0,id:"password",name:"password",type:"password",value:i.formData.password,disabled:i.loading,onChange:g=>p({password:g.target.value}),error:!!i.errors.password,helperText:i.errors.password,autoComplete:"current-password",placeholder:o("login.passwordPlaceholder"),required:!0})]}),_optionalChain([i, 'access', _8 => _8.config, 'access', _9 => _9.loginActions, 'optionalAccess', _10 => _10.includes, 'call', _11 => _11("forgotPassword")])&&_jsxruntime.jsx.call(void 0, _material.Box,{sx:{display:"flex",justifyContent:"flex-end",alignItems:"center"},children:_jsxruntime.jsx.call(void 0, _material.Link,{sx:{cursor:"pointer"},onClick:()=>{_optionalChain([e, 'optionalCall', _12 => _12("forgotPassword",i.searchParams)])},variant:"body2",color:"secondary",children:o("login.forgotPasswordLink")})}),_jsxruntime.jsx.call(void 0, _material.Button,{disabled:i.loading,type:"submit",fullWidth:!0,variant:"contained",color:"primary",sx:{mt:1,mb:2},children:i.loading?_jsxruntime.jsx.call(void 0, _material.CircularProgress,{size:20}):o("login.loginButton")})]}),_jsxruntime.jsx.call(void 0, _material.Box,{children:i.errors.global&&i.errors.global.length>0&&i.errors.global.map((g,S)=>_jsxruntime.jsx.call(void 0, _material.Alert,{variant:"filled",sx:{mt:2},severity:"error",children:_jsxruntime.jsx.call(void 0, "div",{children:g})},S))}),_optionalChain([i, 'access', _13 => _13.config, 'access', _14 => _14.loginActions, 'optionalAccess', _15 => _15.includes, 'call', _16 => _16("createUser")])&&_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"body2",align:"center",sx:{color:"text.secondary",mt:3},children:[o("login.noAccountPrompt")," ",_jsxruntime.jsx.call(void 0, _material.Link,{sx:{cursor:"pointer"},onClick:()=>{let S=`/public/users/create${Object.keys(i.searchParams).length>0?`?${new URLSearchParams(i.searchParams).toString()}`:""}`;_optionalChain([t, 'optionalCall', _17 => _17(S)])},fontWeight:"medium",color:"secondary",children:o("login.signUpLink")})]})]})},po=sr;var ur=({onScreenChange:e,onError:t})=>{let{crudify:s}=q(),[a,m]=_react.useState.call(void 0, ""),[n,i]=_react.useState.call(void 0, !1),[p,l]=_react.useState.call(void 0, []),[y,c]=_react.useState.call(void 0, null),[x,d]=_react.useState.call(void 0, !1),[o,r]=_react.useState.call(void 0, !1),{t:u}=U(),C=v=>{let E=[`errors.auth.${v.code}`,`errors.data.${v.code}`,`errors.system.${v.code}`,`errors.${v.code}`,`forgotPassword.${v.code.toLowerCase()}`];for(let g of E){let S=u(g);if(S!==g)return S}return v.message||u("error.unknown")},P=v=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v),f=async()=>{if(!(n||!s)){if(l([]),c(null),!a){c(u("forgotPassword.emailRequired"));return}if(!P(a)){c(u("forgotPassword.invalidEmail"));return}i(!0);try{let v=[{operation:"requestPasswordReset",data:{email:a}}],E=await s.transaction(v);if(E.success)E.data&&E.data.existingCodeValid?r(!0):d(!0);else{let S=_chunkYIIUEOXCjs.g.call(void 0, E).map(C);l(S)}}catch(v){let g=_chunkYIIUEOXCjs.g.call(void 0, v).map(C);l(g),t&&t(g.join(", "))}finally{i(!1)}}},h=()=>{_optionalChain([e, 'optionalCall', _18 => _18("login")])},w=()=>{if(x||o){_optionalChain([e, 'optionalCall', _19 => _19("checkCode",{email:a})]);return}if(!a){c(u("forgotPassword.emailRequired"));return}if(!P(a)){c(u("forgotPassword.invalidEmail"));return}_optionalChain([e, 'optionalCall', _20 => _20("checkCode",{email:a})])};return x||o?_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{width:"100%",display:"flex",flexDirection:"column",gap:2,textAlign:"center"},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:2},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h5",component:"h1",sx:{mb:1,fontWeight:600},children:u(o?"forgotPassword.codeAlreadyExistsMessage":"forgotPassword.emailSentMessage")}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",sx:{color:o?"success.main":"grey.600"},children:u("forgotPassword.checkEmailInstructions")})]}),_jsxruntime.jsx.call(void 0, _material.Button,{type:"button",onClick:w,fullWidth:!0,variant:"contained",color:"primary",sx:{mt:2,mb:2},children:u("forgotPassword.enterCodeLink")}),_jsxruntime.jsx.call(void 0, _material.Box,{sx:{display:"flex",justifyContent:"center",alignItems:"center"},children:_jsxruntime.jsx.call(void 0, _material.Link,{sx:{cursor:"pointer"},onClick:h,variant:"body2",color:"secondary",children:u("common.back")})})]})}):_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsxs.call(void 0, _material.Box,{component:"form",noValidate:!0,sx:{width:"100%",display:"flex",flexDirection:"column",gap:2},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:2},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h5",component:"h1",sx:{mb:1,fontWeight:600},children:u("forgotPassword.title")}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",sx:{color:"grey.600"},children:u("forgotPassword.instructions")})]}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:1},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",component:"label",htmlFor:"email",sx:{display:"block",fontWeight:500,color:"grey.700",mb:.5},children:u("forgotPassword.emailLabel")}),_jsxruntime.jsx.call(void 0, _material.TextField,{fullWidth:!0,id:"email",name:"email",type:"email",value:a,disabled:n,onChange:v=>m(v.target.value),error:!!y,helperText:y,autoComplete:"email",placeholder:u("forgotPassword.emailPlaceholder"),required:!0})]}),_jsxruntime.jsx.call(void 0, _material.Button,{disabled:n,type:"button",onClick:f,fullWidth:!0,variant:"contained",color:"primary",sx:{mt:2,mb:2},children:n?_jsxruntime.jsx.call(void 0, _material.CircularProgress,{size:20}):u("forgotPassword.sendCodeButton")}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{display:"flex",justifyContent:"center",alignItems:"center",gap:2},children:[_jsxruntime.jsx.call(void 0, _material.Link,{sx:{cursor:"pointer"},onClick:h,variant:"body2",color:"secondary",children:u("common.back")}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",sx:{color:"grey.400"},children:"\u2022"}),_jsxruntime.jsx.call(void 0, _material.Link,{sx:{cursor:"pointer"},onClick:w,variant:"body2",color:"secondary",children:u("login.alreadyHaveCodeLink")})]})]}),_jsxruntime.jsx.call(void 0, _material.Box,{children:p.length>0&&p.map((v,E)=>_jsxruntime.jsx.call(void 0, _material.Alert,{variant:"filled",sx:{mt:2},severity:"error",children:v},E))})]})},xo=ur;var pr=({onScreenChange:e,onError:t,searchParams:s,onResetSuccess:a})=>{let{crudify:m}=q(),[n,i]=_react.useState.call(void 0, ""),[p,l]=_react.useState.call(void 0, ""),[y,c]=_react.useState.call(void 0, !1),[x,d]=_react.useState.call(void 0, []),[o,r]=_react.useState.call(void 0, null),[u,C]=_react.useState.call(void 0, null),[P,f]=_react.useState.call(void 0, ""),[h,w]=_react.useState.call(void 0, ""),[v,E]=_react.useState.call(void 0, !1),[g,S]=_react.useState.call(void 0, !0),[J,de]=_react.useState.call(void 0, !1),[we,Be]=_react.useState.call(void 0, null),[No,Ye]=_react.useState.call(void 0, !1),{t:I}=U(),Ce=T=>{let k=[`errors.auth.${T.code}`,`errors.data.${T.code}`,`errors.system.${T.code}`,`errors.${T.code}`,`resetPassword.${T.code.toLowerCase()}`];for(let O of k){let N=I(O);if(N!==O)return N}return T.message||I("error.unknown")},Pe=T=>s?s instanceof URLSearchParams?s.get(T):s[T]||null:null;_react.useEffect.call(void 0, ()=>{if(s){if(s){let T=Pe("fromCodeVerification"),k=Pe("email"),O=Pe("code");if(T==="true"&&k&&O){f(k),w(O),E(!0),de(!0),S(!1);return}let N=Pe("link");if(N)try{let $=decodeURIComponent(N),[H,ue]=$.split("/");if(H&&ue&&H.length===6){w(H),f(ue),E(!1),Be({email:ue,code:H});return}}catch (e4){}if(k&&O){f(k),w(O),E(!1),Be({email:k,code:O});return}}d([I("resetPassword.invalidCode")]),S(!1),setTimeout(()=>_optionalChain([e, 'optionalCall', _21 => _21("forgotPassword")]),3e3)}},[s,m,I,e]),_react.useEffect.call(void 0, ()=>{m&&we&&!No&&(Ye(!0),(async(k,O)=>{try{let N=[{operation:"validatePasswordResetCode",data:{email:k,codePassword:O}}],$=await m.transaction(N);if($.data&&Array.isArray($.data)){let H=$.data[0];if(H&&H.response&&H.response.status==="OK"){de(!0);return}}if($.success)de(!0);else{let ue=_chunkYIIUEOXCjs.g.call(void 0, $).map(Ce);d(ue),setTimeout(()=>_optionalChain([e, 'optionalCall', _22 => _22("forgotPassword")]),3e3)}}catch(N){let H=_chunkYIIUEOXCjs.g.call(void 0, N).map(Ce);d(H),setTimeout(()=>_optionalChain([e, 'optionalCall', _23 => _23("forgotPassword")]),3e3)}finally{S(!1),Be(null),Ye(!1)}})(we.email,we.code))},[m,we,I,e]);let Vo=T=>T.length<8?I("resetPassword.passwordTooShort"):null,Wo=async()=>{if(y||!m)return;d([]),r(null),C(null);let T=!1;if(!n)r(I("resetPassword.newPasswordRequired")),T=!0;else{let k=Vo(n);k&&(r(k),T=!0)}if(p?n!==p&&(C(I("resetPassword.passwordsDoNotMatch")),T=!0):(C(I("resetPassword.confirmPasswordRequired")),T=!0),!T){c(!0);try{let k=[{operation:"validateAndResetPassword",data:{email:P,codePassword:h,newPassword:n}}],O=await m.transaction(k);if(O.success)d([]),setTimeout(()=>{_optionalChain([a, 'optionalCall', _24 => _24()])},1e3);else{let $=_chunkYIIUEOXCjs.g.call(void 0, O).map(Ce);d($)}}catch(k){let N=_chunkYIIUEOXCjs.g.call(void 0, k).map(Ce);d(N),t&&t(N.join(", "))}c(!1)}},Uo=()=>{v?_optionalChain([e, 'optionalCall', _25 => _25("checkCode",{email:P})]):_optionalChain([e, 'optionalCall', _26 => _26("forgotPassword")])};return g?_jsxruntime.jsx.call(void 0, _material.Box,{sx:{display:"flex",justifyContent:"center",alignItems:"center",minHeight:"300px"},children:_jsxruntime.jsx.call(void 0, _material.CircularProgress,{})}):J?_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsxs.call(void 0, _material.Box,{component:"form",noValidate:!0,sx:{width:"100%",display:"flex",flexDirection:"column",gap:2},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:2},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h5",component:"h1",sx:{mb:1,fontWeight:600},children:I("resetPassword.title")}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",sx:{color:"grey.600"},children:I("resetPassword.instructions")})]}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:1},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",component:"label",htmlFor:"newPassword",sx:{display:"block",fontWeight:500,color:"grey.700",mb:.5},children:I("resetPassword.newPasswordLabel")}),_jsxruntime.jsx.call(void 0, _material.TextField,{fullWidth:!0,id:"newPassword",name:"newPassword",type:"password",value:n,disabled:y,onChange:T=>i(T.target.value),error:!!o,helperText:o,autoComplete:"new-password",placeholder:I("resetPassword.newPasswordPlaceholder"),required:!0})]}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:1},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",component:"label",htmlFor:"confirmPassword",sx:{display:"block",fontWeight:500,color:"grey.700",mb:.5},children:I("resetPassword.confirmPasswordLabel")}),_jsxruntime.jsx.call(void 0, _material.TextField,{fullWidth:!0,id:"confirmPassword",name:"confirmPassword",type:"password",value:p,disabled:y,onChange:T=>l(T.target.value),error:!!u,helperText:u,autoComplete:"new-password",placeholder:I("resetPassword.confirmPasswordPlaceholder"),required:!0})]}),_jsxruntime.jsx.call(void 0, _material.Button,{disabled:y,type:"button",onClick:Wo,fullWidth:!0,variant:"contained",color:"primary",sx:{mt:2,mb:2},children:y?_jsxruntime.jsx.call(void 0, _material.CircularProgress,{size:20}):I("resetPassword.resetPasswordButton")}),_jsxruntime.jsx.call(void 0, _material.Box,{sx:{display:"flex",justifyContent:"center",alignItems:"center"},children:_jsxruntime.jsx.call(void 0, _material.Link,{sx:{cursor:"pointer"},onClick:Uo,variant:"body2",color:"secondary",children:I("common.back")})})]}),_jsxruntime.jsx.call(void 0, _material.Box,{children:x.length>0&&x.map((T,k)=>_jsxruntime.jsx.call(void 0, _material.Alert,{variant:"filled",sx:{mt:2},severity:"error",children:T},k))})]}):_jsxruntime.jsx.call(void 0, _material.Box,{children:x.length>0&&x.map((T,k)=>_jsxruntime.jsx.call(void 0, _material.Alert,{variant:"filled",sx:{mt:2},severity:"error",children:T},k))})},Po=pr;var Pr=({onScreenChange:e,onError:t,searchParams:s})=>{let{crudify:a}=q(),[m,n]=_react.useState.call(void 0, ""),[i,p]=_react.useState.call(void 0, !1),[l,y]=_react.useState.call(void 0, []),[c,x]=_react.useState.call(void 0, null),[d,o]=_react.useState.call(void 0, ""),{t:r}=U(),u=w=>s?s instanceof URLSearchParams?s.get(w):s[w]||null:null,C=w=>{let v=[`errors.auth.${w.code}`,`errors.data.${w.code}`,`errors.system.${w.code}`,`errors.${w.code}`,`checkCode.${w.code.toLowerCase()}`];for(let E of v){let g=r(E);if(g!==E)return g}return w.message||r("error.unknown")};_react.useEffect.call(void 0, ()=>{let w=u("email");w?o(w):_optionalChain([e, 'optionalCall', _27 => _27("forgotPassword")])},[s,e]);let P=async()=>{if(!(i||!a)){if(y([]),x(null),!m){x(r("checkCode.codeRequired"));return}if(m.length!==6){x(r("checkCode.codeRequired"));return}p(!0);try{let w=[{operation:"validatePasswordResetCode",data:{email:d,codePassword:m}}],v=await a.transaction(w);if(v.success)_optionalChain([e, 'optionalCall', _28 => _28("resetPassword",{email:d,code:m,fromCodeVerification:"true"})]);else{let g=_chunkYIIUEOXCjs.g.call(void 0, v).map(C);y(g),p(!1)}}catch(w){let E=_chunkYIIUEOXCjs.g.call(void 0, w).map(C);y(E),p(!1),t&&t(E.join(", "))}}},f=()=>{_optionalChain([e, 'optionalCall', _29 => _29("forgotPassword")])},h=w=>{let v=w.target.value.replace(/\D/g,"").slice(0,6);n(v)};return _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsxs.call(void 0, _material.Box,{component:"form",noValidate:!0,sx:{width:"100%",display:"flex",flexDirection:"column",gap:2},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:2},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h5",component:"h1",sx:{mb:1,fontWeight:600},children:r("checkCode.title")}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",sx:{color:"grey.600"},children:r("checkCode.instructions")})]}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:1},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",component:"label",htmlFor:"code",sx:{display:"block",fontWeight:500,color:"grey.700",mb:.5},children:r("checkCode.codeLabel")}),_jsxruntime.jsx.call(void 0, _material.TextField,{fullWidth:!0,id:"code",name:"code",type:"text",value:m,disabled:i,onChange:h,error:!!c,helperText:c,placeholder:r("checkCode.codePlaceholder"),inputProps:{maxLength:6,style:{textAlign:"center",fontSize:"1.5rem",letterSpacing:"0.4rem"}},required:!0})]}),_jsxruntime.jsx.call(void 0, _material.Button,{disabled:i||m.length!==6,type:"button",onClick:P,fullWidth:!0,variant:"contained",color:"primary",sx:{mt:2,mb:2},children:i?_jsxruntime.jsx.call(void 0, _material.CircularProgress,{size:20}):r("checkCode.verifyButton")}),_jsxruntime.jsx.call(void 0, _material.Box,{sx:{display:"flex",justifyContent:"center",alignItems:"center"},children:_jsxruntime.jsx.call(void 0, _material.Link,{sx:{cursor:"pointer"},onClick:f,variant:"body2",color:"secondary",children:r("common.back")})})]}),_jsxruntime.jsx.call(void 0, _material.Box,{children:l.length>0&&l.map((w,v)=>_jsxruntime.jsx.call(void 0, _material.Alert,{sx:{mt:2},severity:"error",children:w},v))})]})},vo=Pr;var So=({children:e,fallback:t})=>{let{isLoading:s,error:a,isInitialized:m}=q(),{t:n}=U();return s?t||_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",minHeight:"200px",gap:2},children:[_jsxruntime.jsx.call(void 0, _material.CircularProgress,{}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",children:n("login.initializing")!=="login.initializing"?n("login.initializing"):"Initializing..."})]}):a?_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"error",sx:{mt:2},children:_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"body2",children:[n("login.initializationError")!=="login.initializationError"?n("login.initializationError"):"Initialization error",":"," ",a]})}):m?_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:e}):_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"warning",sx:{mt:2},children:_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",children:n("login.notInitialized")!=="login.notInitialized"?n("login.notInitialized"):"System not initialized"})})};var Rr=({onScreenChange:e,onExternalNavigate:t,onLoginSuccess:s,onError:a,redirectUrl:m="/"})=>{let{t:n}=U(),{state:i,setScreen:p}=Te(),{config:l}=_chunkOGQX5FM5js.g.call(void 0, ),{showNotification:y}=_chunkOGQX5FM5js.e.call(void 0, ),c=(d,o)=>{let r=o;d==="login"?r={}:d==="forgotPassword"&&!o&&(r={}),p(d,r),_optionalChain([e, 'optionalCall', _30 => _30(d,r)])},x=()=>{let d={onScreenChange:c,onExternalNavigate:t,onError:a,redirectUrl:m};switch(i.currentScreen){case"forgotPassword":return _jsxruntime.jsx.call(void 0, xo,{...d});case"checkCode":return _jsxruntime.jsx.call(void 0, vo,{...d,searchParams:i.searchParams});case"resetPassword":return _jsxruntime.jsx.call(void 0, Po,{...d,searchParams:i.searchParams,onResetSuccess:()=>{let o=n("resetPassword.successMessage");y(o,"success"),c("login")}});default:return _jsxruntime.jsx.call(void 0, po,{...d,onLoginSuccess:s})}};return _jsxruntime.jsxs.call(void 0, So,{children:[_jsxruntime.jsx.call(void 0, _material.Box,{sx:{display:"flex",justifyContent:"center",mb:3},children:_jsxruntime.jsx.call(void 0, "img",{src:l.logo||"/nocios-default.png",alt:n("login.logoAlt"),style:{width:"100%",maxWidth:"150px",height:"auto"},onError:d=>{let o=d.target;o.src="/nocios-default.png"}})}),!l.logo&&l.appName&&_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h6",component:"h1",sx:{textAlign:"center",mb:2},children:l.appName}),x()]})},Ar=({translations:e,translationsUrl:t,language:s="en",initialScreen:a="login",autoReadFromCookies:m=!0,...n})=>{let{config:i}=_chunkOGQX5FM5js.g.call(void 0, );return _jsxruntime.jsx.call(void 0, no,{translations:e,translationsUrl:t,language:s,children:_jsxruntime.jsx.call(void 0, so,{config:i,children:_jsxruntime.jsx.call(void 0, uo,{config:i,initialScreen:a,autoReadFromCookies:m,children:_jsxruntime.jsx.call(void 0, Rr,{...n})})})})},Wn= exports.a =Ar;var _iconsmaterial = require('@mui/icons-material');var Gr=({showExtendedData:e=!0,showProfileCard:t=!0,autoRefresh:s=!0})=>{let{userProfile:a,loading:m,error:n,extendedData:i,refreshProfile:p}=_chunkOGQX5FM5js.j.call(void 0, {autoFetch:s,retryOnError:!0,maxRetries:3}),[l,y]=_react.useState.call(void 0, !1);if(m)return _jsxruntime.jsxs.call(void 0, _material.Box,{display:"flex",justifyContent:"center",alignItems:"center",p:3,children:[_jsxruntime.jsx.call(void 0, _material.CircularProgress,{}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",sx:{ml:2},children:"Cargando perfil de usuario..."})]});if(n)return _jsxruntime.jsxs.call(void 0, _material.Alert,{severity:"error",action:_jsxruntime.jsx.call(void 0, _material.IconButton,{color:"inherit",size:"small",onClick:p,children:_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"caption",children:"Reintentar"})}),children:["Error al cargar el perfil: ",n]});if(!a)return _jsxruntime.jsx.call(void 0, _material.Alert,{severity:"warning",children:"No se encontr\xF3 informaci\xF3n del usuario"});let c=_optionalChain([i, 'optionalAccess', _31 => _31.displayData])||{},x=_optionalChain([i, 'optionalAccess', _32 => _32.totalFields])||0,d=f=>{if(!f)return"No disponible";try{return new Date(f).toLocaleString("es-ES",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch (e5){return f}},o=(f,h)=>h==null?"No disponible":typeof h=="boolean"?h?"S\xED":"No":Array.isArray(h)?h.length>0?h.join(", "):"Ninguno":typeof h=="object"?JSON.stringify(h,null,2):String(h),r=[{key:"id",label:"ID",icon:_jsxruntime.jsx.call(void 0, _iconsmaterial.Badge,{})},{key:"email",label:"Email",icon:_jsxruntime.jsx.call(void 0, _iconsmaterial.Email,{})},{key:"username",label:"Usuario",icon:_jsxruntime.jsx.call(void 0, _iconsmaterial.Person,{})},{key:"fullName",label:"Nombre completo",icon:_jsxruntime.jsx.call(void 0, _iconsmaterial.AccountCircle,{})},{key:"role",label:"Rol",icon:_jsxruntime.jsx.call(void 0, _iconsmaterial.Security,{})}],u=[{key:"firstName",label:"Nombre"},{key:"lastName",label:"Apellido"},{key:"isActive",label:"Activo"},{key:"lastLogin",label:"\xDAltimo login"},{key:"createdAt",label:"Creado"},{key:"updatedAt",label:"Actualizado"}],C=[...r.map(f=>f.key),...u.map(f=>f.key),"permissions"],P=Object.keys(c).filter(f=>!C.includes(f)).map(f=>({key:f,label:f}));return _jsxruntime.jsxs.call(void 0, _material.Box,{children:[t&&_jsxruntime.jsx.call(void 0, _material.Card,{sx:{mb:2},children:_jsxruntime.jsxs.call(void 0, _material.CardContent,{children:[_jsxruntime.jsxs.call(void 0, _material.Box,{display:"flex",alignItems:"center",mb:2,children:[_jsxruntime.jsx.call(void 0, _material.Avatar,{src:c.avatar,sx:{width:56,height:56,mr:2},children:_optionalChain([c, 'access', _33 => _33.fullName, 'optionalAccess', _34 => _34[0]])||_optionalChain([c, 'access', _35 => _35.username, 'optionalAccess', _36 => _36[0]])||_optionalChain([c, 'access', _37 => _37.email, 'optionalAccess', _38 => _38[0]])}),_jsxruntime.jsxs.call(void 0, _material.Box,{children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h6",children:c.fullName||c.username||c.email}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",children:c.role||"Usuario"}),c.isActive!==void 0&&_jsxruntime.jsx.call(void 0, _material.Chip,{label:c.isActive?"Activo":"Inactivo",color:c.isActive?"success":"error",size:"small",sx:{mt:.5}})]})]}),_jsxruntime.jsx.call(void 0, _material.Box,{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(250px, 1fr))",gap:2,children:r.map(({key:f,label:h,icon:w})=>c[f]?_jsxruntime.jsxs.call(void 0, _material.Box,{display:"flex",alignItems:"center",children:[_jsxruntime.jsx.call(void 0, _material.Box,{sx:{mr:1,color:"text.secondary"},children:w}),_jsxruntime.jsxs.call(void 0, _material.Box,{children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"caption",color:"text.secondary",children:h}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",children:o(f,c[f])})]})]},f):null)}),c.permissions&&Array.isArray(c.permissions)&&c.permissions.length>0&&_jsxruntime.jsxs.call(void 0, _material.Box,{mt:2,children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"caption",color:"text.secondary",display:"block",children:"Permisos"}),_jsxruntime.jsxs.call(void 0, _material.Box,{display:"flex",flexWrap:"wrap",gap:.5,mt:.5,children:[c.permissions.slice(0,5).map((f,h)=>_jsxruntime.jsx.call(void 0, _material.Chip,{label:f,size:"small",variant:"outlined"},h)),c.permissions.length>5&&_jsxruntime.jsx.call(void 0, _material.Chip,{label:`+${c.permissions.length-5} m\xE1s`,size:"small"})]})]})]})}),e&&_jsxruntime.jsx.call(void 0, _material.Card,{children:_jsxruntime.jsxs.call(void 0, _material.CardContent,{children:[_jsxruntime.jsxs.call(void 0, _material.Box,{display:"flex",justifyContent:"space-between",alignItems:"center",mb:2,children:[_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"h6",display:"flex",alignItems:"center",children:[_jsxruntime.jsx.call(void 0, _iconsmaterial.Info,{sx:{mr:1}}),"Informaci\xF3n Detallada"]}),_jsxruntime.jsx.call(void 0, _material.Chip,{label:`${x} campos totales`,size:"small"})]}),_jsxruntime.jsxs.call(void 0, _material.List,{dense:!0,children:[u.map(({key:f,label:h})=>c[f]!==void 0&&_jsxruntime.jsxs.call(void 0, _material.ListItem,{divider:!0,children:[_jsxruntime.jsx.call(void 0, _material.ListItemIcon,{children:_jsxruntime.jsx.call(void 0, _iconsmaterial.Schedule,{fontSize:"small"})}),_jsxruntime.jsx.call(void 0, _material.ListItemText,{primary:h,secondary:f.includes("At")||f.includes("Login")?d(c[f]):o(f,c[f])})]},f)),P.length>0&&_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsx.call(void 0, _material.Divider,{sx:{my:1}}),_jsxruntime.jsx.call(void 0, _material.ListItem,{children:_jsxruntime.jsx.call(void 0, _material.ListItemText,{primary:_jsxruntime.jsxs.call(void 0, _material.Box,{display:"flex",justifyContent:"space-between",alignItems:"center",children:[_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"subtitle2",children:["Campos Personalizados (",P.length,")"]}),_jsxruntime.jsx.call(void 0, _material.IconButton,{size:"small",onClick:()=>y(!l),children:l?_jsxruntime.jsx.call(void 0, _iconsmaterial.ExpandLess,{}):_jsxruntime.jsx.call(void 0, _iconsmaterial.ExpandMore,{})})]})})}),_jsxruntime.jsx.call(void 0, _material.Collapse,{in:l,children:P.map(({key:f,label:h})=>_jsxruntime.jsx.call(void 0, _material.ListItem,{sx:{pl:4},children:_jsxruntime.jsx.call(void 0, _material.ListItemText,{primary:h,secondary:o(f,c[f])})},f))})]})]}),_jsxruntime.jsxs.call(void 0, _material.Box,{mt:2,display:"flex",justifyContent:"space-between",alignItems:"center",children:[_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"caption",color:"text.secondary",children:["\xDAltima actualizaci\xF3n: ",d(c.updatedAt)]}),_jsxruntime.jsx.call(void 0, _material.IconButton,{size:"small",onClick:p,disabled:m,children:_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"caption",children:"Actualizar"})})]})]})})]})},Yr= exports.b =Gr;var Ao=["create","read","update","delete"],Io= exports.d =["create","read","update","delete"];var _reacti18next = require('react-i18next');var st=({value:e,onChange:t,availableFields:s,error:a,disabled:m=!1})=>{let{t:n}=_reacti18next.useTranslation.call(void 0, ),[i,p]=_react.useState.call(void 0, "custom"),l=_react.useRef.call(void 0, !1);_react.useEffect.call(void 0, ()=>{let o=e||{allow:[],owner_allow:[],deny:[]},r=new Set(s),u=(o.allow||[]).filter(h=>r.has(h)),C=(o.owner_allow||[]).filter(h=>r.has(h)),P=(o.deny||[]).filter(h=>r.has(h));s.forEach(h=>{!u.includes(h)&&!C.includes(h)&&!P.includes(h)&&P.push(h)});let f={allow:u,owner_allow:C,deny:P};JSON.stringify(f)!==JSON.stringify(o)&&t(f),u.length===s.length?p("all"):P.length===s.length?p("none"):p("custom")},[s,e]);let y=()=>{l.current=!0,t({allow:[...s],owner_allow:[],deny:[]}),p("all"),setTimeout(()=>{l.current=!1},0)},c=()=>{l.current=!0,t({allow:[],owner_allow:[],deny:[...s]}),p("none"),setTimeout(()=>{l.current=!1},0)},x=o=>_optionalChain([e, 'optionalAccess', _39 => _39.allow, 'optionalAccess', _40 => _40.includes, 'call', _41 => _41(o)])?"allow":_optionalChain([e, 'optionalAccess', _42 => _42.owner_allow, 'optionalAccess', _43 => _43.includes, 'call', _44 => _44(o)])?"owner_allow":"deny",d=(o,r)=>{l.current=!0;let u=new Set(_optionalChain([e, 'optionalAccess', _45 => _45.allow])||[]),C=new Set(_optionalChain([e, 'optionalAccess', _46 => _46.owner_allow])||[]),P=new Set(_optionalChain([e, 'optionalAccess', _47 => _47.deny])||[]);u.delete(o),C.delete(o),P.delete(o),r==="allow"&&u.add(o),r==="owner_allow"&&C.add(o),r==="deny"&&P.add(o),t({allow:Array.from(u),owner_allow:Array.from(C),deny:Array.from(P)}),p("custom"),setTimeout(()=>{l.current=!1},0)};return s.length===0?_jsxruntime.jsxs.call(void 0, _material.Box,{children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",sx:{mb:1},children:n("modules.form.publicPolicies.fields.conditions.label")}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",sx:{fontStyle:"italic"},children:n("modules.form.publicPolicies.fields.conditions.noFieldsAvailable")}),a&&_jsxruntime.jsx.call(void 0, _material.FormHelperText,{error:!0,sx:{mt:1},children:a})]}):_jsxruntime.jsxs.call(void 0, _material.Box,{children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",sx:{mb:2},children:n("modules.form.publicPolicies.fields.conditions.label")}),_jsxruntime.jsxs.call(void 0, _material.Stack,{direction:"row",spacing:1,sx:{mb:3},children:[_jsxruntime.jsx.call(void 0, _material.Button,{variant:i==="all"?"contained":"outlined",startIcon:_jsxruntime.jsx.call(void 0, _iconsmaterial.SelectAll,{}),onClick:y,disabled:m,size:"small",sx:{minWidth:120,...i==="all"&&{backgroundColor:"#16a34a","&:hover":{backgroundColor:"#15803d"}}},children:n("modules.form.publicPolicies.fields.conditions.allFields")}),_jsxruntime.jsx.call(void 0, _material.Button,{variant:i==="none"?"contained":"outlined",startIcon:_jsxruntime.jsx.call(void 0, _iconsmaterial.ClearAll,{}),onClick:c,disabled:m,size:"small",sx:{minWidth:120,...i==="none"&&{backgroundColor:"#cf222e","&:hover":{backgroundColor:"#bc1f2c"}}},children:n("modules.form.publicPolicies.fields.conditions.noFields")})]}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{p:2,border:"1px solid #d1d9e0",borderRadius:1,backgroundColor:"#f6f8fa"},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",sx:{mb:2},children:n("modules.form.publicPolicies.fields.conditions.help")}),_jsxruntime.jsx.call(void 0, _material.Stack,{spacing:1,children:s.map(o=>{let r=x(o);return _jsxruntime.jsxs.call(void 0, _material.Stack,{direction:"row",spacing:1,alignItems:"center",children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",sx:{minWidth:100,fontFamily:"monospace"},children:o}),_jsxruntime.jsxs.call(void 0, _material.ToggleButtonGroup,{value:r,exclusive:!0,size:"small",children:[_jsxruntime.jsxs.call(void 0, _material.ToggleButton,{value:"allow",onClick:()=>d(o,"allow"),disabled:m,sx:{px:2,color:r==="allow"?"#ffffff":"#6b7280",backgroundColor:r==="allow"?"#16a34a":"#f3f4f6",borderColor:r==="allow"?"#16a34a":"#d1d5db","&:hover":{backgroundColor:r==="allow"?"#15803d":"#e5e7eb",borderColor:r==="allow"?"#15803d":"#9ca3af"},"&.Mui-selected":{backgroundColor:"#16a34a",color:"#ffffff","&:hover":{backgroundColor:"#15803d"}}},children:[_jsxruntime.jsx.call(void 0, _iconsmaterial.CheckCircle,{sx:{fontSize:16,mr:.5}}),n("modules.form.publicPolicies.fields.conditions.states.allow")]}),_jsxruntime.jsx.call(void 0, _material.ToggleButton,{value:"owner_allow",onClick:()=>d(o,"owner_allow"),disabled:m,sx:{px:2,color:r==="owner_allow"?"#ffffff":"#6b7280",backgroundColor:r==="owner_allow"?"#0ea5e9":"#f3f4f6",borderColor:r==="owner_allow"?"#0ea5e9":"#d1d5db","&:hover":{backgroundColor:r==="owner_allow"?"#0284c7":"#e5e7eb",borderColor:r==="owner_allow"?"#0284c7":"#9ca3af"},"&.Mui-selected":{backgroundColor:"#0ea5e9",color:"#ffffff","&:hover":{backgroundColor:"#0284c7"}}},children:n("modules.form.publicPolicies.fields.conditions.states.ownerAllow")}),_jsxruntime.jsxs.call(void 0, _material.ToggleButton,{value:"deny",onClick:()=>d(o,"deny"),disabled:m,sx:{px:2,color:r==="deny"?"#ffffff":"#6b7280",backgroundColor:r==="deny"?"#dc2626":"#f3f4f6",borderColor:r==="deny"?"#dc2626":"#d1d5db","&:hover":{backgroundColor:r==="deny"?"#b91c1c":"#e5e7eb",borderColor:r==="deny"?"#b91c1c":"#9ca3af"},"&.Mui-selected":{backgroundColor:"#dc2626",color:"#ffffff","&:hover":{backgroundColor:"#b91c1c"}}},children:[_jsxruntime.jsx.call(void 0, _iconsmaterial.Cancel,{sx:{fontSize:16,mr:.5}}),n("modules.form.publicPolicies.fields.conditions.states.deny")]})]})]},o)})})]}),a&&_jsxruntime.jsx.call(void 0, _material.FormHelperText,{error:!0,sx:{mt:1},children:a})]})},He=st;var bt=_react.forwardRef.call(void 0, ({policy:e,onChange:t,onRemove:s,availableFields:a,isSubmitting:m=!1,usedActions:n,error:i},p)=>{let{t:l}=_reacti18next.useTranslation.call(void 0, ),y=new Set(Array.from(n||[]));y.delete(e.action);let c=Ao.map(x=>({value:x,label:l(`modules.form.publicPolicies.fields.action.options.${x}`)}));return _jsxruntime.jsxs.call(void 0, _material.Paper,{ref:p,sx:{p:3,border:"1px solid #d1d9e0",borderRadius:2,position:"relative",backgroundColor:"#ffffff"},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",mb:3},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"subtitle1",sx:{fontWeight:600,color:"#111418",fontSize:"1rem"},children:l("modules.form.publicPolicies.policyTitle")}),_jsxruntime.jsx.call(void 0, _material.IconButton,{onClick:s,size:"small",disabled:m,"aria-label":l("modules.form.publicPolicies.removePolicy"),sx:{color:"#656d76","&:hover":{color:"#cf222e",backgroundColor:"rgba(207, 34, 46, 0.1)"}},children:_jsxruntime.jsx.call(void 0, _iconsmaterial.Delete,{})})]}),_jsxruntime.jsxs.call(void 0, _material.Stack,{spacing:3,children:[_jsxruntime.jsx.call(void 0, _material.Stack,{direction:{xs:"column",md:"row"},spacing:2,children:_jsxruntime.jsx.call(void 0, _material.Box,{sx:{flex:1,minWidth:200},children:_jsxruntime.jsxs.call(void 0, _material.FormControl,{fullWidth:!0,children:[_jsxruntime.jsx.call(void 0, _material.InputLabel,{children:l("modules.form.publicPolicies.fields.action.label")}),_jsxruntime.jsx.call(void 0, _material.Select,{value:e.action,label:l("modules.form.publicPolicies.fields.action.label"),disabled:m,onChange:x=>{let d=x.target.value,o={...e,action:d};d==="delete"?(o.permission="deny",delete o.fields):(o.fields={allow:[],owner_allow:[],deny:a},delete o.permission),t(o)},sx:{backgroundColor:"#ffffff","&:hover .MuiOutlinedInput-notchedOutline":{borderColor:"#8c959f"},"&.Mui-focused .MuiOutlinedInput-notchedOutline":{borderColor:"#0969da",borderWidth:2}},children:c.map(x=>{let d=y.has(x.value);return _jsxruntime.jsx.call(void 0, _material.MenuItem,{value:x.value,disabled:d,children:x.label},x.value)})}),i&&_jsxruntime.jsx.call(void 0, _material.FormHelperText,{error:!0,children:i})]})})}),e.action==="delete"?_jsxruntime.jsxs.call(void 0, _material.Box,{children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",sx:{mb:2},children:l("modules.form.publicPolicies.fields.conditions.label")}),_jsxruntime.jsxs.call(void 0, _material.Stack,{direction:"row",spacing:1,sx:{mb:3},children:[_jsxruntime.jsx.call(void 0, _material.Button,{variant:e.permission==="*"?"contained":"outlined",startIcon:_jsxruntime.jsx.call(void 0, _iconsmaterial.SelectAll,{}),onClick:()=>t({...e,permission:"*"}),disabled:m,size:"small",sx:{minWidth:140,whiteSpace:"nowrap",...e.permission==="*"&&{backgroundColor:"#16a34a","&:hover":{backgroundColor:"#15803d"}}},children:l("modules.form.publicPolicies.fields.conditions.allFields")}),_jsxruntime.jsx.call(void 0, _material.Button,{variant:e.permission==="owner"?"contained":"outlined",onClick:()=>t({...e,permission:"owner"}),disabled:m,size:"small",sx:{minWidth:140,whiteSpace:"nowrap",...e.permission==="owner"&&{backgroundColor:"#0ea5e9","&:hover":{backgroundColor:"#0284c7"}}},children:l("modules.form.publicPolicies.fields.conditions.states.ownerAllow")}),_jsxruntime.jsx.call(void 0, _material.Button,{variant:e.permission==="deny"?"contained":"outlined",startIcon:_jsxruntime.jsx.call(void 0, _iconsmaterial.ClearAll,{}),onClick:()=>t({...e,permission:"deny"}),disabled:m,size:"small",sx:{minWidth:140,whiteSpace:"nowrap",...e.permission==="deny"&&{backgroundColor:"#cf222e","&:hover":{backgroundColor:"#bc1f2c"}}},children:l("modules.form.publicPolicies.fields.conditions.noFields")})]})]}):_jsxruntime.jsx.call(void 0, He,{value:e.fields||{allow:[],owner_allow:[],deny:[]},onChange:x=>t({...e,fields:x}),availableFields:a,disabled:m}),_jsxruntime.jsx.call(void 0, _material.Paper,{variant:"outlined",sx:{p:2,backgroundColor:"#f9fafb"},children:e.action==="delete"?_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"body2",sx:{fontFamily:"monospace",color:"text.secondary"},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{component:"span",sx:{color:e.permission==="*"?"#16a34a":e.permission==="owner"?"#0ea5e9":"#dc2626"},children:[l("modules.form.publicPolicies.fields.conditions.states.allow"),":"]})," ",e.permission||"-"]}):_jsxruntime.jsxs.call(void 0, _material.Stack,{spacing:.5,divider:_jsxruntime.jsx.call(void 0, _material.Divider,{sx:{borderColor:"#e5e7eb"}}),children:[_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"body2",sx:{fontFamily:"monospace",color:"text.secondary"},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{component:"span",sx:{color:"#16a34a"},children:[l("modules.form.publicPolicies.fields.conditions.states.allow"),":"]})," ",(_optionalChain([e, 'optionalAccess', _48 => _48.fields, 'optionalAccess', _49 => _49.allow])||[]).join(", ")||"-"]}),_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"body2",sx:{fontFamily:"monospace",color:"text.secondary"},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{component:"span",sx:{color:"#0ea5e9"},children:[l("modules.form.publicPolicies.fields.conditions.states.ownerAllow"),":"]})," ",(_optionalChain([e, 'optionalAccess', _50 => _50.fields, 'optionalAccess', _51 => _51.owner_allow])||[]).join(", ")||"-"]}),_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"body2",sx:{fontFamily:"monospace",color:"text.secondary"},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{component:"span",sx:{color:"#dc2626"},children:[l("modules.form.publicPolicies.fields.conditions.states.deny"),":"]})," ",(_optionalChain([e, 'optionalAccess', _52 => _52.fields, 'optionalAccess', _53 => _53.deny])||[]).join(", ")||"-"]})]})})]})]})}),je=bt;var St=()=>{let e=_optionalChain([globalThis, 'optionalAccess', _54 => _54.crypto]);return e&&typeof e.randomUUID=="function"?e.randomUUID():`${Date.now()}-${Math.random().toString(16).slice(2)}`},kt=({policies:e,onChange:t,availableFields:s,errors:a,isSubmitting:m=!1})=>{let{t:n}=_reacti18next.useTranslation.call(void 0, ),i=_react.useRef.call(void 0, {}),p=new Set((e||[]).map(r=>r.action).filter(Boolean)),l=Io.filter(r=>!p.has(r)),y=l.length>0,c=()=>{let r=l[0]||"create",u={id:St(),action:r};r==="delete"?u.permission="deny":u.fields={allow:[],owner_allow:[],deny:s};let C=[...e||[],u];t(C),setTimeout(()=>{let P=C.length-1,f=i.current[P];f&&f.scrollIntoView({behavior:"smooth",block:"center"})},100)},x=r=>{let u=[...e];u.splice(r,1),t(u)},d=(()=>{if(!a)return null;if(typeof a=="string")return a;let r=a._error;return typeof r=="string"?r:null})(),o=new Set((e||[]).map(r=>r.action));return _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsx.call(void 0, _material.Divider,{sx:{borderColor:"#e0e4e7"}}),_jsxruntime.jsxs.call(void 0, _material.Box,{children:[_jsxruntime.jsx.call(void 0, _material.Box,{display:"flex",justifyContent:"space-between",alignItems:"center",mb:3,children:_jsxruntime.jsxs.call(void 0, _material.Box,{children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h6",sx:{fontWeight:600,color:"#111418",mb:1},children:n("modules.form.publicPolicies.title")}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",sx:{fontSize:"0.875rem"},children:n("modules.form.publicPolicies.description")})]})}),d&&_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"error",sx:{mb:3},children:d}),_jsxruntime.jsxs.call(void 0, _material.Stack,{spacing:3,children:[(e||[]).length===0?_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"info",children:n("modules.form.publicPolicies.noPolicies")}):e.map((r,u)=>_jsxruntime.jsx.call(void 0, je,{ref:C=>{i.current[u]=C},policy:r,onChange:C=>{let P=[...e];P[u]=C,t(P)},onRemove:()=>x(u),availableFields:s,isSubmitting:m,usedActions:o,error:typeof a=="object"&&a&&r.id in a?a[r.id]:void 0},r.id)),y&&_jsxruntime.jsx.call(void 0, _material.Box,{children:_jsxruntime.jsx.call(void 0, _material.Button,{type:"button",variant:"outlined",startIcon:_jsxruntime.jsx.call(void 0, _iconsmaterial.Add,{}),onClick:c,disabled:m,sx:{borderColor:"#d0d7de",color:"#656d76","&:hover":{borderColor:"#8c959f",backgroundColor:"transparent"}},children:n("modules.form.publicPolicies.addPolicy")})})]})]})]})},Ti= exports.e =kt;function Ii(){let[e,t]=_react.useState.call(void 0, ""),[s,a]=_react.useState.call(void 0, ""),[m,n]=_react.useState.call(void 0, !1),{isAuthenticated:i,isLoading:p,error:l,login:y,logout:c,refreshTokens:x,clearError:d,isExpiringSoon:o,expiresIn:r}=_chunkOGQX5FM5js.g.call(void 0, ),u=async f=>{if(f.preventDefault(),!e||!s)return;(await y(e,s)).success&&(t(""),a(""),n(!1))},C=async()=>{await c()},P=async()=>{await x()};return i?_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{maxWidth:600,mx:"auto",p:3},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h4",gutterBottom:!0,children:"Welcome! \u{1F389}"}),_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"success",sx:{mb:3},children:"You are successfully logged in with Refresh Token Pattern enabled"}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:3,p:2,bgcolor:"background.paper",border:1,borderColor:"divider",borderRadius:1},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h6",gutterBottom:!0,children:"Token Status"}),_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",children:["Access Token expires in: ",Math.round(r/1e3/60)," minutes"]}),o&&_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"warning",sx:{mt:1},children:"Token expires soon - automatic refresh will happen"})]}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{display:"flex",gap:2,flexWrap:"wrap"},children:[_jsxruntime.jsx.call(void 0, _material.Button,{variant:"contained",onClick:P,disabled:p,startIcon:p?_jsxruntime.jsx.call(void 0, _material.CircularProgress,{size:16}):null,children:"Refresh Tokens"}),_jsxruntime.jsx.call(void 0, _material.Button,{variant:"outlined",color:"error",onClick:C,disabled:p,children:"Logout"})]}),l&&_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"error",sx:{mt:2},onClose:d,children:l})]}):_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{maxWidth:400,mx:"auto",p:3},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h4",gutterBottom:!0,align:"center",children:"Login with Refresh Tokens"}),_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"info",sx:{mb:3},children:"This demo shows the new Refresh Token Pattern with automatic session management"}),m?_jsxruntime.jsxs.call(void 0, "form",{onSubmit:u,children:[_jsxruntime.jsx.call(void 0, _material.TextField,{fullWidth:!0,label:"Email",type:"email",value:e,onChange:f=>t(f.target.value),margin:"normal",required:!0,autoComplete:"email"}),_jsxruntime.jsx.call(void 0, _material.TextField,{fullWidth:!0,label:"Password",type:"password",value:s,onChange:f=>a(f.target.value),margin:"normal",required:!0,autoComplete:"current-password"}),_jsxruntime.jsx.call(void 0, _material.Button,{type:"submit",fullWidth:!0,variant:"contained",size:"large",disabled:p,startIcon:p?_jsxruntime.jsx.call(void 0, _material.CircularProgress,{size:16}):null,sx:{mt:3,mb:2},children:p?"Logging in...":"Login"})]}):_jsxruntime.jsx.call(void 0, _material.Button,{fullWidth:!0,variant:"contained",size:"large",onClick:()=>n(!0),sx:{mt:2},children:"Show Login Form"}),l&&_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"error",sx:{mt:2},onClose:d,children:l})]})}function Bi(){let{isAuthenticated:e,isLoading:t,isExpiringSoon:s,expiresIn:a}=_chunkOGQX5FM5js.g.call(void 0, );return t?_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{display:"flex",alignItems:"center",gap:1},children:[_jsxruntime.jsx.call(void 0, _material.CircularProgress,{size:16}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"caption",children:"Loading session..."})]}):e?_jsxruntime.jsxs.call(void 0, _material.Box,{children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"caption",color:"success.main",children:"\u2713 Authenticated"}),s&&_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"caption",color:"warning.main",display:"block",children:["\u26A0 Token expires in ",Math.round(a/1e3/60)," min"]})]}):_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"caption",color:"text.secondary",children:"Not logged in"})}exports.a = Wn; exports.b = Yr; exports.c = Ao; exports.d = Io; exports.e = Ti; exports.f = Ii; exports.g = Bi;
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunk2OSNNNIDjs = require('./chunk-2OSNNNID.js');var _chunkYIIUEOXCjs = require('./chunk-YIIUEOXC.js');var _chunk6EBMA4HZjs = require('./chunk-6EBMA4HZ.js');var _material = require('@mui/material');var _react = require('react');var eo=(e,t)=>{let[s,a]=_react.useState.call(void 0, {}),[m,n]=_react.useState.call(void 0, !1),[i,p]=_react.useState.call(void 0, null);return _react.useEffect.call(void 0, ()=>{if(console.log("\u{1F527} [I18nProvider] Hybrid translation loading:",{hasProvidedTranslations:!!t&&Object.keys(t).length>0,hasUrl:!!e,providedKeys:t?Object.keys(t).length:0}),t&&Object.keys(t).length>0){console.log("\u2705 [I18nProvider] Using provided translations (highest priority)"),a(t),n(!1),p(null);return}if(!e){console.log("\u26A0\uFE0F [I18nProvider] No translations provided, using empty object (keys will show as-is)"),a({}),n(!1),p(null);return}console.log("\u{1F310} [I18nProvider] Loading translations from URL:",e);let l=!1;return n(!0),p(null),fetch(e).then(y=>{if(!y.ok)throw new Error(`Failed to load translations: ${y.status}`);return y.json()}).then(y=>{l||(console.log("\u2705 [I18nProvider] Translations loaded successfully from URL:",{url:e,keysLoaded:Object.keys(y).length}),a(y),n(!1))}).catch(y=>{l||(console.error("\u274C [I18nProvider] Failed to load translations from URL:",e,y),p(y.message),console.log("\u{1F504} [I18nProvider] Falling back to empty translations (keys will show as-is)"),a({}),n(!1))}),()=>{l=!0}},[e,t]),{translations:s,loading:m,error:i}};var _jsxruntime = require('react/jsx-runtime');var to=_react.createContext.call(void 0, null),Ko=(e,t)=>e&&e[t]?e[t]:t.split(".").reduce((s,a)=>s&&typeof s=="object"?s[a]:void 0,e),no=({children:e,translations:t,translationsUrl:s,language:a="en"})=>{let{translations:m,loading:n}=eo(s,t),i=_react.useMemo.call(void 0, ()=>(l,y)=>{let c=Ko(m,l);return c==null&&(console.log(`\u{1F50D} [I18nProvider] Translation not found for key: "${l}" - showing key as-is`),c=l),y&&typeof c=="string"&&Object.entries(y).forEach(([x,d])=>{c=c.replace(new RegExp(`{{${x}}}`,"g"),d)}),typeof c=="string"?c:l},[m]),p=_react.useMemo.call(void 0, ()=>({t:i,language:a}),[i,a]);return n?_jsxruntime.jsx.call(void 0, "div",{children:"Loading translations..."}):_jsxruntime.jsx.call(void 0, to.Provider,{value:p,children:e})},U=()=>{let e=_react.useContext.call(void 0, to);if(!e)throw new Error("useTranslation must be used within I18nProvider");return e};var _crudifybrowser = require('@nocios/crudify-browser'); var _crudifybrowser2 = _interopRequireDefault(_crudifybrowser);var io=_react.createContext.call(void 0, void 0),so=({config:e,children:t})=>{let[s,a]=_react.useState.call(void 0, !0),[m,n]=_react.useState.call(void 0, null),[i,p]=_react.useState.call(void 0, !1),[l,y]=_react.useState.call(void 0, "");console.log("\u{1F50D} CrudifyProvider - Received config:",e),_react.useEffect.call(void 0, ()=>{if(console.log("\u{1F50D} CrudifyProvider - useEffect - config.publicApiKey:",e.publicApiKey),console.log("\u{1F50D} CrudifyProvider - useEffect - full config:",e),!e.publicApiKey){console.log("\u274C CrudifyProvider - No publicApiKey provided, setting error"),n("No publicApiKey provided"),a(!1),p(!1);return}console.log("\u2705 CrudifyProvider - publicApiKey found, proceeding with initialization");let x=`${e.publicApiKey}-${e.env}`;if(x===l&&i){a(!1);return}(async()=>{a(!0),n(null),p(!1);try{if(_crudifybrowser2.default.config(e.env||"prod"),await _crudifybrowser2.default.init(e.publicApiKey,"none"),typeof _crudifybrowser2.default.transaction=="function"&&typeof _crudifybrowser2.default.login=="function")p(!0),y(x);else throw new Error("Crudify methods not properly initialized")}catch(o){let r=o instanceof Error?o.message:"Failed to initialize Crudify";n(r),p(!1)}finally{a(!1)}})()},[e.publicApiKey,e.env,l,i]);let c={crudify:i?_crudifybrowser2.default:null,isLoading:s,error:m,isInitialized:i};return _jsxruntime.jsx.call(void 0, io.Provider,{value:c,children:t})},q=()=>{let e=_react.useContext.call(void 0, io);if(e===void 0)throw new Error("useCrudify must be used within a CrudifyProvider");return e};var lo={currentScreen:"login",searchParams:{},formData:{username:"",password:"",email:"",code:"",newPassword:"",confirmPassword:""},loading:!1,errors:{global:[]},emailSent:!1,codeAlreadyExists:!1,codeValidated:!1,fromCodeVerification:!1,config:{}};function Zo(e,t){switch(t.type){case"SET_SCREEN":let s={...e,currentScreen:t.payload.screen,searchParams:t.payload.params||e.searchParams,errors:{global:[]}},a=new URLSearchParams(s.searchParams),m=a.toString()?`?${a.toString()}`:window.location.pathname;try{window.history.replaceState({},"",m)}catch (e2){}return s;case"SET_SEARCH_PARAMS":return{...e,searchParams:t.payload};case"UPDATE_FORM_DATA":return{...e,formData:{...e.formData,...t.payload},errors:{...e.errors,...Object.keys(t.payload).reduce((n,i)=>({...n,[i]:void 0}),{})}};case"SET_LOADING":return{...e,loading:t.payload};case"SET_ERRORS":return{...e,errors:{...e.errors,...t.payload}};case"CLEAR_ERRORS":return{...e,errors:{global:[]}};case"SET_EMAIL_SENT":return{...e,emailSent:t.payload};case"SET_CODE_ALREADY_EXISTS":return{...e,codeAlreadyExists:t.payload};case"SET_CODE_VALIDATED":return{...e,codeValidated:t.payload};case"SET_FROM_CODE_VERIFICATION":return{...e,fromCodeVerification:t.payload};case"RESET_FORM":return{...e,formData:lo.formData,errors:{global:[]},loading:!1,emailSent:!1,codeAlreadyExists:!1,codeValidated:!1,fromCodeVerification:!1};case"INIT_CONFIG":return{...e,config:t.payload};default:return e}}var co=_react.createContext.call(void 0, void 0),uo=({children:e,initialScreen:t="login",config:s,autoReadFromCookies:a=!0})=>{let[m,n]=_react.useReducer.call(void 0, Zo,{...lo,currentScreen:t});_react.useEffect.call(void 0, ()=>{n({type:"INIT_CONFIG",payload:(()=>{let o={};if(a)try{let r=_chunk6EBMA4HZjs.a.call(void 0, "logo");if(r){let u=decodeURIComponent(r);u.startsWith("http")&&(o.logo=u)}}catch(r){console.error("Error reading configuration from cookies:",r)}return{publicApiKey:_optionalChain([s, 'optionalAccess', _2 => _2.publicApiKey]),env:_optionalChain([s, 'optionalAccess', _3 => _3.env]),appName:_optionalChain([s, 'optionalAccess', _4 => _4.appName]),logo:_optionalChain([s, 'optionalAccess', _5 => _5.logo])||o.logo,loginActions:_optionalChain([s, 'optionalAccess', _6 => _6.loginActions])}})()})},[s,a]),_react.useEffect.call(void 0, ()=>{let d=new URLSearchParams(window.location.search),o={};d.forEach((r,u)=>{o[u]=r}),Object.keys(o).length>0&&n({type:"SET_SEARCH_PARAMS",payload:o}),t==="checkCode"&&o.email&&n({type:"UPDATE_FORM_DATA",payload:{email:o.email,code:o.code||""}}),t==="resetPassword"&&o.link&&n({type:"SET_SEARCH_PARAMS",payload:o})},[t]);let x={state:m,dispatch:n,setScreen:(d,o)=>{n({type:"SET_SCREEN",payload:{screen:d,params:o}})},updateFormData:d=>{n({type:"UPDATE_FORM_DATA",payload:d})},setFieldError:(d,o)=>{n({type:"SET_ERRORS",payload:{[d]:o}})},clearErrors:()=>{n({type:"CLEAR_ERRORS"})},setLoading:d=>{n({type:"SET_LOADING",payload:d})}};return _jsxruntime.jsx.call(void 0, co.Provider,{value:x,children:e})},Te=()=>{let e=_react.useContext.call(void 0, co);if(e===void 0)throw new Error("useLoginState must be used within a LoginStateProvider");return e};var sr=({onScreenChange:e,onExternalNavigate:t,onLoginSuccess:s,onError:a,redirectUrl:m="/"})=>{let{crudify:n}=q(),{state:i,updateFormData:p,setFieldError:l,clearErrors:y,setLoading:c}=Te(),{login:x}=_chunk2OSNNNIDjs.g.call(void 0, ),d=U(),{t:o}=d,r=d.i18n,u=_react.useRef.call(void 0, null),C=_chunk6EBMA4HZjs.e.call(void 0, o,{currentLanguage:_optionalChain([r, 'optionalAccess', _7 => _7.language]),enableDebug:!1}),P=()=>{if(i.searchParams.redirect)try{let g=decodeURIComponent(i.searchParams.redirect);if(g.startsWith("/")&&!g.startsWith("//"))return g}catch (e3){}return m||"/"};_react.useEffect.call(void 0, ()=>{let g=setTimeout(()=>{u.current&&u.current.focus()},100);return()=>clearTimeout(g)},[]);let f=g=>{console.log("\u{1F50D} [LoginForm] Translating parsed error:",g);let S=C.translateError({code:g.code,message:g.message,field:g.field});return console.log("\u{1F50D} [LoginForm] Translation result:",S),S},h=async()=>{if(!i.loading){if(!i.formData.username.trim()){l("username",o("login.usernameRequired"));return}if(!i.formData.password.trim()){l("password",o("login.passwordRequired"));return}y(),c(!0);try{let g=await x(i.formData.username,i.formData.password);if(c(!1),g.success){console.log("\u{1F510} LoginForm - Login successful via SessionProvider, calling onLoginSuccess");let S=P();s&&s(g.data,S)}else{let S=g.rawResponse||g;w(S)}}catch(g){c(!1);let J=_chunkYIIUEOXCjs.g.call(void 0, g).map(f);l("global",J),a&&a(J.join(", "))}}},w=g=>{_chunkYIIUEOXCjs.g.call(void 0, g).forEach(J=>{if(J.field)l(J.field,f(J));else{let de=i.errors.global||[];l("global",[...de,f(J)])}})};return _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsxs.call(void 0, _material.Box,{component:"form",noValidate:!0,onSubmit:g=>{g.preventDefault(),h()},onKeyDown:g=>{g.key==="Enter"&&!i.loading&&(g.preventDefault(),h())},sx:{width:"100%",display:"flex",flexDirection:"column",gap:2},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:1},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",component:"label",htmlFor:"email",sx:{display:"block",fontWeight:500,color:"grey.700",mb:.5},children:o("login.usernameOrEmailLabel")}),_jsxruntime.jsx.call(void 0, _material.TextField,{fullWidth:!0,id:"email",name:"email",type:"email",value:i.formData.username,disabled:i.loading,onChange:g=>p({username:g.target.value}),error:!!i.errors.username,helperText:i.errors.username,autoComplete:"email",placeholder:o("login.usernameOrEmailPlaceholder"),inputRef:u,required:!0})]}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:1},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",component:"label",htmlFor:"password",sx:{display:"block",fontWeight:500,color:"grey.700",mb:.5},children:o("login.passwordLabel")}),_jsxruntime.jsx.call(void 0, _material.TextField,{fullWidth:!0,id:"password",name:"password",type:"password",value:i.formData.password,disabled:i.loading,onChange:g=>p({password:g.target.value}),error:!!i.errors.password,helperText:i.errors.password,autoComplete:"current-password",placeholder:o("login.passwordPlaceholder"),required:!0})]}),_optionalChain([i, 'access', _8 => _8.config, 'access', _9 => _9.loginActions, 'optionalAccess', _10 => _10.includes, 'call', _11 => _11("forgotPassword")])&&_jsxruntime.jsx.call(void 0, _material.Box,{sx:{display:"flex",justifyContent:"flex-end",alignItems:"center"},children:_jsxruntime.jsx.call(void 0, _material.Link,{sx:{cursor:"pointer"},onClick:()=>{_optionalChain([e, 'optionalCall', _12 => _12("forgotPassword",i.searchParams)])},variant:"body2",color:"secondary",children:o("login.forgotPasswordLink")})}),_jsxruntime.jsx.call(void 0, _material.Button,{disabled:i.loading,type:"submit",fullWidth:!0,variant:"contained",color:"primary",sx:{mt:1,mb:2},children:i.loading?_jsxruntime.jsx.call(void 0, _material.CircularProgress,{size:20}):o("login.loginButton")})]}),_jsxruntime.jsx.call(void 0, _material.Box,{children:i.errors.global&&i.errors.global.length>0&&i.errors.global.map((g,S)=>_jsxruntime.jsx.call(void 0, _material.Alert,{variant:"filled",sx:{mt:2},severity:"error",children:_jsxruntime.jsx.call(void 0, "div",{children:g})},S))}),_optionalChain([i, 'access', _13 => _13.config, 'access', _14 => _14.loginActions, 'optionalAccess', _15 => _15.includes, 'call', _16 => _16("createUser")])&&_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"body2",align:"center",sx:{color:"text.secondary",mt:3},children:[o("login.noAccountPrompt")," ",_jsxruntime.jsx.call(void 0, _material.Link,{sx:{cursor:"pointer"},onClick:()=>{let S=`/public/users/create${Object.keys(i.searchParams).length>0?`?${new URLSearchParams(i.searchParams).toString()}`:""}`;_optionalChain([t, 'optionalCall', _17 => _17(S)])},fontWeight:"medium",color:"secondary",children:o("login.signUpLink")})]})]})},po=sr;var ur=({onScreenChange:e,onError:t})=>{let{crudify:s}=q(),[a,m]=_react.useState.call(void 0, ""),[n,i]=_react.useState.call(void 0, !1),[p,l]=_react.useState.call(void 0, []),[y,c]=_react.useState.call(void 0, null),[x,d]=_react.useState.call(void 0, !1),[o,r]=_react.useState.call(void 0, !1),{t:u}=U(),C=v=>{let E=[`errors.auth.${v.code}`,`errors.data.${v.code}`,`errors.system.${v.code}`,`errors.${v.code}`,`forgotPassword.${v.code.toLowerCase()}`];for(let g of E){let S=u(g);if(S!==g)return S}return v.message||u("error.unknown")},P=v=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v),f=async()=>{if(!(n||!s)){if(l([]),c(null),!a){c(u("forgotPassword.emailRequired"));return}if(!P(a)){c(u("forgotPassword.invalidEmail"));return}i(!0);try{let v=[{operation:"requestPasswordReset",data:{email:a}}],E=await s.transaction(v);if(E.success)E.data&&E.data.existingCodeValid?r(!0):d(!0);else{let S=_chunkYIIUEOXCjs.g.call(void 0, E).map(C);l(S)}}catch(v){let g=_chunkYIIUEOXCjs.g.call(void 0, v).map(C);l(g),t&&t(g.join(", "))}finally{i(!1)}}},h=()=>{_optionalChain([e, 'optionalCall', _18 => _18("login")])},w=()=>{if(x||o){_optionalChain([e, 'optionalCall', _19 => _19("checkCode",{email:a})]);return}if(!a){c(u("forgotPassword.emailRequired"));return}if(!P(a)){c(u("forgotPassword.invalidEmail"));return}_optionalChain([e, 'optionalCall', _20 => _20("checkCode",{email:a})])};return x||o?_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{width:"100%",display:"flex",flexDirection:"column",gap:2,textAlign:"center"},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:2},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h5",component:"h1",sx:{mb:1,fontWeight:600},children:u(o?"forgotPassword.codeAlreadyExistsMessage":"forgotPassword.emailSentMessage")}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",sx:{color:o?"success.main":"grey.600"},children:u("forgotPassword.checkEmailInstructions")})]}),_jsxruntime.jsx.call(void 0, _material.Button,{type:"button",onClick:w,fullWidth:!0,variant:"contained",color:"primary",sx:{mt:2,mb:2},children:u("forgotPassword.enterCodeLink")}),_jsxruntime.jsx.call(void 0, _material.Box,{sx:{display:"flex",justifyContent:"center",alignItems:"center"},children:_jsxruntime.jsx.call(void 0, _material.Link,{sx:{cursor:"pointer"},onClick:h,variant:"body2",color:"secondary",children:u("common.back")})})]})}):_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsxs.call(void 0, _material.Box,{component:"form",noValidate:!0,sx:{width:"100%",display:"flex",flexDirection:"column",gap:2},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:2},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h5",component:"h1",sx:{mb:1,fontWeight:600},children:u("forgotPassword.title")}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",sx:{color:"grey.600"},children:u("forgotPassword.instructions")})]}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:1},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",component:"label",htmlFor:"email",sx:{display:"block",fontWeight:500,color:"grey.700",mb:.5},children:u("forgotPassword.emailLabel")}),_jsxruntime.jsx.call(void 0, _material.TextField,{fullWidth:!0,id:"email",name:"email",type:"email",value:a,disabled:n,onChange:v=>m(v.target.value),error:!!y,helperText:y,autoComplete:"email",placeholder:u("forgotPassword.emailPlaceholder"),required:!0})]}),_jsxruntime.jsx.call(void 0, _material.Button,{disabled:n,type:"button",onClick:f,fullWidth:!0,variant:"contained",color:"primary",sx:{mt:2,mb:2},children:n?_jsxruntime.jsx.call(void 0, _material.CircularProgress,{size:20}):u("forgotPassword.sendCodeButton")}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{display:"flex",justifyContent:"center",alignItems:"center",gap:2},children:[_jsxruntime.jsx.call(void 0, _material.Link,{sx:{cursor:"pointer"},onClick:h,variant:"body2",color:"secondary",children:u("common.back")}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",sx:{color:"grey.400"},children:"\u2022"}),_jsxruntime.jsx.call(void 0, _material.Link,{sx:{cursor:"pointer"},onClick:w,variant:"body2",color:"secondary",children:u("login.alreadyHaveCodeLink")})]})]}),_jsxruntime.jsx.call(void 0, _material.Box,{children:p.length>0&&p.map((v,E)=>_jsxruntime.jsx.call(void 0, _material.Alert,{variant:"filled",sx:{mt:2},severity:"error",children:v},E))})]})},xo=ur;var pr=({onScreenChange:e,onError:t,searchParams:s,onResetSuccess:a})=>{let{crudify:m}=q(),[n,i]=_react.useState.call(void 0, ""),[p,l]=_react.useState.call(void 0, ""),[y,c]=_react.useState.call(void 0, !1),[x,d]=_react.useState.call(void 0, []),[o,r]=_react.useState.call(void 0, null),[u,C]=_react.useState.call(void 0, null),[P,f]=_react.useState.call(void 0, ""),[h,w]=_react.useState.call(void 0, ""),[v,E]=_react.useState.call(void 0, !1),[g,S]=_react.useState.call(void 0, !0),[J,de]=_react.useState.call(void 0, !1),[we,Be]=_react.useState.call(void 0, null),[No,Ye]=_react.useState.call(void 0, !1),{t:I}=U(),Ce=T=>{let k=[`errors.auth.${T.code}`,`errors.data.${T.code}`,`errors.system.${T.code}`,`errors.${T.code}`,`resetPassword.${T.code.toLowerCase()}`];for(let O of k){let N=I(O);if(N!==O)return N}return T.message||I("error.unknown")},Pe=T=>s?s instanceof URLSearchParams?s.get(T):s[T]||null:null;_react.useEffect.call(void 0, ()=>{if(s){if(s){let T=Pe("fromCodeVerification"),k=Pe("email"),O=Pe("code");if(T==="true"&&k&&O){f(k),w(O),E(!0),de(!0),S(!1);return}let N=Pe("link");if(N)try{let $=decodeURIComponent(N),[H,ue]=$.split("/");if(H&&ue&&H.length===6){w(H),f(ue),E(!1),Be({email:ue,code:H});return}}catch (e4){}if(k&&O){f(k),w(O),E(!1),Be({email:k,code:O});return}}d([I("resetPassword.invalidCode")]),S(!1),setTimeout(()=>_optionalChain([e, 'optionalCall', _21 => _21("forgotPassword")]),3e3)}},[s,m,I,e]),_react.useEffect.call(void 0, ()=>{m&&we&&!No&&(Ye(!0),(async(k,O)=>{try{let N=[{operation:"validatePasswordResetCode",data:{email:k,codePassword:O}}],$=await m.transaction(N);if($.data&&Array.isArray($.data)){let H=$.data[0];if(H&&H.response&&H.response.status==="OK"){de(!0);return}}if($.success)de(!0);else{let ue=_chunkYIIUEOXCjs.g.call(void 0, $).map(Ce);d(ue),setTimeout(()=>_optionalChain([e, 'optionalCall', _22 => _22("forgotPassword")]),3e3)}}catch(N){let H=_chunkYIIUEOXCjs.g.call(void 0, N).map(Ce);d(H),setTimeout(()=>_optionalChain([e, 'optionalCall', _23 => _23("forgotPassword")]),3e3)}finally{S(!1),Be(null),Ye(!1)}})(we.email,we.code))},[m,we,I,e]);let Vo=T=>T.length<8?I("resetPassword.passwordTooShort"):null,Wo=async()=>{if(y||!m)return;d([]),r(null),C(null);let T=!1;if(!n)r(I("resetPassword.newPasswordRequired")),T=!0;else{let k=Vo(n);k&&(r(k),T=!0)}if(p?n!==p&&(C(I("resetPassword.passwordsDoNotMatch")),T=!0):(C(I("resetPassword.confirmPasswordRequired")),T=!0),!T){c(!0);try{let k=[{operation:"validateAndResetPassword",data:{email:P,codePassword:h,newPassword:n}}],O=await m.transaction(k);if(O.success)d([]),setTimeout(()=>{_optionalChain([a, 'optionalCall', _24 => _24()])},1e3);else{let $=_chunkYIIUEOXCjs.g.call(void 0, O).map(Ce);d($)}}catch(k){let N=_chunkYIIUEOXCjs.g.call(void 0, k).map(Ce);d(N),t&&t(N.join(", "))}c(!1)}},Uo=()=>{v?_optionalChain([e, 'optionalCall', _25 => _25("checkCode",{email:P})]):_optionalChain([e, 'optionalCall', _26 => _26("forgotPassword")])};return g?_jsxruntime.jsx.call(void 0, _material.Box,{sx:{display:"flex",justifyContent:"center",alignItems:"center",minHeight:"300px"},children:_jsxruntime.jsx.call(void 0, _material.CircularProgress,{})}):J?_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsxs.call(void 0, _material.Box,{component:"form",noValidate:!0,sx:{width:"100%",display:"flex",flexDirection:"column",gap:2},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:2},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h5",component:"h1",sx:{mb:1,fontWeight:600},children:I("resetPassword.title")}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",sx:{color:"grey.600"},children:I("resetPassword.instructions")})]}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:1},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",component:"label",htmlFor:"newPassword",sx:{display:"block",fontWeight:500,color:"grey.700",mb:.5},children:I("resetPassword.newPasswordLabel")}),_jsxruntime.jsx.call(void 0, _material.TextField,{fullWidth:!0,id:"newPassword",name:"newPassword",type:"password",value:n,disabled:y,onChange:T=>i(T.target.value),error:!!o,helperText:o,autoComplete:"new-password",placeholder:I("resetPassword.newPasswordPlaceholder"),required:!0})]}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:1},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",component:"label",htmlFor:"confirmPassword",sx:{display:"block",fontWeight:500,color:"grey.700",mb:.5},children:I("resetPassword.confirmPasswordLabel")}),_jsxruntime.jsx.call(void 0, _material.TextField,{fullWidth:!0,id:"confirmPassword",name:"confirmPassword",type:"password",value:p,disabled:y,onChange:T=>l(T.target.value),error:!!u,helperText:u,autoComplete:"new-password",placeholder:I("resetPassword.confirmPasswordPlaceholder"),required:!0})]}),_jsxruntime.jsx.call(void 0, _material.Button,{disabled:y,type:"button",onClick:Wo,fullWidth:!0,variant:"contained",color:"primary",sx:{mt:2,mb:2},children:y?_jsxruntime.jsx.call(void 0, _material.CircularProgress,{size:20}):I("resetPassword.resetPasswordButton")}),_jsxruntime.jsx.call(void 0, _material.Box,{sx:{display:"flex",justifyContent:"center",alignItems:"center"},children:_jsxruntime.jsx.call(void 0, _material.Link,{sx:{cursor:"pointer"},onClick:Uo,variant:"body2",color:"secondary",children:I("common.back")})})]}),_jsxruntime.jsx.call(void 0, _material.Box,{children:x.length>0&&x.map((T,k)=>_jsxruntime.jsx.call(void 0, _material.Alert,{variant:"filled",sx:{mt:2},severity:"error",children:T},k))})]}):_jsxruntime.jsx.call(void 0, _material.Box,{children:x.length>0&&x.map((T,k)=>_jsxruntime.jsx.call(void 0, _material.Alert,{variant:"filled",sx:{mt:2},severity:"error",children:T},k))})},Po=pr;var Pr=({onScreenChange:e,onError:t,searchParams:s})=>{let{crudify:a}=q(),[m,n]=_react.useState.call(void 0, ""),[i,p]=_react.useState.call(void 0, !1),[l,y]=_react.useState.call(void 0, []),[c,x]=_react.useState.call(void 0, null),[d,o]=_react.useState.call(void 0, ""),{t:r}=U(),u=w=>s?s instanceof URLSearchParams?s.get(w):s[w]||null:null,C=w=>{let v=[`errors.auth.${w.code}`,`errors.data.${w.code}`,`errors.system.${w.code}`,`errors.${w.code}`,`checkCode.${w.code.toLowerCase()}`];for(let E of v){let g=r(E);if(g!==E)return g}return w.message||r("error.unknown")};_react.useEffect.call(void 0, ()=>{let w=u("email");w?o(w):_optionalChain([e, 'optionalCall', _27 => _27("forgotPassword")])},[s,e]);let P=async()=>{if(!(i||!a)){if(y([]),x(null),!m){x(r("checkCode.codeRequired"));return}if(m.length!==6){x(r("checkCode.codeRequired"));return}p(!0);try{let w=[{operation:"validatePasswordResetCode",data:{email:d,codePassword:m}}],v=await a.transaction(w);if(v.success)_optionalChain([e, 'optionalCall', _28 => _28("resetPassword",{email:d,code:m,fromCodeVerification:"true"})]);else{let g=_chunkYIIUEOXCjs.g.call(void 0, v).map(C);y(g),p(!1)}}catch(w){let E=_chunkYIIUEOXCjs.g.call(void 0, w).map(C);y(E),p(!1),t&&t(E.join(", "))}}},f=()=>{_optionalChain([e, 'optionalCall', _29 => _29("forgotPassword")])},h=w=>{let v=w.target.value.replace(/\D/g,"").slice(0,6);n(v)};return _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsxs.call(void 0, _material.Box,{component:"form",noValidate:!0,sx:{width:"100%",display:"flex",flexDirection:"column",gap:2},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:2},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h5",component:"h1",sx:{mb:1,fontWeight:600},children:r("checkCode.title")}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",sx:{color:"grey.600"},children:r("checkCode.instructions")})]}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:1},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",component:"label",htmlFor:"code",sx:{display:"block",fontWeight:500,color:"grey.700",mb:.5},children:r("checkCode.codeLabel")}),_jsxruntime.jsx.call(void 0, _material.TextField,{fullWidth:!0,id:"code",name:"code",type:"text",value:m,disabled:i,onChange:h,error:!!c,helperText:c,placeholder:r("checkCode.codePlaceholder"),inputProps:{maxLength:6,style:{textAlign:"center",fontSize:"1.5rem",letterSpacing:"0.4rem"}},required:!0})]}),_jsxruntime.jsx.call(void 0, _material.Button,{disabled:i||m.length!==6,type:"button",onClick:P,fullWidth:!0,variant:"contained",color:"primary",sx:{mt:2,mb:2},children:i?_jsxruntime.jsx.call(void 0, _material.CircularProgress,{size:20}):r("checkCode.verifyButton")}),_jsxruntime.jsx.call(void 0, _material.Box,{sx:{display:"flex",justifyContent:"center",alignItems:"center"},children:_jsxruntime.jsx.call(void 0, _material.Link,{sx:{cursor:"pointer"},onClick:f,variant:"body2",color:"secondary",children:r("common.back")})})]}),_jsxruntime.jsx.call(void 0, _material.Box,{children:l.length>0&&l.map((w,v)=>_jsxruntime.jsx.call(void 0, _material.Alert,{sx:{mt:2},severity:"error",children:w},v))})]})},vo=Pr;var So=({children:e,fallback:t})=>{let{isLoading:s,error:a,isInitialized:m}=q(),{t:n}=U();return s?t||_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",minHeight:"200px",gap:2},children:[_jsxruntime.jsx.call(void 0, _material.CircularProgress,{}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",children:n("login.initializing")!=="login.initializing"?n("login.initializing"):"Initializing..."})]}):a?_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"error",sx:{mt:2},children:_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"body2",children:[n("login.initializationError")!=="login.initializationError"?n("login.initializationError"):"Initialization error",":"," ",a]})}):m?_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:e}):_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"warning",sx:{mt:2},children:_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",children:n("login.notInitialized")!=="login.notInitialized"?n("login.notInitialized"):"System not initialized"})})};var Rr=({onScreenChange:e,onExternalNavigate:t,onLoginSuccess:s,onError:a,redirectUrl:m="/"})=>{let{t:n}=U(),{state:i,setScreen:p}=Te(),{config:l}=_chunk2OSNNNIDjs.g.call(void 0, ),{showNotification:y}=_chunk2OSNNNIDjs.e.call(void 0, ),c=(d,o)=>{let r=o;d==="login"?r={}:d==="forgotPassword"&&!o&&(r={}),p(d,r),_optionalChain([e, 'optionalCall', _30 => _30(d,r)])},x=()=>{let d={onScreenChange:c,onExternalNavigate:t,onError:a,redirectUrl:m};switch(i.currentScreen){case"forgotPassword":return _jsxruntime.jsx.call(void 0, xo,{...d});case"checkCode":return _jsxruntime.jsx.call(void 0, vo,{...d,searchParams:i.searchParams});case"resetPassword":return _jsxruntime.jsx.call(void 0, Po,{...d,searchParams:i.searchParams,onResetSuccess:()=>{let o=n("resetPassword.successMessage");y(o,"success"),c("login")}});default:return _jsxruntime.jsx.call(void 0, po,{...d,onLoginSuccess:s})}};return _jsxruntime.jsxs.call(void 0, So,{children:[_jsxruntime.jsx.call(void 0, _material.Box,{sx:{display:"flex",justifyContent:"center",mb:3},children:_jsxruntime.jsx.call(void 0, "img",{src:l.logo||"/nocios-default.png",alt:n("login.logoAlt"),style:{width:"100%",maxWidth:"150px",height:"auto"},onError:d=>{let o=d.target;o.src="/nocios-default.png"}})}),!l.logo&&l.appName&&_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h6",component:"h1",sx:{textAlign:"center",mb:2},children:l.appName}),x()]})},Ar=({translations:e,translationsUrl:t,language:s="en",initialScreen:a="login",autoReadFromCookies:m=!0,...n})=>{let{config:i}=_chunk2OSNNNIDjs.g.call(void 0, );return _jsxruntime.jsx.call(void 0, no,{translations:e,translationsUrl:t,language:s,children:_jsxruntime.jsx.call(void 0, so,{config:i,children:_jsxruntime.jsx.call(void 0, uo,{config:i,initialScreen:a,autoReadFromCookies:m,children:_jsxruntime.jsx.call(void 0, Rr,{...n})})})})},Wn= exports.a =Ar;var _iconsmaterial = require('@mui/icons-material');var Gr=({showExtendedData:e=!0,showProfileCard:t=!0,autoRefresh:s=!0})=>{let{userProfile:a,loading:m,error:n,extendedData:i,refreshProfile:p}=_chunk2OSNNNIDjs.j.call(void 0, {autoFetch:s,retryOnError:!0,maxRetries:3}),[l,y]=_react.useState.call(void 0, !1);if(m)return _jsxruntime.jsxs.call(void 0, _material.Box,{display:"flex",justifyContent:"center",alignItems:"center",p:3,children:[_jsxruntime.jsx.call(void 0, _material.CircularProgress,{}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",sx:{ml:2},children:"Cargando perfil de usuario..."})]});if(n)return _jsxruntime.jsxs.call(void 0, _material.Alert,{severity:"error",action:_jsxruntime.jsx.call(void 0, _material.IconButton,{color:"inherit",size:"small",onClick:p,children:_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"caption",children:"Reintentar"})}),children:["Error al cargar el perfil: ",n]});if(!a)return _jsxruntime.jsx.call(void 0, _material.Alert,{severity:"warning",children:"No se encontr\xF3 informaci\xF3n del usuario"});let c=_optionalChain([i, 'optionalAccess', _31 => _31.displayData])||{},x=_optionalChain([i, 'optionalAccess', _32 => _32.totalFields])||0,d=f=>{if(!f)return"No disponible";try{return new Date(f).toLocaleString("es-ES",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch (e5){return f}},o=(f,h)=>h==null?"No disponible":typeof h=="boolean"?h?"S\xED":"No":Array.isArray(h)?h.length>0?h.join(", "):"Ninguno":typeof h=="object"?JSON.stringify(h,null,2):String(h),r=[{key:"id",label:"ID",icon:_jsxruntime.jsx.call(void 0, _iconsmaterial.Badge,{})},{key:"email",label:"Email",icon:_jsxruntime.jsx.call(void 0, _iconsmaterial.Email,{})},{key:"username",label:"Usuario",icon:_jsxruntime.jsx.call(void 0, _iconsmaterial.Person,{})},{key:"fullName",label:"Nombre completo",icon:_jsxruntime.jsx.call(void 0, _iconsmaterial.AccountCircle,{})},{key:"role",label:"Rol",icon:_jsxruntime.jsx.call(void 0, _iconsmaterial.Security,{})}],u=[{key:"firstName",label:"Nombre"},{key:"lastName",label:"Apellido"},{key:"isActive",label:"Activo"},{key:"lastLogin",label:"\xDAltimo login"},{key:"createdAt",label:"Creado"},{key:"updatedAt",label:"Actualizado"}],C=[...r.map(f=>f.key),...u.map(f=>f.key),"permissions"],P=Object.keys(c).filter(f=>!C.includes(f)).map(f=>({key:f,label:f}));return _jsxruntime.jsxs.call(void 0, _material.Box,{children:[t&&_jsxruntime.jsx.call(void 0, _material.Card,{sx:{mb:2},children:_jsxruntime.jsxs.call(void 0, _material.CardContent,{children:[_jsxruntime.jsxs.call(void 0, _material.Box,{display:"flex",alignItems:"center",mb:2,children:[_jsxruntime.jsx.call(void 0, _material.Avatar,{src:c.avatar,sx:{width:56,height:56,mr:2},children:_optionalChain([c, 'access', _33 => _33.fullName, 'optionalAccess', _34 => _34[0]])||_optionalChain([c, 'access', _35 => _35.username, 'optionalAccess', _36 => _36[0]])||_optionalChain([c, 'access', _37 => _37.email, 'optionalAccess', _38 => _38[0]])}),_jsxruntime.jsxs.call(void 0, _material.Box,{children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h6",children:c.fullName||c.username||c.email}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",children:c.role||"Usuario"}),c.isActive!==void 0&&_jsxruntime.jsx.call(void 0, _material.Chip,{label:c.isActive?"Activo":"Inactivo",color:c.isActive?"success":"error",size:"small",sx:{mt:.5}})]})]}),_jsxruntime.jsx.call(void 0, _material.Box,{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(250px, 1fr))",gap:2,children:r.map(({key:f,label:h,icon:w})=>c[f]?_jsxruntime.jsxs.call(void 0, _material.Box,{display:"flex",alignItems:"center",children:[_jsxruntime.jsx.call(void 0, _material.Box,{sx:{mr:1,color:"text.secondary"},children:w}),_jsxruntime.jsxs.call(void 0, _material.Box,{children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"caption",color:"text.secondary",children:h}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",children:o(f,c[f])})]})]},f):null)}),c.permissions&&Array.isArray(c.permissions)&&c.permissions.length>0&&_jsxruntime.jsxs.call(void 0, _material.Box,{mt:2,children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"caption",color:"text.secondary",display:"block",children:"Permisos"}),_jsxruntime.jsxs.call(void 0, _material.Box,{display:"flex",flexWrap:"wrap",gap:.5,mt:.5,children:[c.permissions.slice(0,5).map((f,h)=>_jsxruntime.jsx.call(void 0, _material.Chip,{label:f,size:"small",variant:"outlined"},h)),c.permissions.length>5&&_jsxruntime.jsx.call(void 0, _material.Chip,{label:`+${c.permissions.length-5} m\xE1s`,size:"small"})]})]})]})}),e&&_jsxruntime.jsx.call(void 0, _material.Card,{children:_jsxruntime.jsxs.call(void 0, _material.CardContent,{children:[_jsxruntime.jsxs.call(void 0, _material.Box,{display:"flex",justifyContent:"space-between",alignItems:"center",mb:2,children:[_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"h6",display:"flex",alignItems:"center",children:[_jsxruntime.jsx.call(void 0, _iconsmaterial.Info,{sx:{mr:1}}),"Informaci\xF3n Detallada"]}),_jsxruntime.jsx.call(void 0, _material.Chip,{label:`${x} campos totales`,size:"small"})]}),_jsxruntime.jsxs.call(void 0, _material.List,{dense:!0,children:[u.map(({key:f,label:h})=>c[f]!==void 0&&_jsxruntime.jsxs.call(void 0, _material.ListItem,{divider:!0,children:[_jsxruntime.jsx.call(void 0, _material.ListItemIcon,{children:_jsxruntime.jsx.call(void 0, _iconsmaterial.Schedule,{fontSize:"small"})}),_jsxruntime.jsx.call(void 0, _material.ListItemText,{primary:h,secondary:f.includes("At")||f.includes("Login")?d(c[f]):o(f,c[f])})]},f)),P.length>0&&_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsx.call(void 0, _material.Divider,{sx:{my:1}}),_jsxruntime.jsx.call(void 0, _material.ListItem,{children:_jsxruntime.jsx.call(void 0, _material.ListItemText,{primary:_jsxruntime.jsxs.call(void 0, _material.Box,{display:"flex",justifyContent:"space-between",alignItems:"center",children:[_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"subtitle2",children:["Campos Personalizados (",P.length,")"]}),_jsxruntime.jsx.call(void 0, _material.IconButton,{size:"small",onClick:()=>y(!l),children:l?_jsxruntime.jsx.call(void 0, _iconsmaterial.ExpandLess,{}):_jsxruntime.jsx.call(void 0, _iconsmaterial.ExpandMore,{})})]})})}),_jsxruntime.jsx.call(void 0, _material.Collapse,{in:l,children:P.map(({key:f,label:h})=>_jsxruntime.jsx.call(void 0, _material.ListItem,{sx:{pl:4},children:_jsxruntime.jsx.call(void 0, _material.ListItemText,{primary:h,secondary:o(f,c[f])})},f))})]})]}),_jsxruntime.jsxs.call(void 0, _material.Box,{mt:2,display:"flex",justifyContent:"space-between",alignItems:"center",children:[_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"caption",color:"text.secondary",children:["\xDAltima actualizaci\xF3n: ",d(c.updatedAt)]}),_jsxruntime.jsx.call(void 0, _material.IconButton,{size:"small",onClick:p,disabled:m,children:_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"caption",children:"Actualizar"})})]})]})})]})},Yr= exports.b =Gr;var Ao=["create","read","update","delete"],Io= exports.d =["create","read","update","delete"];var _reacti18next = require('react-i18next');var st=({value:e,onChange:t,availableFields:s,error:a,disabled:m=!1})=>{let{t:n}=_reacti18next.useTranslation.call(void 0, ),[i,p]=_react.useState.call(void 0, "custom"),l=_react.useRef.call(void 0, !1);_react.useEffect.call(void 0, ()=>{let o=e||{allow:[],owner_allow:[],deny:[]},r=new Set(s),u=(o.allow||[]).filter(h=>r.has(h)),C=(o.owner_allow||[]).filter(h=>r.has(h)),P=(o.deny||[]).filter(h=>r.has(h));s.forEach(h=>{!u.includes(h)&&!C.includes(h)&&!P.includes(h)&&P.push(h)});let f={allow:u,owner_allow:C,deny:P};JSON.stringify(f)!==JSON.stringify(o)&&t(f),u.length===s.length?p("all"):P.length===s.length?p("none"):p("custom")},[s,e]);let y=()=>{l.current=!0,t({allow:[...s],owner_allow:[],deny:[]}),p("all"),setTimeout(()=>{l.current=!1},0)},c=()=>{l.current=!0,t({allow:[],owner_allow:[],deny:[...s]}),p("none"),setTimeout(()=>{l.current=!1},0)},x=o=>_optionalChain([e, 'optionalAccess', _39 => _39.allow, 'optionalAccess', _40 => _40.includes, 'call', _41 => _41(o)])?"allow":_optionalChain([e, 'optionalAccess', _42 => _42.owner_allow, 'optionalAccess', _43 => _43.includes, 'call', _44 => _44(o)])?"owner_allow":"deny",d=(o,r)=>{l.current=!0;let u=new Set(_optionalChain([e, 'optionalAccess', _45 => _45.allow])||[]),C=new Set(_optionalChain([e, 'optionalAccess', _46 => _46.owner_allow])||[]),P=new Set(_optionalChain([e, 'optionalAccess', _47 => _47.deny])||[]);u.delete(o),C.delete(o),P.delete(o),r==="allow"&&u.add(o),r==="owner_allow"&&C.add(o),r==="deny"&&P.add(o),t({allow:Array.from(u),owner_allow:Array.from(C),deny:Array.from(P)}),p("custom"),setTimeout(()=>{l.current=!1},0)};return s.length===0?_jsxruntime.jsxs.call(void 0, _material.Box,{children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",sx:{mb:1},children:n("modules.form.publicPolicies.fields.conditions.label")}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",sx:{fontStyle:"italic"},children:n("modules.form.publicPolicies.fields.conditions.noFieldsAvailable")}),a&&_jsxruntime.jsx.call(void 0, _material.FormHelperText,{error:!0,sx:{mt:1},children:a})]}):_jsxruntime.jsxs.call(void 0, _material.Box,{children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",sx:{mb:2},children:n("modules.form.publicPolicies.fields.conditions.label")}),_jsxruntime.jsxs.call(void 0, _material.Stack,{direction:"row",spacing:1,sx:{mb:3},children:[_jsxruntime.jsx.call(void 0, _material.Button,{variant:i==="all"?"contained":"outlined",startIcon:_jsxruntime.jsx.call(void 0, _iconsmaterial.SelectAll,{}),onClick:y,disabled:m,size:"small",sx:{minWidth:120,...i==="all"&&{backgroundColor:"#16a34a","&:hover":{backgroundColor:"#15803d"}}},children:n("modules.form.publicPolicies.fields.conditions.allFields")}),_jsxruntime.jsx.call(void 0, _material.Button,{variant:i==="none"?"contained":"outlined",startIcon:_jsxruntime.jsx.call(void 0, _iconsmaterial.ClearAll,{}),onClick:c,disabled:m,size:"small",sx:{minWidth:120,...i==="none"&&{backgroundColor:"#cf222e","&:hover":{backgroundColor:"#bc1f2c"}}},children:n("modules.form.publicPolicies.fields.conditions.noFields")})]}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{p:2,border:"1px solid #d1d9e0",borderRadius:1,backgroundColor:"#f6f8fa"},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",sx:{mb:2},children:n("modules.form.publicPolicies.fields.conditions.help")}),_jsxruntime.jsx.call(void 0, _material.Stack,{spacing:1,children:s.map(o=>{let r=x(o);return _jsxruntime.jsxs.call(void 0, _material.Stack,{direction:"row",spacing:1,alignItems:"center",children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",sx:{minWidth:100,fontFamily:"monospace"},children:o}),_jsxruntime.jsxs.call(void 0, _material.ToggleButtonGroup,{value:r,exclusive:!0,size:"small",children:[_jsxruntime.jsxs.call(void 0, _material.ToggleButton,{value:"allow",onClick:()=>d(o,"allow"),disabled:m,sx:{px:2,color:r==="allow"?"#ffffff":"#6b7280",backgroundColor:r==="allow"?"#16a34a":"#f3f4f6",borderColor:r==="allow"?"#16a34a":"#d1d5db","&:hover":{backgroundColor:r==="allow"?"#15803d":"#e5e7eb",borderColor:r==="allow"?"#15803d":"#9ca3af"},"&.Mui-selected":{backgroundColor:"#16a34a",color:"#ffffff","&:hover":{backgroundColor:"#15803d"}}},children:[_jsxruntime.jsx.call(void 0, _iconsmaterial.CheckCircle,{sx:{fontSize:16,mr:.5}}),n("modules.form.publicPolicies.fields.conditions.states.allow")]}),_jsxruntime.jsx.call(void 0, _material.ToggleButton,{value:"owner_allow",onClick:()=>d(o,"owner_allow"),disabled:m,sx:{px:2,color:r==="owner_allow"?"#ffffff":"#6b7280",backgroundColor:r==="owner_allow"?"#0ea5e9":"#f3f4f6",borderColor:r==="owner_allow"?"#0ea5e9":"#d1d5db","&:hover":{backgroundColor:r==="owner_allow"?"#0284c7":"#e5e7eb",borderColor:r==="owner_allow"?"#0284c7":"#9ca3af"},"&.Mui-selected":{backgroundColor:"#0ea5e9",color:"#ffffff","&:hover":{backgroundColor:"#0284c7"}}},children:n("modules.form.publicPolicies.fields.conditions.states.ownerAllow")}),_jsxruntime.jsxs.call(void 0, _material.ToggleButton,{value:"deny",onClick:()=>d(o,"deny"),disabled:m,sx:{px:2,color:r==="deny"?"#ffffff":"#6b7280",backgroundColor:r==="deny"?"#dc2626":"#f3f4f6",borderColor:r==="deny"?"#dc2626":"#d1d5db","&:hover":{backgroundColor:r==="deny"?"#b91c1c":"#e5e7eb",borderColor:r==="deny"?"#b91c1c":"#9ca3af"},"&.Mui-selected":{backgroundColor:"#dc2626",color:"#ffffff","&:hover":{backgroundColor:"#b91c1c"}}},children:[_jsxruntime.jsx.call(void 0, _iconsmaterial.Cancel,{sx:{fontSize:16,mr:.5}}),n("modules.form.publicPolicies.fields.conditions.states.deny")]})]})]},o)})})]}),a&&_jsxruntime.jsx.call(void 0, _material.FormHelperText,{error:!0,sx:{mt:1},children:a})]})},He=st;var bt=_react.forwardRef.call(void 0, ({policy:e,onChange:t,onRemove:s,availableFields:a,isSubmitting:m=!1,usedActions:n,error:i},p)=>{let{t:l}=_reacti18next.useTranslation.call(void 0, ),y=new Set(Array.from(n||[]));y.delete(e.action);let c=Ao.map(x=>({value:x,label:l(`modules.form.publicPolicies.fields.action.options.${x}`)}));return _jsxruntime.jsxs.call(void 0, _material.Paper,{ref:p,sx:{p:3,border:"1px solid #d1d9e0",borderRadius:2,position:"relative",backgroundColor:"#ffffff"},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",mb:3},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"subtitle1",sx:{fontWeight:600,color:"#111418",fontSize:"1rem"},children:l("modules.form.publicPolicies.policyTitle")}),_jsxruntime.jsx.call(void 0, _material.IconButton,{onClick:s,size:"small",disabled:m,"aria-label":l("modules.form.publicPolicies.removePolicy"),sx:{color:"#656d76","&:hover":{color:"#cf222e",backgroundColor:"rgba(207, 34, 46, 0.1)"}},children:_jsxruntime.jsx.call(void 0, _iconsmaterial.Delete,{})})]}),_jsxruntime.jsxs.call(void 0, _material.Stack,{spacing:3,children:[_jsxruntime.jsx.call(void 0, _material.Stack,{direction:{xs:"column",md:"row"},spacing:2,children:_jsxruntime.jsx.call(void 0, _material.Box,{sx:{flex:1,minWidth:200},children:_jsxruntime.jsxs.call(void 0, _material.FormControl,{fullWidth:!0,children:[_jsxruntime.jsx.call(void 0, _material.InputLabel,{children:l("modules.form.publicPolicies.fields.action.label")}),_jsxruntime.jsx.call(void 0, _material.Select,{value:e.action,label:l("modules.form.publicPolicies.fields.action.label"),disabled:m,onChange:x=>{let d=x.target.value,o={...e,action:d};d==="delete"?(o.permission="deny",delete o.fields):(o.fields={allow:[],owner_allow:[],deny:a},delete o.permission),t(o)},sx:{backgroundColor:"#ffffff","&:hover .MuiOutlinedInput-notchedOutline":{borderColor:"#8c959f"},"&.Mui-focused .MuiOutlinedInput-notchedOutline":{borderColor:"#0969da",borderWidth:2}},children:c.map(x=>{let d=y.has(x.value);return _jsxruntime.jsx.call(void 0, _material.MenuItem,{value:x.value,disabled:d,children:x.label},x.value)})}),i&&_jsxruntime.jsx.call(void 0, _material.FormHelperText,{error:!0,children:i})]})})}),e.action==="delete"?_jsxruntime.jsxs.call(void 0, _material.Box,{children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",sx:{mb:2},children:l("modules.form.publicPolicies.fields.conditions.label")}),_jsxruntime.jsxs.call(void 0, _material.Stack,{direction:"row",spacing:1,sx:{mb:3},children:[_jsxruntime.jsx.call(void 0, _material.Button,{variant:e.permission==="*"?"contained":"outlined",startIcon:_jsxruntime.jsx.call(void 0, _iconsmaterial.SelectAll,{}),onClick:()=>t({...e,permission:"*"}),disabled:m,size:"small",sx:{minWidth:140,whiteSpace:"nowrap",...e.permission==="*"&&{backgroundColor:"#16a34a","&:hover":{backgroundColor:"#15803d"}}},children:l("modules.form.publicPolicies.fields.conditions.allFields")}),_jsxruntime.jsx.call(void 0, _material.Button,{variant:e.permission==="owner"?"contained":"outlined",onClick:()=>t({...e,permission:"owner"}),disabled:m,size:"small",sx:{minWidth:140,whiteSpace:"nowrap",...e.permission==="owner"&&{backgroundColor:"#0ea5e9","&:hover":{backgroundColor:"#0284c7"}}},children:l("modules.form.publicPolicies.fields.conditions.states.ownerAllow")}),_jsxruntime.jsx.call(void 0, _material.Button,{variant:e.permission==="deny"?"contained":"outlined",startIcon:_jsxruntime.jsx.call(void 0, _iconsmaterial.ClearAll,{}),onClick:()=>t({...e,permission:"deny"}),disabled:m,size:"small",sx:{minWidth:140,whiteSpace:"nowrap",...e.permission==="deny"&&{backgroundColor:"#cf222e","&:hover":{backgroundColor:"#bc1f2c"}}},children:l("modules.form.publicPolicies.fields.conditions.noFields")})]})]}):_jsxruntime.jsx.call(void 0, He,{value:e.fields||{allow:[],owner_allow:[],deny:[]},onChange:x=>t({...e,fields:x}),availableFields:a,disabled:m}),_jsxruntime.jsx.call(void 0, _material.Paper,{variant:"outlined",sx:{p:2,backgroundColor:"#f9fafb"},children:e.action==="delete"?_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"body2",sx:{fontFamily:"monospace",color:"text.secondary"},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{component:"span",sx:{color:e.permission==="*"?"#16a34a":e.permission==="owner"?"#0ea5e9":"#dc2626"},children:[l("modules.form.publicPolicies.fields.conditions.states.allow"),":"]})," ",e.permission||"-"]}):_jsxruntime.jsxs.call(void 0, _material.Stack,{spacing:.5,divider:_jsxruntime.jsx.call(void 0, _material.Divider,{sx:{borderColor:"#e5e7eb"}}),children:[_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"body2",sx:{fontFamily:"monospace",color:"text.secondary"},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{component:"span",sx:{color:"#16a34a"},children:[l("modules.form.publicPolicies.fields.conditions.states.allow"),":"]})," ",(_optionalChain([e, 'optionalAccess', _48 => _48.fields, 'optionalAccess', _49 => _49.allow])||[]).join(", ")||"-"]}),_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"body2",sx:{fontFamily:"monospace",color:"text.secondary"},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{component:"span",sx:{color:"#0ea5e9"},children:[l("modules.form.publicPolicies.fields.conditions.states.ownerAllow"),":"]})," ",(_optionalChain([e, 'optionalAccess', _50 => _50.fields, 'optionalAccess', _51 => _51.owner_allow])||[]).join(", ")||"-"]}),_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"body2",sx:{fontFamily:"monospace",color:"text.secondary"},children:[_jsxruntime.jsxs.call(void 0, _material.Box,{component:"span",sx:{color:"#dc2626"},children:[l("modules.form.publicPolicies.fields.conditions.states.deny"),":"]})," ",(_optionalChain([e, 'optionalAccess', _52 => _52.fields, 'optionalAccess', _53 => _53.deny])||[]).join(", ")||"-"]})]})})]})]})}),je=bt;var St=()=>{let e=_optionalChain([globalThis, 'optionalAccess', _54 => _54.crypto]);return e&&typeof e.randomUUID=="function"?e.randomUUID():`${Date.now()}-${Math.random().toString(16).slice(2)}`},kt=({policies:e,onChange:t,availableFields:s,errors:a,isSubmitting:m=!1})=>{let{t:n}=_reacti18next.useTranslation.call(void 0, ),i=_react.useRef.call(void 0, {}),p=new Set((e||[]).map(r=>r.action).filter(Boolean)),l=Io.filter(r=>!p.has(r)),y=l.length>0,c=()=>{let r=l[0]||"create",u={id:St(),action:r};r==="delete"?u.permission="deny":u.fields={allow:[],owner_allow:[],deny:s};let C=[...e||[],u];t(C),setTimeout(()=>{let P=C.length-1,f=i.current[P];f&&f.scrollIntoView({behavior:"smooth",block:"center"})},100)},x=r=>{let u=[...e];u.splice(r,1),t(u)},d=(()=>{if(!a)return null;if(typeof a=="string")return a;let r=a._error;return typeof r=="string"?r:null})(),o=new Set((e||[]).map(r=>r.action));return _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsx.call(void 0, _material.Divider,{sx:{borderColor:"#e0e4e7"}}),_jsxruntime.jsxs.call(void 0, _material.Box,{children:[_jsxruntime.jsx.call(void 0, _material.Box,{display:"flex",justifyContent:"space-between",alignItems:"center",mb:3,children:_jsxruntime.jsxs.call(void 0, _material.Box,{children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h6",sx:{fontWeight:600,color:"#111418",mb:1},children:n("modules.form.publicPolicies.title")}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",sx:{fontSize:"0.875rem"},children:n("modules.form.publicPolicies.description")})]})}),d&&_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"error",sx:{mb:3},children:d}),_jsxruntime.jsxs.call(void 0, _material.Stack,{spacing:3,children:[(e||[]).length===0?_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"info",children:n("modules.form.publicPolicies.noPolicies")}):e.map((r,u)=>_jsxruntime.jsx.call(void 0, je,{ref:C=>{i.current[u]=C},policy:r,onChange:C=>{let P=[...e];P[u]=C,t(P)},onRemove:()=>x(u),availableFields:s,isSubmitting:m,usedActions:o,error:typeof a=="object"&&a&&r.id in a?a[r.id]:void 0},r.id)),y&&_jsxruntime.jsx.call(void 0, _material.Box,{children:_jsxruntime.jsx.call(void 0, _material.Button,{type:"button",variant:"outlined",startIcon:_jsxruntime.jsx.call(void 0, _iconsmaterial.Add,{}),onClick:c,disabled:m,sx:{borderColor:"#d0d7de",color:"#656d76","&:hover":{borderColor:"#8c959f",backgroundColor:"transparent"}},children:n("modules.form.publicPolicies.addPolicy")})})]})]})]})},Ti= exports.e =kt;function Ii(){let[e,t]=_react.useState.call(void 0, ""),[s,a]=_react.useState.call(void 0, ""),[m,n]=_react.useState.call(void 0, !1),{isAuthenticated:i,isLoading:p,error:l,login:y,logout:c,refreshTokens:x,clearError:d,isExpiringSoon:o,expiresIn:r}=_chunk2OSNNNIDjs.g.call(void 0, ),u=async f=>{if(f.preventDefault(),!e||!s)return;(await y(e,s)).success&&(t(""),a(""),n(!1))},C=async()=>{await c()},P=async()=>{await x()};return i?_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{maxWidth:600,mx:"auto",p:3},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h4",gutterBottom:!0,children:"Welcome! \u{1F389}"}),_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"success",sx:{mb:3},children:"You are successfully logged in with Refresh Token Pattern enabled"}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{mb:3,p:2,bgcolor:"background.paper",border:1,borderColor:"divider",borderRadius:1},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h6",gutterBottom:!0,children:"Token Status"}),_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"body2",color:"text.secondary",children:["Access Token expires in: ",Math.round(r/1e3/60)," minutes"]}),o&&_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"warning",sx:{mt:1},children:"Token expires soon - automatic refresh will happen"})]}),_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{display:"flex",gap:2,flexWrap:"wrap"},children:[_jsxruntime.jsx.call(void 0, _material.Button,{variant:"contained",onClick:P,disabled:p,startIcon:p?_jsxruntime.jsx.call(void 0, _material.CircularProgress,{size:16}):null,children:"Refresh Tokens"}),_jsxruntime.jsx.call(void 0, _material.Button,{variant:"outlined",color:"error",onClick:C,disabled:p,children:"Logout"})]}),l&&_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"error",sx:{mt:2},onClose:d,children:l})]}):_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{maxWidth:400,mx:"auto",p:3},children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"h4",gutterBottom:!0,align:"center",children:"Login with Refresh Tokens"}),_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"info",sx:{mb:3},children:"This demo shows the new Refresh Token Pattern with automatic session management"}),m?_jsxruntime.jsxs.call(void 0, "form",{onSubmit:u,children:[_jsxruntime.jsx.call(void 0, _material.TextField,{fullWidth:!0,label:"Email",type:"email",value:e,onChange:f=>t(f.target.value),margin:"normal",required:!0,autoComplete:"email"}),_jsxruntime.jsx.call(void 0, _material.TextField,{fullWidth:!0,label:"Password",type:"password",value:s,onChange:f=>a(f.target.value),margin:"normal",required:!0,autoComplete:"current-password"}),_jsxruntime.jsx.call(void 0, _material.Button,{type:"submit",fullWidth:!0,variant:"contained",size:"large",disabled:p,startIcon:p?_jsxruntime.jsx.call(void 0, _material.CircularProgress,{size:16}):null,sx:{mt:3,mb:2},children:p?"Logging in...":"Login"})]}):_jsxruntime.jsx.call(void 0, _material.Button,{fullWidth:!0,variant:"contained",size:"large",onClick:()=>n(!0),sx:{mt:2},children:"Show Login Form"}),l&&_jsxruntime.jsx.call(void 0, _material.Alert,{severity:"error",sx:{mt:2},onClose:d,children:l})]})}function Bi(){let{isAuthenticated:e,isLoading:t,isExpiringSoon:s,expiresIn:a}=_chunk2OSNNNIDjs.g.call(void 0, );return t?_jsxruntime.jsxs.call(void 0, _material.Box,{sx:{display:"flex",alignItems:"center",gap:1},children:[_jsxruntime.jsx.call(void 0, _material.CircularProgress,{size:16}),_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"caption",children:"Loading session..."})]}):e?_jsxruntime.jsxs.call(void 0, _material.Box,{children:[_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"caption",color:"success.main",children:"\u2713 Authenticated"}),s&&_jsxruntime.jsxs.call(void 0, _material.Typography,{variant:"caption",color:"warning.main",display:"block",children:["\u26A0 Token expires in ",Math.round(a/1e3/60)," min"]})]}):_jsxruntime.jsx.call(void 0, _material.Typography,{variant:"caption",color:"text.secondary",children:"Not logged in"})}exports.a = Wn; exports.b = Yr; exports.c = Ao; exports.d = Io; exports.e = Ti; exports.f = Ii; exports.g = Bi;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as D,b as F,f as G,g as Y}from"./chunk-YS3C7YG5.mjs";import C from"crypto-js";var a=class a{static setStorageType(e){a.storageType=e}static generateEncryptionKey(){let e=[navigator.userAgent,navigator.language,navigator.platform,screen.width,screen.height,Date.now().toString(),Math.random().toString(36)].join("|");return C.SHA256(e).toString()}static getEncryptionKey(){if(a.encryptionKey)return a.encryptionKey;let e=window.localStorage;if(!e)return a.encryptionKey=a.generateEncryptionKey(),a.encryptionKey;try{let t=e.getItem(a.ENCRYPTION_KEY_STORAGE);return(!t||t.length<32)&&(t=a.generateEncryptionKey(),e.setItem(a.ENCRYPTION_KEY_STORAGE,t)),a.encryptionKey=t,t}catch{return console.warn("Crudify: Cannot persist encryption key, using temporary key"),a.encryptionKey=a.generateEncryptionKey(),a.encryptionKey}}static isStorageAvailable(e){try{let t=window[e],r="__storage_test__";return t.setItem(r,"test"),t.removeItem(r),!0}catch{return!1}}static getStorage(){return a.storageType==="none"?null:a.isStorageAvailable(a.storageType)?window[a.storageType]:(console.warn(`Crudify: ${a.storageType} not available, tokens won't persist`),null)}static encrypt(e){try{let t=a.getEncryptionKey();return C.AES.encrypt(e,t).toString()}catch(t){return console.error("Crudify: Encryption failed",t),e}}static decrypt(e){try{let t=a.getEncryptionKey();return C.AES.decrypt(e,t).toString(C.enc.Utf8)||e}catch(t){return console.error("Crudify: Decryption failed",t),e}}static saveTokens(e){let t=a.getStorage();if(t)try{let r={accessToken:e.accessToken,refreshToken:e.refreshToken,expiresAt:e.expiresAt,refreshExpiresAt:e.refreshExpiresAt,savedAt:Date.now()},i=a.encrypt(JSON.stringify(r));t.setItem(a.TOKEN_KEY,i),console.debug("Crudify: Tokens saved successfully")}catch(r){console.error("Crudify: Failed to save tokens",r)}}static getTokens(){let e=a.getStorage();if(!e)return null;try{let t=e.getItem(a.TOKEN_KEY);if(!t)return null;let r=a.decrypt(t),i=JSON.parse(r);return!i.accessToken||!i.refreshToken||!i.expiresAt||!i.refreshExpiresAt?(console.warn("Crudify: Incomplete token data found, clearing storage"),a.clearTokens(),null):Date.now()>=i.refreshExpiresAt?(console.info("Crudify: Refresh token expired, clearing storage"),a.clearTokens(),null):{accessToken:i.accessToken,refreshToken:i.refreshToken,expiresAt:i.expiresAt,refreshExpiresAt:i.refreshExpiresAt}}catch(t){return console.error("Crudify: Failed to retrieve tokens",t),a.clearTokens(),null}}static clearTokens(){let e=a.getStorage();if(e)try{e.removeItem(a.TOKEN_KEY),console.debug("Crudify: Tokens cleared from storage")}catch(t){console.error("Crudify: Failed to clear tokens",t)}}static rotateEncryptionKey(){try{a.clearTokens(),a.encryptionKey=null;let e=window.localStorage;e&&e.removeItem(a.ENCRYPTION_KEY_STORAGE),console.info("Crudify: Encryption key rotated successfully")}catch(e){console.error("Crudify: Failed to rotate encryption key",e)}}static hasValidTokens(){return a.getTokens()!==null}static getExpirationInfo(){let e=a.getTokens();if(!e)return null;let t=Date.now();return{accessExpired:t>=e.expiresAt,refreshExpired:t>=e.refreshExpiresAt,accessExpiresIn:Math.max(0,e.expiresAt-t),refreshExpiresIn:Math.max(0,e.refreshExpiresAt-t)}}static updateAccessToken(e,t){let r=a.getTokens();if(!r){console.warn("Crudify: Cannot update access token, no existing tokens found");return}a.saveTokens({...r,accessToken:e,expiresAt:t})}};a.TOKEN_KEY="crudify_tokens",a.ENCRYPTION_KEY_STORAGE="crudify_enc_key",a.encryptionKey=null,a.storageType="localStorage";var g=a;import m from"@nocios/crudify-browser";var P=class o{constructor(){this.config={};this.initialized=!1;this.lastActivityTime=0}static getInstance(){return o.instance||(o.instance=new o),o.instance}async initialize(e={}){if(this.initialized){console.warn("SessionManager: Already initialized");return}this.config={storageType:"localStorage",autoRestore:!0,enableLogging:!1,...e},g.setStorageType(this.config.storageType||"localStorage"),this.config.enableLogging,this.config.autoRestore&&await this.restoreSession(),this.initialized=!0,this.log("SessionManager initialized successfully")}async login(e,t){try{this.log("Attempting login...");let r=await m.login(e,t);if(!r.success)return this.log("Login failed:",r.errors),{success:!1,error:this.formatError(r.errors),rawResponse:r};let i={accessToken:r.data.token,refreshToken:r.data.refreshToken,expiresAt:r.data.expiresAt,refreshExpiresAt:r.data.refreshExpiresAt};return g.saveTokens(i),this.lastActivityTime=Date.now(),this.log("Login successful, tokens saved"),this.config.onLoginSuccess?.(i),{success:!0,tokens:i,data:r.data}}catch(r){return this.log("Login error:",r),{success:!1,error:r instanceof Error?r.message:"Unknown error"}}}async logout(){try{this.log("Logging out..."),await m.logout(),g.clearTokens(),this.log("Logout successful"),this.config.onLogout?.()}catch(e){this.log("Logout error:",e),g.clearTokens()}}async restoreSession(){try{this.log("Attempting to restore session...");let e=g.getTokens();if(!e)return this.log("No valid tokens found in storage"),!1;if(Date.now()>=e.refreshExpiresAt)return this.log("Refresh token expired, clearing storage"),g.clearTokens(),!1;if(m.setTokens({accessToken:e.accessToken,refreshToken:e.refreshToken,expiresAt:e.expiresAt,refreshExpiresAt:e.refreshExpiresAt}),m.getTokenData().isValid===!1){if(this.log("Restored access token is invalid or expired"),Date.now()<e.refreshExpiresAt&&(this.log("Access token expired but refresh is valid, attempting refresh..."),await this.refreshTokens())){this.log("Session restored successfully via token refresh");let i=g.getTokens();return i&&this.config.onSessionRestored?.(i),!0}return g.clearTokens(),await m.logout(),!1}return this.log("Session restored successfully"),this.lastActivityTime=Date.now(),this.config.onSessionRestored?.(e),!0}catch(e){return this.log("Session restore error:",e),g.clearTokens(),await m.logout(),!1}}isAuthenticated(){return m.isLogin()||g.hasValidTokens()}getTokenInfo(){let e=m.getTokenData(),t=g.getExpirationInfo();return{isLoggedIn:this.isAuthenticated(),crudifyTokens:e,storageInfo:t,hasValidTokens:g.hasValidTokens()}}async refreshTokens(){try{this.log("Manually refreshing tokens...");let e=await m.refreshAccessToken();if(!e.success)return this.log("Token refresh failed:",e.errors),g.clearTokens(),this.config.showNotification?.(this.getSessionExpiredMessage(),"warning"),this.config.onSessionExpired?.(),!1;let t={accessToken:e.data.token,refreshToken:e.data.refreshToken,expiresAt:e.data.expiresAt,refreshExpiresAt:e.data.refreshExpiresAt};return g.saveTokens(t),this.log("Tokens refreshed and saved successfully"),this.lastActivityTime=Date.now(),!0}catch(e){return this.log("Token refresh error:",e),g.clearTokens(),this.config.showNotification?.(this.getSessionExpiredMessage(),"warning"),this.config.onSessionExpired?.(),!1}}setupResponseInterceptor(){m.setResponseInterceptor(async e=>{this.updateLastActivity();let t=this.detectAuthorizationError(e);if(t.isAuthError){if(console.warn("\u{1F6A8} SessionManager - Authorization error detected:",{errorType:t.errorType,errorDetails:t.errorDetails,fullResponse:e}),t.isRefreshTokenInvalid||t.isTokenRefreshFailed)return this.log("Refresh token invalid or refresh already failed, clearing session"),g.clearTokens(),this.config.showNotification?.(this.getSessionExpiredMessage(),"warning"),this.config.onSessionExpired?.(),e;g.hasValidTokens()&&!t.isIrrecoverable?(this.log("Auth error detected, attempting token refresh..."),await this.refreshTokens()||(this.log("Token refresh failed, triggering session expired"),this.config.onSessionExpired?.())):(this.log("Auth error with no valid tokens or irrecoverable error, triggering session expired"),g.clearTokens(),this.config.showNotification?.(this.getSessionExpiredMessage(),"warning"),this.config.onSessionExpired?.())}return e}),this.log("Response interceptor configured")}detectAuthorizationError(e){let t={isAuthError:!1,isRefreshTokenInvalid:!1,isTokenRefreshFailed:!1,isIrrecoverable:!1,errorType:"",errorDetails:null};if(e.errors){if(Array.isArray(e.errors))e.errors.some(i=>i.errorType==="Unauthorized"||i.message?.includes("Unauthorized")||i.message?.includes("Not Authorized")||i.message?.includes("Token")||i.extensions?.code==="UNAUTHENTICATED"||i.message?.includes("NOT_AUTHORIZED"))&&(t.isAuthError=!0,t.errorType="GraphQL Array Format",t.errorDetails=e.errors);else if(typeof e.errors=="object"){let r=Object.values(e.errors).flat();r.some(u=>typeof u=="string"&&(u.includes("NOT_AUTHORIZED")||u.includes("TOKEN_REFRESH_FAILED")||u.includes("PLEASE_LOGIN")||u.includes("Unauthorized")||u.includes("UNAUTHENTICATED")||u.includes("Token")))&&(t.isAuthError=!0,t.errorType="GraphQL Object Format",t.errorDetails=e.errors,t.isTokenRefreshFailed=r.some(u=>typeof u=="string"&&u.includes("TOKEN_REFRESH_FAILED")))}}if(!t.isAuthError&&e.data?.response?.status==="UNAUTHORIZED"&&(t.isAuthError=!0,t.errorType="Status UNAUTHORIZED",t.errorDetails=e.data.response,t.isIrrecoverable=!0),!t.isAuthError&&e.data?.response?.data)try{let r=JSON.parse(e.data.response.data);(r.error==="REFRESH_TOKEN_INVALID"||r.error==="TOKEN_EXPIRED")&&(t.isAuthError=!0,t.errorType="Parsed Data Format",t.errorDetails=r,t.isRefreshTokenInvalid=!0,t.isIrrecoverable=!0)}catch{}if(!t.isAuthError&&e.errorCode){let r=e.errorCode;(r==="UNAUTHORIZED"||r==="UNAUTHENTICATED"||r==="TOKEN_EXPIRED")&&(t.isAuthError=!0,t.errorType="Error Code Format",t.errorDetails={errorCode:r})}return t}updateLastActivity(){this.lastActivityTime=Date.now(),this.log("Last activity updated")}getTimeSinceLastActivity(){return this.lastActivityTime===0?0:Date.now()-this.lastActivityTime}checkInactivity(){let e=this.getTimeSinceLastActivity(),t=m.getTokenData();if(this.lastActivityTime===0)return"none";let r=900*1e3,i=300*1e3,u=300*1e3;return e>r?(this.log(`Inactivity timeout: ${Math.floor(e/6e4)} minutes since last activity`),"logout"):e<i&&t.expiresIn<u&&t.expiresIn>0?(this.log(`User active recently (${Math.floor(e/6e4)}min ago) and token expiring soon, should refresh`),"refresh"):"none"}clearSession(){g.clearTokens(),m.logout(),this.lastActivityTime=0,this.log("Session cleared completely")}getSessionExpiredMessage(){return this.config.translateFn?F("SESSION_EXPIRED",{translateFn:this.config.translateFn,enableDebug:this.config.enableLogging}):"Tu sesi\xF3n ha expirado. Por favor, inicia sesi\xF3n nuevamente."}log(e,...t){this.config.enableLogging&&console.log(`[SessionManager] ${e}`,...t)}formatError(e){return e?typeof e=="string"?e:typeof e=="object"?Object.values(e).flat().join(", "):"Authentication failed":"Unknown error"}};import{useState as ee,useEffect as V,useCallback as w}from"react";function j(o={}){let[e,t]=ee({isAuthenticated:!1,isLoading:!0,isInitialized:!1,tokens:null,error:null}),r=P.getInstance(),i=w(async()=>{try{t(s=>({...s,isLoading:!0,error:null}));let l={autoRestore:o.autoRestore??!0,enableLogging:o.enableLogging??!1,showNotification:o.showNotification,translateFn:o.translateFn,onSessionExpired:()=>{t(s=>({...s,isAuthenticated:!1,tokens:null,error:"Session expired"})),o.onSessionExpired?.()},onSessionRestored:s=>{t(d=>({...d,isAuthenticated:!0,tokens:s,error:null})),o.onSessionRestored?.(s)},onLoginSuccess:s=>{t(d=>({...d,isAuthenticated:!0,tokens:s,error:null}))},onLogout:()=>{t(s=>({...s,isAuthenticated:!1,tokens:null,error:null}))}};await r.initialize(l),r.setupResponseInterceptor();let n=r.isAuthenticated(),c=r.getTokenInfo();t(s=>({...s,isAuthenticated:n,isInitialized:!0,isLoading:!1,tokens:c.crudifyTokens.accessToken?{accessToken:c.crudifyTokens.accessToken,refreshToken:c.crudifyTokens.refreshToken,expiresAt:c.crudifyTokens.expiresAt,refreshExpiresAt:c.crudifyTokens.refreshExpiresAt}:null}))}catch(l){let n=l instanceof Error?l.message:"Initialization failed";t(c=>({...c,isLoading:!1,isInitialized:!0,error:n}))}},[o.autoRestore,o.enableLogging,o.onSessionExpired,o.onSessionRestored]),u=w(async(l,n)=>{t(c=>({...c,isLoading:!0,error:null}));try{let c=await r.login(l,n);return c.success&&c.tokens?t(s=>({...s,isAuthenticated:!0,tokens:c.tokens,isLoading:!1,error:null})):t(s=>({...s,isAuthenticated:!1,tokens:null,isLoading:!1,error:null})),c}catch(c){let s=c instanceof Error?c.message:"Login failed",d=s.includes("INVALID_CREDENTIALS")||s.includes("Invalid email")||s.includes("Invalid password")||s.includes("credentials");return t(T=>({...T,isAuthenticated:!1,tokens:null,isLoading:!1,error:d?null:s})),{success:!1,error:s}}},[r]),v=w(async()=>{t(l=>({...l,isLoading:!0}));try{await r.logout(),t(l=>({...l,isAuthenticated:!1,tokens:null,isLoading:!1,error:null}))}catch(l){t(n=>({...n,isAuthenticated:!1,tokens:null,isLoading:!1,error:l instanceof Error?l.message:"Logout error"}))}},[r]),p=w(async()=>{try{let l=await r.refreshTokens();if(l){let n=r.getTokenInfo();t(c=>({...c,tokens:n.crudifyTokens.accessToken?{accessToken:n.crudifyTokens.accessToken,refreshToken:n.crudifyTokens.refreshToken,expiresAt:n.crudifyTokens.expiresAt,refreshExpiresAt:n.crudifyTokens.refreshExpiresAt}:null,error:null}))}else t(n=>({...n,isAuthenticated:!1,tokens:null,error:"Token refresh failed"}));return l}catch(l){return t(n=>({...n,isAuthenticated:!1,tokens:null,error:l instanceof Error?l.message:"Token refresh failed"})),!1}},[r]),x=w(()=>{t(l=>({...l,error:null}))},[]),k=w(()=>r.getTokenInfo(),[r]);V(()=>{i()},[i]),V(()=>{if(!e.isAuthenticated||!e.tokens)return;let l=()=>{r.updateLastActivity(),o.enableLogging&&console.log("\u{1F4CD} User navigating - activity updated")};window.addEventListener("popstate",l);let n=window.history.pushState,c=window.history.replaceState;window.history.pushState=function(...d){let T=n.apply(this,d);return l(),T},window.history.replaceState=function(...d){let T=c.apply(this,d);return l(),T};let s=setInterval(async()=>{let d=r.checkInactivity();if(d==="logout")o.enableLogging&&console.log("\u23F1\uFE0F Inactivity timeout - logging out user"),await v();else if(d==="refresh"&&(o.enableLogging&&console.log("\u{1F504} User active, token expiring soon - refreshing..."),await r.refreshTokens())){let h=r.getTokenInfo();t(b=>({...b,tokens:h.crudifyTokens.accessToken?{accessToken:h.crudifyTokens.accessToken,refreshToken:h.crudifyTokens.refreshToken,expiresAt:h.crudifyTokens.expiresAt,refreshExpiresAt:h.crudifyTokens.refreshExpiresAt}:null}))}},120*1e3);return()=>{clearInterval(s),window.removeEventListener("popstate",l),window.history.pushState=n,window.history.replaceState=c}},[e.isAuthenticated,e.tokens,r,o.enableLogging,v]);let S=w(()=>{r.updateLastActivity()},[r]);return{...e,login:u,logout:v,refreshTokens:p,clearError:x,getTokenInfo:k,updateActivity:S,isExpiringSoon:e.tokens?e.tokens.expiresAt-Date.now()<300*1e3:!1,expiresIn:e.tokens?Math.max(0,e.tokens.expiresAt-Date.now()):0,refreshExpiresIn:e.tokens?Math.max(0,e.tokens.refreshExpiresAt-Date.now()):0}}import{useState as W,createContext as te,useContext as re,useCallback as O,useEffect as oe}from"react";import{Snackbar as ne,Alert as ie,Box as se,Portal as ae}from"@mui/material";import{v4 as ce}from"uuid";import le from"dompurify";import{jsx as I,jsxs as de}from"react/jsx-runtime";var B=te(null),ue=o=>le.sanitize(o,{ALLOWED_TAGS:["b","i","em","strong","br","span"],ALLOWED_ATTR:["class"],FORBID_TAGS:["script","iframe","object","embed"],FORBID_ATTR:["onload","onerror","onclick","onmouseover","onfocus","onblur"],WHOLE_DOCUMENT:!1,RETURN_DOM:!1,RETURN_DOM_FRAGMENT:!1,RETURN_TRUSTED_TYPE:!1}),J=({children:o,maxNotifications:e=5,defaultAutoHideDuration:t=6e3,position:r={vertical:"top",horizontal:"right"},enabled:i=!1,allowHtml:u=!1})=>{let[v,p]=W([]),x=O((n,c="info",s)=>{if(!i)return"";if(!n||typeof n!="string")return console.warn("\u26A0\uFE0F GlobalNotificationProvider: Invalid message provided"),"";n.length>1e3&&(console.warn("\u26A0\uFE0F GlobalNotificationProvider: Message too long, truncating"),n=n.substring(0,1e3)+"...");let d=ce(),T={id:d,message:n,severity:c,autoHideDuration:s?.autoHideDuration??t,persistent:s?.persistent??!1,allowHtml:s?.allowHtml??u};return p(h=>[...h.length>=e?h.slice(-(e-1)):h,T]),d},[e,t,i,u]),k=O(n=>{p(c=>c.filter(s=>s.id!==n))},[]),S=O(()=>{p([])},[]),l={showNotification:x,hideNotification:k,clearAllNotifications:S};return de(B.Provider,{value:l,children:[o,i&&I(ae,{children:I(se,{sx:{position:"fixed",zIndex:9999,[r.vertical]:(r.vertical==="top",24),[r.horizontal]:r.horizontal==="right"||r.horizontal==="left"?24:"50%",...r.horizontal==="center"&&{transform:"translateX(-50%)"},display:"flex",flexDirection:r.vertical==="top"?"column":"column-reverse",gap:1,maxWidth:"400px",width:"auto"},children:v.map(n=>I(fe,{notification:n,onClose:()=>k(n.id)},n.id))})})]})},fe=({notification:o,onClose:e})=>{let[t,r]=W(!0),i=O((u,v)=>{v!=="clickaway"&&(r(!1),setTimeout(e,300))},[e]);return oe(()=>{if(!o.persistent&&o.autoHideDuration){let u=setTimeout(()=>{i()},o.autoHideDuration);return()=>clearTimeout(u)}},[o.autoHideDuration,o.persistent,i]),I(ne,{open:t,onClose:i,sx:{position:"relative","& .MuiSnackbarContent-root":{minWidth:"auto"}},TransitionProps:{enter:!0,exit:!0},children:I(ie,{variant:"filled",severity:o.severity,onClose:i,sx:{width:"100%",minWidth:"280px",maxWidth:"400px",wordBreak:"break-word"},children:o.allowHtml?I("span",{dangerouslySetInnerHTML:{__html:ue(o.message)}}):I("span",{children:o.message})})})},_=()=>{let o=re(B);if(!o)throw new Error("useGlobalNotification debe ser usado dentro de un GlobalNotificationProvider");return o};import ge,{createContext as pe,useContext as he,useMemo as $}from"react";import{Fragment as M,jsx as y,jsxs as A}from"react/jsx-runtime";var X=pe(void 0);function ye({children:o,options:e={},config:t,showNotifications:r=!1,notificationOptions:i={}}){let u;try{let{showNotification:n}=_();u=n}catch{}let v=ge.useMemo(()=>({...e,showNotification:u,onSessionExpired:()=>{e.onSessionExpired?.()}}),[e,u]),p=j(v),x=$(()=>{let n,c,s,d,T,h="unknown";if(t?.publicApiKey&&(n=t.publicApiKey,h="props"),t?.env&&(c=t.env),t?.appName&&(s=t.appName),t?.loginActions&&(d=t.loginActions),t?.logo&&(T=t.logo),!n){let b=D("publicApiKey"),N=D("environment"),R=D("appName"),E=D("loginActions"),f=D("logo");b&&(n=b,h="cookies"),N&&["dev","stg","prod"].includes(N)&&(c=N),R&&(s=decodeURIComponent(R)),E&&(d=decodeURIComponent(E).split(",").map(L=>L.trim()).filter(Boolean)),f&&(T=decodeURIComponent(f))}return{publicApiKey:n,env:c,appName:s,loginActions:d,logo:T}},[t]),k=$(()=>{if(!p.tokens?.accessToken||!p.isAuthenticated)return null;try{let n=G(p.tokens.accessToken);if(n&&n.sub&&n.email&&n.subscriber){let c={_id:n.sub,email:n.email,subscriberKey:n.subscriber};return Object.keys(n).forEach(s=>{["sub","email","subscriber"].includes(s)||(c[s]=n[s])}),c}}catch(n){console.error("Error decoding JWT token for sessionData:",n)}return null},[p.tokens?.accessToken,p.isAuthenticated]),S={...p,sessionData:k,config:x},l={enabled:r,maxNotifications:i.maxNotifications||5,defaultAutoHideDuration:i.defaultAutoHideDuration||6e3,position:i.position||{vertical:"top",horizontal:"right"}};return y(X.Provider,{value:S,children:o})}function Be(o){let e={enabled:o.showNotifications,maxNotifications:o.notificationOptions?.maxNotifications||5,defaultAutoHideDuration:o.notificationOptions?.defaultAutoHideDuration||6e3,position:o.notificationOptions?.position||{vertical:"top",horizontal:"right"},allowHtml:o.notificationOptions?.allowHtml||!1};return y(J,{...e,children:y(ye,{...o})})}function Z(){let o=he(X);if(o===void 0)throw new Error("useSessionContext must be used within a SessionProvider");return o}function Je({children:o,fallback:e=y("div",{children:"Please log in to access this content"}),redirectTo:t}){let{isAuthenticated:r,isLoading:i,isInitialized:u}=Z();return!u||i?y("div",{children:"Loading..."}):r?y(M,{children:o}):t?(t(),null):y(M,{children:e})}function _e(){let o=Z();return o.isInitialized?A("div",{style:{padding:"10px",margin:"10px",border:"1px solid #ccc",borderRadius:"4px",fontSize:"12px",fontFamily:"monospace"},children:[y("h4",{children:"Session Debug Info"}),A("div",{children:[y("strong",{children:"Authenticated:"})," ",o.isAuthenticated?"Yes":"No"]}),A("div",{children:[y("strong",{children:"Loading:"})," ",o.isLoading?"Yes":"No"]}),A("div",{children:[y("strong",{children:"Error:"})," ",o.error||"None"]}),o.tokens&&A(M,{children:[A("div",{children:[y("strong",{children:"Access Token:"})," ",o.tokens.accessToken.substring(0,20),"..."]}),A("div",{children:[y("strong",{children:"Refresh Token:"})," ",o.tokens.refreshToken.substring(0,20),"..."]}),A("div",{children:[y("strong",{children:"Access Expires In:"})," ",Math.round(o.expiresIn/1e3/60)," minutes"]}),A("div",{children:[y("strong",{children:"Refresh Expires In:"})," ",Math.round(o.refreshExpiresIn/1e3/60/60)," hours"]}),A("div",{children:[y("strong",{children:"Expiring Soon:"})," ",o.isExpiringSoon?"Yes":"No"]})]})]}):y("div",{children:"Session not initialized"})}import{useState as U,useEffect as q,useCallback as Q,useRef as K}from"react";import Te from"@nocios/crudify-browser";var et=(o={})=>{let{autoFetch:e=!0,retryOnError:t=!1,maxRetries:r=3}=o,[i,u]=U(null),[v,p]=U(!1),[x,k]=U(null),[S,l]=U({}),n=K(null),c=K(!0),s=K(0),d=K(0),T=Q(()=>{u(null),k(null),p(!1),l({})},[]),h=Q(async()=>{let b=Y();if(!b){c.current&&(k("No user email available"),p(!1));return}n.current&&n.current.abort();let N=new AbortController;n.current=N;let R=++s.current;try{c.current&&(p(!0),k(null));let E=await Te.readItems("users",{filter:{email:b},pagination:{limit:1}});if(R===s.current&&c.current&&!N.signal.aborted)if(E.success&&E.data&&E.data.length>0){let f=E.data[0];u(f);let H={fullProfile:f,totalFields:Object.keys(f).length,displayData:{id:f.id,email:f.email,username:f.username,firstName:f.firstName,lastName:f.lastName,fullName:f.fullName||`${f.firstName||""} ${f.lastName||""}`.trim(),role:f.role,permissions:f.permissions||[],isActive:f.isActive,lastLogin:f.lastLogin,createdAt:f.createdAt,updatedAt:f.updatedAt,...Object.keys(f).filter(L=>!["id","email","username","firstName","lastName","fullName","role","permissions","isActive","lastLogin","createdAt","updatedAt"].includes(L)).reduce((L,z)=>({...L,[z]:f[z]}),{})}};l(H),k(null),d.current=0}else k("User profile not found"),u(null),l({})}catch(E){if(R===s.current&&c.current){let f=E;if(f.name==="AbortError")return;t&&d.current<r&&(f.message?.includes("Network Error")||f.message?.includes("Failed to fetch"))?(d.current++,setTimeout(()=>{c.current&&h()},1e3*d.current)):(k("Failed to load user profile"),u(null),l({}))}}finally{R===s.current&&c.current&&p(!1),n.current===N&&(n.current=null)}},[t,r]);return q(()=>{e&&h()},[e,h]),q(()=>(c.current=!0,()=>{c.current=!1,n.current&&(n.current.abort(),n.current=null)}),[]),{userProfile:i,loading:v,error:x,extendedData:S,refreshProfile:h,clearProfile:T}};export{g as a,P as b,j as c,J as d,_ as e,Be as f,Z as g,Je as h,_e as i,et as j};
|
package/dist/components.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkQ7FTH5JWjs = require('./chunk-Q7FTH5JW.js');var _chunk2OSNNNIDjs = require('./chunk-2OSNNNID.js');require('./chunk-YIIUEOXC.js');require('./chunk-6EBMA4HZ.js');exports.CrudifyLogin = _chunkQ7FTH5JWjs.a; exports.GlobalNotificationProvider = _chunk2OSNNNIDjs.d; exports.LoginComponent = _chunkQ7FTH5JWjs.f; exports.Policies = _chunkQ7FTH5JWjs.e; exports.SessionStatus = _chunkQ7FTH5JWjs.g; exports.UserProfileDisplay = _chunkQ7FTH5JWjs.b; exports.useGlobalNotification = _chunk2OSNNNIDjs.e;
|
package/dist/components.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as r,b as t,e,f,g as n}from"./chunk-
|
|
1
|
+
import{a as r,b as t,e,f,g as n}from"./chunk-5PZJJNHP.mjs";import{d as o,e as i}from"./chunk-VVXZWBHL.mjs";import"./chunk-BJ6PIVZR.mjs";import"./chunk-YS3C7YG5.mjs";export{r as CrudifyLogin,o as GlobalNotificationProvider,f as LoginComponent,e as Policies,n as SessionStatus,t as UserProfileDisplay,i as useGlobalNotification};
|
package/dist/hooks.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { d as SessionState, j as UseAuthReturn, l as UseDataReturn, U as UseSessionOptions, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-
|
|
1
|
+
export { d as SessionState, j as UseAuthReturn, l as UseDataReturn, U as UseSessionOptions, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-BoWx_rFw.mjs';
|
|
2
2
|
import './api-Djqihi4n.mjs';
|
|
3
3
|
import './GlobalNotificationProvider-C3iWgM1z.mjs';
|
|
4
4
|
import 'react';
|
package/dist/hooks.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { d as SessionState, j as UseAuthReturn, l as UseDataReturn, U as UseSessionOptions, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-
|
|
1
|
+
export { d as SessionState, j as UseAuthReturn, l as UseDataReturn, U as UseSessionOptions, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-CQttyYlB.js';
|
|
2
2
|
import './api-Djqihi4n.js';
|
|
3
3
|
import './GlobalNotificationProvider-C3iWgM1z.js';
|
|
4
4
|
import 'react';
|
package/dist/hooks.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk3SLGRD36js = require('./chunk-3SLGRD36.js');var _chunk2OSNNNIDjs = require('./chunk-2OSNNNID.js');require('./chunk-6EBMA4HZ.js');exports.useAuth = _chunk3SLGRD36js.b; exports.useCrudifyWithNotifications = _chunk3SLGRD36js.d; exports.useData = _chunk3SLGRD36js.c; exports.useSession = _chunk2OSNNNIDjs.c; exports.useUserData = _chunk3SLGRD36js.a; exports.useUserProfile = _chunk2OSNNNIDjs.j;
|
package/dist/hooks.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as s,b as r,c as o,d as a}from"./chunk-
|
|
1
|
+
import{a as s,b as r,c as o,d as a}from"./chunk-5INZZQD6.mjs";import{c as e,j as t}from"./chunk-VVXZWBHL.mjs";import"./chunk-YS3C7YG5.mjs";export{r as useAuth,a as useCrudifyWithNotifications,o as useData,e as useSession,s as useUserData,t as useUserProfile};
|
|
@@ -99,6 +99,7 @@ declare class SessionManager {
|
|
|
99
99
|
private static instance;
|
|
100
100
|
private config;
|
|
101
101
|
private initialized;
|
|
102
|
+
private lastActivityTime;
|
|
102
103
|
private constructor();
|
|
103
104
|
static getInstance(): SessionManager;
|
|
104
105
|
/**
|
|
@@ -114,7 +115,7 @@ declare class SessionManager {
|
|
|
114
115
|
*/
|
|
115
116
|
logout(): Promise<void>;
|
|
116
117
|
/**
|
|
117
|
-
* Restaurar sesión desde storage
|
|
118
|
+
* ✅ MEJORADO: Restaurar sesión desde storage con validación robusta
|
|
118
119
|
*/
|
|
119
120
|
restoreSession(): Promise<boolean>;
|
|
120
121
|
/**
|
|
@@ -133,6 +134,9 @@ declare class SessionManager {
|
|
|
133
134
|
refreshExpiresAt: number;
|
|
134
135
|
isExpired: boolean;
|
|
135
136
|
isRefreshExpired: boolean;
|
|
137
|
+
isValid: boolean;
|
|
138
|
+
expiresIn: number;
|
|
139
|
+
willExpireSoon: boolean;
|
|
136
140
|
};
|
|
137
141
|
storageInfo: {
|
|
138
142
|
accessExpired: boolean;
|
|
@@ -154,6 +158,20 @@ declare class SessionManager {
|
|
|
154
158
|
* Detectar errores de autorización en todos los formatos posibles
|
|
155
159
|
*/
|
|
156
160
|
private detectAuthorizationError;
|
|
161
|
+
/**
|
|
162
|
+
* ✅ FASE 2: Actualizar timestamp de última actividad del usuario
|
|
163
|
+
* Debe llamarse cuando el usuario realiza cualquier acción (CRUD, navegación, etc.)
|
|
164
|
+
*/
|
|
165
|
+
updateLastActivity(): void;
|
|
166
|
+
/**
|
|
167
|
+
* ✅ FASE 2: Obtener tiempo transcurrido desde última actividad (en milisegundos)
|
|
168
|
+
*/
|
|
169
|
+
getTimeSinceLastActivity(): number;
|
|
170
|
+
/**
|
|
171
|
+
* ✅ FASE 2: Verificar inactividad y determinar acción necesaria
|
|
172
|
+
* @returns 'logout' si debe desloguear, 'refresh' si debe renovar, 'none' si no hace nada
|
|
173
|
+
*/
|
|
174
|
+
checkInactivity(): "logout" | "refresh" | "none";
|
|
157
175
|
/**
|
|
158
176
|
* Limpiar sesión completamente
|
|
159
177
|
*/
|
|
@@ -195,6 +213,9 @@ declare function useSession(options?: UseSessionOptions): {
|
|
|
195
213
|
refreshExpiresAt: number;
|
|
196
214
|
isExpired: boolean;
|
|
197
215
|
isRefreshExpired: boolean;
|
|
216
|
+
isValid: boolean;
|
|
217
|
+
expiresIn: number;
|
|
218
|
+
willExpireSoon: boolean;
|
|
198
219
|
};
|
|
199
220
|
storageInfo: {
|
|
200
221
|
accessExpired: boolean;
|
|
@@ -204,6 +225,7 @@ declare function useSession(options?: UseSessionOptions): {
|
|
|
204
225
|
} | null;
|
|
205
226
|
hasValidTokens: boolean;
|
|
206
227
|
};
|
|
228
|
+
updateActivity: () => void;
|
|
207
229
|
isExpiringSoon: boolean;
|
|
208
230
|
expiresIn: number;
|
|
209
231
|
refreshExpiresIn: number;
|
|
@@ -99,6 +99,7 @@ declare class SessionManager {
|
|
|
99
99
|
private static instance;
|
|
100
100
|
private config;
|
|
101
101
|
private initialized;
|
|
102
|
+
private lastActivityTime;
|
|
102
103
|
private constructor();
|
|
103
104
|
static getInstance(): SessionManager;
|
|
104
105
|
/**
|
|
@@ -114,7 +115,7 @@ declare class SessionManager {
|
|
|
114
115
|
*/
|
|
115
116
|
logout(): Promise<void>;
|
|
116
117
|
/**
|
|
117
|
-
* Restaurar sesión desde storage
|
|
118
|
+
* ✅ MEJORADO: Restaurar sesión desde storage con validación robusta
|
|
118
119
|
*/
|
|
119
120
|
restoreSession(): Promise<boolean>;
|
|
120
121
|
/**
|
|
@@ -133,6 +134,9 @@ declare class SessionManager {
|
|
|
133
134
|
refreshExpiresAt: number;
|
|
134
135
|
isExpired: boolean;
|
|
135
136
|
isRefreshExpired: boolean;
|
|
137
|
+
isValid: boolean;
|
|
138
|
+
expiresIn: number;
|
|
139
|
+
willExpireSoon: boolean;
|
|
136
140
|
};
|
|
137
141
|
storageInfo: {
|
|
138
142
|
accessExpired: boolean;
|
|
@@ -154,6 +158,20 @@ declare class SessionManager {
|
|
|
154
158
|
* Detectar errores de autorización en todos los formatos posibles
|
|
155
159
|
*/
|
|
156
160
|
private detectAuthorizationError;
|
|
161
|
+
/**
|
|
162
|
+
* ✅ FASE 2: Actualizar timestamp de última actividad del usuario
|
|
163
|
+
* Debe llamarse cuando el usuario realiza cualquier acción (CRUD, navegación, etc.)
|
|
164
|
+
*/
|
|
165
|
+
updateLastActivity(): void;
|
|
166
|
+
/**
|
|
167
|
+
* ✅ FASE 2: Obtener tiempo transcurrido desde última actividad (en milisegundos)
|
|
168
|
+
*/
|
|
169
|
+
getTimeSinceLastActivity(): number;
|
|
170
|
+
/**
|
|
171
|
+
* ✅ FASE 2: Verificar inactividad y determinar acción necesaria
|
|
172
|
+
* @returns 'logout' si debe desloguear, 'refresh' si debe renovar, 'none' si no hace nada
|
|
173
|
+
*/
|
|
174
|
+
checkInactivity(): "logout" | "refresh" | "none";
|
|
157
175
|
/**
|
|
158
176
|
* Limpiar sesión completamente
|
|
159
177
|
*/
|
|
@@ -195,6 +213,9 @@ declare function useSession(options?: UseSessionOptions): {
|
|
|
195
213
|
refreshExpiresAt: number;
|
|
196
214
|
isExpired: boolean;
|
|
197
215
|
isRefreshExpired: boolean;
|
|
216
|
+
isValid: boolean;
|
|
217
|
+
expiresIn: number;
|
|
218
|
+
willExpireSoon: boolean;
|
|
198
219
|
};
|
|
199
220
|
storageInfo: {
|
|
200
221
|
accessExpired: boolean;
|
|
@@ -204,6 +225,7 @@ declare function useSession(options?: UseSessionOptions): {
|
|
|
204
225
|
} | null;
|
|
205
226
|
hasValidTokens: boolean;
|
|
206
227
|
};
|
|
228
|
+
updateActivity: () => void;
|
|
207
229
|
isExpiringSoon: boolean;
|
|
208
230
|
expiresIn: number;
|
|
209
231
|
refreshExpiresIn: number;
|
package/dist/index.d.mts
CHANGED
|
@@ -2,8 +2,8 @@ export * from '@nocios/crudify-browser';
|
|
|
2
2
|
export { default as crudify } from '@nocios/crudify-browser';
|
|
3
3
|
export { B as BoxScreenType, C as CrudifyLogin, d as CrudifyLoginConfig, e as CrudifyLoginProps, f as CrudifyLoginTranslations, L as LoginComponent, a as POLICY_ACTIONS, b as PREFERRED_POLICY_ORDER, P as Policies, c as PolicyAction, S as SessionStatus, g as UserLoginData, U as UserProfileDisplay } from './index-CY6Qkw3q.mjs';
|
|
4
4
|
export { A as ApiError, C as CrudifyApiResponse, a as CrudifyTransactionResponse, F as ForgotPasswordRequest, J as JwtPayload, b as LoginRequest, L as LoginResponse, R as ResetPasswordRequest, T as TransactionResponseData, U as UserProfile, V as ValidateCodeRequest, c as ValidationError } from './api-Djqihi4n.mjs';
|
|
5
|
-
import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-
|
|
6
|
-
export { a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-
|
|
5
|
+
import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-BoWx_rFw.mjs';
|
|
6
|
+
export { a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-BoWx_rFw.mjs';
|
|
7
7
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
8
8
|
import { ReactNode } from 'react';
|
|
9
9
|
export { ERROR_CODES, ERROR_SEVERITY_MAP, ErrorCode, ErrorSeverity, ErrorTranslationConfig, ParsedError, createErrorTranslator, decodeJwtSafely, getCookie, getCurrentUserEmail, getErrorMessage, handleCrudifyError, isTokenExpired, parseApiError, parseJavaScriptError, parseTransactionError, secureLocalStorage, secureSessionStorage, translateError, translateErrorCode, translateErrorCodes } from './utils.mjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -2,8 +2,8 @@ export * from '@nocios/crudify-browser';
|
|
|
2
2
|
export { default as crudify } from '@nocios/crudify-browser';
|
|
3
3
|
export { B as BoxScreenType, C as CrudifyLogin, d as CrudifyLoginConfig, e as CrudifyLoginProps, f as CrudifyLoginTranslations, L as LoginComponent, a as POLICY_ACTIONS, b as PREFERRED_POLICY_ORDER, P as Policies, c as PolicyAction, S as SessionStatus, g as UserLoginData, U as UserProfileDisplay } from './index-DxFMT2hN.js';
|
|
4
4
|
export { A as ApiError, C as CrudifyApiResponse, a as CrudifyTransactionResponse, F as ForgotPasswordRequest, J as JwtPayload, b as LoginRequest, L as LoginResponse, R as ResetPasswordRequest, T as TransactionResponseData, U as UserProfile, V as ValidateCodeRequest, c as ValidationError } from './api-Djqihi4n.js';
|
|
5
|
-
import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-
|
|
6
|
-
export { a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-
|
|
5
|
+
import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-CQttyYlB.js';
|
|
6
|
+
export { a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-CQttyYlB.js';
|
|
7
7
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
8
8
|
import { ReactNode } from 'react';
|
|
9
9
|
export { ERROR_CODES, ERROR_SEVERITY_MAP, ErrorCode, ErrorSeverity, ErrorTranslationConfig, ParsedError, createErrorTranslator, decodeJwtSafely, getCookie, getCurrentUserEmail, getErrorMessage, handleCrudifyError, isTokenExpired, parseApiError, parseJavaScriptError, parseTransactionError, secureLocalStorage, secureSessionStorage, translateError, translateErrorCode, translateErrorCodes } from './utils.js';
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); }var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); }var _chunkQ7FTH5JWjs = require('./chunk-Q7FTH5JW.js');var _chunk3SLGRD36js = require('./chunk-3SLGRD36.js');var _chunk2OSNNNIDjs = require('./chunk-2OSNNNID.js');var _chunkNNY4A73Vjs = require('./chunk-NNY4A73V.js');var _chunkYIIUEOXCjs = require('./chunk-YIIUEOXC.js');var _chunk6EBMA4HZjs = require('./chunk-6EBMA4HZ.js');var _crudifybrowser = require('@nocios/crudify-browser'); var _crudifybrowser2 = _interopRequireDefault(_crudifybrowser); _createStarExport(_crudifybrowser);exports.CrudifyLogin = _chunkQ7FTH5JWjs.a; exports.ERROR_CODES = _chunkYIIUEOXCjs.a; exports.ERROR_SEVERITY_MAP = _chunkYIIUEOXCjs.b; exports.GlobalNotificationProvider = _chunk2OSNNNIDjs.d; exports.LoginComponent = _chunkQ7FTH5JWjs.f; exports.POLICY_ACTIONS = _chunkQ7FTH5JWjs.c; exports.PREFERRED_POLICY_ORDER = _chunkQ7FTH5JWjs.d; exports.Policies = _chunkQ7FTH5JWjs.e; exports.ProtectedRoute = _chunk2OSNNNIDjs.h; exports.SessionDebugInfo = _chunk2OSNNNIDjs.i; exports.SessionManager = _chunk2OSNNNIDjs.b; exports.SessionProvider = _chunk2OSNNNIDjs.f; exports.SessionStatus = _chunkQ7FTH5JWjs.g; exports.TokenStorage = _chunk2OSNNNIDjs.a; exports.UserProfileDisplay = _chunkQ7FTH5JWjs.b; exports.createErrorTranslator = _chunk6EBMA4HZjs.e; exports.crudify = _crudifybrowser2.default; exports.decodeJwtSafely = _chunk6EBMA4HZjs.f; exports.getCookie = _chunk6EBMA4HZjs.a; exports.getCurrentUserEmail = _chunk6EBMA4HZjs.g; exports.getErrorMessage = _chunkYIIUEOXCjs.e; exports.handleCrudifyError = _chunkYIIUEOXCjs.g; exports.isTokenExpired = _chunk6EBMA4HZjs.h; exports.parseApiError = _chunkYIIUEOXCjs.c; exports.parseJavaScriptError = _chunkYIIUEOXCjs.f; exports.parseTransactionError = _chunkYIIUEOXCjs.d; exports.secureLocalStorage = _chunkNNY4A73Vjs.b; exports.secureSessionStorage = _chunkNNY4A73Vjs.a; exports.translateError = _chunk6EBMA4HZjs.d; exports.translateErrorCode = _chunk6EBMA4HZjs.b; exports.translateErrorCodes = _chunk6EBMA4HZjs.c; exports.useAuth = _chunk3SLGRD36js.b; exports.useCrudifyWithNotifications = _chunk3SLGRD36js.d; exports.useData = _chunk3SLGRD36js.c; exports.useGlobalNotification = _chunk2OSNNNIDjs.e; exports.useSession = _chunk2OSNNNIDjs.c; exports.useSessionContext = _chunk2OSNNNIDjs.g; exports.useUserData = _chunk3SLGRD36js.a; exports.useUserProfile = _chunk2OSNNNIDjs.j;
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as U,b as L,c as v,d as O,e as h,f as k,g as A}from"./chunk-
|
|
1
|
+
import{a as U,b as L,c as v,d as O,e as h,f as k,g as A}from"./chunk-5PZJJNHP.mjs";import{a as N,b,c as _,d as w}from"./chunk-5INZZQD6.mjs";import{a as r,b as a,c as n,d as m,e as l,f as x,g as d,h as y,i as c,j as T}from"./chunk-VVXZWBHL.mjs";import{a as I,b as q}from"./chunk-T2CPA46I.mjs";import{a as S,b as P,c as R,d as g,e as E,f as C,g as D}from"./chunk-BJ6PIVZR.mjs";import{a as o,b as e,c as t,d as s,e as i,f as p,g as f,h as u}from"./chunk-YS3C7YG5.mjs";import{default as J}from"@nocios/crudify-browser";export*from"@nocios/crudify-browser";export{U as CrudifyLogin,S as ERROR_CODES,P as ERROR_SEVERITY_MAP,m as GlobalNotificationProvider,k as LoginComponent,v as POLICY_ACTIONS,O as PREFERRED_POLICY_ORDER,h as Policies,y as ProtectedRoute,c as SessionDebugInfo,a as SessionManager,x as SessionProvider,A as SessionStatus,r as TokenStorage,L as UserProfileDisplay,i as createErrorTranslator,J as crudify,p as decodeJwtSafely,o as getCookie,f as getCurrentUserEmail,E as getErrorMessage,D as handleCrudifyError,u as isTokenExpired,R as parseApiError,C as parseJavaScriptError,g as parseTransactionError,q as secureLocalStorage,I as secureSessionStorage,s as translateError,e as translateErrorCode,t as translateErrorCodes,b as useAuth,w as useCrudifyWithNotifications,_ as useData,l as useGlobalNotification,n as useSession,d as useSessionContext,N as useUserData,T as useUserProfile};
|