@privy-io/expo
Version:
Expo client for the Privy Auth API
2 lines (1 loc) • 48.2 kB
JavaScript
;Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var Dt=Object.defineProperty,qt=Object.defineProperties;var Kt=Object.getOwnPropertyDescriptors;var ye=Object.getOwnPropertySymbols;var je=Object.prototype.hasOwnProperty,De=Object.prototype.propertyIsEnumerable;var Ne=(e,t,r)=>t in e?Dt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,C= exports.a =(e,t)=>{for(var r in t||(t={}))je.call(t,r)&&Ne(e,r,t[r]);if(ye)for(var r of ye(t))De.call(t,r)&&Ne(e,r,t[r]);return e},W= exports.b =(e,t)=>qt(e,Kt(t));var eo=(e,t)=>{var r={};for(var o in e)je.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&ye)for(var o of ye(e))t.indexOf(o)<0&&De.call(e,o)&&(r[o]=e[o]);return r};var p=(e,t,r)=>new Promise((o,i)=>{var d=l=>{try{s(r.next(l))}catch(n){i(n)}},a=l=>{try{s(r.throw(l))}catch(n){i(n)}},s=l=>l.done?o(l.value):Promise.resolve(l.value).then(d,a);s((r=r.apply(e,t)).next())});var _react = require('react'); var _react2 = _interopRequireDefault(_react);var _zustand = require('zustand');var qe=_zustand.create.call(void 0, ()=>({status:"disconnected"})),Ke= exports.i =()=>qe.getState().onNeedsRecovery,no= exports.j =e=>{_react.useEffect.call(void 0, ()=>{qe.setState({onNeedsRecovery:e==null?void 0:e.onNeedsRecovery})},[e==null?void 0:e.onNeedsRecovery])};var _expoapplication = require('expo-application');var _expolinking = require('expo-linking'); var ie = _interopRequireWildcard(_expolinking); var B = _interopRequireWildcard(_expolinking); var re = _interopRequireWildcard(_expolinking); var oe = _interopRequireWildcard(_expolinking);var _exposecurestore = require('expo-secure-store'); var I = _interopRequireWildcard(_exposecurestore);var _expowebbrowser = require('expo-web-browser'); var pe = _interopRequireWildcard(_expowebbrowser); var tt = _interopRequireWildcard(_expowebbrowser);var _reactnative = require('react-native');var _jssdkcore = require('@privy-io/js-sdk-core'); var _jssdkcore2 = _interopRequireDefault(_jssdkcore);var _reactfastcompare = require('react-fast-compare'); var _reactfastcompare2 = _interopRequireDefault(_reactfastcompare);var ve=_zustand.create.call(void 0, ()=>{}),Ve=e=>ve.setState(t=>_reactfastcompare2.default.call(void 0, t,e)?t:e),H= exports.e =ve.getState;var _reactnativewebview = require('react-native-webview'); var _reactnativewebview2 = _interopRequireDefault(_reactnativewebview);var $=_zustand.createStore.call(void 0, )(()=>({user:null,proxyStatus:"loading"}));function fe(){return $.getState().user}function Pe(e){$.setState(({user:t})=>_reactfastcompare2.default.call(void 0, t,e)?{}:{user:e})}var Ae=e=>$.setState({proxyStatus:e});function O(){return _zustand.useStore.call(void 0, $,e=>e.user)}function ze(){return _zustand.useStore.call(void 0, $,e=>!!e.user)}function j(){return _zustand.useStore.call(void 0, $,e=>e.proxyStatus!=="loading")}var He=({client:e,isClientReady:t,logLevel:r})=>{let o=_react.useRef.call(void 0, null);_react.useEffect.call(void 0, ()=>_reactnative.AppState.addEventListener("change",a=>p(void 0,null,function*(){a==="active"&&((yield e.embeddedWallet.ping(500))||(Ae("reloading"),e.embeddedWallet.reload()))})).remove,[e]);let i=_react.useCallback.call(void 0, d=>p(void 0,null,function*(){let{data:a}=d.nativeEvent;e.embeddedWallet.onMessage(JSON.parse(a))}),[e]);return t?_react2.default.createElement(_reactnativewebview2.default,{style:{flex:1},ref:d=>{d&&(e.setMessagePoster(d),o.current=d)},cacheEnabled:!1,cacheMode:"LOAD_NO_CACHE",source:{uri:e.embeddedWallet.getURL()},webviewDebuggingEnabled:r==="DEBUG",onLoad:()=>Ae("loaded"),onError:console.error,onMessage:i}):null};function Be(d){return p(this,arguments,function*({client:e,setSolanaWallet:t,createSolanaWalletCallbacks:r,setSolanaRecoveryFlowState:o,opts:i}){var a,s,l;t({status:"creating"});try{let{user:n}=yield e.user.get(),u=_jssdkcore.getAllUserEmbeddedSolanaWallets.call(void 0, n),m=u[0],y=(a=_jssdkcore.getUserEmbeddedEthereumWallet.call(void 0, n))!=null?a:void 0;if(i!=null&&i.recoveryMethod&&i.recoveryMethod!=="privy")throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_creation_error",error:"Unsupported recovery method for solana wallet."});if(!(i!=null&&i.createAdditional)&&m)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_creation_error",error:"Solana wallet already exists for this user. Set `createAdditional` to `true` to create another wallet"});let g,f;if(m){let c=y!=null?y:m,{entropyId:_,entropyIdVerifier:v}=_jssdkcore.getEntropyDetailsFromAccount.call(void 0, c),w=Math.max(...u.map(E=>E.wallet_index),0)+1,S=yield e.embeddedWallet.add({chainType:"solana",entropyId:_,entropyIdVerifier:v,hdWalletIndex:w}),b=_jssdkcore.getAllUserEmbeddedSolanaWallets.call(void 0, S.user).find(E=>E.wallet_index===w);if(!b)throw new (0, _jssdkcore.PrivyClientError)({error:"Embedded wallet account not created",code:"embedded_wallet_creation_error"});g=yield e.embeddedWallet.getSolanaProvider(b,_,v),f=S.user}else{let c=yield e.embeddedWallet.createSolana({ethereumAccount:y}),_=_jssdkcore.getAllUserEmbeddedSolanaWallets.call(void 0, c.user).find(b=>b.wallet_index===0);if(!_)throw new (0, _jssdkcore.PrivyClientError)({error:"Embedded wallet account not created",code:"embedded_wallet_creation_error"});let v=y!=null?y:_,{entropyId:w,entropyIdVerifier:S}=_jssdkcore.getEntropyDetailsFromAccount.call(void 0, v);g=yield e.embeddedWallet.getSolanaProvider(_,w,S),f=c.user}let h=_jssdkcore.getAllUserEmbeddedSolanaWallets.call(void 0, f)[0];if(!h)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_creation_error",error:"Unknown error creating solana wallet"});return(l=(s=r.current)==null?void 0:s.onSuccess)==null||l.call(s,g),t({status:"connected",publicKey:h.public_key}),o({status:"initial"}),g}catch(n){let u=n instanceof Error?n.message:"Error creating embedded wallet";throw t({status:"error",error:u}),o({status:"initial"}),new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_creation_error",error:u})}})}function ge(u){return p(this,arguments,function*({client:e,account:t,setWallet:r,recoverWalletCallbacks:o,recoveryMethod:i,setRecoveryFlowState:d,password:a,recoveryKey:s,recoveryToken:l,recoverySecretOverride:n}){var m,y,g,f;if(!t)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});switch(i){case"user-passcode":if(!a)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"password is required for user-passcode recovery method"});break;case"google-drive":if(!l)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"Recovery token is required for google-drive recovery method"});break;case"icloud":if(!n)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"Record name is required for icloud recovery method"});break;case"recovery-encryption-key":if(!s)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"recoveryKey is required for recovery-encryption-key recovery method"});break}r({status:"connecting",account:t});try{let h=yield e.embeddedWallet.getProvider(t,a,l,n,s);return r({status:"connected",provider:h,account:t}),d({status:"initial"}),(y=(m=o.current)==null?void 0:m.onSuccess)==null||y.call(m,h),h}catch(h){r({status:"needs-recovery",account:t}),d({status:"initial"});let c=new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:h instanceof Error?h.message:"Error recovering embedded wallet"});throw(f=(g=o.current)==null?void 0:g.onError)==null||f.call(g,c),c}})}function Ge(s){return p(this,arguments,function*({client:e,account:t,entropyId:r,entropyIdVerifier:o,setSolanaWallet:i,recoverSolanaWalletCallbacks:d,setSolanaRecoveryFlowState:a}){var l,n,u,m;i({status:"connecting"});try{let y=yield e.embeddedWallet.getSolanaProvider(t,r,o);return i({status:"connected",publicKey:y._publicKey}),a({status:"initial"}),(n=(l=d.current)==null?void 0:l.onSuccess)==null||n.call(l,y),y}catch(y){i({status:"needs-recovery"}),a({status:"initial"});let g=new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:y instanceof Error?y.message:"Error recovering embedded wallet"});throw(m=(u=d.current)==null?void 0:u.onError)==null||m.call(u,g),g}})}var Qe=({client:e,solanaWallet:t,setSolanaWallet:r,setSolanaRecoveryFlowState:o,createSolanaWalletCallbacks:i,recoverSolanaWalletCallbacks:d})=>{let a=O(),s=_react.useMemo.call(void 0, ()=>_jssdkcore.getAllUserEmbeddedSolanaWallets.call(void 0, a),[a]),l=j(),n=_react.useMemo.call(void 0, ()=>s.length===0?null:_jssdkcore.getEntropyDetailsFromUser.call(void 0, a),[a,s]),u=_react.useMemo.call(void 0, ()=>{let f=s.map(v=>{let w=_jssdkcore.getEntropyDetailsFromUser.call(void 0, a,v);return w?{account:v,entropy:w}:null});if(f.some(v=>v===null))return[];let h=void 0,c=void 0,_=void 0;return f.filter(v=>v!==null).map(({account:v,entropy:{entropyId:w,entropyIdVerifier:S}})=>({address:v.address,publicKey:v.address,walletIndex:v.wallet_index,getProvider:()=>e.embeddedWallet.getSolanaProvider(v,w,S,h,c,_,b=>p(void 0,null,function*(){var E;yield(E=Ke())==null?void 0:E(b)}))}))},[s,a,e]),m=_react.useCallback.call(void 0, f=>p(void 0,null,function*(){return yield Be({client:e,setSolanaWallet:r,createSolanaWalletCallbacks:i,setSolanaRecoveryFlowState:o,opts:f})}),[e,i]),y=_react.useCallback.call(void 0, ()=>p(void 0,null,function*(){if(!n)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});let{entropyId:f,entropyIdVerifier:h}=n;return Ge({client:e,account:s[0],entropyId:f,entropyIdVerifier:h,setSolanaWallet:r,recoverSolanaWalletCallbacks:d,setSolanaRecoveryFlowState:o})}),[e,n,s,d,o,r]),g=_react.useCallback.call(void 0, ()=>p(void 0,null,function*(){if(!n)throw r({status:"not-created"}),new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});r(f=>f.status==="connected"?{status:"reconnecting"}:{status:"connecting"});try{let{entropyId:f,entropyIdVerifier:h}=n,c=yield e.embeddedWallet.getSolanaProvider(s[0],f,h);return r({status:"connected",publicKey:s[0].public_key}),c}catch(f){throw _jssdkcore.errorIndicatesRecoveryIsNeeded.call(void 0, f)?(r({status:"needs-recovery"}),new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_needs_recovery",error:"Embedded wallet not loaded on device"})):f instanceof Error?(r({status:"error",error:f.message}),new (0, _jssdkcore.PrivyClientError)({code:"unknown_embedded_wallet_error",error:f.message})):(r({status:"error",error:"Error loading embedded wallet"}),new (0, _jssdkcore.PrivyClientError)({code:"unknown_embedded_wallet_error",error:"Error loading embedded wallet"}))}}),[s,e,n,r]);return _react.useEffect.call(void 0, ()=>{if(!a&&t.status!=="disconnected")return r({status:"disconnected"});l&&g().catch(()=>{})},[l,a]),_react.useEffect.call(void 0, ()=>{t.status==="error"&&t.error.includes("User must be logged in")&&g()},[t.status]),{create:m,recover:y,getProvider:g,wallets:u}};function we(m){return p(this,arguments,function*({client:e,setWallet:t,createWalletCallbacks:r,recoveryMethod:o,setRecoveryFlowState:i,password:d,recoveryKey:a,recoveryToken:s,recoverySecretOverride:l,iCloudRecordNameOverride:n,solanaAccount:u}){var g,f;switch(o){case"user-passcode":if(!d)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"password is required for user-passcode recovery method"});break;case"recovery-encryption-key":if(!a)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"key is required for recovery-encryption-key recovery method"});break;case"google-drive":if(!s)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"Recovery token is required for google-drive recovery method"});break;case"icloud":if(!l||!n)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"iCloud recovery failed due to inability to store credentials"});break}t({status:"creating",account:null});let y=o==="icloud"?"icloud-native":o;try{let{user:h}=yield e.embeddedWallet.create({password:d,recoveryMethod:y,recoveryKey:a,recoveryToken:s,recoverySecretOverride:l,iCloudRecordNameOverride:n,solanaAccount:u}),c=_jssdkcore.getUserEmbeddedEthereumWallet.call(void 0, h);if(!c)throw new (0, _jssdkcore.PrivyClientError)({error:"Embedded wallet account not created",code:"embedded_wallet_creation_error"});let _=yield e.embeddedWallet.getProvider(c);return(f=(g=r.current)==null?void 0:g.onSuccess)==null||f.call(g,_),t({status:"connected",provider:_,account:c}),i({status:"initial"}),_}catch(h){let c=h instanceof Error?h.message:"Error creating embedded wallet";throw t({status:"error",error:c,account:null}),i({status:"initial"}),new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_creation_error",error:c})}})}function Ze(){return p(this,null,function*(){try{return yield Promise.resolve().then(() => _interopRequireWildcard(require("@privy-io/expo-native-extensions")))}catch(e){throw new Error("@privy-io/expo-native-extensions not found. Ensure that you're explicitly including as a dependency, and running an Expo development build")}})}function Oe(o){return p(this,arguments,function*({user:e,appId:t,client:r}){var s;if(_reactnative.Platform.OS==="android")throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"iCloud recovery is not supported on Android"});let i=yield Ze(),d=yield r.recovery.icloudAuth.getICloudConfiguration("expo-ios");if(!(d==null?void 0:d.container_identifier))throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"An iCloud Container ID must be specified in the Privy Dashboard."});try{let{recoverySecret:l,iCloudRecordName:n}=yield i.writeRecoverySecretToICloud({containerId:d.container_identifier,appId:t,userId:e.id});return{recoverySecret:l,iCloudRecordName:n}}catch(l){if(l instanceof Error){let n=(s=l.message.split("Caused by: ")[1])!=null?s:"Error writing to iCloud";throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:n})}throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"Error writing to iCloud"})}})}function et(o){return p(this,arguments,function*({walletAddress:e,client:t,chainType:r}){var n;if(_reactnative.Platform.OS==="android")throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"iCloud recovery is not supported on Android"});let i=yield Ze(),a=(yield t.recovery.getRecoveryKeyMaterial(e,r)).icloud_record_name;if(!a)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"iCloud recovery not properly backed up."});let s=yield t.recovery.icloudAuth.getICloudConfiguration("expo-ios"),l=s==null?void 0:s.container_identifier;if(!l)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"An iCloud Container ID must be specified in the Privy Dashboard."});try{let{recoverySecret:u}=yield i.readRecoverySecretFromICloud({containerId:l,recordName:a});return{recoverySecret:u}}catch(u){if(u instanceof Error){let m=(n=u.message.split("Caused by: ")[1])!=null?n:"Error writing to iCloud";throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:m})}throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"Error writing to iCloud"})}})}function U(e){return e instanceof Error||e instanceof _jssdkcore.PrivyApiError||e instanceof _jssdkcore.PrivyClientError?e:typeof e=="string"?new Error(e):new Error("Unknown error")}var Bo=e=>new Promise(t=>setTimeout(t,e));function $o(){let e=_react.useRef.call(void 0, _reactnative.AppState.currentState);_react.useEffect.call(void 0, ()=>_reactnative.AppState.addEventListener("change",o=>{e.current=o}).remove,[]);function t(){return _reactnative.AppState.currentState}return{appState:e,getCurrentAppState:t}}function le(i){return p(this,arguments,function*({provider:e,redirectUri:t,client:r,onError:o}){try{let d;switch(e){case"google-drive":{let{url:n}=yield r.recovery.auth.generateURL(B.createURL(t||"/"));d=n;break}default:throw new (0, _jssdkcore.PrivyClientError)({error:"OAuth invalid provider",code:"embedded_wallet_recovery_error"})}let a=yield tt.openAuthSessionAsync(d);if(_reactnative.Platform.OS==="android")return;if(a.type!=="success")throw new (0, _jssdkcore.PrivyClientError)({error:"Recovery OAuth session failed",code:"embedded_wallet_recovery_error"});let{queryParams:s}=B.parse(a.url),l;switch(e){case"google-drive":{let{privy_oauth_state:n,privy_oauth_code:u}=s;if(!u||!n)throw new (0, _jssdkcore.PrivyClientError)({error:"Recovery OAuth invalid credentials",code:"embedded_wallet_recovery_error"});l=yield _e({oAuthCode:u,oAuthState:n,client:r});break}default:throw new (0, _jssdkcore.PrivyClientError)({error:"Recovery OAuth invalid provider",code:"embedded_wallet_recovery_error"})}return l}catch(d){throw o==null||o(U(d)),d}})}function _e(o){return p(this,arguments,function*({oAuthCode:e,oAuthState:t,client:r}){let{access_token:i}=yield r.recovery.auth.authorize(e,t);if(!i)throw new (0, _jssdkcore.PrivyClientError)({error:"OAuth invalid credentials",code:"login_with_oauth_returned_with_invalid_credentials"});return i})}var dr=2*60*1e3;function cr(e){let t;return new Promise((r,o)=>{t=B.addEventListener("url",d=>p(this,[d],function*({url:i}){if(!i)return;let{queryParams:a}=B.parse(i),{privy_oauth_state:s,privy_oauth_code:l}=a!=null?a:{};if(typeof l!="string"||typeof s!="string")return;let n=yield _e({client:e,oAuthCode:l,oAuthState:s});r(n)})),setTimeout(()=>{o(new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_set_recovery_error",error:"Failed to complete Google Drive recovery flow"}))},dr)}).finally(()=>{t==null||t.remove()})}function cn(e){return p(this,null,function*(){let t;_reactnative.Platform.OS==="android"&&(t=cr(e));let r=yield le({provider:"google-drive",client:e});return r!=null?r:yield t})}function be(d){return p(this,arguments,function*({client:e,recoveryInput:t,setWalletRecoveryCallbacks:r,setRecoveryFlowState:o,setWallet:i}){var a,s,l,n;try{let{provider:u,user:m}=yield e.embeddedWallet.setRecovery(t),y=u,g=_jssdkcore.getUserEmbeddedWallet.call(void 0, m);return i({status:"connected",provider:y,account:g}),(s=(a=r.current)==null?void 0:a.onSuccess)==null||s.call(a,y),o({status:"initial"}),y}catch(u){let m=new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_set_recovery_error",error:u instanceof Error?u.message:"Error setting password on embedded wallet"});throw(n=(l=r.current)==null?void 0:l.onError)==null||n.call(l,m),o({status:"initial"}),m}})}function it(e){return e===void 0?{recoveryMethod:"privy"}:typeof e=="string"?{recoveryMethod:"user-passcode",password:e}:e.recoveryMethod==="user-passcode"?{recoveryMethod:"user-passcode",password:e.password}:e.recoveryMethod==="recovery-encryption-key"?{recoveryMethod:"recovery-encryption-key",recoveryKey:e.recoveryKey}:{recoveryMethod:e.recoveryMethod}}var at=({client:e,appId:t,wallet:r,setWallet:o,setRecoveryFlowState:i,createWalletCallbacks:d,recoverWalletCallbacks:a,setWalletRecoveryCallbacks:s})=>{let l=O(),n=_react.useMemo.call(void 0, ()=>_jssdkcore.getUserEmbeddedEthereumWallet.call(void 0, l),[l]),u=j(),m=_react.useCallback.call(void 0, c=>p(void 0,null,function*(){var L,Q;if(n)throw new (0, _jssdkcore.PrivyClientError)({error:"This user already has an embedded wallet",code:"embedded_wallet_already_exists"});let{user:_}=yield e.user.get(),{password:v,recoveryMethod:w,recoveryKey:S}=it(c),b,E,F;if(w==="google-drive"&&(b=yield le({provider:w,client:e,onError:(L=d.current)==null?void 0:L.onError}),i({status:"creating-wallet"}),!b))return null;if(w==="icloud"){if(!_)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"User must be loaded before creating a wallet with iCloud."});let{recoverySecret:q,iCloudRecordName:K}=yield Oe({user:_,appId:t,client:e});E=q,F=K}return yield we({client:e,setWallet:o,createWalletCallbacks:d,recoveryMethod:w,recoveryKey:S,setRecoveryFlowState:i,password:v,recoverySecretOverride:E,iCloudRecordNameOverride:F,solanaAccount:(Q=_jssdkcore.getUserEmbeddedSolanaWallet.call(void 0, _))!=null?Q:void 0})}),[e,n,l]),y=_react.useCallback.call(void 0, c=>p(void 0,null,function*(){var w;if(r.status!=="connected")throw new (0, _jssdkcore.PrivyClientError)({code:"attempted_to_set_password_before_connected",error:"Embedded wallet must be connected before setting password"});if(!n)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});if(_jssdkcore.getUserEmbeddedSolanaWallet.call(void 0, l))throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_set_recovery_error",error:"Cannot set user-controlled recovery for a user with an embedded Solana wallet."});_jssdkcore.throwIfInvalidRecoveryUpgradePath.call(void 0, {currentRecoveryMethod:n.recovery_method,upgradeToRecoveryMethod:c.recoveryMethod});let _,v;switch(c.recoveryMethod){case"privy":v=W(C({},c),{wallet:n});break;case"user-passcode":v=W(C({},c),{wallet:n,password:c.password});break;case"google-drive":if(_=yield le({provider:c.recoveryMethod,client:e,onError:(w=s.current)==null?void 0:w.onError}),i({status:"upgrading-recovery"}),!_)return null;v={recoveryMethod:"google-drive",wallet:n,recoveryAccessToken:_};break;case"icloud":if(!l)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"User must be loaded before backing up to iCloud."});let{recoverySecret:S,iCloudRecordName:b}=yield Oe({user:l,appId:t,client:e});v={recoveryMethod:"icloud-native",recoverySecretOverride:S,iCloudRecordNameOverride:b,wallet:n};break;default:throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"Unrecognized recovery method"})}return be({client:e,recoveryInput:v,setWalletRecoveryCallbacks:s,setRecoveryFlowState:i,setWallet:o})}),[e,n,r.status,l]),g=_react.useCallback.call(void 0, c=>p(void 0,null,function*(){return y({recoveryMethod:"user-passcode",password:c})}),[e,n,r.status]),f=_react.useCallback.call(void 0, c=>p(void 0,null,function*(){var E;if(!n)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});let{password:_,recoveryMethod:v,recoveryKey:w}=it(c),S,b;if(v==="google-drive"&&(S=yield le({provider:v,client:e,onError:(E=a.current)==null?void 0:E.onError}),i({status:"recovering"}),!S))return null;if(v==="icloud"){if(!l)throw new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_recovery_error",error:"User must be loaded before recovering via iCloud."});let{recoverySecret:F}=yield et({client:e,walletAddress:n.address});b=F}return ge({client:e,account:n,setWallet:o,recoverWalletCallbacks:a,recoveryMethod:v,setRecoveryFlowState:i,recoveryKey:w,password:_,recoveryToken:S,recoverySecretOverride:b})}),[e,n]),h=_react.useCallback.call(void 0, ()=>p(void 0,null,function*(){if(!n)throw o({status:"not-created",account:null}),new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});o(c=>c.status==="connected"?{status:"reconnecting",account:n}:{status:"connecting",account:n});try{let c=yield e.embeddedWallet.getProvider(n);return o({status:"connected",provider:c,account:n}),c}catch(c){throw _jssdkcore.errorIndicatesRecoveryIsNeeded.call(void 0, c)?(o({status:"needs-recovery",account:n}),new (0, _jssdkcore.PrivyClientError)({code:"embedded_wallet_needs_recovery",error:"Embedded wallet not loaded on device"})):c instanceof Error?(o({status:"error",error:c.message,account:n}),new (0, _jssdkcore.PrivyClientError)({code:"unknown_embedded_wallet_error",error:c.message})):(o({status:"error",error:"Error loading embedded wallet",account:n}),new (0, _jssdkcore.PrivyClientError)({code:"unknown_embedded_wallet_error",error:"Error loading embedded wallet"}))}}),[e,n]);return _react.useEffect.call(void 0, ()=>{if(!l&&r.status!=="disconnected")return o({status:"disconnected",account:null});u&&h().catch(()=>{})},[u,l,n]),_react.useEffect.call(void 0, ()=>{r.status==="error"&&r.error.includes("User must be logged in")&&h()},[r.status]),{create:m,recover:f,setPassword:g,setRecovery:y,getProvider:h}};var lt=({client:e,isReady:t})=>{let r=O(),o=ve(a=>a==null?void 0:a.customAuth),[i,d]=_react.useState.call(void 0, {status:"initial"});return _react.useEffect.call(void 0, ()=>{(()=>p(void 0,null,function*(){if(!(o!=null&&o.enabled)){d({status:"not-enabled"});return}d({status:"loading"});let{getCustomAccessToken:s,isLoading:l}=o;if(!(!t||l))try{let n=yield s();if(!n&&r){yield e.auth.logout(),d({status:"done"});return}if(!n){d({status:"done"});return}if(r){d({status:"done"});return}let u=H();if(!(yield e.auth.customProvider.syncWithToken(n,{embedded:u==null?void 0:u.embedded}))){yield e.auth.logout(),d({status:"error",error:new (0, _jssdkcore.PrivyClientError)({error:"Failed to sync with custom auth provider",code:"third_party_auth_error"})});return}d({status:"done"})}catch(n){if(console.log("Error syncing with custom auth provider",n),d({status:"error",error:n}),r)throw yield e.auth.logout(),new (0, _jssdkcore.PrivyClientError)({error:"Third-party auth failed",code:"third_party_auth_error"})}}))()},[e,r,t,o==null?void 0:o.enabled,o==null?void 0:o.getCustomAccessToken,o==null?void 0:o.isLoading]),{customAuthState:i,customAuthStateIsSettled:i.status!=="loading"&&i.status!=="initial"}};var dt=({client:e,isUserInitialized:t,oAuthState:r,oAuthCallbacks:o,setOAuthState:i,recoveryFlowState:d,oAuthStateRef:a})=>{let s=re.useURL(),l=_react.useCallback.call(void 0, n=>{var m,y;let u=U(n);i({status:"error",error:u}),(y=(m=o.current).onError)==null||y.call(m,u)},[i]);return _react.useEffect.call(void 0, ()=>{function n(){return p(this,null,function*(){var g,f;if(!s||r.status!=="loading"||d.status!=="initial")return;let{queryParams:u}=re.parse(s),{privy_oauth_state:m,privy_oauth_code:y}=u;if(!y||!m){i({status:"done"});return}try{let h,c;if(fe())({user:h}=yield e.auth.oauth.linkWithCode(y,m));else{let v=H(),w=yield e.auth.oauth.loginWithCode(y,m,void 0,void 0,a.current.disableSignup?"no-signup":"login-or-sign-up",{embedded:v==null?void 0:v.embedded});h=w.user,c=!!w.is_new_user}return(f=(g=o.current).onSuccess)==null||f.call(g,h,c),a.current={},i({status:"done"}),yield re.openURL(s.split("?")[0])}catch(h){a.current={},l(h)}})}_reactnative.Platform.OS==="android"&&t&&n()},[s,t])};var ct=({client:e,createWalletCallbacks:t,recoverWalletCallbacks:r,setWalletRecoveryCallbacks:o,recoveryFlowState:i,oAuthState:d,setRecoveryFlowState:a,setWallet:s,appStateVisible:l})=>{let n=oe.useURL(),u=O(),m=_react.useMemo.call(void 0, ()=>_jssdkcore.getUserEmbeddedWallet.call(void 0, u),[u]),y=j(),g=_react.useCallback.call(void 0, f=>{var c,_,v,w;let h=U(f);i.status==="creating-wallet"?(_=(c=t.current).onError)==null||_.call(c,U(h)):(w=(v=r.current).onError)==null||w.call(v,U(h)),a({status:"initial"})},[i]);return _react.useEffect.call(void 0, ()=>{function f(){return p(this,null,function*(){var v;if(!n&&i.status!=="initial"&&l&&g(new Error("Recovery OAuth session failed")),!n||i.status==="initial"||d.status!=="initial"||!l||!y)return;let{queryParams:h}=oe.parse(n),{privy_oauth_state:c,privy_oauth_code:_}=h;if(!(!_||!c)){yield oe.openURL(n.split("?")[0]);try{let w=yield _e({oAuthCode:_,oAuthState:c,client:e});if(i.status==="creating-wallet"){let S=(v=_jssdkcore.getUserEmbeddedSolanaWallet.call(void 0, u))!=null?v:void 0;yield we({client:e,setWallet:s,createWalletCallbacks:t,recoveryMethod:"google-drive",setRecoveryFlowState:a,recoveryToken:w,solanaAccount:S})}else if(i.status==="upgrading-recovery"){if(!m)throw new Error("Embedded wallet not found");yield be({client:e,recoveryInput:{recoveryMethod:"google-drive",wallet:m,recoveryAccessToken:w},setWalletRecoveryCallbacks:o,setRecoveryFlowState:a,setWallet:s})}else yield ge({client:e,account:m,setWallet:s,recoverWalletCallbacks:r,recoveryMethod:"google-drive",setRecoveryFlowState:a,recoveryToken:w})}catch(w){g(w)}}})}_reactnative.Platform.OS==="android"&&f()},[n,i.status,l,y])};var ut=({client:e,isUserInitialized:t,setIsUserInitialized:r,setError:o})=>{_react.useEffect.call(void 0, ()=>{t||(()=>p(void 0,null,function*(){try{yield e.initialize()}catch(d){o(d instanceof Error?d:new Error(String(d)))}try{yield e.user.get()}catch(d){}finally{r(!0)}}))()},[e,t,o,r])};var _expocrypto = require('expo-crypto');var pt={name:"@privy-io/expo",version:"0.50.0",description:"Expo client for the Privy Auth API",keywords:["authentication","authorization","identity","privacy","privy","user data","react-native","expo","web3"],license:"Apache-2.0",author:"privy.io",exports:{".":{require:"./dist/index.js",import:"./dist/esm/index.js",types:"./dist/index.d.ts"},"./passkey":{require:"./dist/passkey.js",import:"./dist/esm/passkey.js",types:"./dist/passkey.d.ts"},"./smart-wallets":{require:"./dist/smart-wallets.js",import:"./dist/esm/smart-wallets.js",types:"./dist/smart-wallets.d.ts"}},main:"./dist/esm/index.js",source:"./src/index.ts",types:"./dist/index.d.ts",files:["dist/**/*","LICENSE","README.md"],scripts:{build:"tsup --clean --minify","check-types":"tsc --noEmit",clean:"rm -rf dist .turbo",dev:"tsup --watch",format:'eslint "src/**/*.{ts,tsx,js,jsx}" --fix',"generate-types":"tsup --dts-only",lint:'eslint "src/**/*.{ts,tsx,js,jsx}"',test:'jest --testMatch "**/test/**/*.test.{ts,tsx}"'},browserslist:["defaults","node >= 18","not op_mini all"],dependencies:{"@privy-io/js-sdk-core":"0.47.0","react-fast-compare":"^3.2.2",zustand:"^4.4.1"},devDependencies:{expo:"52.0.37","expo-apple-authentication":"7.1.3","expo-application":"6.0.2","expo-clipboard":"7.0.1","expo-crypto":"14.0.2",react:"^18.3.1","react-native":"0.77.1","@privy-io/eslint-config-custom":"*","@privy-io/tsconfig":"*","@simplewebauthn/types":"9.0.1","@svgr/core":"^8.1.0","@svgr/plugin-jsx":"^8.1.0","@svgr/plugin-svgo":"^8.1.0","@testing-library/react-native":"^13.1.0","react-test-renderer":"^18.3.1","@tsconfig/node16-strictest-esm":"^1.0.3","@types/jest":"^29.1.2",buffer:"^5.4.3","eslint-plugin-react-hooks":"^5.0.0-canary-7118f5dd7-20230705",jest:"^29.7.0","jest-expo":"52.0.5","lucide-react-native":"^0.474.0",tsup:"^6.2.3",typescript:"~5.5.3"},peerDependencies:{"@expo-google-fonts/inter":"*","@privy-io/expo-native-extensions":"0.0.4","expo-apple-authentication":"*","expo-application":"*","expo-clipboard":"*","expo-crypto":"*","expo-font":"*","expo-linking":"*","expo-secure-store":"*","expo-web-browser":"*",permissionless:"^0.2.10",react:"*","react-native":"*","react-native-passkeys":"^0.3.0","react-native-qrcode-styled":"*","react-native-safe-area-context":"*","react-native-svg":"*","react-native-webview":"*",viem:"^2.21.36"},peerDependenciesMeta:{"@expo-google-fonts/inter":{optional:!0},"expo-font":{optional:!0},permissionless:{optional:!0},viem:{optional:!0}},publishConfig:{access:"public"}};var vt=({appId:e,clientId:t,storage:r=Se,supportedChains:o,baseUrl:i,logLevel:d})=>new (0, _jssdkcore2.default)({appId:e,clientId:t,supportedChains:o,storage:yt(r),sdkVersion:`expo:${pt.version}`,nativeAppIdentifier:mt(),crypto:{digest:_expocrypto.digest},baseUrl:i,logLevel:d});var ft=()=>{let{isReady:e,logout:t,getAccessToken:r,error:o}=_react.useContext.call(void 0, D);return{user:O(),isReady:e,error:o,logout:t,getAccessToken:r}};var ht=()=>{let{client:e}=_react.useContext.call(void 0, D);return e};function gt(){let e=ht(),{isReady:t}=ft(),r=O();return _react.useMemo.call(void 0, ()=>{var a,s;if(!t)return null;let o=e.app.getConfig();if(!o)return null;let i=(a=o.require_users_accept_terms)!=null?a:!1,d=(s=r==null?void 0:r.has_accepted_terms)!=null?s:!1;return{termsAndConditionsUrl:o.terms_and_conditions_url,privacyPolicyUrl:o.privacy_policy_url,requireUsersAcceptTerms:i&&!d}},[e.app,t,r==null?void 0:r.has_accepted_terms])}var A=class extends Error{constructor(r,o){super(o);this.code=r,this.error=o}},wt= exports.z =class extends A{constructor(r){super("underlying_error",r instanceof Error?r.message:"An underlying error occurred");this.wrappedError=r}};var We={success:e=>({value:e}),error:e=>({error:e})};var _t=e=>{let t=Array.from(new Set(e));return t.length===0?We.error(new A("no_login_methods_available","No login methods available")):We.success(t)},Ue=e=>{let t=e.length,r=e.every(o=>o==="sms"||o==="email");return t<=2&&r?e[0]:null},Si= exports.A =(e,t)=>{if(e.length!==2)return null;let[r,o]=e;return t===r?o:r},Ei= exports.B ={email:"email",sms:"phone",google:"Google",apple:"Apple",discord:"Discord",twitter:"X",github:"Github",spotify:"Spotify",instagram:"Instagram",tiktok:"Tiktok",linkedin:"LinkedIn"};var _vanilla = require('zustand/vanilla');var Ie=_vanilla.createStore.call(void 0, )(e=>({elementsConfig:null,updateUIMounted:t=>e({elementsConfig:t})})),bt= exports.C =()=>{let{elementsConfig:e}=Ie.getState();if(!(e!==null))throw new A("privy_elements_not_ready","Privy Elements is not mounted")},Ri= exports.D =()=>{let{elementsConfig:e}=Ie.getState();if(e===null)throw new A("privy_elements_not_ready","Privy Elements is not mounted");return e},Oi= exports.E =e=>{_react.useEffect.call(void 0, ()=>{let{updateUIMounted:t}=Ie.getState();return t(e),()=>{t(null)}},[e])};function St(e){return new Promise((t,r)=>{e({resolve:t,reject:r})})}function Fr(e,t){return{resolve:r=>{t(),e.resolve(r)},reject:r=>{t(),e.reject(r)}}}function Et(e,t,r){let o=setTimeout(()=>{e.reject(t())},r);return Fr(e,()=>{clearTimeout(o)})}var Dr=1e3*60*5,G=_zustand.create.call(void 0, )((e,t)=>({privyElementsConfig:null,loginPromiseResolvers:null,activeLoginMethod:null,openLoginFlow:(r,o,i,d)=>St(a=>{var m,y,g;let s=o.app.getConfig();if(!s)return a.reject(new A("privy_not_ready","Privy is not ready"));if(i!==null)return a.reject(new A("user_already_logged_in","User is already logged in"));if(bt(),t().loginPromiseResolvers!==null)return a.reject(new A("existing_login_flow_in_progress","A login flow is already in progress"));let l=_t(r.loginMethods);if(l.error)return a.reject(l.error);let n={loginMethods:l.value,appearance:{logo:(g=(y=(m=r.appearance)==null?void 0:m.logo)!=null?y:s.logo_url)!=null?g:void 0}},u=Et(a,()=>(e({privyElementsConfig:null,loginPromiseResolvers:null}),new A("login_flow_timeout","The login flow timed out")),Dr);d(),e({loginPromiseResolvers:u,privyElementsConfig:n,activeLoginMethod:Ue(n.loginMethods)})}),closeLoginFlow:()=>{var r;return(r=t().loginPromiseResolvers)==null||r.reject(new A("login_flow_closed","The login flow was closed")),e({privyElementsConfig:null,loginPromiseResolvers:null})},goBack:()=>{let{activeLoginMethod:r,privyElementsConfig:o,updateActiveLoginMethod:i,closeLoginFlow:d}=t();if(!o){d();return}let a=Ue(o.loginMethods)===null;r===null||!a?d():i(null)},updateActiveLoginMethod:r=>e({activeLoginMethod:r})})),ji= exports.H =()=>G(e=>e.privyElementsConfig),Di= exports.I =()=>G(e=>e.openLoginFlow),qi= exports.J =()=>{let e=G(r=>r.closeLoginFlow),t=gt();return _react.useCallback.call(void 0, r=>{t!=null&&t.requireUsersAcceptTerms&&!(r!=null&&r.termsReviewed)||e()},[e,t])},Ki= exports.K =()=>G(e=>e.goBack),Vi= exports.L =()=>[G(e=>e.activeLoginMethod),G(e=>e.updateActiveLoginMethod)],qr=e=>{let{loginPromiseResolvers:t}=G.getState();t==null||t.resolve(e)},Ct=()=>qr;var D=_react.createContext.call(void 0, null),ne;function aa(e){return ne?ne.getAccessToken():e!=null&&e.strict?Promise.reject(new (0, _jssdkcore.PrivyClientError)({code:"attempted_to_read_storage_before_client_initialized",error:"Called `getAccessToken` before client initialized"})):(console.warn("Called `getAccessToken` before client initialized"),Promise.resolve(null))}var sa=e=>{Jr();let[t,r]=_react.useState.call(void 0, _reactnative.AppState.currentState==="active");_react.useEffect.call(void 0, ()=>{let M=_reactnative.AppState.addEventListener("change",jt=>{r(jt==="active")});return()=>{M.remove()}},[]),_react.useEffect.call(void 0, ()=>Ve(e.config),[e.config]);let[o,i]=_react.useState.call(void 0, !1),[d,a]=_react.useState.call(void 0, null),[s,l]=_react.useState.call(void 0, !1),[n,u]=_react.useState.call(void 0, {status:"disconnected",account:null}),[m,y]=_react.useState.call(void 0, {status:"disconnected"}),[g,f]=_react.useState.call(void 0, {status:"initial"}),[h,c]=_react.useState.call(void 0, {status:"initial"}),_=_react.useRef.call(void 0, {}),[v,w]=_react.useState.call(void 0, {status:"initial"}),[S,b]=_react.useState.call(void 0, {status:"initial"}),[E,F]=_react.useState.call(void 0, {status:"initial"}),[L,Q]=_react.useState.call(void 0, {status:"initial"}),[q,K]=_react.useState.call(void 0, {status:"initial"}),V=_react.useRef.call(void 0, {}),N=_react.useRef.call(void 0, {}),x=_react.useRef.call(void 0, {}),z=_react.useRef.call(void 0, {}),ae=_react.useRef.call(void 0, {}),Fe=_react.useRef.call(void 0, {}),Wt=Ct(),me=_react.useCallback.call(void 0, M=>{if(M){Wt(M),Pe(M),a(null);return}Pe(null),f({status:"initial"}),c({status:"initial"}),u({status:"disconnected",account:null})},[]),P=_react.useMemo.call(void 0, ()=>{let M=e.storage||Se;return e.client?ne=e.client:ne=vt({appId:e.appId,clientId:e.clientId,supportedChains:e.supportedChains,storage:M,baseUrl:e.baseUrl,logLevel:e.logLevel}),ne.setCallbacks({setUser:me,setIsReady:l}),ne},[e.client,e.storage,e.appId,e.clientId,e.baseUrl,e.supportedChains,e.logLevel,me]),Ut=_react.useCallback.call(void 0, ()=>(me(null),P.auth.logout()),[me,P]),It=_react.useCallback.call(void 0, ()=>p(void 0,null,function*(){try{return yield P.getAccessToken()}catch(M){return console.debug(M),null}}),[P]),Lt=_react.useCallback.call(void 0, ()=>P.getIdentityToken(),[P]);ut({client:P,isUserInitialized:o,setIsUserInitialized:i,setError:a});let Mt=at({client:P,appId:e.appId,createWalletCallbacks:N,recoverWalletCallbacks:x,setWalletRecoveryCallbacks:z,setRecoveryFlowState:w,wallet:n,setWallet:u}),Tt=Qe({client:P,createSolanaWalletCallbacks:ae,recoverSolanaWalletCallbacks:Fe,setSolanaRecoveryFlowState:b,solanaWallet:m,setSolanaWallet:y});dt({client:P,isUserInitialized:o,oAuthState:h,setOAuthState:c,oAuthCallbacks:V,recoveryFlowState:v,oAuthStateRef:_}),ct({client:P,createWalletCallbacks:N,recoverWalletCallbacks:x,setWalletRecoveryCallbacks:z,recoveryFlowState:v,oAuthState:h,setRecoveryFlowState:w,setWallet:u,appStateVisible:t});let{customAuthStateIsSettled:Ft}=lt({client:P,isReady:o}),Nt=j();return _react2.default.createElement(_react2.default.Fragment,null,_react2.default.createElement(D.Provider,{value:{client:P,isReady:Nt&&o&&Ft,error:d,logout:Ut,getAccessToken:It,getIdentityToken:Lt,wallet:C(C({},n),Mt),solanaWallet:C(C({},m),Tt),oAuthState:h,oAuthCallbacks:V,recoveryFlowState:v,setRecoveryFlowState:w,solanaRecoveryFlowState:S,setSolanaRecoveryFlowState:b,createWalletCallbacks:N,recoverWalletCallbacks:x,setWalletRecoveryCallbacks:z,createSolanaWalletCallbacks:ae,recoverSolanaWalletCallbacks:Fe,setOAuthState:c,siweState:E,setSiweState:F,otpState:g,setOtpState:f,passkeyState:L,setPasskeyState:Q,farcasterState:q,setFarcasterState:K,oAuthStateRef:_}},e.children),_react2.default.createElement(_reactnative.View,{style:{width:0,height:0,overflow:"hidden"}},_react2.default.createElement(He,{logLevel:e.logLevel,client:P,isClientReady:s})))},Jr=()=>{if(_react.useContext.call(void 0, D))throw new (0, _jssdkcore.PrivyClientError)({code:"configuration_error",error:"Found multiple instances of PrivyProvider, ensure there is only one mounted in your application tree."})};var _expoappleauthentication = require('expo-apple-authentication'); var ue = _interopRequireWildcard(_expoappleauthentication);function Rt(e){return p(this,null,function*(){try{return yield ue.signInAsync({state:e.state,requestedScopes:[ue.AppleAuthenticationScope.EMAIL,ue.AppleAuthenticationScope.FULL_NAME]})}catch(t){throw t instanceof Error&&"code"in t&&t.code==="ERR_REQUEST_CANCELED"?new (0, _jssdkcore.PrivyClientError)({error:"Apple login was cancelled",code:e.isLogin?"login_with_oauth_was_cancelled_by_user":"link_with_oauth_was_cancelled_by_user"}):t}})}var Me=(e={})=>{let{oAuthState:t,setOAuthState:r,oAuthCallbacks:o,client:i,oAuthStateRef:d}=_react.useContext.call(void 0, D),a=ze(),s=e.action?e.action==="login":!a;_react.useEffect.call(void 0, ()=>{o.current={onSuccess:e.onSuccess,onError:e.onError}},[e.onSuccess,e.onError]);let l=_react.useCallback.call(void 0, u=>{var y;let m=U(u);return r({status:"error",error:m}),(y=e==null?void 0:e.onError)==null||y.call(e,m),m},[e==null?void 0:e.onError]);return{start:_react.useCallback.call(void 0, function(h){return p(this,arguments,function*({provider:m,redirectUri:y,isLegacyAppleIosBehaviorEnabled:g=!1,disableSignup:f}){var _,v,w;r({status:"loading"}),d.current={disableSignup:f};let c=fe();try{if(c&&e.action==="login")throw new (0, _jssdkcore.PrivyClientError)({code:"attempted_login_with_oauth_while_already_logged_in",error:"Already logged in, if trying to link an OAuth account use `useLinkWithOAuth`"});if(!c&&e.action==="link")throw new (0, _jssdkcore.PrivyClientError)({code:"attempted_link_oauth_before_logged_in",error:"Must be logged in to link an OAuth account, use `useLoginWithOAuth`"});let{url:S}=yield i.auth.oauth.generateURL(m,ie.createURL(y||"/")),b,E;if(_reactnative.Platform.OS==="ios"&&m==="apple"&&!g){let N=(_=new URL(S).searchParams.get("state"))!=null?_:"",x=yield Rt({state:N,isLogin:s});if(!x.authorizationCode||!x.state)throw new (0, _jssdkcore.PrivyClientError)({error:"OAuth invalid credentials",code:s?"login_with_oauth_returned_with_invalid_credentials":"link_with_oauth_returned_with_invalid_credentials"});if(s){let z=H(),ae=yield i.auth.oauth.loginWithCode(x.authorizationCode,x.state,m,"raw",f?"no-signup":"login-or-sign-up",{embedded:z==null?void 0:z.embedded});b=ae.user,E=ae.is_new_user}else({user:b}=yield i.auth.oauth.linkWithCode(x.authorizationCode,x.state,m,"raw"));return(v=e==null?void 0:e.onSuccess)==null||v.call(e,b,E),r({status:"done"}),b!=null?b:void 0}let F=_reactnative.Platform.OS==="android"?S.replace("x.com","twitter.com"):S,L=yield pe.openAuthSessionAsync(F);if(_reactnative.Platform.OS==="android")return;if(L.type!=="success")throw[pe.WebBrowserResultType.CANCEL,pe.WebBrowserResultType.DISMISS].includes(L.type)?new (0, _jssdkcore.PrivyClientError)({error:"OAuth was cancelled",code:s?"login_with_oauth_was_cancelled_by_user":"link_with_oauth_was_cancelled_by_user"}):new (0, _jssdkcore.PrivyClientError)({error:"OAuth session failed",code:s?"failed_to_complete_login_with_oauth":"failed_to_complete_link_with_oauth"});let{queryParams:Q}=ie.parse(L.url),{privy_oauth_state:q,privy_oauth_code:K}=Q;if(!K||!q)throw new (0, _jssdkcore.PrivyClientError)({error:"OAuth invalid credentials",code:s?"login_with_oauth_returned_with_invalid_credentials":"link_with_oauth_returned_with_invalid_credentials"});if(s){let V=H(),N=yield i.auth.oauth.loginWithCode(K,q,m,void 0,f?"no-signup":"login-or-sign-up",{embedded:V==null?void 0:V.embedded});b=N.user,E=N.is_new_user}else({user:b}=yield i.auth.oauth.linkWithCode(K,q,m));return(w=e==null?void 0:e.onSuccess)==null||w.call(e,b,E),yield ie.openURL(L.url.split("?")[0]),r({status:"done"}),b!=null?b:void 0}catch(S){l(S)}})},[i,r,l]),state:t}};function Sa(e){let{state:t,start:r}=Me(W(C({},e),{action:"login"}));return{state:t,login:r}}function Ea(e){let{state:t,start:r}=Me(W(C({},e),{action:"link"}));return{state:t,link:r}}function Ca(e){return Me(e)}var mt=()=>{if(typeof _expoapplication.applicationId!="string")throw new (0, _jssdkcore.PrivyClientError)({error:"Cannot determine native application ID. Please make sure `expo-application` is installed as a dependency and that `ios.bundleId` or `android.package` is set.",code:"invalid_native_app_id"});return _expoapplication.applicationId};function yt(e){return{get(t){return e.get(t.replaceAll(":","-"))},put(t,r){return e.put(t.replaceAll(":","-"),r)},del(t){return e.del(t.replaceAll(":","-"))},getKeys:()=>p(this,null,function*(){return[]})}}var Se={get(e){return I.getItemAsync(e,{keychainAccessible:I.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY})},put(e,t){return I.setItemAsync(e,t,{keychainAccessible:I.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY})},del(e){return I.deleteItemAsync(e,{keychainAccessible:I.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY})},getKeys:()=>p(void 0,null,function*(){return[]})};var Qr=e=>p(void 0,null,function*(){var o;let r=yield(yield Promise.resolve().then(() => _interopRequireWildcard(require("react-native-passkeys")))).create({rp:e.rp,user:e.user,challenge:e.challenge,pubKeyCredParams:e.pubKeyCredParams,excludeCredentials:e.excludeCredentials,authenticatorSelection:e.authenticatorSelection,timeout:12e4});if(!r)throw new (0, _jssdkcore.PrivyClientError)({code:"failed_to_create_passkey",error:"Could not create passkey"});return W(C({},r),{type:(o=r.type)!=null?o:"public-key",clientExtensionResults:{}})});var Zr=e=>p(void 0,null,function*(){var o;let r=yield(yield Promise.resolve().then(() => _interopRequireWildcard(require("react-native-passkeys")))).get({rpId:e.rpId,challenge:e.challenge,allowCredentials:e.allowCredentials,timeout:12e4});if(!r)throw new (0, _jssdkcore.PrivyClientError)({code:"no_passkey_found_for_challenge",error:"Could not find a matching passkey to login with"});return W(C({},r),{type:(o=r.type)!=null?o:"public-key",clientExtensionResults:{}})});function Na(e){var t;return{id:e.id,client_extension_results:{app_id:e.clientExtensionResults.appid,cred_props:e.clientExtensionResults.credProps,hmac_create_secret:e.clientExtensionResults.hmacCreateSecret},raw_id:e.rawId,type:e.type,authenticator_attachment:(t=e.authenticatorAttachment)!=null?t:"platform",response:{authenticator_data:e.response.authenticatorData,client_data_json:e.response.clientDataJSON,signature:e.response.signature,user_handle:e.response.userHandle}}}function ja(e){var t,r,o,i;return{challenge:e.challenge,rpId:e.rp_id,extensions:{appid:(t=e.extensions)==null?void 0:t.app_id,credProps:(r=e.extensions)==null?void 0:r.cred_props,hmacCreateSecret:(o=e.extensions)==null?void 0:o.hmac_create_secret},timeout:e.timeout,allowCredentials:(i=e.allow_credentials)==null?void 0:i.map(({id:d,type:a,transports:s})=>({id:d,type:a,transports:s})),userVerification:e.user_verification}}function Da(e){var t,r,o,i,d,a,s,l;return{rp:e.rp,user:{id:e.user.id,name:e.user.name,displayName:e.user.display_name},challenge:e.challenge,pubKeyCredParams:e.pub_key_cred_params,extensions:{hmacCreateSecret:(t=e.extensions)==null?void 0:t.hmac_create_secret,credProps:(o=(r=e.extensions)==null?void 0:r.cred_props)==null?void 0:o.rk,appid:(i=e.extensions)==null?void 0:i.app_id},attestation:e.attestation,excludeCredentials:e.exclude_credentials,authenticatorSelection:{authenticatorAttachment:(d=e.authenticator_selection)==null?void 0:d.authenticator_attachment,residentKey:(a=e.authenticator_selection)==null?void 0:a.resident_key,userVerification:(s=e.authenticator_selection)==null?void 0:s.user_verification,requireResidentKey:(l=e.authenticator_selection)==null?void 0:l.require_resident_key}}}exports.a = C; exports.b = W; exports.c = eo; exports.d = p; exports.e = H; exports.f = fe; exports.g = O; exports.h = ze; exports.i = Ke; exports.j = no; exports.k = Oe; exports.l = et; exports.m = U; exports.n = Bo; exports.o = $o; exports.p = cn; exports.q = Sa; exports.r = Ea; exports.s = Ca; exports.t = Se; exports.u = vt; exports.v = ft; exports.w = ht; exports.x = gt; exports.y = A; exports.z = wt; exports.A = Si; exports.B = Ei; exports.C = bt; exports.D = Ri; exports.E = Oi; exports.F = St; exports.G = Et; exports.H = ji; exports.I = Di; exports.J = qi; exports.K = Ki; exports.L = Vi; exports.M = D; exports.N = aa; exports.O = sa; exports.P = Qr; exports.Q = Zr; exports.R = Na; exports.S = ja; exports.T = Da;