@crossmint/client-sdk-react-native-ui 0.8.0 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,67 +1,146 @@
1
1
  # Crossmint React Native SDK
2
2
 
3
- This package provides a React Native UI for integrating Crossmint authentication and wallet functionality into your mobile apps.
3
+ > **Create chain-agnostic wallets for your React Native apps in minutes**
4
+ > Supports Solana, 20+ EVM chains (Polygon, Base, etc.), with secure mobile authentication.
4
5
 
5
- ## Installation
6
+ ## 🚀 Quick Start
6
7
 
7
8
  ```bash
8
9
  pnpm add @crossmint/client-sdk-react-native-ui expo-secure-store expo-web-browser
9
10
  ```
10
11
 
11
- ## Authentication with Secure Storage
12
+ ### 1. Setup Providers
12
13
 
13
- The React Native SDK uses [Expo's SecureStore](https://docs.expo.dev/versions/latest/sdk/securestore/) for secure, encrypted storage of authentication tokens. This provides a platform-native secure storage solution that encrypts sensitive data on the device.
14
-
15
- ### Using the Default Secure Storage
16
-
17
- The `CrossmintAuthProvider` uses SecureStorage by default:
14
+ **Option A: With Crossmint Authentication (Recommended)**
18
15
 
19
16
  ```tsx
20
- import { CrossmintProvider, CrossmintAuthProvider } from "@crossmint/client-sdk-react-native-ui";
17
+ import {
18
+ CrossmintProvider,
19
+ CrossmintAuthProvider,
20
+ CrossmintWalletProvider
21
+ } from "@crossmint/client-sdk-react-native-ui";
21
22
 
22
23
  export default function App() {
23
24
  return (
24
- <CrossmintProvider
25
- apiKey="YOUR_API_KEY"
26
- >
25
+ <CrossmintProvider apiKey={process.env.EXPO_PUBLIC_CROSSMINT_API_KEY}>
27
26
  <CrossmintAuthProvider>
28
- {/* Your app content */}
27
+ <CrossmintWalletProvider
28
+ createOnLogin={{
29
+ chain: "solana",
30
+ signer: { type: "email" }
31
+ }}
32
+ >
33
+ <MainApp />
34
+ </CrossmintWalletProvider>
29
35
  </CrossmintAuthProvider>
30
36
  </CrossmintProvider>
31
37
  );
32
38
  }
33
39
  ```
34
40
 
35
- ### Authentication Hooks
41
+ **Option B: 🔧 Bring Your Own Authentication**
42
+
43
+ Already have authentication? Skip Crossmint Auth and use wallets with your existing system:
44
+
45
+ 📖 **[Complete Custom Auth Guide](https://docs.crossmint.com/wallets/advanced/bring-your-own-auth#react-native)** - Full setup with server-side examples and implementation details.
46
+
47
+ ```tsx
48
+ import {
49
+ CrossmintProvider,
50
+ CrossmintWalletProvider
51
+ } from "@crossmint/client-sdk-react-native-ui";
52
+
53
+ export default function App() {
54
+ return (
55
+ <CrossmintProvider apiKey={process.env.EXPO_PUBLIC_CROSSMINT_API_KEY}>
56
+ {/* No CrossmintAuthProvider needed! */}
57
+ <CrossmintWalletProvider>
58
+ <MainApp />
59
+ </CrossmintWalletProvider>
60
+ </CrossmintProvider>
61
+ );
62
+ }
63
+ ```
64
+
65
+ ### 2. Use Authentication & Wallets
36
66
 
37
- Once the providers are set up, you can use the authentication hooks in your components:
67
+ The React Native SDK uses [Expo's SecureStore](https://docs.expo.dev/versions/latest/sdk/securestore/) for secure, encrypted storage of authentication tokens. This provides a platform-native secure storage solution that encrypts sensitive data on the device.
38
68
 
39
69
  ```tsx
40
- import { useCrossmintAuth } from "@crossmint/client-sdk-react-native-ui";
70
+ import { View, Button, Text } from "react-native";
71
+ import { useCrossmintAuth, useWallet } from "@crossmint/client-sdk-react-native-ui";
41
72
 
42
- function ProfileScreen() {
43
- const { user, status, logout, login } = useCrossmintAuth();
73
+ export default function MainApp() {
74
+ const { loginWithOAuth, logout, user } = useCrossmintAuth();
75
+ const { wallet, status } = useWallet();
44
76
 
45
- if (status === "logged-out") {
77
+ if (!user) {
46
78
  return (
47
- <View>
48
- <Button
49
- title="Sign in with Google"
50
- onPress={() => login("google")}
79
+ <View style={{ padding: 20 }}>
80
+ <Button
81
+ title="Login with Google"
82
+ onPress={() => loginWithOAuth("google")}
51
83
  />
52
84
  </View>
53
85
  );
54
86
  }
55
87
 
56
- return (
57
- <View>
58
- <Text>Welcome, {user?.email}</Text>
59
- <Button title="Logout" onPress={logout} />
60
- </View>
61
- );
88
+ if (status === "loaded") {
89
+ return (
90
+ <View style={{ padding: 20 }}>
91
+ <Text>Welcome {user.email}!</Text>
92
+ <Text>Wallet: {wallet?.address}</Text>
93
+ <Button
94
+ title="Send 1 USDC"
95
+ onPress={() => wallet?.send(recipient, "usdc", "1.0")}
96
+ />
97
+ <Button title="Logout" onPress={logout} />
98
+ </View>
99
+ );
100
+ }
101
+
102
+ return <Text>Loading wallet...</Text>;
62
103
  }
63
104
  ```
64
105
 
106
+ ## 🔐 Authentication
107
+
108
+ ### OAuth Login Methods
109
+ ```tsx
110
+ const { loginWithOAuth } = useCrossmintAuth();
111
+
112
+ // Available OAuth providers
113
+ <Button title="Google" onPress={() => loginWithOAuth("google")} />
114
+ <Button title="Twitter" onPress={() => loginWithOAuth("twitter")} />
115
+ ```
116
+
117
+ ## 💳 Wallets
118
+
119
+ ### Multi-Chain Support
120
+ - **Solana**: Native SOL, SPL tokens
121
+ - **EVM Chains**: Ethereum, Polygon, Base, Arbitrum, and 15+ more
122
+ - **Unified API**: Same code works across all chains
123
+
124
+ ### Using Wallets
125
+ ```tsx
126
+ const { wallet, getOrCreateWallet } = useWallet();
127
+
128
+ // Get wallet info
129
+ const address = wallet?.address;
130
+ const balance = await wallet?.balances();
131
+
132
+ // Send tokens
133
+ const tx = await wallet?.send(recipient, "usdc", "10.5");
134
+ console.log("Transaction:", tx.explorerLink);
135
+
136
+ // For advanced use cases
137
+ const customWallet = await getOrCreateWallet({
138
+ chain: "<your-chain>",
139
+ signer: { type: "<your-signer-type>" }
140
+ });
141
+ ```
142
+
143
+
65
144
  ## Custom Storage Provider
66
145
 
67
146
  If you need to implement a custom storage solution, you can implement the `StorageProvider` interface and pass it to the `CrossmintAuthProvider`:
@@ -98,4 +177,28 @@ function App() {
98
177
  }
99
178
  ```
100
179
 
101
- For more detailed documentation, please visit the [Crossmint Developer Docs](https://docs.crossmint.com/).
180
+ ## 🛠️ Environment Setup
181
+
182
+ 1. Get your API key from [Crossmint Console](https://staging.crossmint.com/console/projects/apiKeys)
183
+
184
+ 2. Add to your `.env`:
185
+ ```bash
186
+ EXPO_PUBLIC_CROSSMINT_API_KEY=your_api_key_here
187
+ ```
188
+
189
+ 3. Configure deep linking in `app.json`:
190
+ ```json
191
+ {
192
+ "expo": {
193
+ "scheme": "your-app-scheme"
194
+ }
195
+ }
196
+ ```
197
+
198
+ ## 📚 Examples & Documentation
199
+
200
+ - **[Wallets Expo Quickstart](https://github.com/Crossmint/wallets-expo-quickstart)** - Create and interact with Crossmint wallets using Crossmint Auth for React Native.
201
+
202
+ ---
203
+
204
+ **Questions?** Visit our [documentation](https://docs.crossmint.com/introduction/about-crossmint) or contact our support team.
@@ -0,0 +1 @@
1
+ import{a as q}from"./chunk-GDMV4TA2.js";import{d as u}from"./chunk-PXDN3KFO.js";import{createContext as me,useEffect as D,useMemo as ee,useRef as fe,useState as S,useCallback as $}from"react";import*as p from"expo-web-browser";import{CrossmintAuth as ge}from"@crossmint/client-sdk-auth";import{SESSION_PREFIX as ve}from"@crossmint/common-sdk-auth";import{useCrossmint as T,useWallet as _e}from"@crossmint/client-sdk-react-base";import{useContext as X}from"react";function We(){let e=X(j);if(!e)throw new Error("useCrossmintAuth must be used within a CrossmintAuthProvider");return e}function be(){let e=X(j);if(!e)throw new Error("useAuth must be used within a CrossmintAuthProvider");return e}import{useCallback as Q,useEffect as re,useRef as x,useState as ne,useMemo as Y,createContext as oe}from"react";import{View as ie}from"react-native";import{RNWebView as se,WebViewParent as ae}from"@crossmint/client-sdk-rn-window";import{environmentUrlConfig as Z,signerInboundEvents as le,signerOutboundEvents as ue}from"@crossmint/client-signers";import{validateAPIKey as ce}from"@crossmint/common-sdk-base";import{CrossmintWalletBaseProvider as de}from"@crossmint/client-sdk-react-base";import{jsx as F,jsxs as he}from"react/jsx-runtime";var P=e=>()=>{throw new Error(`${e} is not available. Make sure you're using an email signer wallet.`)},K=oe({needsAuth:!1,sendEmailWithOtp:P("sendEmailWithOtp"),verifyOtp:P("verifyOtp"),reject:P("reject")});function je({children:e,createOnLogin:c,callbacks:v}){let{crossmint:U}=T("CrossmintWalletProvider must be used within CrossmintProvider"),{apiKey:w,appId:m}=U,W=ce(w);if(!W.isValid)throw new Error("Invalid API key");let b=Z[W.environment],f=x(null),o=x(null),[A,N]=ne(!1),R=x(P("sendEmailWithOtp")),C=x(P("verifyOtp")),a=x(P("reject")),L=Y(()=>m!=null?`window.crossmintAppId = '${m}';`:"",[m]);re(()=>{f.current!=null&&o.current==null&&(o.current=new ae(f,{incomingEvents:ue,outgoingEvents:le}))},[]);let M=Q(()=>u(this,null,function*(){let t=o.current;if(t!=null)try{yield t.handshakeWithChild()}catch(n){console.error("[CrossmintWalletProvider] Handshake error:",n)}}),[]),B=Q(t=>{let n=o.current;if(n!=null){try{let i=JSON.parse(t.nativeEvent.data);if(i&&typeof i.type=="string"&&i.type.startsWith("console.")){let g=i.type.split(".")[1],d=(i.data||[]).map(h=>{try{return h==="[Function]"||h==="[Circular Reference]"||h==="[Unserializable Object]"?h:JSON.parse(h)}catch(J){return h}}),y=`[WebView:${g.toUpperCase()}]`;switch(g){case"log":console.log(y,...d);break;case"error":console.error(y,...d);break;case"warn":console.warn(y,...d);break;case"info":console.info(y,...d);break;default:console.log(`[WebView Unknown:${g}]`,...d)}return}}catch(i){}n.handleMessage(t)}},[]),O=()=>{if(o.current==null)throw new Error("WebView not ready or handshake incomplete");return o.current},z=(t,n,i,g)=>u(this,null,function*(){N(t),R.current=n,C.current=i,a.current=g}),H=Y(()=>({needsAuth:A,sendEmailWithOtp:R.current,verifyOtp:C.current,reject:a.current}),[A]);return he(de,{createOnLogin:c,onAuthRequired:z,clientTEEConnection:O,callbacks:v,children:[F(K.Provider,{value:H,children:e}),F(ie,{style:{position:"absolute",width:0,height:0,overflow:"hidden"},children:F(se,{ref:f,source:{uri:b},injectedGlobals:L,onLoadStart:t=>{console.log("[CrossmintWalletProvider] WebView onLoadStart:",t.nativeEvent.url)},onLoadEnd:M,onLoadProgress:({nativeEvent:t})=>{console.log("[CrossmintWalletProvider] WebView loading progress:",t.progress)},onMessage:B,onError:t=>{console.error("[CrossmintWalletProvider] WebView error:",t.nativeEvent)},onHttpError:t=>{console.error("[CrossmintWalletProvider] WebView HTTP error:",t.nativeEvent)},style:{width:1,height:1},javaScriptCanOpenWindowsAutomatically:!1,thirdPartyCookiesEnabled:!1,sharedCookiesEnabled:!1,incognito:!1,setSupportMultipleWindows:!1,originWhitelist:[Z[W.environment]]})})]})}import{useContext as pe}from"react";function Ke(){let e=pe(K);if(e==null)throw new Error("useWalletEmailSigner must be used within CrossmintWalletProvider");if(!e.sendEmailWithOtp||!e.verifyOtp||!e.reject)throw new Error("Email signer functions are not available. Make sure you're using an email signer wallet.");return{needsAuth:e.needsAuth,sendEmailWithOtp:e.sendEmailWithOtp,verifyOtp:e.verifyOtp,reject:e.reject}}import{Platform as we}from"react-native";import G from"expo-constants";import{jsx as ye}from"react/jsx-runtime";var te={google:null,twitter:null},Ae={crossmintAuth:void 0,logout:()=>{},jwt:void 0,user:void 0,status:"initializing",getUser:()=>{},loginWithOAuth:()=>Promise.resolve(),createAuthSession:()=>Promise.resolve(null)},j=me(Ae);function ot({children:e,onLoginSuccess:c,refreshRoute:v,logoutRoute:U,customStorageProvider:w,appSchema:m}){let{crossmint:W}=T("CrossmintAuthProvider must be used within CrossmintProvider"),[b,f]=S(void 0),[o,A]=S(void 0),[N,R]=S(te),C=fe(null),a=ee(()=>w!=null?w:new q,[w]),[L,M]=S(!1),[B,O]=S(!1),z=Array.isArray(m)?m[0]:m,t=G.executionEnvironment==="storeClient"||G.appOwnership==="expo"||!!G.expoVersion?"exp://127.0.0.1:8081":z,n=ee(()=>{if(!C.current){let r={callbacks:{onLogout:()=>{f(void 0),A(void 0)},onTokenRefresh:s=>{f(s.user),A(s.jwt)}},refreshRoute:v,logoutRoute:U,storageProvider:a};C.current=ge.from(W,r)}return C.current},[a]),i=$(()=>{c==null||c()},[c]);D(()=>{o==null?a==null||a.get(ve).then(r=>{r!=null&&A(r)}).finally(()=>{M(!0)}):M(!0)},[o,a]),D(()=>{o!=null&&i()},[o,i]);let g=()=>{n.logout()},d=$(()=>u(this,null,function*(){try{let s=Object.keys(te).map(E=>u(this,null,function*(){let V=yield n==null?void 0:n.getOAuthUrl(E,{appSchema:t});return{[E]:V}})),l=Object.assign({},...yield Promise.all(s));R(l)}catch(r){console.error(r)}}),[n]);D(()=>{b==null&&d()},[d,b]);let y=()=>L?B?"in-progress":o!=null?"logged-in":"logged-out":"initializing",h=()=>u(this,null,function*(){if(o==null){console.log("User not logged in");return}let r=yield n.getUser();return f(r),r}),J=r=>u(this,null,function*(){var s;try{O(!0);let l=(s=N[r])!=null?s:yield n.getOAuthUrl(r,{appSchema:t});yield p.warmUpAsync();let E=new URL(l);if(r==="google"&&E.searchParams.append("provider_prompt","select_account"),we.OS==="android")yield p.openBrowserAsync(E.toString());else{let V=yield p.openAuthSessionAsync(E.toString());V.type==="success"&&(yield _(V.url))}yield p.coolDownAsync()}catch(l){throw console.error("[CrossmintAuthProvider] Error during OAuth login:",l),new Error(`Error during OAuth login: ${l}`)}}),_=$(r=>u(this,null,function*(){let s=r.includes("://")?Ce(r):r;if(s!=null)try{return O(!0),yield n.handleRefreshAuthMaterial(s)}catch(l){throw l}finally{O(!1)}return null}),[n]);return ye(j.Provider,{value:{crossmintAuth:n,logout:g,jwt:o,user:b,status:y(),getUser:h,loginWithOAuth:J,createAuthSession:_},children:e})}var Ce=e=>{let c=/[?&]oneTimeSecret=([^&#]+)/,v=e.match(c);return v?decodeURIComponent(v[1]):void 0};export{j as a,ot as b,We as c,be as d,K as e,je as f,Ke as g,T as h,_e as i};
@@ -0,0 +1 @@
1
+ "use strict";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 _chunkK754GXKDcjs = require('./chunk-K754GXKD.cjs');var _chunk2WSEHVNPcjs = require('./chunk-2WSEHVNP.cjs');var _react = require('react');var _expowebbrowser = require('expo-web-browser'); var p = _interopRequireWildcard(_expowebbrowser);var _clientsdkauth = require('@crossmint/client-sdk-auth');var _commonsdkauth = require('@crossmint/common-sdk-auth');var _clientsdkreactbase = require('@crossmint/client-sdk-react-base');function Pe(){let e=_react.useContext.call(void 0, I);if(!e)throw new Error("useCrossmintAuth must be used within a CrossmintAuthProvider");return e}function We(){let e=_react.useContext.call(void 0, I);if(!e)throw new Error("useAuth must be used within a CrossmintAuthProvider");return e}var _reactnative = require('react-native');var _clientsdkrnwindow = require('@crossmint/client-sdk-rn-window');var _clientsigners = require('@crossmint/client-signers');var _commonsdkbase = require('@crossmint/common-sdk-base');var _jsxruntime = require('react/jsx-runtime');var P=e=>()=>{throw new Error(`${e} is not available. Make sure you're using an email signer wallet.`)},F= exports.e =_react.createContext.call(void 0, {needsAuth:!1,sendEmailWithOtp:P("sendEmailWithOtp"),verifyOtp:P("verifyOtp"),reject:P("reject")});function Ie({children:e,createOnLogin:c,callbacks:v}){let{crossmint:U}=_clientsdkreactbase.useCrossmint.call(void 0, "CrossmintWalletProvider must be used within CrossmintProvider"),{apiKey:w,appId:m}=U,W=_commonsdkbase.validateAPIKey.call(void 0, w);if(!W.isValid)throw new Error("Invalid API key");let b=_clientsigners.environmentUrlConfig[W.environment],f=_react.useRef.call(void 0, null),o=_react.useRef.call(void 0, null),[A,T]=_react.useState.call(void 0, !1),R=_react.useRef.call(void 0, P("sendEmailWithOtp")),C=_react.useRef.call(void 0, P("verifyOtp")),a=_react.useRef.call(void 0, P("reject")),N=_react.useMemo.call(void 0, ()=>m!=null?`window.crossmintAppId = '${m}';`:"",[m]);_react.useEffect.call(void 0, ()=>{f.current!=null&&o.current==null&&(o.current=new (0, _clientsdkrnwindow.WebViewParent)(f,{incomingEvents:_clientsigners.signerOutboundEvents,outgoingEvents:_clientsigners.signerInboundEvents}))},[]);let M=_react.useCallback.call(void 0, ()=>_chunk2WSEHVNPcjs.d.call(void 0, this,null,function*(){let t=o.current;if(t!=null)try{yield t.handshakeWithChild()}catch(n){console.error("[CrossmintWalletProvider] Handshake error:",n)}}),[]),L=_react.useCallback.call(void 0, t=>{let n=o.current;if(n!=null){try{let i=JSON.parse(t.nativeEvent.data);if(i&&typeof i.type=="string"&&i.type.startsWith("console.")){let g=i.type.split(".")[1],d=(i.data||[]).map(h=>{try{return h==="[Function]"||h==="[Circular Reference]"||h==="[Unserializable Object]"?h:JSON.parse(h)}catch(H){return h}}),y=`[WebView:${g.toUpperCase()}]`;switch(g){case"log":console.log(y,...d);break;case"error":console.error(y,...d);break;case"warn":console.warn(y,...d);break;case"info":console.info(y,...d);break;default:console.log(`[WebView Unknown:${g}]`,...d)}return}}catch(i){}n.handleMessage(t)}},[]),O=()=>{if(o.current==null)throw new Error("WebView not ready or handshake incomplete");return o.current},B=(t,n,i,g)=>_chunk2WSEHVNPcjs.d.call(void 0, this,null,function*(){T(t),R.current=n,C.current=i,a.current=g}),G=_react.useMemo.call(void 0, ()=>({needsAuth:A,sendEmailWithOtp:R.current,verifyOtp:C.current,reject:a.current}),[A]);return _jsxruntime.jsxs.call(void 0, _clientsdkreactbase.CrossmintWalletBaseProvider,{createOnLogin:c,onAuthRequired:B,clientTEEConnection:O,callbacks:v,children:[_jsxruntime.jsx.call(void 0, F.Provider,{value:G,children:e}),_jsxruntime.jsx.call(void 0, _reactnative.View,{style:{position:"absolute",width:0,height:0,overflow:"hidden"},children:_jsxruntime.jsx.call(void 0, _clientsdkrnwindow.RNWebView,{ref:f,source:{uri:b},injectedGlobals:N,onLoadStart:t=>{console.log("[CrossmintWalletProvider] WebView onLoadStart:",t.nativeEvent.url)},onLoadEnd:M,onLoadProgress:({nativeEvent:t})=>{console.log("[CrossmintWalletProvider] WebView loading progress:",t.progress)},onMessage:L,onError:t=>{console.error("[CrossmintWalletProvider] WebView error:",t.nativeEvent)},onHttpError:t=>{console.error("[CrossmintWalletProvider] WebView HTTP error:",t.nativeEvent)},style:{width:1,height:1},javaScriptCanOpenWindowsAutomatically:!1,thirdPartyCookiesEnabled:!1,sharedCookiesEnabled:!1,incognito:!1,setSupportMultipleWindows:!1,originWhitelist:[_clientsigners.environmentUrlConfig[W.environment]]})})]})}function Fe(){let e=_react.useContext.call(void 0, F);if(e==null)throw new Error("useWalletEmailSigner must be used within CrossmintWalletProvider");if(!e.sendEmailWithOtp||!e.verifyOtp||!e.reject)throw new Error("Email signer functions are not available. Make sure you're using an email signer wallet.");return{needsAuth:e.needsAuth,sendEmailWithOtp:e.sendEmailWithOtp,verifyOtp:e.verifyOtp,reject:e.reject}}var _expoconstants = require('expo-constants'); var _expoconstants2 = _interopRequireDefault(_expoconstants);var ee={google:null,twitter:null},we={crossmintAuth:void 0,logout:()=>{},jwt:void 0,user:void 0,status:"initializing",getUser:()=>{},loginWithOAuth:()=>Promise.resolve(),createAuthSession:()=>Promise.resolve(null)},I= exports.a =_react.createContext.call(void 0, we);function nt({children:e,onLoginSuccess:c,refreshRoute:v,logoutRoute:U,customStorageProvider:w,appSchema:m}){let{crossmint:W}=_clientsdkreactbase.useCrossmint.call(void 0, "CrossmintAuthProvider must be used within CrossmintProvider"),[b,f]=_react.useState.call(void 0, void 0),[o,A]=_react.useState.call(void 0, void 0),[T,R]=_react.useState.call(void 0, ee),C=_react.useRef.call(void 0, null),a=_react.useMemo.call(void 0, ()=>w!=null?w:new _chunkK754GXKDcjs.a,[w]),[N,M]=_react.useState.call(void 0, !1),[L,O]=_react.useState.call(void 0, !1),B=Array.isArray(m)?m[0]:m,t=_expoconstants2.default.executionEnvironment==="storeClient"||_expoconstants2.default.appOwnership==="expo"||!!_expoconstants2.default.expoVersion?"exp://127.0.0.1:8081":B,n=_react.useMemo.call(void 0, ()=>{if(!C.current){let r={callbacks:{onLogout:()=>{f(void 0),A(void 0)},onTokenRefresh:s=>{f(s.user),A(s.jwt)}},refreshRoute:v,logoutRoute:U,storageProvider:a};C.current=_clientsdkauth.CrossmintAuth.from(W,r)}return C.current},[a]),i=_react.useCallback.call(void 0, ()=>{c==null||c()},[c]);_react.useEffect.call(void 0, ()=>{o==null?a==null||a.get(_commonsdkauth.SESSION_PREFIX).then(r=>{r!=null&&A(r)}).finally(()=>{M(!0)}):M(!0)},[o,a]),_react.useEffect.call(void 0, ()=>{o!=null&&i()},[o,i]);let g=()=>{n.logout()},d=_react.useCallback.call(void 0, ()=>_chunk2WSEHVNPcjs.d.call(void 0, this,null,function*(){try{let s=Object.keys(ee).map(E=>_chunk2WSEHVNPcjs.d.call(void 0, this,null,function*(){let V=yield n==null?void 0:n.getOAuthUrl(E,{appSchema:t});return{[E]:V}})),l=Object.assign({},...yield Promise.all(s));R(l)}catch(r){console.error(r)}}),[n]);_react.useEffect.call(void 0, ()=>{b==null&&d()},[d,b]);let y=()=>N?L?"in-progress":o!=null?"logged-in":"logged-out":"initializing",h=()=>_chunk2WSEHVNPcjs.d.call(void 0, this,null,function*(){if(o==null){console.log("User not logged in");return}let r=yield n.getUser();return f(r),r}),H=r=>_chunk2WSEHVNPcjs.d.call(void 0, this,null,function*(){var s;try{O(!0);let l=(s=T[r])!=null?s:yield n.getOAuthUrl(r,{appSchema:t});yield p.warmUpAsync();let E=new URL(l);if(r==="google"&&E.searchParams.append("provider_prompt","select_account"),_reactnative.Platform.OS==="android")yield p.openBrowserAsync(E.toString());else{let V=yield p.openAuthSessionAsync(E.toString());V.type==="success"&&(yield J(V.url))}yield p.coolDownAsync()}catch(l){throw console.error("[CrossmintAuthProvider] Error during OAuth login:",l),new Error(`Error during OAuth login: ${l}`)}}),J=_react.useCallback.call(void 0, r=>_chunk2WSEHVNPcjs.d.call(void 0, this,null,function*(){let s=r.includes("://")?Ae(r):r;if(s!=null)try{return O(!0),yield n.handleRefreshAuthMaterial(s)}catch(l){throw l}finally{O(!1)}return null}),[n]);return _jsxruntime.jsx.call(void 0, I.Provider,{value:{crossmintAuth:n,logout:g,jwt:o,user:b,status:y(),getUser:h,loginWithOAuth:H,createAuthSession:J},children:e})}var Ae=e=>{let c=/[?&]oneTimeSecret=([^&#]+)/,v=e.match(c);return v?decodeURIComponent(v[1]):void 0};exports.a = I; exports.b = nt; exports.c = Pe; exports.d = We; exports.e = F; exports.f = Ie; exports.g = Fe; exports.h = _clientsdkreactbase.useCrossmint; exports.i = _clientsdkreactbase.useWallet;
@@ -1 +1 @@
1
- import{b as m,d,h as l}from"./chunk-GC2BGKUC.js";import{a as n,b as s,c as u}from"./chunk-PXDN3KFO.js";import{useEffect as h}from"react";import{jsx as c}from"react/jsx-runtime";function a({children:i}){let{experimental_setCustomAuth:r,experimental_customAuth:o}=l(),{user:t,jwt:e}=d();return h(()=>{e==null&&(o==null?void 0:o.jwt)!=null&&r(void 0),e!=null&&r({jwt:e,email:t==null?void 0:t.email})},[r,e,t]),i}function A(o){var t=o,{children:i}=t,r=u(t,["children"]);return c(m,s(n({},r),{children:c(a,{children:i})}))}export{A as a};
1
+ import{b as m,d,h as l}from"./chunk-D5X6HRXA.js";import{a as n,b as s,c as u}from"./chunk-PXDN3KFO.js";import{useEffect as h}from"react";import{jsx as c}from"react/jsx-runtime";function a({children:i}){let{experimental_setCustomAuth:r,experimental_customAuth:o}=l(),{user:t,jwt:e}=d();return h(()=>{e==null&&(o==null?void 0:o.jwt)!=null&&r(void 0),e!=null&&r({jwt:e,email:t==null?void 0:t.email})},[r,e,t]),i}function A(o){var t=o,{children:i}=t,r=u(t,["children"]);return c(m,s(n({},r),{children:c(a,{children:i})}))}export{A as a};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkR62SJDSAcjs = require('./chunk-R62SJDSA.cjs');var _chunk2WSEHVNPcjs = require('./chunk-2WSEHVNP.cjs');var _react = require('react');var _jsxruntime = require('react/jsx-runtime');function a({children:i}){let{experimental_setCustomAuth:r,experimental_customAuth:o}=_chunkR62SJDSAcjs.h.call(void 0, ),{user:t,jwt:e}=_chunkR62SJDSAcjs.d.call(void 0, );return _react.useEffect.call(void 0, ()=>{e==null&&(o==null?void 0:o.jwt)!=null&&r(void 0),e!=null&&r({jwt:e,email:t==null?void 0:t.email})},[r,e,t]),i}function v(o){var t=o,{children:i}=t,r=_chunk2WSEHVNPcjs.c.call(void 0, t,["children"]);return _jsxruntime.jsx.call(void 0, _chunkR62SJDSAcjs.b,_chunk2WSEHVNPcjs.b.call(void 0, _chunk2WSEHVNPcjs.a.call(void 0, {},r),{children:_jsxruntime.jsx.call(void 0, a,{children:i})}))}exports.a = v;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkE2XXTZVLcjs = require('./chunk-E2XXTZVL.cjs');var _chunk2WSEHVNPcjs = require('./chunk-2WSEHVNP.cjs');var _react = require('react');var _jsxruntime = require('react/jsx-runtime');function a({children:i}){let{experimental_setCustomAuth:r,experimental_customAuth:o}=_chunkE2XXTZVLcjs.h.call(void 0, ),{user:t,jwt:e}=_chunkE2XXTZVLcjs.d.call(void 0, );return _react.useEffect.call(void 0, ()=>{e==null&&(o==null?void 0:o.jwt)!=null&&r(void 0),e!=null&&r({jwt:e,email:t==null?void 0:t.email})},[r,e,t]),i}function v(o){var t=o,{children:i}=t,r=_chunk2WSEHVNPcjs.c.call(void 0, t,["children"]);return _jsxruntime.jsx.call(void 0, _chunkE2XXTZVLcjs.b,_chunk2WSEHVNPcjs.b.call(void 0, _chunk2WSEHVNPcjs.a.call(void 0, {},r),{children:_jsxruntime.jsx.call(void 0, a,{children:i})}))}exports.a = v;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkR62SJDSAcjs = require('../chunk-R62SJDSA.cjs');require('../chunk-K754GXKD.cjs');require('../chunk-2WSEHVNP.cjs');exports.useAuth = _chunkR62SJDSAcjs.d; exports.useCrossmint = _chunkR62SJDSAcjs.h; exports.useCrossmintAuth = _chunkR62SJDSAcjs.c; exports.useWallet = _chunkR62SJDSAcjs.i; exports.useWalletEmailSigner = _chunkR62SJDSAcjs.g;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkE2XXTZVLcjs = require('../chunk-E2XXTZVL.cjs');require('../chunk-K754GXKD.cjs');require('../chunk-2WSEHVNP.cjs');exports.useAuth = _chunkE2XXTZVLcjs.d; exports.useCrossmint = _chunkE2XXTZVLcjs.h; exports.useCrossmintAuth = _chunkE2XXTZVLcjs.c; exports.useWallet = _chunkE2XXTZVLcjs.i; exports.useWalletEmailSigner = _chunkE2XXTZVLcjs.g;
@@ -1 +1 @@
1
- import{c as a,d as b,g as c,h as d,i as e}from"../chunk-GC2BGKUC.js";import"../chunk-GDMV4TA2.js";import"../chunk-PXDN3KFO.js";export{b as useAuth,d as useCrossmint,a as useCrossmintAuth,e as useWallet,c as useWalletEmailSigner};
1
+ import{c as a,d as b,g as c,h as d,i as e}from"../chunk-D5X6HRXA.js";import"../chunk-GDMV4TA2.js";import"../chunk-PXDN3KFO.js";export{b as useAuth,d as useCrossmint,a as useCrossmintAuth,e as useWallet,c as useWalletEmailSigner};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkR62SJDSAcjs = require('../chunk-R62SJDSA.cjs');require('../chunk-K754GXKD.cjs');require('../chunk-2WSEHVNP.cjs');exports.useAuth = _chunkR62SJDSAcjs.d; exports.useCrossmintAuth = _chunkR62SJDSAcjs.c;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkE2XXTZVLcjs = require('../chunk-E2XXTZVL.cjs');require('../chunk-K754GXKD.cjs');require('../chunk-2WSEHVNP.cjs');exports.useAuth = _chunkE2XXTZVLcjs.d; exports.useCrossmintAuth = _chunkE2XXTZVLcjs.c;
@@ -1 +1 @@
1
- import{c as a,d as b}from"../chunk-GC2BGKUC.js";import"../chunk-GDMV4TA2.js";import"../chunk-PXDN3KFO.js";export{b as useAuth,a as useCrossmintAuth};
1
+ import{c as a,d as b}from"../chunk-D5X6HRXA.js";import"../chunk-GDMV4TA2.js";import"../chunk-PXDN3KFO.js";export{b as useAuth,a as useCrossmintAuth};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkR62SJDSAcjs = require('../chunk-R62SJDSA.cjs');require('../chunk-K754GXKD.cjs');require('../chunk-2WSEHVNP.cjs');exports.useWalletEmailSigner = _chunkR62SJDSAcjs.g;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkE2XXTZVLcjs = require('../chunk-E2XXTZVL.cjs');require('../chunk-K754GXKD.cjs');require('../chunk-2WSEHVNP.cjs');exports.useWalletEmailSigner = _chunkE2XXTZVLcjs.g;
@@ -1 +1 @@
1
- import{g as a}from"../chunk-GC2BGKUC.js";import"../chunk-GDMV4TA2.js";import"../chunk-PXDN3KFO.js";export{a as useWalletEmailSigner};
1
+ import{g as a}from"../chunk-D5X6HRXA.js";import"../chunk-GDMV4TA2.js";import"../chunk-PXDN3KFO.js";export{a as useWalletEmailSigner};
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});require('./chunk-ZR6BLDCD.cjs');var _chunkUHGR7JZYcjs = require('./chunk-UHGR7JZY.cjs');var _chunkR62SJDSAcjs = require('./chunk-R62SJDSA.cjs');require('./chunk-K754GXKD.cjs');var _chunkYBYUZ7SKcjs = require('./chunk-YBYUZ7SK.cjs');require('./chunk-2WSEHVNP.cjs');var _walletssdk = require('@crossmint/wallets-sdk');exports.CrossmintAuthProvider = _chunkUHGR7JZYcjs.a; exports.CrossmintProvider = _chunkYBYUZ7SKcjs.a; exports.CrossmintWalletProvider = _chunkR62SJDSAcjs.f; exports.EVMWallet = _walletssdk.EVMWallet; exports.SolanaWallet = _walletssdk.SolanaWallet; exports.Wallet = _walletssdk.Wallet; exports.useAuth = _chunkR62SJDSAcjs.d; exports.useCrossmint = _chunkR62SJDSAcjs.h; exports.useCrossmintAuth = _chunkR62SJDSAcjs.c; exports.useWallet = _chunkR62SJDSAcjs.i; exports.useWalletEmailSigner = _chunkR62SJDSAcjs.g;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});require('./chunk-ZR6BLDCD.cjs');var _chunkM6UAJ7OMcjs = require('./chunk-M6UAJ7OM.cjs');var _chunkE2XXTZVLcjs = require('./chunk-E2XXTZVL.cjs');require('./chunk-K754GXKD.cjs');var _chunkYBYUZ7SKcjs = require('./chunk-YBYUZ7SK.cjs');require('./chunk-2WSEHVNP.cjs');var _walletssdk = require('@crossmint/wallets-sdk');exports.CrossmintAuthProvider = _chunkM6UAJ7OMcjs.a; exports.CrossmintProvider = _chunkYBYUZ7SKcjs.a; exports.CrossmintWalletProvider = _chunkE2XXTZVLcjs.f; exports.EVMWallet = _walletssdk.EVMWallet; exports.SolanaWallet = _walletssdk.SolanaWallet; exports.Wallet = _walletssdk.Wallet; exports.useAuth = _chunkE2XXTZVLcjs.d; exports.useCrossmint = _chunkE2XXTZVLcjs.h; exports.useCrossmintAuth = _chunkE2XXTZVLcjs.c; exports.useWallet = _chunkE2XXTZVLcjs.i; exports.useWalletEmailSigner = _chunkE2XXTZVLcjs.g;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import"./chunk-C62HRWJA.js";import{a as p}from"./chunk-S6THHBSF.js";import{c as t,d as e,f as r,g as o,h as a,i as n}from"./chunk-GC2BGKUC.js";import"./chunk-GDMV4TA2.js";import{a as s}from"./chunk-ZENPJSBN.js";import"./chunk-PXDN3KFO.js";import{EVMWallet as d,SolanaWallet as v,Wallet as E}from"@crossmint/wallets-sdk";export{p as CrossmintAuthProvider,s as CrossmintProvider,r as CrossmintWalletProvider,d as EVMWallet,v as SolanaWallet,E as Wallet,e as useAuth,a as useCrossmint,t as useCrossmintAuth,n as useWallet,o as useWalletEmailSigner};
1
+ import"./chunk-C62HRWJA.js";import{a as p}from"./chunk-HCLDYOY2.js";import{c as t,d as e,f as r,g as o,h as a,i as n}from"./chunk-D5X6HRXA.js";import"./chunk-GDMV4TA2.js";import{a as s}from"./chunk-ZENPJSBN.js";import"./chunk-PXDN3KFO.js";import{EVMWallet as d,SolanaWallet as v,Wallet as E}from"@crossmint/wallets-sdk";export{p as CrossmintAuthProvider,s as CrossmintProvider,r as CrossmintWalletProvider,d as EVMWallet,v as SolanaWallet,E as Wallet,e as useAuth,a as useCrossmint,t as useCrossmintAuth,n as useWallet,o as useWalletEmailSigner};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkUHGR7JZYcjs = require('../chunk-UHGR7JZY.cjs');require('../chunk-R62SJDSA.cjs');require('../chunk-K754GXKD.cjs');require('../chunk-2WSEHVNP.cjs');exports.CrossmintAuthProvider = _chunkUHGR7JZYcjs.a;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkM6UAJ7OMcjs = require('../chunk-M6UAJ7OM.cjs');require('../chunk-E2XXTZVL.cjs');require('../chunk-K754GXKD.cjs');require('../chunk-2WSEHVNP.cjs');exports.CrossmintAuthProvider = _chunkM6UAJ7OMcjs.a;
@@ -1 +1 @@
1
- import{a}from"../chunk-S6THHBSF.js";import"../chunk-GC2BGKUC.js";import"../chunk-GDMV4TA2.js";import"../chunk-PXDN3KFO.js";export{a as CrossmintAuthProvider};
1
+ import{a}from"../chunk-HCLDYOY2.js";import"../chunk-D5X6HRXA.js";import"../chunk-GDMV4TA2.js";import"../chunk-PXDN3KFO.js";export{a as CrossmintAuthProvider};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkR62SJDSAcjs = require('../chunk-R62SJDSA.cjs');require('../chunk-K754GXKD.cjs');require('../chunk-2WSEHVNP.cjs');exports.AuthContext = _chunkR62SJDSAcjs.a; exports.CrossmintAuthProviderInternal = _chunkR62SJDSAcjs.b;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkE2XXTZVLcjs = require('../chunk-E2XXTZVL.cjs');require('../chunk-K754GXKD.cjs');require('../chunk-2WSEHVNP.cjs');exports.AuthContext = _chunkE2XXTZVLcjs.a; exports.CrossmintAuthProviderInternal = _chunkE2XXTZVLcjs.b;
@@ -1 +1 @@
1
- import{a,b}from"../chunk-GC2BGKUC.js";import"../chunk-GDMV4TA2.js";import"../chunk-PXDN3KFO.js";export{a as AuthContext,b as CrossmintAuthProviderInternal};
1
+ import{a,b}from"../chunk-D5X6HRXA.js";import"../chunk-GDMV4TA2.js";import"../chunk-PXDN3KFO.js";export{a as AuthContext,b as CrossmintAuthProviderInternal};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkR62SJDSAcjs = require('../chunk-R62SJDSA.cjs');require('../chunk-K754GXKD.cjs');require('../chunk-2WSEHVNP.cjs');exports.CrossmintWalletEmailSignerContext = _chunkR62SJDSAcjs.e; exports.CrossmintWalletProvider = _chunkR62SJDSAcjs.f;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkE2XXTZVLcjs = require('../chunk-E2XXTZVL.cjs');require('../chunk-K754GXKD.cjs');require('../chunk-2WSEHVNP.cjs');exports.CrossmintWalletEmailSignerContext = _chunkE2XXTZVLcjs.e; exports.CrossmintWalletProvider = _chunkE2XXTZVLcjs.f;
@@ -1 +1 @@
1
- import{e as a,f as b}from"../chunk-GC2BGKUC.js";import"../chunk-GDMV4TA2.js";import"../chunk-PXDN3KFO.js";export{a as CrossmintWalletEmailSignerContext,b as CrossmintWalletProvider};
1
+ import{e as a,f as b}from"../chunk-D5X6HRXA.js";import"../chunk-GDMV4TA2.js";import"../chunk-PXDN3KFO.js";export{a as CrossmintWalletEmailSignerContext,b as CrossmintWalletProvider};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});require('../chunk-ZR6BLDCD.cjs');var _chunkUHGR7JZYcjs = require('../chunk-UHGR7JZY.cjs');var _chunkR62SJDSAcjs = require('../chunk-R62SJDSA.cjs');require('../chunk-K754GXKD.cjs');var _chunkYBYUZ7SKcjs = require('../chunk-YBYUZ7SK.cjs');require('../chunk-2WSEHVNP.cjs');exports.CrossmintAuthProvider = _chunkUHGR7JZYcjs.a; exports.CrossmintProvider = _chunkYBYUZ7SKcjs.a; exports.CrossmintWalletProvider = _chunkR62SJDSAcjs.f;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});require('../chunk-ZR6BLDCD.cjs');var _chunkM6UAJ7OMcjs = require('../chunk-M6UAJ7OM.cjs');var _chunkE2XXTZVLcjs = require('../chunk-E2XXTZVL.cjs');require('../chunk-K754GXKD.cjs');var _chunkYBYUZ7SKcjs = require('../chunk-YBYUZ7SK.cjs');require('../chunk-2WSEHVNP.cjs');exports.CrossmintAuthProvider = _chunkM6UAJ7OMcjs.a; exports.CrossmintProvider = _chunkYBYUZ7SKcjs.a; exports.CrossmintWalletProvider = _chunkE2XXTZVLcjs.f;
@@ -1 +1 @@
1
- import"../chunk-C62HRWJA.js";import{a as c}from"../chunk-S6THHBSF.js";import{f as a}from"../chunk-GC2BGKUC.js";import"../chunk-GDMV4TA2.js";import{a as b}from"../chunk-ZENPJSBN.js";import"../chunk-PXDN3KFO.js";export{c as CrossmintAuthProvider,b as CrossmintProvider,a as CrossmintWalletProvider};
1
+ import"../chunk-C62HRWJA.js";import{a as c}from"../chunk-HCLDYOY2.js";import{f as a}from"../chunk-D5X6HRXA.js";import"../chunk-GDMV4TA2.js";import{a as b}from"../chunk-ZENPJSBN.js";import"../chunk-PXDN3KFO.js";export{c as CrossmintAuthProvider,b as CrossmintProvider,a as CrossmintWalletProvider};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crossmint/client-sdk-react-native-ui",
3
- "version": "0.8.0",
3
+ "version": "0.8.2",
4
4
  "repository": "https://github.com/Crossmint/crossmint-sdk",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Paella Labs Inc",
