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