1import{B as z,u as H,l as K,P as ce,bu as ne,b as i,i as E,by as Y,bA as de,aS as ue,al as he,j as a,dH as pe,dK as ve,dL as we,dM as ye,dN as fe,dO as me,dP as ee,dQ as Ee}from"./index-q3Gg3hU_.js";import{r as m}from"./react-Ga8F0Dx0.js";import{L as _e,b as G,h as Ae}from"./ModalFooter-Dgk75taJ-DK91vV86.js";import{o as Q}from"./ScreenHeader-CHmc4-Lu-D2LM6WZY.js";import{d as ge,e as Ce,o as X}from"./styles-BsotlekN-DbzKVNTX.js";import"./solana-7MIGCHC8.js";import"./meteora-Ci9gqm7k.js";async function q({url:h,popup:l,provider:p}){return l.location=h,new Promise((s,c)=>{function n(){l?.close(),window.removeEventListener("message",d)}function d(o){o.data&&(o.data.type==="PRIVY_OAUTH_RESPONSE"&&o.data.stateCode&&o.data.authorizationCode&&(s(o.data),n()),o.origin==="https://cdn.apple-cloudkit.com"&&o.data.ckSession&&(s({type:"PRIVY_OAUTH_RESPONSE",ckWebAuthToken:o.data.ckSession}),n()),o.data.type==="PRIVY_OAUTH_ERROR"&&(c(o.data.error),n()))}window.addEventListener("message",d)})}async function be({api:h,provider:l,stateCode:p,codeVerifier:s,authorizationCode:c}){if(!c||!p)throw new i("[OAuth AuthFlow] Authorization and state codes code must be set prior to calling authenicate.");if(c==="undefined")throw new i("User denied confirmation during OAuth flow");try{return(await h.post(Ee,{authorization_code:c,state_code:p,code_verifier:s,provider:l})).access_token}catch(n){let d=ee(n);throw d.privyErrorCode?new i(d.message||"Invalid code during OAuth flow.",void 0,d.privyErrorCode):d.message==="User denied confirmation during OAuth flow"?new i("Invalid code during oauth flow.",void 0,E.OAUTH_USER_DENIED):new i("Invalid code during OAuth flow.",void 0,E.UNKNOWN_AUTH_ERROR)}}async function J({api:h,provider:l}){let p=ve(),s=we(),c=await ye(p);try{return l==="icloud"?{url:(await h.post(fe,{client_type:"web"})).url}:{url:(await h.post(me,{redirect_to:window.location.href,code_challenge:c,state_code:s})).url,codeVerifier:p,stateCode:s,provider:l}}catch(n){throw ee(n)}}let Z={"google-drive":{name:"Google Drive",component:Ce},icloud:{name:"iCloud",component:ge}};const Ue={component:()=>{let{logout:h}=z(),{navigate:l,setModalData:p,data:s}=H(),{closePrivyModal:c,createAnalyticsEvent:n}=K(),{execute:d}=(()=>{let{client:t,walletProxy:w,refreshSessionAndUser:N}=K(),{data:A}=H(),{user:g}=z(),C=ce(),{create:O}=ne();return{execute:async({provider:r,action:se,popup:P,shouldCreateEth:L,shouldCreateSol:V})=>{let b,y;if(!t)throw new i("Missing client");function F(e){if(!e&&t)throw t.createAnalyticsEvent({eventName:"recovery_oauth_error",payload:{error:"Unable to open recovery OAuth popup",provider:r}}),new i("Recovery OAuth failed")}switch(r){case"google-drive":{let e,u,{url:R,codeVerifier:T,stateCode:B}=await J({api:t.api,provider:r});F(R);try{let S=await q({url:R,popup:P,provider:r});if(e=S.stateCode,u=S.authorizationCode,e!==B)throw t.createAnalyticsEvent({eventName:"possible_phishing_attempt",payload:{provider:r,storedStateCode:B??"",returnedStateCode:e??""}}),new i("Unexpected auth flow. This may be a phishing attempt.",void 0,E.OAUTH_UNEXPECTED)}catch(S){throw t.createAnalyticsEvent({eventName:"recovery_oauth_error",payload:{error:S.toString(),provider:r}}),new i("Recovery OAuth failed")}[b,y]=await Promise.all([t.getAccessToken(),be({api:t.api,provider:r,codeVerifier:T,stateCode:e,authorizationCode:u})]);break}case"icloud":{let{url:e}=await J({api:t.api,provider:r});F(e);let{ckWebAuthToken:u}=await q({url:e,popup:P,provider:r});y=u,b=await t.getAccessToken()}}if(!w)throw new i("Cannot connect to wallet proxy");if(!b)throw new i("Unable to authorize user");switch(se){case"recover":{let e=A?.recoverWallet?.entropyId,u=A?.recoverWallet?.entropyIdVerifier;if(!e||!u)throw new i("Recovery OAuth failed");t.createAnalyticsEvent({eventName:"embedded_wallet_recovery_started",payload:{walletAddress:e,recoveryMethod:r}}),await w.recover({accessToken:b,entropyId:e,entropyIdVerifier:u,recoveryAccessToken:y}),t.createAnalyticsEvent({eventName:"embedded_wallet_recovery_completed",payload:{walletAddress:e,recoveryMethod:r}});break}case"create-wallet":{let e;if(t.createAnalyticsEvent({eventName:"embedded_wallet_creation_started"}),L&&V)e=await O({recoveryMethod:r,recoveryAccessToken:y,chainType:"ethereum",walletIndex:0,latestUser:g}),e=await O({chainType:"solana",walletIndex:0,latestUser:e.user});else if(V)e=await O({recoveryMethod:r,recoveryAccessToken:y,chainType:"solana",walletIndex:0,latestUser:g});else{if(!L)throw Error("Invalid args to create wallet");e=await O({recoveryMethod:r,recoveryAccessToken:y,chainType:"ethereum",walletIndex:0,latestUser:g})}if(!e)throw C("createWallet","onError",E.UNKNOWN_EMBEDDED_WALLET_ERROR),Error("Failed to create wallet");t.createAnalyticsEvent({eventName:"embedded_wallet_creation_completed",payload:{walletAddress:e.account.address}}),C("createWallet","onSuccess",{wallet:e.account});break}case"set-recovery":{let e=Y(g);if(!e)throw C("setWalletRecovery","onError",E.EMBEDDED_WALLET_NOT_FOUND),Error("Embedded wallet not found");t.createAnalyticsEvent({eventName:"embedded_wallet_set_recovery_started",payload:{walletAddress:e.address,existingRecoveryMethod:e.recoveryMethod,targetRecoveryMethod:r}});let{entropyId:u,entropyIdVerifier:R}=de(g);await w.setRecovery({accessToken:b,entropyId:u,entropyIdVerifier:R,recoveryMethod:r,recoveryAccessToken:y});let T=Y(await N());if(!T)throw C("createWallet","onError",E.UNKNOWN_EMBEDDED_WALLET_ERROR),Error("Failed to set recovery on wallet");t.createAnalyticsEvent({eventName:"embedded_wallet_set_recovery_completed",payload:{walletAddress:e.address,existingRecoveryMethod:e.recoveryMethod,targetRecoveryMethod:r}}),C("setWalletRecovery","onSuccess",{method:r,wallet:T});break}default:throw new i("Unsupported recovery action")}}}})(),[o,U]=m.useState(!1),{provider:_,action:f,isInAccountCreateFlow:$,
1shouldCreateEth:te,shouldCreateSol:re}=s?.recoveryOAuthStatus??{},[v,I]=m.useState(void 0),[oe,ae]=m.useState(f==="create-wallet");if(_==="user-passcode")throw Error("RecoveryOAuthScreen should never be called with a wallet that specifies recoveryMethod: `user-passcode`");let M=Z[_].name,W=Z[_].component,D=s?.recoverWallet?.onCompleteNavigateTo,k=new ue(async(t="create-wallet")=>(ae(!0),new Promise((w,N)=>{setTimeout(async()=>{try{let A=window.open();await d({provider:_,action:t,popup:A,shouldCreateEth:te,shouldCreateSol:re}),U(!0),w()}catch{I({message:`${t==="recover"?"Recovery":"Back up"} with ${M} unsuccessful`,detail:f==="recover"?`Please verify that you are selecting the ${M} account associated with your backup.`:"",retryable:!0}),N()}},0)})));m.useEffect(()=>{f!=="recover"&&k.execute($?"create-wallet":"set-recovery")},[]),m.useEffect(()=>{if(!o)return;let t=setTimeout(()=>{$?(p({createWallet:{onSuccess:()=>{},onFailure:w=>{n({eventName:"embedded_wallet_creation_failure_logout",payload:{error:w,screen:"RecoveryOAuthScreen"}}),h()},callAuthOnSuccessOnClose:!0,shouldCreateEth:!1,shouldCreateSol:!1}}),l("EmbeddedWalletCreatedScreen")):c({shouldCallAuthOnSuccess:!1})},he);return()=>clearTimeout(t)},[o]);let j=m.useCallback(async()=>{await k.execute("recover"),D?l(D):U(!0)},[]),x=_==="google-drive"?"Google Drive":"Apple iCloud",ie=o&&`Successfully ${f==="recover"?"recovered":"backed up"} with ${x}.`||v&&v.message||`${f==="recover"?"Recovering":"Backing up"} with ${x}...`,le=v?v.detail:"";return a.jsxs(a.Fragment,{children:[a.jsx(_e,{}),oe?a.jsx(a.Fragment,{children:a.jsxs(X,{children:[a.jsx(Q,{title:ie,icon:a.jsx(W,{style:{width:"38px",height:"38px"}}),description:le}),v&&v?.retryable?a.jsx(G,{onClick:()=>{pe(),I(void 0),f==="create-wallet"?k.execute("create-wallet"):j()},disabled:!o&&!v?.retryable,children:"Try again"}):null]})}):a.jsxs(X,{children:[a.jsx(Q,{title:"Confirm it's really you",icon:a.jsx(W,{style:{height:42,width:48}}),description:`To confirm your identity, please log in to ${x} where your account is backed up.`}),a.jsxs(G,{onClick:j,children:["Confirm with ",x]})]}),a.jsx(Ae,{})]})}};export{Ue as RecoveryOAuthScreen,Ue as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.