@@ -24,14 +24,14 @@
24
24
  "expo-secure-store": "~14.0.0",
25
25
  "expo-web-browser": "~14.0.2",
26
26
  "react-native-webview": "13.12.5",
27
- "@crossmint/client-sdk-auth": "1.2.16",
28
- "@crossmint/client-sdk-base": "1.5.7",
29
- "@crossmint/client-sdk-react-base": "0.5.5",
27
+ "@crossmint/client-sdk-auth": "1.2.17",
28
+ "@crossmint/client-sdk-base": "1.5.8",
29
+ "@crossmint/client-sdk-react-base": "0.5.7",
30
30
  "@crossmint/client-sdk-rn-window": "0.2.2",
31
31
  "@crossmint/client-signers": "0.0.18",
32
- "@crossmint/common-sdk-auth": "1.0.38",
33
- "@crossmint/common-sdk-base": "0.8.1",
34
- "@crossmint/wallets-sdk": "0.10.5"
32
+ "@crossmint/common-sdk-auth": "1.0.39",
33
+ "@crossmint/common-sdk-base": "0.8.2",
34
+ "@crossmint/wallets-sdk": "0.10.7"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/react": "19.0.12"
@@ -1 +0,0 @@
1
- import{a as q}from"./chunk-GDMV4TA2.js";import{d as u}from"./chunk-PXDN3KFO.js";import{createContext as pe,useEffect as _,useMemo as ee,useRef as fe,useState as S,useCallback as D}from"react";import*as h from"expo-web-browser";import{CrossmintAuth as ge}from"@crossmint/client-sdk-auth";import{SESSION_PREFIX as ve}from"@crossmint/common-sdk-auth";import{useCrossmint as T,useWallet as Je}from"@crossmint/client-sdk-react-base";import{useContext as X}from"react";function We(){let e=X(j);if(!e)throw new Error("useCrossmintAuth must be used within a CrossmintAuthProvider");return e}function be(){let e=X(j);if(!e)throw new Error("useAuth must be used within a CrossmintAuthProvider");return e}import{useCallback as Q,useEffect as re,useRef as x,useState as ne,useMemo as Y,createContext as oe}from"react";import{View as ie}from"react-native";import{RNWebView as se,WebViewParent as ae}from"@crossmint/client-sdk-rn-window";import{environmentUrlConfig as Z,signerInboundEvents as le,signerOutboundEvents as ue}from"@crossmint/client-signers";import{validateAPIKey as ce}from"@crossmint/common-sdk-base";import{CrossmintWalletBaseProvider as de}from"@crossmint/client-sdk-react-base";import{jsx as F,jsxs as me}from"react/jsx-runtime";var E=e=>()=>{throw new Error(`${e} is not available. Make sure you're using an email signer wallet.`)},K=oe({needsAuth:!1,sendEmailWithOtp:E("sendEmailWithOtp"),verifyOtp:E("verifyOtp"),reject:E("reject")});function je({children:e,createOnLogin:c,callbacks:v}){let{crossmint:U}=T("CrossmintWalletProvider must be used within CrossmintProvider"),{apiKey:w,appId:p}=U,W=ce(w);if(!W.isValid)throw new Error("Invalid API key");let b=Z[W.environment],f=x(null),o=x(null),[A,N]=ne(!1),R=x(E("sendEmailWithOtp")),y=x(E("verifyOtp")),a=x(E("reject")),L=Y(()=>p!=null?`window.crossmintAppId = '${p}';`:"",[p]);re(()=>{f.current!=null&&o.current==null&&(o.current=new ae(f,{incomingEvents:ue,outgoingEvents:le}))},[]);let M=Q(()=>u(this,null,function*(){let t=o.current;if(t!=null)try{yield t.handshakeWithChild()}catch(n){console.error("[CrossmintWalletProvider] Handshake error:",n)}}),[]),B=Q(t=>{let n=o.current;if(n!=null){try{let i=JSON.parse(t.nativeEvent.data);if(i&&typeof i.type=="string"&&i.type.startsWith("console.")){let g=i.type.split(".")[1],d=(i.data||[]).map(m=>{try{return m==="[Function]"||m==="[Circular Reference]"||m==="[Unserializable Object]"?m:JSON.parse(m)}catch(H){return m}}),C=`[WebView:${g.toUpperCase()}]`;switch(g){case"log":console.log(C,...d);break;case"error":console.error(C,...d);break;case"warn":console.warn(C,...d);break;case"info":console.info(C,...d);break;default:console.log(`[WebView Unknown:${g}]`,...d)}return}}catch(i){}n.handleMessage(t)}},[]),O=()=>{if(o.current==null)throw new Error("WebView not ready or handshake incomplete");return o.current},z=(t,n,i,g)=>u(this,null,function*(){N(t),R.current=n,y.current=i,a.current=g}),G=Y(()=>({needsAuth:A,sendEmailWithOtp:R.current,verifyOtp:y.current,reject:a.current}),[A]);return me(de,{createOnLogin:c,onAuthRequired:z,_getEmailSignerIframe:O,callbacks:v,children:[F(K.Provider,{value:G,children:e}),F(ie,{style:{position:"absolute",width:0,height:0,overflow:"hidden"},children:F(se,{ref:f,source:{uri:b},injectedGlobals:L,onLoadStart:t=>{console.log("[CrossmintWalletProvider] WebView onLoadStart:",t.nativeEvent.url)},onLoadEnd:M,onLoadProgress:({nativeEvent:t})=>{console.log("[CrossmintWalletProvider] WebView loading progress:",t.progress)},onMessage:B,onError:t=>{console.error("[CrossmintWalletProvider] WebView error:",t.nativeEvent)},onHttpError:t=>{console.error("[CrossmintWalletProvider] WebView HTTP error:",t.nativeEvent)},style:{width:1,height:1},javaScriptCanOpenWindowsAutomatically:!1,thirdPartyCookiesEnabled:!1,sharedCookiesEnabled:!1,incognito:!1,setSupportMultipleWindows:!1,originWhitelist:[Z[W.environment]]})})]})}import{useContext as he}from"react";function Ke(){let e=he(K);if(e==null)throw new Error("useWalletEmailSigner must be used within CrossmintWalletProvider");if(!e.sendEmailWithOtp||!e.verifyOtp||!e.reject)throw new Error("Email signer functions are not available. Make sure you're using an email signer wallet.");return{needsAuth:e.needsAuth,sendEmailWithOtp:e.sendEmailWithOtp,verifyOtp:e.verifyOtp,reject:e.reject}}import{Platform as we}from"react-native";import $ from"expo-constants";import{jsx as Ce}from"react/jsx-runtime";var te={google:null,twitter:null},Ae={crossmintAuth:void 0,logout:()=>{},jwt:void 0,user:void 0,status:"initializing",getUser:()=>{},loginWithOAuth:()=>Promise.resolve(),createAuthSession:()=>Promise.resolve(null)},j=pe(Ae);function ot({children:e,onLoginSuccess:c,refreshRoute:v,logoutRoute:U,customStorageProvider:w,appSchema:p}){let{crossmint:W}=T("CrossmintAuthProvider must be used within CrossmintProvider"),[b,f]=S(void 0),[o,A]=S(void 0),[N,R]=S(te),y=fe(null),a=ee(()=>w!=null?w:new q,[w]),[L,M]=S(!1),[B,O]=S(!1),z=Array.isArray(p)?p[0]:p,t=$.executionEnvironment==="storeClient"||$.appOwnership==="expo"||!!$.expoVersion?"exp://127.0.0.1:8081":z,n=ee(()=>{if(!y.current){let r={callbacks:{onLogout:()=>{f(void 0),A(void 0)},onTokenRefresh:s=>{f(s.user),A(s.jwt)}},refreshRoute:v,logoutRoute:U,storageProvider:a};y.current=ge.from(W,r)}return y.current},[a]),i=D(()=>{c==null||c()},[c]);_(()=>{o==null?a==null||a.get(ve).then(r=>{r!=null&&A(r)}).finally(()=>{M(!0)}):M(!0)},[o,a]),_(()=>{o!=null&&i()},[o,i]);let g=()=>{n.logout()},d=D(()=>u(this,null,function*(){try{let s=Object.keys(te).map(P=>u(this,null,function*(){let V=yield n==null?void 0:n.getOAuthUrl(P,{appSchema:t});return{[P]:V}})),l=Object.assign({},...yield Promise.all(s));R(l)}catch(r){console.error(r)}}),[n]);_(()=>{b==null&&d()},[d,b]);let C=()=>L?B?"in-progress":o!=null?"logged-in":"logged-out":"initializing",m=()=>u(this,null,function*(){if(o==null){console.log("User not logged in");return}let r=yield n.getUser();return f(r),r}),H=r=>u(this,null,function*(){var s;try{O(!0);let l=(s=N[r])!=null?s:yield n.getOAuthUrl(r,{appSchema:t});yield h.warmUpAsync();let P=new URL(l);if(r==="google"&&P.searchParams.append("provider_prompt","select_account"),we.OS==="android")yield h.openBrowserAsync(P.toString());else{let V=yield h.openAuthSessionAsync(P.toString());V.type==="success"&&(yield J(V.url))}yield h.coolDownAsync()}catch(l){throw console.error("[CrossmintAuthProvider] Error during OAuth login:",l),new Error(`Error during OAuth login: ${l}`)}}),J=D(r=>u(this,null,function*(){let s=r.includes("://")?ye(r):r;if(s!=null)try{return O(!0),yield n.handleRefreshAuthMaterial(s)}catch(l){throw l}finally{O(!1)}return null}),[n]);return Ce(j.Provider,{value:{crossmintAuth:n,logout:g,jwt:o,user:b,status:C(),getUser:m,loginWithOAuth:H,createAuthSession:J},children:e})}var ye=e=>{let c=/[?&]oneTimeSecret=([^&#]+)/,v=e.match(c);return v?decodeURIComponent(v[1]):void 0};export{j as a,ot as b,We as c,be as d,K as e,je as f,Ke as g,T as h,Je as i};
@@ -1 +0,0 @@
1
- "use strict";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 _chunkK754GXKDcjs = require('./chunk-K754GXKD.cjs');var _chunk2WSEHVNPcjs = require('./chunk-2WSEHVNP.cjs');var _react = require('react');var _expowebbrowser = require('expo-web-browser'); var h = _interopRequireWildcard(_expowebbrowser);var _clientsdkauth = require('@crossmint/client-sdk-auth');var _commonsdkauth = require('@crossmint/common-sdk-auth');var _clientsdkreactbase = require('@crossmint/client-sdk-react-base');function Ee(){let e=_react.useContext.call(void 0, k);if(!e)throw new Error("useCrossmintAuth must be used within a CrossmintAuthProvider");return e}function We(){let e=_react.useContext.call(void 0, k);if(!e)throw new Error("useAuth must be used within a CrossmintAuthProvider");return e}var _reactnative = require('react-native');var _clientsdkrnwindow = require('@crossmint/client-sdk-rn-window');var _clientsigners = require('@crossmint/client-signers');var _commonsdkbase = require('@crossmint/common-sdk-base');var _jsxruntime = require('react/jsx-runtime');var E=e=>()=>{throw new Error(`${e} is not available. Make sure you're using an email signer wallet.`)},F= exports.e =_react.createContext.call(void 0, {needsAuth:!1,sendEmailWithOtp:E("sendEmailWithOtp"),verifyOtp:E("verifyOtp"),reject:E("reject")});function ke({children:e,createOnLogin:c,callbacks:v}){let{crossmint:U}=_clientsdkreactbase.useCrossmint.call(void 0, "CrossmintWalletProvider must be used within CrossmintProvider"),{apiKey:w,appId:p}=U,W=_commonsdkbase.validateAPIKey.call(void 0, w);if(!W.isValid)throw new Error("Invalid API key");let b=_clientsigners.environmentUrlConfig[W.environment],f=_react.useRef.call(void 0, null),o=_react.useRef.call(void 0, null),[A,T]=_react.useState.call(void 0, !1),R=_react.useRef.call(void 0, E("sendEmailWithOtp")),y=_react.useRef.call(void 0, E("verifyOtp")),a=_react.useRef.call(void 0, E("reject")),N=_react.useMemo.call(void 0, ()=>p!=null?`window.crossmintAppId = '${p}';`:"",[p]);_react.useEffect.call(void 0, ()=>{f.current!=null&&o.current==null&&(o.current=new (0, _clientsdkrnwindow.WebViewParent)(f,{incomingEvents:_clientsigners.signerOutboundEvents,outgoingEvents:_clientsigners.signerInboundEvents}))},[]);let M=_react.useCallback.call(void 0, ()=>_chunk2WSEHVNPcjs.d.call(void 0, this,null,function*(){let t=o.current;if(t!=null)try{yield t.handshakeWithChild()}catch(n){console.error("[CrossmintWalletProvider] Handshake error:",n)}}),[]),L=_react.useCallback.call(void 0, t=>{let n=o.current;if(n!=null){try{let i=JSON.parse(t.nativeEvent.data);if(i&&typeof i.type=="string"&&i.type.startsWith("console.")){let g=i.type.split(".")[1],d=(i.data||[]).map(m=>{try{return m==="[Function]"||m==="[Circular Reference]"||m==="[Unserializable Object]"?m:JSON.parse(m)}catch(G){return m}}),C=`[WebView:${g.toUpperCase()}]`;switch(g){case"log":console.log(C,...d);break;case"error":console.error(C,...d);break;case"warn":console.warn(C,...d);break;case"info":console.info(C,...d);break;default:console.log(`[WebView Unknown:${g}]`,...d)}return}}catch(i){}n.handleMessage(t)}},[]),O=()=>{if(o.current==null)throw new Error("WebView not ready or handshake incomplete");return o.current},B=(t,n,i,g)=>_chunk2WSEHVNPcjs.d.call(void 0, this,null,function*(){T(t),R.current=n,y.current=i,a.current=g}),$=_react.useMemo.call(void 0, ()=>({needsAuth:A,sendEmailWithOtp:R.current,verifyOtp:y.current,reject:a.current}),[A]);return _jsxruntime.jsxs.call(void 0, _clientsdkreactbase.CrossmintWalletBaseProvider,{createOnLogin:c,onAuthRequired:B,_getEmailSignerIframe:O,callbacks:v,children:[_jsxruntime.jsx.call(void 0, F.Provider,{value:$,children:e}),_jsxruntime.jsx.call(void 0, _reactnative.View,{style:{position:"absolute",width:0,height:0,overflow:"hidden"},children:_jsxruntime.jsx.call(void 0, _clientsdkrnwindow.RNWebView,{ref:f,source:{uri:b},injectedGlobals:N,onLoadStart:t=>{console.log("[CrossmintWalletProvider] WebView onLoadStart:",t.nativeEvent.url)},onLoadEnd:M,onLoadProgress:({nativeEvent:t})=>{console.log("[CrossmintWalletProvider] WebView loading progress:",t.progress)},onMessage:L,onError:t=>{console.error("[CrossmintWalletProvider] WebView error:",t.nativeEvent)},onHttpError:t=>{console.error("[CrossmintWalletProvider] WebView HTTP error:",t.nativeEvent)},style:{width:1,height:1},javaScriptCanOpenWindowsAutomatically:!1,thirdPartyCookiesEnabled:!1,sharedCookiesEnabled:!1,incognito:!1,setSupportMultipleWindows:!1,originWhitelist:[_clientsigners.environmentUrlConfig[W.environment]]})})]})}function Fe(){let e=_react.useContext.call(void 0, F);if(e==null)throw new Error("useWalletEmailSigner must be used within CrossmintWalletProvider");if(!e.sendEmailWithOtp||!e.verifyOtp||!e.reject)throw new Error("Email signer functions are not available. Make sure you're using an email signer wallet.");return{needsAuth:e.needsAuth,sendEmailWithOtp:e.sendEmailWithOtp,verifyOtp:e.verifyOtp,reject:e.reject}}var _expoconstants = require('expo-constants'); var _expoconstants2 = _interopRequireDefault(_expoconstants);var ee={google:null,twitter:null},we={crossmintAuth:void 0,logout:()=>{},jwt:void 0,user:void 0,status:"initializing",getUser:()=>{},loginWithOAuth:()=>Promise.resolve(),createAuthSession:()=>Promise.resolve(null)},k= exports.a =_react.createContext.call(void 0, we);function nt({children:e,onLoginSuccess:c,refreshRoute:v,logoutRoute:U,customStorageProvider:w,appSchema:p}){let{crossmint:W}=_clientsdkreactbase.useCrossmint.call(void 0, "CrossmintAuthProvider must be used within CrossmintProvider"),[b,f]=_react.useState.call(void 0, void 0),[o,A]=_react.useState.call(void 0, void 0),[T,R]=_react.useState.call(void 0, ee),y=_react.useRef.call(void 0, null),a=_react.useMemo.call(void 0, ()=>w!=null?w:new _chunkK754GXKDcjs.a,[w]),[N,M]=_react.useState.call(void 0, !1),[L,O]=_react.useState.call(void 0, !1),B=Array.isArray(p)?p[0]:p,t=_expoconstants2.default.executionEnvironment==="storeClient"||_expoconstants2.default.appOwnership==="expo"||!!_expoconstants2.default.expoVersion?"exp://127.0.0.1:8081":B,n=_react.useMemo.call(void 0, ()=>{if(!y.current){let r={callbacks:{onLogout:()=>{f(void 0),A(void 0)},onTokenRefresh:s=>{f(s.user),A(s.jwt)}},refreshRoute:v,logoutRoute:U,storageProvider:a};y.current=_clientsdkauth.CrossmintAuth.from(W,r)}return y.current},[a]),i=_react.useCallback.call(void 0, ()=>{c==null||c()},[c]);_react.useEffect.call(void 0, ()=>{o==null?a==null||a.get(_commonsdkauth.SESSION_PREFIX).then(r=>{r!=null&&A(r)}).finally(()=>{M(!0)}):M(!0)},[o,a]),_react.useEffect.call(void 0, ()=>{o!=null&&i()},[o,i]);let g=()=>{n.logout()},d=_react.useCallback.call(void 0, ()=>_chunk2WSEHVNPcjs.d.call(void 0, this,null,function*(){try{let s=Object.keys(ee).map(P=>_chunk2WSEHVNPcjs.d.call(void 0, this,null,function*(){let V=yield n==null?void 0:n.getOAuthUrl(P,{appSchema:t});return{[P]:V}})),l=Object.assign({},...yield Promise.all(s));R(l)}catch(r){console.error(r)}}),[n]);_react.useEffect.call(void 0, ()=>{b==null&&d()},[d,b]);let C=()=>N?L?"in-progress":o!=null?"logged-in":"logged-out":"initializing",m=()=>_chunk2WSEHVNPcjs.d.call(void 0, this,null,function*(){if(o==null){console.log("User not logged in");return}let r=yield n.getUser();return f(r),r}),G=r=>_chunk2WSEHVNPcjs.d.call(void 0, this,null,function*(){var s;try{O(!0);let l=(s=T[r])!=null?s:yield n.getOAuthUrl(r,{appSchema:t});yield h.warmUpAsync();let P=new URL(l);if(r==="google"&&P.searchParams.append("provider_prompt","select_account"),_reactnative.Platform.OS==="android")yield h.openBrowserAsync(P.toString());else{let V=yield h.openAuthSessionAsync(P.toString());V.type==="success"&&(yield H(V.url))}yield h.coolDownAsync()}catch(l){throw console.error("[CrossmintAuthProvider] Error during OAuth login:",l),new Error(`Error during OAuth login: ${l}`)}}),H=_react.useCallback.call(void 0, r=>_chunk2WSEHVNPcjs.d.call(void 0, this,null,function*(){let s=r.includes("://")?Ae(r):r;if(s!=null)try{return O(!0),yield n.handleRefreshAuthMaterial(s)}catch(l){throw l}finally{O(!1)}return null}),[n]);return _jsxruntime.jsx.call(void 0, k.Provider,{value:{crossmintAuth:n,logout:g,jwt:o,user:b,status:C(),getUser:m,loginWithOAuth:G,createAuthSession:H},children:e})}var Ae=e=>{let c=/[?&]oneTimeSecret=([^&#]+)/,v=e.match(c);return v?decodeURIComponent(v[1]):void 0};exports.a = k; exports.b = nt; exports.c = Ee; exports.d = We; exports.e = F; exports.f = ke; exports.g = Fe; exports.h = _clientsdkreactbase.useCrossmint; exports.i = _clientsdkreactbase.useWallet;