UNPKG

@privy-io/react-auth

Version:

React client for the Privy Auth API

2 lines (1 loc) • 10.3 kB
"use strict";var e=require("react/jsx-runtime"),r=require("react"),t=require("./ModalHeader-BCPQgekO.js"),o=require("./ScreenHeader-CgYJ5Fmg.js"),i=require("./context-D-ZJYjUg.js"),a=require("./index-C8lpxYDX.js"),l=require("./internal-context-BJv4f_bO.js"),n=require("./get-is-unified-wallet-UpdjHxOV.js"),c=require("./paths-DizMb-lU.js"),s=require("./useWallets-CKAypPZB.js"),d=require("./events-context-Di6--rDg.js"),u=require("./styles-CQnB5gHS.js");async function v({url:e,popup:r,provider:t}){return r.location=e,new Promise(((e,t)=>{function o(){r?.close(),window.removeEventListener("message",i)}function i(r){r.data&&("PRIVY_OAUTH_RESPONSE"===r.data.type&&r.data.stateCode&&r.data.authorizationCode&&(e(r.data),o()),"https://cdn.apple-cloudkit.com"===r.origin&&r.data.ckSession&&(e({type:"PRIVY_OAUTH_RESPONSE",ckWebAuthToken:r.data.ckSession}),o()),"PRIVY_OAUTH_ERROR"===r.data.type&&(t(r.data.error),o()))}window.addEventListener("message",i)}))}async function y({api:e,provider:r,stateCode:t,codeVerifier:o,authorizationCode:i}){if(!i||!t)throw new l.PrivyClientError("[OAuth AuthFlow] Authorization and state codes code must be set prior to calling authenicate.");if("undefined"===i)throw new l.PrivyClientError("User denied confirmation during OAuth flow");try{return(await e.post(c.recoveryOAuthAuthenticatePath,{authorization_code:i,state_code:t,code_verifier:o,provider:r})).access_token}catch(e){let r=l.formatApiError(e);if(r.privyErrorCode)throw new l.PrivyClientError(r.message||"Invalid code during OAuth flow.",void 0,r.privyErrorCode);if("User denied confirmation during OAuth flow"===r.message)throw new l.PrivyClientError("Invalid code during oauth flow.",void 0,l.PrivyErrorCode.OAUTH_USER_DENIED);throw new l.PrivyClientError("Invalid code during OAuth flow.",void 0,l.PrivyErrorCode.UNKNOWN_AUTH_ERROR)}}async function h({api:e,provider:r}){let t=a.createCodeVerifier(),o=a.createStateCode(),i=await a.deriveCodeChallengeFromCodeVerifier(t);try{return"icloud"===r?{url:(await e.post(c.recoveryOAuthInitICloudPath,{client_type:"web"})).url}:{url:(await e.post(c.recoveryOAuthInitPath,{redirect_to:window.location.href,code_challenge:i,state_code:o})).url,codeVerifier:t,stateCode:o,provider:r}}catch(e){throw l.formatApiError(e)}}require("styled-components"),require("./useActiveWallet-Cn6zOXx5.js"),require("zustand"),require("react-device-detect"),require("./use-export-wallet-B5ujV5Nk.js"),require("@privy-io/js-sdk-core"),require("eventemitter3"),require("viem/utils"),require("viem"),require("./getPublicClient-BsmZyCGX.js"),require("@heroicons/react/24/outline/ArrowLeftIcon"),require("@heroicons/react/24/outline/ArrowRightIcon"),require("@heroicons/react/24/outline/QuestionMarkCircleIcon"),require("@heroicons/react/24/outline/XMarkIcon"),require("tinycolor2"),require("uuid"),require("jose"),require("@coinbase/wallet-sdk"),require("@privy-io/ethereum"),require("mipd"),require("@privy-io/popup"),require("./usePrivy-cfS6o4tX.js"),require("@scure/base"),require("@headlessui/react"),require("@walletconnect/ethereum-provider"),require("@privy-io/urls"),require("./PrivyPluginContext-DsgaS6n9.js"),require("./getEmbeddedConnectedWallet-pJd-l936.js"),require("ofetch"),require("js-cookie"),require("./frame-Oz7volks.js"),require("@privy-io/routes"),require("x402/client"),require("@privy-io/api-base"),require("@privy-io/are-addresses-equal"),require("viem/accounts"),require("./use-sign-with-user-signer-Cu_6Bx7m.js");let p={"google-drive":{name:"Google Drive",component:u.GoogleDrive},icloud:{name:"iCloud",component:u.AppleICloud}};const w={component:()=>{let{logout:c}=n.usePrivyContext(),{navigate:w,setModalData:E,data:m}=n.usePrivyModal(),{closePrivyModal:C,createAnalyticsEvent:f}=l.usePrivyInternal(),{execute:A}=(()=>{let{client:e,walletProxy:r,refreshSessionAndUser:t}=l.usePrivyInternal(),{data:o}=n.usePrivyModal(),{user:i}=n.usePrivyContext(),c=d.useEmitPrivyEvent(),{create:u}=a.useCreateWalletWithoutFallback();return{execute:async({provider:a,action:d,popup:p,shouldCreateEth:w,shouldCreateSol:E})=>{let m,C;if(!e)throw new l.PrivyClientError("Missing client");function f(r){if(!r&&e)throw e.createAnalyticsEvent({eventName:"recovery_oauth_error",payload:{error:"Unable to open recovery OAuth popup",provider:a}}),new l.PrivyClientError("Recovery OAuth failed")}switch(a){case"google-drive":{let r,t,{url:o,codeVerifier:i,stateCode:n}=await h({api:e.api,provider:a});f(o);try{let i=await v({url:o,popup:p,provider:a});if(r=i.stateCode,t=i.authorizationCode,r!==n)throw e.createAnalyticsEvent({eventName:"possible_phishing_attempt",payload:{provider:a,storedStateCode:n??"",returnedStateCode:r??""}}),new l.PrivyClientError("Unexpected auth flow. This may be a phishing attempt.",void 0,l.PrivyErrorCode.OAUTH_UNEXPECTED)}catch(r){throw e.createAnalyticsEvent({eventName:"recovery_oauth_error",payload:{error:r.toString(),provider:a}}),new l.PrivyClientError("Recovery OAuth failed")}[m,C]=await Promise.all([e.getAccessToken(),y({api:e.api,provider:a,codeVerifier:i,stateCode:r,authorizationCode:t})]);break}case"icloud":{let{url:r}=await h({api:e.api,provider:a});f(r);let{ckWebAuthToken:t}=await v({url:r,popup:p,provider:a});C=t,m=await e.getAccessToken()}}if(!r)throw new l.PrivyClientError("Cannot connect to wallet proxy");if(!m)throw new l.PrivyClientError("Unable to authorize user");switch(d){case"recover":{let t=o?.recoverWallet?.entropyId,i=o?.recoverWallet?.entropyIdVerifier;if(!t||!i)throw new l.PrivyClientError("Recovery OAuth failed");e.createAnalyticsEvent({eventName:"embedded_wallet_recovery_started",payload:{walletAddress:t,recoveryMethod:a}}),await r.recover({accessToken:m,entropyId:t,entropyIdVerifier:i,recoveryAccessToken:C}),e.createAnalyticsEvent({eventName:"embedded_wallet_recovery_completed",payload:{walletAddress:t,recoveryMethod:a}});break}case"create-wallet":{let r;if(e.createAnalyticsEvent({eventName:"embedded_wallet_creation_started"}),w&&E)r=await u({recoveryMethod:a,recoveryAccessToken:C,chainType:"ethereum",walletIndex:0,latestUser:i}),r=await u({chainType:"solana",walletIndex:0,latestUser:r.user});else if(E)r=await u({recoveryMethod:a,recoveryAccessToken:C,chainType:"solana",walletIndex:0,latestUser:i});else{if(!w)throw Error("Invalid args to create wallet");r=await u({recoveryMethod:a,recoveryAccessToken:C,chainType:"ethereum",walletIndex:0,latestUser:i})}if(!r)throw c("createWallet","onError",l.PrivyErrorCode.UNKNOWN_EMBEDDED_WALLET_ERROR),Error("Failed to create wallet");e.createAnalyticsEvent({eventName:"embedded_wallet_creation_completed",payload:{walletAddress:r.account.address}}),c("createWallet","onSuccess",{wallet:r.account});break}case"set-recovery":{let o=n.getPrivyPrimaryWallet(i);if(!o)throw c("setWalletRecovery","onError",l.PrivyErrorCode.EMBEDDED_WALLET_NOT_FOUND),Error("Embedded wallet not found");e.createAnalyticsEvent({eventName:"embedded_wallet_set_recovery_started",payload:{walletAddress:o.address,existingRecoveryMethod:o.recoveryMethod,targetRecoveryMethod:a}});let{entropyId:d,entropyIdVerifier:u}=s.getEntropyDetailsForUser(i);await r.setRecovery({accessToken:m,entropyId:d,entropyIdVerifier:u,recoveryMethod:a,recoveryAccessToken:C});let v=n.getPrivyPrimaryWallet(await t());if(!v)throw c("createWallet","onError",l.PrivyErrorCode.UNKNOWN_EMBEDDED_WALLET_ERROR),Error("Failed to set recovery on wallet");e.createAnalyticsEvent({eventName:"embedded_wallet_set_recovery_completed",payload:{walletAddress:o.address,existingRecoveryMethod:o.recoveryMethod,targetRecoveryMethod:a}}),c("setWalletRecovery","onSuccess",{method:a,wallet:v});break}default:throw new l.PrivyClientError("Unsupported recovery action")}}}})(),[_,g]=r.useState(!1),{provider:P,action:q,isInAccountCreateFlow:x,shouldCreateEth:R,shouldCreateSol:b}=m?.recoveryOAuthStatus,[S,O]=r.useState(void 0),[j,k]=r.useState("create-wallet"===q);if("user-passcode"===P)throw Error("RecoveryOAuthScreen should never be called with a wallet that specifies recoveryMethod: `user-passcode`");let T=p[P].name,I=p[P].component,N=m?.recoverWallet?.onCompleteNavigateTo,U=new a.RunEffectOnce((async(e="create-wallet")=>(k(!0),new Promise(((r,t)=>{setTimeout((async()=>{try{let t=window.open();await A({provider:P,action:e,popup:t,shouldCreateEth:R,shouldCreateSol:b}),g(!0),r()}catch(r){O({message:`${"recover"===e?"Recovery":"Back up"} with ${T} unsuccessful`,detail:"recover"===q?`Please verify that you are selecting the ${T} account associated with your backup.`:"",retryable:!0}),t()}}),0)})))));r.useEffect((()=>{"recover"!==q&&U.execute(x?"create-wallet":"set-recovery")}),[]),r.useEffect((()=>{if(!_)return;let e=setTimeout((()=>{x?(E({createWallet:{onSuccess:()=>{},onFailure:e=>{f({eventName:"embedded_wallet_creation_failure_logout",payload:{error:e,screen:"RecoveryOAuthScreen"}}),c()},callAuthOnSuccessOnClose:!0,shouldCreateEth:!1,shouldCreateSol:!1}}),w("EmbeddedWalletCreatedScreen")):C({shouldCallAuthOnSuccess:!1})}),i.DEFAULT_SUCCESS_SCREEN_DURATION_MS);return()=>clearTimeout(e)}),[_]);let M=r.useCallback((async()=>{await U.execute("recover"),N?w(N):g(!0)}),[]),W="google-drive"===P?"Google Drive":"Apple iCloud",D=_&&`Successfully ${"recover"===q?"recovered":"backed up"} with ${W}.`||S&&S.message||`${"recover"===q?"Recovering":"Backing up"} with ${W}...`,F=S?S.detail:"";/*#__PURE__*/return e.jsxs(e.Fragment,{children:[/*#__PURE__*/e.jsx(t.ModalHeader,{}),j?/*#__PURE__*/e.jsx(e.Fragment,{children:/*#__PURE__*/e.jsxs(u.RecoveryContainer,{children:[/*#__PURE__*/e.jsx(o.CenteredScreenHeader,{title:D,icon:/*#__PURE__*/e.jsx(I,{style:{width:"38px",height:"38px"}}),description:F}),S&&S?.retryable?/*#__PURE__*/e.jsx(t.PrimaryButton,{onClick:()=>{a.stripUrlOAuthParamsAndRemoveStateCode(),O(void 0),"create-wallet"===q?U.execute("create-wallet"):M()},disabled:!_&&!S?.retryable,children:"Try again"}):null]})}):/*#__PURE__*/e.jsxs(u.RecoveryContainer,{children:[/*#__PURE__*/e.jsx(o.CenteredScreenHeader,{title:"Confirm it's really you",icon:/*#__PURE__*/e.jsx(I,{style:{height:42,width:48}}),description:`To confirm your identity, please log in to ${W} where your account is backed up.`}),/*#__PURE__*/e.jsxs(t.PrimaryButton,{onClick:M,children:["Confirm with ",W]})]}),/*#__PURE__*/e.jsx(t.BlobbyFooter,{})]})}};exports.RecoveryOAuthScreen=w,exports.default=w;