UNPKG

@frank-auth/react

Version:

Flexible and customizable React UI components for Frank Authentication

4 lines (3 loc) 9.14 kB
'use client'; "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $=require("react/jsx-runtime"),n=require("react"),h=require("@frank-auth/sdk"),_=n.createContext(null);function J(l,o){switch(o.type){case"SET_LOADING":return{...l,isLoading:o.payload};case"SET_LOADED":return{...l,isLoaded:o.payload};case"SET_USER":return{...l,user:o.payload,isSignedIn:!!o.payload,error:null};case"SET_SESSION":return{...l,session:o.payload,error:null};case"SET_ORGANIZATION":return{...l,organization:o.payload,error:null};case"SET_ACTIVE_ORGANIZATION":return{...l,activeOrganization:o.payload,error:null};case"SET_MEMBERSHIPS":return{...l,organizationMemberships:o.payload,error:null};case"SET_FEATURES":return{...l,features:o.payload};case"SET_ERROR":return{...l,error:o.payload,isLoading:!1};case"RESET_STATE":return{...k,isLoaded:!0};default:return l}}const k={isLoaded:!1,isLoading:!1,isSignedIn:!1,user:null,session:null,organization:null,organizationMemberships:[],activeOrganization:null,error:null,features:{signUp:!0,signIn:!0,passwordReset:!0,mfa:!1,passkeys:!1,oauth:!1,magicLink:!1,sso:!1,organizationManagement:!1,userProfile:!0,sessionManagement:!0},sdk:void 0};function Q({children:l,publishableKey:o,userType:d="external",apiUrl:y,secretKey:A,projectId:f,initialState:R,onError:I,onSignIn:p,onSignOut:T,debug:c=!1}){const[O,a]=n.useReducer(J,{...k,...R}),r=n.useMemo(()=>new h.AuthSDK({publishableKey:o,apiUrl:y,enableDevMode:c,userType:d,projectId:f,secretKey:A}),[o,y,c]),E=n.useMemo(()=>new h.OrganizationSDK({publishableKey:o,apiUrl:y,enableDevMode:c,userType:d,projectId:f,secretKey:A}),[o,y,c]),S=n.useMemo(()=>new h.SessionSDK({publishableKey:o,apiUrl:y,enableDevMode:c,userType:d,projectId:f,secretKey:A}),[o,y,c]),w=n.useMemo(()=>new h.UserSDK({publishableKey:o,apiUrl:y,enableDevMode:c,userType:d,projectId:f,secretKey:A}),[o,y,c]),L=n.useMemo(()=>({auth:r,organization:E,session:S,user:w}),[w,r,E,S]),s=n.useCallback(t=>{const e={code:t.code||"UNKNOWN_ERROR",message:t.message||"An unknown error occurred",details:t.details,field:t.field};a({type:"SET_ERROR",payload:e}),I?.(e),c&&console.error("[FrankAuth] Error:",e)},[I,c]),g=n.useCallback(async()=>{try{a({type:"SET_LOADING",payload:!0});const t=await r.getAuthStatus();if(t.isAuthenticated&&t.user){if(a({type:"SET_USER",payload:t.user}),a({type:"SET_SESSION",payload:t.session}),f||t.user.organizationId)try{const i=f||t.user.organizationId||"",u=await E.getOrganization(i);a({type:"SET_ORGANIZATION",payload:u}),a({type:"SET_ACTIVE_ORGANIZATION",payload:u});const W=await E.listMembers(i);a({type:"SET_MEMBERSHIPS",payload:W.data})}catch(i){c&&console.warn("[FrankAuth] Failed to load organization:",i)}const e=await m(t.user,O.organization,d);a({type:"SET_FEATURES",payload:e})}a({type:"SET_LOADED",payload:!0})}catch(t){s(t)}finally{a({type:"SET_LOADING",payload:!1})}},[r,f,d,c,s]),m=async(t,e,i)=>{const u={signUp:!0,signIn:!0,passwordReset:!0,mfa:!1,passkeys:!1,oauth:!1,magicLink:!1,sso:!1,organizationManagement:!1,userProfile:!0,sessionManagement:!0};if(!t)return u;switch(i){case"internal":return{...u,mfa:!0,passkeys:!0,organizationManagement:!0,sso:!0};case"external":return{...u,mfa:e?.settings?.mfaSettings?.enabled||!1,passkeys:e?.settings?.authConfig?.passkeysEnabled||!1,oauth:e?.settings?.authConfig?.oauthEnabled||!1,sso:e?.settings?.authConfig?.ssoEnabled||!1,organizationManagement:!0};case"end_user":return{...u,mfa:e?.settings?.mfaSettings?.enabled||!1,passkeys:e?.settings?.authConfig?.passkeysEnabled||!1,oauth:e?.settings?.authConfig?.oauthEnabled||!1,organizationManagement:!1};default:return u}},D=n.useCallback(async t=>{try{a({type:"SET_LOADING",payload:!0}),a({type:"SET_ERROR",payload:null});let e,i="complete";switch(t.strategy){case"password":if(!t.identifier||!t.password)throw new Error("Email/username and password are required");const u={email:t.identifier,password:t.password,organizationId:t.organizationId,rememberMe:!0};e=await r.signIn(u),e.mfaRequired?i="needs_mfa":e.verificationRequired&&(i="needs_verification");break;case"oauth":if(!t.provider)throw new Error("OAuth provider is required");e=await r.initiateOAuthLogin(t.provider,{redirectUrl:t.redirectUrl,organizationId:t.organizationId});break;case"magic_link":if(!t.identifier)throw new Error("Email is required for magic link");e=await r.sendMagicLink({email:t.identifier,redirectUrl:t.redirectUrl});break;case"passkey":e=await r.beginPasskeyAuthentication({}),i="needs_passkey";break;case"sso":if(!t.organizationId)throw new Error("Organization ID is required for SSO");e=await r.initiateSSOLogin(t.organizationId,{redirectUrl:t.redirectUrl});break;default:throw new Error(`Unsupported sign-in strategy: ${t.strategy}`)}return e.user&&e.session&&(a({type:"SET_USER",payload:e.user}),a({type:"SET_SESSION",payload:e.session}),p?.(e.user)),{status:i,user:e.user,session:e.session,verificationId:e.verificationId,mfaToken:e.mfaToken}}catch(e){return s(e),{status:"complete",error:{code:"SIGN_IN_FAILED",message:e instanceof h.FrankAuthError?e.message:"Sign in failed"}}}finally{a({type:"SET_LOADING",payload:!1})}},[r,p,s]),v=n.useCallback(async t=>{try{a({type:"SET_LOADING",payload:!0}),a({type:"SET_ERROR",payload:null});const e={email:t.emailAddress,password:t.password,firstName:t.firstName,lastName:t.lastName,username:t.username,userType:d,acceptTerms:t.acceptTerms,marketingConsent:t.marketingConsent,phoneNumber:t.phoneNumber,locale:t.locale??"en",organizationId:t.organizationId,invitationToken:t.invitationToken,customAttributes:t.unsafeMetadata},i=await r.signUp(e);i.user&&i.session&&(a({type:"SET_USER",payload:i.user}),a({type:"SET_SESSION",payload:i.session}),p?.(i.user));let u="complete";return i.verificationRequired&&(u="needs_verification"),{status:u,user:i.user,session:i.session,verificationId:i.verificationToken}}catch(e){return s(e),{status:"missing_requirements",error:{code:"SIGN_UP_FAILED",message:e instanceof Error?e.message:"Sign up failed"}}}finally{a({type:"SET_LOADING",payload:!1})}},[r,p,s]),C=n.useCallback(async()=>{try{a({type:"SET_LOADING",payload:!0}),await r.signOut({logoutAll:!1}),r.authStorage.clearAll(),a({type:"RESET_STATE"}),T?.()}catch(t){s(t)}finally{a({type:"SET_LOADING",payload:!1})}},[r,T,s]),z=n.useCallback(async t=>{try{S.activeSession=t;const e=await S.getCurrentSession();return a({type:"SET_SESSION",payload:e}),e}catch(e){throw s(e),e}},[r,s]),G=n.useCallback(async t=>{try{if(t.session){const e=t.session;typeof t.session=="string"&&(S.activeSession=t.session,await S.getCurrentSession()),a({type:"SET_SESSION",payload:e})}if(t.organization){const e=typeof t.organization=="string"?await E.getOrganization(t.organization):t.organization;a({type:"SET_ACTIVE_ORGANIZATION",payload:e})}}catch(e){s(e)}},[r,s]),M=n.useCallback(async t=>{try{let e;typeof t=="string"?e=await E.getOrganization(t):e=t,a({type:"SET_ACTIVE_ORGANIZATION",payload:e})}catch(e){s(e)}},[r,s]),b=n.useCallback(async t=>{try{a({type:"SET_LOADING",payload:!0});const e=await r.switchOrganization(t);a({type:"SET_ACTIVE_ORGANIZATION",payload:e}),await g()}catch(e){s(e)}finally{a({type:"SET_LOADING",payload:!1})}},[r,s,g]),U=n.useCallback(async t=>{try{const e=await r.updateProfile(t);return a({type:"SET_USER",payload:e}),e}catch(e){throw s(e),e}},[r,s]),P=n.useCallback(async()=>{try{await w.deleteUser(),a({type:"RESET_STATE"}),T?.()}catch(t){s(t)}},[r,s,T]),q=n.useCallback(async t=>{try{return a({type:"SET_LOADING",payload:!0}),await r.requestPasswordReset(t)}catch(e){throw s(e),e}finally{a({type:"SET_LOADING",payload:!1})}},[r,s]),x=n.useCallback(async t=>{try{return a({type:"SET_LOADING",payload:!0}),await r.resetPassword(t)}catch(e){throw s(e),e}finally{a({type:"SET_LOADING",payload:!1})}},[r,s]),F=n.useCallback(async t=>{try{return a({type:"SET_LOADING",payload:!0}),await r.resendVerification(t)}catch(e){throw s(e),e}finally{a({type:"SET_LOADING",payload:!1})}},[r,s]),V=n.useCallback(async(t,e)=>{try{return a({type:"SET_LOADING",payload:!0}),t==="phone"?await r.verifyPhone(e):await r.verifyEmail(e)}catch(i){throw s(i),i}finally{a({type:"SET_LOADING",payload:!1})}},[r,s]),Z=n.useCallback(async t=>{try{return a({type:"SET_LOADING",payload:!0}),await r.validateToken(t)}catch(e){throw s(e),e}finally{a({type:"SET_LOADING",payload:!1})}},[r,s]),B=n.useCallback(async()=>{await g()},[g]);n.useEffect(()=>{g()},[g]);const H={...O,signIn:D,signUp:v,signOut:C,createSession:z,setActive:G,setActiveOrganization:M,switchOrganization:b,updateUser:U,deleteUser:P,reload:B,requestPasswordReset:q,resetPassword:x,validateToken:Z,resendVerification:F,verifyIdentity:V,sdk:L};return $.jsx(_.Provider,{value:H,children:l})}function N(){const l=n.useContext(_);if(!l)throw new Error("useAuth must be used within an AuthProvider");return l}function X(){const{isLoaded:l,isSignedIn:o,user:d}=N();return{isLoaded:l,isSignedIn:o,user:d,isAuthenticated:l&&o,requireAuth:()=>{if(!l)throw new Error("Authentication not loaded");if(!o)throw new Error("Authentication required")}}}exports.AuthContext=_;exports.AuthProvider=Q;exports.useAuth=N;exports.useAuthGuard=X; //# sourceMappingURL=auth-provider.cjs.map