@frank-auth/react
Version:
Flexible and customizable React UI components for Frank Authentication
4 lines (3 loc) • 7.17 kB
JavaScript
'use client';
;Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("react/jsx-runtime"),t=require("react"),g=require("../config/index.cjs"),p=require("../config/defaults.cjs"),_=require("../config/validators.cjs"),c=t.createContext(null);function k(e,a){switch(a.type){case"SET_LOADED":return{...e,isLoaded:a.payload};case"SET_CONFIG":return{...e,config:a.payload,publishableKey:a.payload.publishableKey,secretKey:a.payload.secretKey,projectId:a.payload.projectId,userType:a.payload.userType,apiUrl:a.payload.apiUrl||e.apiUrl,theme:a.payload.theme||e.theme,appearance:a.payload.appearance||e.appearance,localization:a.payload.localization||e.localization,components:a.payload.components||e.components,linksPath:{...e.linksPath??{},...a.payload.linksPath},features:a.payload.features||e.features,debug:a.payload.debug||e.debug,frontendUrl:a.payload.frontendUrl||e.frontendUrl};case"UPDATE_CONFIG":const i={...e.config,...a.payload};return{...e,config:i,theme:a.payload.theme||e.theme,appearance:a.payload.appearance||e.appearance,localization:a.payload.localization||e.localization,components:a.payload.components||e.components,linksPath:{...e.linksPath??{},...a.payload.linksPath},features:a.payload.features||e.features,debug:a.payload.debug!==void 0?a.payload.debug:e.debug,frontendUrl:a.payload.frontendUrl||e.frontendUrl};case"SET_ORGANIZATION":return{...e,organizationConfig:a.payload,config:{...e.config,organization:a.payload,projectId:a.payload.id}};case"SET_ORGANIZATION_SETTINGS":return{...e,organizationSettings:a.payload};case"SET_THEME":return{...e,theme:a.payload,config:{...e.config,theme:a.payload}};case"SET_APPEARANCE":return{...e,appearance:a.payload,config:{...e.config,appearance:a.payload}};case"SET_LOCALIZATION":return{...e,localization:a.payload,config:{...e.config,localization:a.payload}};case"SET_COMPONENTS":return{...e,components:a.payload,config:{...e.config,components:a.payload}};case"SET_FEATURES":return{...e,features:a.payload,config:{...e.config,features:a.payload}};case"SET_DEBUG":return{...e,debug:a.payload,config:{...e.config,debug:a.payload}};case"RESET_CONFIG":return{...y,publishableKey:e.publishableKey,secretKey:e.secretKey,projectId:e.projectId,userType:e.userType,apiUrl:e.apiUrl,isLoaded:!0};default:return e}}const y={isLoaded:!1,config:p.DEFAULT_FRANK_AUTH_CONFIG,publishableKey:"",userType:"external",apiUrl:"https://api.frankauth.com",theme:p.DEFAULT_FRANK_AUTH_CONFIG.theme,appearance:p.DEFAULT_FRANK_AUTH_CONFIG.appearance,localization:p.DEFAULT_FRANK_AUTH_CONFIG.localization,components:{},linksPath:{signUp:"/auth/sign-up",magicLink:"/auth/magic-link",verify:"/auth/verify",signIn:"/auth/sign-in",resetPassword:"/auth/reset-password",forgotPassword:"/auth/forgot-password",signOut:"/auth/sign-out"},features:{signUp:!0,signIn:!0,passwordReset:!0,mfa:!1,passkeys:!1,oauth:!1,magicLink:!1,sso:!1,organizationManagement:!1,userProfile:!0,sessionManagement:!0},debug:!1};function I({children:e,config:a,onConfigChange:i}){const[s,l]=t.useReducer(k,y),o=t.useMemo(()=>{try{const r=g.createFrankAuthConfig(a);return new g.ConfigManager(r)}catch(r){throw console.error("[FrankAuth] Invalid configuration:",r),r}},[a]);t.useEffect(()=>{const r=o.getConfig();l({type:"SET_CONFIG",payload:r}),l({type:"SET_LOADED",payload:!0})},[o]),t.useEffect(()=>o.subscribe(n=>{l({type:"SET_CONFIG",payload:n}),i?.(n)}),[o,i]),t.useEffect(()=>{typeof window<"u"&&s.isLoaded&&o.applyToDOM()},[o,s.isLoaded,s.theme,s.appearance]);const h=t.useCallback(r=>{try{const n=_.validateFrankAuthConfig({...s.config,...r});if(!n.isValid){const d=n.errors.map(S=>S.message).join(", ");throw new Error(`Configuration validation failed: ${d}`)}o.updateConfig(r),l({type:"UPDATE_CONFIG",payload:r})}catch(n){throw console.error("[FrankAuth] Configuration update failed:",n),n}},[o,s.config]),m=t.useCallback(r=>{try{const n={id:r.id,name:r.name,slug:r.slug||"",settings:r.settings||{},features:{sso:r.ssoEnabled||!1,mfa:r.settings?.mfaSettings?.enabled||!1,auditLogs:r.settings?.auditSettings?.enabled||!1,customBranding:!!r.settings?.branding,apiAccess:r.apiEnabled||!1},limits:{maxUsers:r.userLimit||100,maxSessions:r.sessionLimit||10,apiRequestLimit:r.apiRequestLimit||1e3}};o.setOrganization(n),l({type:"SET_ORGANIZATION",payload:n});const d=F(n);l({type:"SET_FEATURES",payload:d})}catch(n){throw console.error("[FrankAuth] Failed to set organization:",n),n}},[o]),C=t.useCallback(r=>{try{o.getThemeManager().setTheme(r),l({type:"SET_THEME",payload:o.getThemeManager().getTheme()})}catch(n){throw console.error("[FrankAuth] Failed to set theme:",n),n}},[o]),T=t.useCallback(r=>{try{o.getAppearanceManager().updateConfig(r),l({type:"SET_APPEARANCE",payload:o.getAppearanceManager().getConfig()})}catch(n){throw console.error("[FrankAuth] Failed to set appearance:",n),n}},[o]),E=t.useCallback(r=>{try{o.getLocalizationManager().setLocale(r),l({type:"SET_LOCALIZATION",payload:{...s.localization,defaultLocale:r}})}catch(n){throw console.error("[FrankAuth] Failed to set locale:",n),n}},[o,s.localization]),b=t.useCallback(r=>{try{if(r.settings?.branding){const n={logo:{url:r.logoUrl,alt:r.name},colors:{primary:r.settings.branding.primaryColor||"#3b82f6",secondary:r.settings.branding.secondaryColor||"#64748b"},fonts:{primary:"Inter, ui-sans-serif, system-ui, sans-serif"},customCSS:r.settings.branding.customCSS};o.getThemeManager().applyBranding(n),o.getAppearanceManager().applyOrganizationBranding(r)}}catch(n){throw console.error("[FrankAuth] Failed to apply organization branding:",n),n}},[o]),A=t.useCallback(()=>{try{o.reset(),l({type:"RESET_CONFIG"})}catch(r){throw console.error("[FrankAuth] Failed to reset configuration:",r),r}},[o]),F=r=>{const n=r.settings;return{signUp:n.allowPublicSignup||!1,signIn:!0,passwordReset:!0,mfa:r.features.mfa,passkeys:n.authConfig?.passkeysEnabled||!1,oauth:n.authConfig?.oauthEnabled||!1,magicLink:n.authConfig?.magicLinkEnabled||!1,sso:r.features.sso,organizationManagement:!0,userProfile:!0,sessionManagement:!0}},O={...s,updateConfig:h,setOrganization:m,setTheme:C,setAppearance:T,setLocale:E,applyOrganizationBranding:b,resetToDefaults:A};return f.jsx(c.Provider,{value:O,children:e})}function u(){const e=t.useContext(c);if(!e)throw new Error("useConfig must be used within a ConfigProvider");return e}function N(){const{features:e}=u();return{...e,hasFeature:a=>e[a],requireFeature:a=>{if(!e[a])throw new Error(`Feature ${a} is not enabled`)}}}function U(){const{organizationConfig:e,organizationSettings:a,setOrganization:i,applyOrganizationBranding:s}=u();return{organization:e,settings:a,setOrganization:i,applyBranding:s,hasOrganization:!!e,isMultiTenant:!!e}}function w(){const{components:e}=u(),a=t.useCallback((i,s)=>e[i]||s,[e]);return{components:e,getComponent:a,hasOverride:i=>!!e[i]}}function L(e){const a=i=>{const s=u();return f.jsx(e,{...i,config:s})};return a.displayName=`withConfig(${e.displayName||e.name})`,a}exports.ConfigContext=c;exports.ConfigProvider=I;exports.useComponentOverrides=w;exports.useConfig=u;exports.useFeatures=N;exports.useOrganizationConfig=U;exports.withConfig=L;
//# sourceMappingURL=config-provider.cjs.map