UNPKG

@frank-auth/react

Version:

Flexible and customizable React UI components for Frank Authentication

3 lines (2 loc) 5.71 kB
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),G=require("./use-auth.cjs"),H=require("../provider/config-provider.cjs"),p={google:{name:"Google",displayName:"Google",icon:"🔴",color:"#4285f4",defaultScopes:["openid","profile","email"]},microsoft:{name:"Microsoft",displayName:"Microsoft",icon:"🟦",color:"#00a1f1",defaultScopes:["openid","profile","email"]},github:{name:"GitHub",displayName:"GitHub",icon:"⚫",color:"#333333",defaultScopes:["user:email"]},apple:{name:"Apple",displayName:"Apple",icon:"🍎",color:"#000000",defaultScopes:["name","email"]},facebook:{name:"Facebook",displayName:"Facebook",icon:"🔵",color:"#1877f2",defaultScopes:["email","public_profile"]},twitter:{name:"Twitter",displayName:"Twitter",icon:"🐦",color:"#1da1f2",defaultScopes:["users.read","tweet.read"]},linkedin:{name:"LinkedIn",displayName:"LinkedIn",icon:"🔵",color:"#0077b5",defaultScopes:["r_liteprofile","r_emailaddress"]},discord:{name:"Discord",displayName:"Discord",icon:"🎮",color:"#5865f2",defaultScopes:["identify","email"]}};function O(){const{user:s,activeOrganization:b,reload:i,sdk:n}=G.useAuth(),{features:g}=H.useConfig(),[w,S]=t.useState([]),[C,c]=t.useState(!1),[k,h]=t.useState(null),a=t.useMemo(()=>g.oauth,[g.oauth]),u=t.useCallback(e=>{const o={code:e.code||"UNKNOWN_ERROR",message:e.message||"An unknown error occurred",details:e.details,field:e.field};throw h(o),o},[]),d=t.useCallback(async()=>{if(a)try{c(!0),h(null);const e=await n.auth.getOAuthProviders();S(e)}catch(e){console.error("Failed to load OAuth providers:",e),h({code:"OAUTH_PROVIDERS_LOAD_FAILED",message:"Failed to load OAuth providers"})}finally{c(!1)}},[n.auth,a]);t.useEffect(()=>{d()},[d]);const f=t.useCallback(async(e,o)=>{if(!a)throw new Error("OAuth not available");try{const l={provider:e,redirectUrl:o?.redirectUrl||`${window.location.origin}/auth/callback`,scopes:o?.scopes,state:o?.state,prompt:o?.prompt,organizationId:o?.organizationId||b?.id,connection:o?.connection};return(await n.auth.initiateSSOLogin(l)).authUrl}catch(l){return u(l),""}},[n.auth,a,b,u]),r=t.useCallback(async(e,o)=>{if(!a)throw new Error("OAuth not available");try{c(!0),h(null);const l=await f(e,o);window.location.href=l}catch(l){u(l)}finally{c(!1)}},[f,a,u]),y=t.useCallback(async(e,o,l)=>{if(!a)throw new Error("OAuth not available");try{c(!0),h(null);const m={provider:e,code:o||new URLSearchParams(window.location.search).get("code")||"",state:l||new URLSearchParams(window.location.search).get("state")||""},A=await n.auth.handleSSOCallback(m);return A.success?(await i(),{success:!0,user:A.user,session:A.session}):{success:!1,error:A.error||"OAuth authentication failed"}}catch(m){return{success:!1,error:m.message||"OAuth callback failed"}}finally{c(!1)}},[n.auth,a,i]),P=t.useCallback(async(e,o)=>{if(!s)throw new Error("User not authenticated");if(!a)throw new Error("OAuth not available");try{c(!0),h(null);const l=await f(e,{...o,state:`connect:${e}:${s.id}`});window.location.href=l}catch(l){u(l)}finally{c(!1)}},[s,f,a,u]),v=t.useCallback(async e=>{if(!s)throw new Error("User not authenticated");if(!a)throw new Error("OAuth not available");try{c(!0),h(null),await n.auth.disconnectOAuthProvider(e),await i()}catch(o){u(o)}finally{c(!1)}},[n.auth,s,a,i,u]),I=t.useCallback(e=>s?.connectedAccounts?s.connectedAccounts.some(o=>o.provider===e):!1,[s]),E=t.useCallback(e=>w.find(o=>o.name===e)||null,[w]),R=t.useCallback(e=>r("google",{scopes:p.google.defaultScopes,...e}),[r]),U=t.useCallback(e=>r("microsoft",{scopes:p.microsoft.defaultScopes,...e}),[r]),L=t.useCallback(e=>r("github",{scopes:p.github.defaultScopes,...e}),[r]),W=t.useCallback(e=>r("apple",{scopes:p.apple.defaultScopes,...e}),[r]),_=t.useCallback(e=>r("facebook",{scopes:p.facebook.defaultScopes,...e}),[r]),D=t.useCallback(e=>r("twitter",{scopes:p.twitter.defaultScopes,...e}),[r]),M=t.useCallback(e=>r("linkedin",{scopes:p.linkedin.defaultScopes,...e}),[r]),T=t.useCallback(e=>r("discord",{scopes:p.discord.defaultScopes,...e}),[r]),F=t.useCallback(async()=>{await d()},[d]);return{providers:w,isLoading:C,error:k,signInWithProvider:r,handleCallback:y,connectProvider:P,disconnectProvider:v,isProviderConnected:I,getProviderInfo:E,signInWithGoogle:R,signInWithMicrosoft:U,signInWithGitHub:L,signInWithApple:W,signInWithFacebook:_,signInWithTwitter:D,signInWithLinkedIn:M,signInWithDiscord:T,refreshProviders:F,getAuthUrl:f}}function q(s){const{signInWithProvider:b,connectProvider:i,disconnectProvider:n,isProviderConnected:g,getProviderInfo:w,isLoading:S,error:C}=O(),c=t.useMemo(()=>p[s],[s]),k=t.useMemo(()=>w(s),[w,s]),h=t.useMemo(()=>g(s),[g,s]),a=t.useCallback(f=>b(s,{scopes:c.defaultScopes,...f}),[b,s,c.defaultScopes]),u=t.useCallback(f=>i(s,f),[i,s]),d=t.useCallback(()=>n(s),[n,s]);return{provider:c,providerInfo:k,isConnected:h,signIn:a,connect:u,disconnect:d,isLoading:S,error:C,isEnabled:!!k?.enabled}}function z(){const{handleCallback:s}=O(),[b,i]=t.useState("idle"),[n,g]=t.useState(null);return{processCallback:t.useCallback(async(S,C,c)=>{const k=new URLSearchParams(window.location.search),h=S||k.get("provider")||"google",a=C||k.get("code")||"",u=c||k.get("state")||"";if(!a){i("error"),g({success:!1,error:"No authorization code received"});return}try{i("processing");const d=await s(h,a,u);return g(d),i(d.success?"success":"error"),d}catch(d){const f={success:!1,error:d.message||"OAuth callback failed"};return g(f),i("error"),f}},[s]),state:b,result:n,isProcessing:b==="processing",isSuccess:b==="success",isError:b==="error"}}exports.OAUTH_PROVIDERS=p;exports.useOAuth=O;exports.useOAuthCallback=z;exports.useOAuthProvider=q; //# sourceMappingURL=use-oauth.cjs.map