@explorins/pers-sdk-react-native 1.5.18 → 1.5.20
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 +336 -234
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/useAuth.d.ts +1 -1
- package/dist/hooks/useAuth.d.ts.map +1 -1
- package/dist/hooks/useAuth.js +7 -7
- package/dist/hooks/useRedemptions.d.ts.map +1 -1
- package/dist/hooks/useRedemptions.js +4 -4
- package/dist/hooks/useTenants.d.ts.map +1 -1
- package/dist/hooks/useTenants.js +0 -1
- package/dist/hooks/useTransactionSigner.d.ts +186 -53
- package/dist/hooks/useTransactionSigner.d.ts.map +1 -1
- package/dist/hooks/useTransactionSigner.js +285 -102
- package/dist/hooks/useTransactions.d.ts +2 -2
- package/dist/hooks/useTransactions.d.ts.map +1 -1
- package/dist/hooks/useTransactions.js +9 -10
- package/dist/index.d.ts +211 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20918 -18336
- package/dist/index.js.map +1 -1
- package/dist/providers/PersSDKProvider.d.ts +2 -8
- package/dist/providers/PersSDKProvider.d.ts.map +1 -1
- package/dist/providers/PersSDKProvider.js +16 -31
- package/dist/providers/react-native-auth-provider.d.ts +25 -36
- package/dist/providers/react-native-auth-provider.d.ts.map +1 -1
- package/dist/providers/react-native-auth-provider.js +36 -146
- package/dist/storage/async-storage-token-storage.d.ts +22 -0
- package/dist/storage/async-storage-token-storage.d.ts.map +1 -0
- package/dist/storage/async-storage-token-storage.js +113 -0
- package/package.json +16 -11
- package/src/hooks/index.ts +1 -1
- package/src/hooks/useAuth.ts +7 -7
- package/src/hooks/useRedemptions.ts +5 -7
- package/src/hooks/useTenants.ts +0 -1
- package/src/hooks/useTransactionSigner.ts +322 -166
- package/src/hooks/useTransactions.ts +12 -11
- package/src/index.ts +243 -7
- package/src/providers/PersSDKProvider.tsx +21 -40
- package/src/providers/react-native-auth-provider.ts +59 -176
- package/src/storage/async-storage-token-storage.ts +133 -0
package/dist/hooks/index.d.ts
CHANGED
|
@@ -14,5 +14,5 @@ export { useFiles } from './useFiles';
|
|
|
14
14
|
export { useAnalytics } from './useAnalytics';
|
|
15
15
|
export { useDonations } from './useDonations';
|
|
16
16
|
export type { RawUserData } from './useAuth';
|
|
17
|
-
export type { TransactionSignerHook, TransactionSigningResult } from './useTransactionSigner';
|
|
17
|
+
export type { TransactionSignerHook, SubmissionResult, AuthenticatedUser, TransactionSigningResult } from './useTransactionSigner';
|
|
18
18
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/hooks/useAuth.d.ts
CHANGED
|
@@ -51,7 +51,7 @@ export declare const useAuth: () => {
|
|
|
51
51
|
checkIsAuthenticated: () => Promise<boolean>;
|
|
52
52
|
refreshTokens: (refreshToken?: string) => Promise<import("@explorins/pers-shared").SessionAuthResponseDTO>;
|
|
53
53
|
clearAuth: () => Promise<void>;
|
|
54
|
-
hasValidAuth: () => boolean
|
|
54
|
+
hasValidAuth: () => Promise<boolean>;
|
|
55
55
|
};
|
|
56
56
|
export type AuthHook = ReturnType<typeof useAuth>;
|
|
57
57
|
//# sourceMappingURL=useAuth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAG/F,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,eAAO,MAAM,OAAO;;;;;sBA2ByB,MAAM,aAAY,MAAM,GAAG,OAAO,KAAY,QAAQ,6BAA6B,CAAC;oCA8CtE,WAAW,KAAG,QAAQ,IAAI,CAAC;kBA+C/C,QAAQ,IAAI,CAAC;;0BA8BL,QAAQ,OAAO,CAAC;gCAmBV,QAAQ,OAAO,CAAC;mCAqBX,MAAM;qBAmBtB,QAAQ,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAG/F,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,eAAO,MAAM,OAAO;;;;;sBA2ByB,MAAM,aAAY,MAAM,GAAG,OAAO,KAAY,QAAQ,6BAA6B,CAAC;oCA8CtE,WAAW,KAAG,QAAQ,IAAI,CAAC;kBA+C/C,QAAQ,IAAI,CAAC;;0BA8BL,QAAQ,OAAO,CAAC;gCAmBV,QAAQ,OAAO,CAAC;mCAqBX,MAAM;qBAmBtB,QAAQ,IAAI,CAAC;wBAoBV,QAAQ,OAAO,CAAC;CAyB5D,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC"}
|
package/dist/hooks/useAuth.js
CHANGED
|
@@ -61,7 +61,7 @@ export const useAuth = () => {
|
|
|
61
61
|
try {
|
|
62
62
|
console.log(`Logging in as ${userType}...`);
|
|
63
63
|
// Set token in auth provider
|
|
64
|
-
await authProvider.
|
|
64
|
+
await authProvider.setAccessToken(jwtToken);
|
|
65
65
|
// Perform login using the manager
|
|
66
66
|
const result = await sdk.auth.loginWithToken(jwtToken, userType);
|
|
67
67
|
const userData = result.user || result.admin;
|
|
@@ -100,11 +100,11 @@ export const useAuth = () => {
|
|
|
100
100
|
}
|
|
101
101
|
try {
|
|
102
102
|
console.log('Logging in with raw user data...');
|
|
103
|
-
// Use the raw data login from the
|
|
104
|
-
const result = await sdk.
|
|
103
|
+
// Use the raw data login from the auth manager
|
|
104
|
+
const result = await sdk.auth.loginWithRawData(rawUserData);
|
|
105
105
|
// Set token from result
|
|
106
106
|
if (result.accessToken) {
|
|
107
|
-
await authProvider.
|
|
107
|
+
await authProvider.setAccessToken(result.accessToken);
|
|
108
108
|
}
|
|
109
109
|
const userData = result.user;
|
|
110
110
|
if (userData) {
|
|
@@ -139,7 +139,7 @@ export const useAuth = () => {
|
|
|
139
139
|
try {
|
|
140
140
|
console.log('Logging out...');
|
|
141
141
|
if (authProvider) {
|
|
142
|
-
await authProvider.
|
|
142
|
+
await authProvider.clearTokens();
|
|
143
143
|
}
|
|
144
144
|
setAuthenticationState(null, null, false);
|
|
145
145
|
console.log('Logout successful');
|
|
@@ -237,11 +237,11 @@ export const useAuth = () => {
|
|
|
237
237
|
* console.log('Auth is valid:', isValid);
|
|
238
238
|
* ```
|
|
239
239
|
*/
|
|
240
|
-
const hasValidAuth = useCallback(() => {
|
|
240
|
+
const hasValidAuth = useCallback(async () => {
|
|
241
241
|
if (!sdk) {
|
|
242
242
|
return false;
|
|
243
243
|
}
|
|
244
|
-
return sdk.auth.hasValidAuth();
|
|
244
|
+
return await sdk.auth.hasValidAuth();
|
|
245
245
|
}, [sdk]);
|
|
246
246
|
return {
|
|
247
247
|
// State
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRedemptions.d.ts","sourceRoot":"","sources":["../../src/hooks/useRedemptions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useRedemptions.d.ts","sourceRoot":"","sources":["../../src/hooks/useRedemptions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,0BAA0B,EAC1B,aAAa,EACb,mBAAmB,EACnB,kCAAkC,EAClC,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAEhC,eAAO,MAAM,cAAc;gCAI0B,QAAQ,aAAa,EAAE,CAAC;8BAe1B,QAAQ,mBAAmB,EAAE,CAAC;gCAmB1B,MAAM,KAAG,QAAQ,kCAAkC,CAAC;8BAsFxD,QAAQ,iBAAiB,EAAE,CAAC;uCA/BjB,0BAA0B,KAAG,QAAQ,aAAa,CAAC;iCAgBzD,OAAO,KAAG,QAAQ,aAAa,EAAE,CAAC;qCA8B9B,MAAM,kBAAkB,0BAA0B,KAAG,QAAQ,aAAa,CAAC;2CAerE,MAAM,KAAG,QAAQ,aAAa,CAAC;;CA0BhG,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { usePersSDK } from '../providers/PersSDKProvider';
|
|
|
3
3
|
import { useTransactionSigner } from './useTransactionSigner';
|
|
4
4
|
export const useRedemptions = () => {
|
|
5
5
|
const { sdk, isInitialized, isAuthenticated } = usePersSDK();
|
|
6
|
-
const {
|
|
6
|
+
const { signAndSubmitTransactionWithJWT, isSignerAvailable } = useTransactionSigner();
|
|
7
7
|
const getActiveRedemptions = useCallback(async () => {
|
|
8
8
|
if (!isInitialized || !sdk) {
|
|
9
9
|
throw new Error('SDK not initialized. Call initialize() first.');
|
|
@@ -52,7 +52,7 @@ export const useRedemptions = () => {
|
|
|
52
52
|
if (txToken && isSignerAvailable) {
|
|
53
53
|
console.log('Transaction requires blockchain signing, processing with WebAuthn signer...');
|
|
54
54
|
try {
|
|
55
|
-
const signingResult = await
|
|
55
|
+
const signingResult = await signAndSubmitTransactionWithJWT(txToken);
|
|
56
56
|
console.log('Blockchain signing result:', signingResult);
|
|
57
57
|
if (signingResult.success) {
|
|
58
58
|
console.log('Transaction signed successfully:', signingResult.transactionHash);
|
|
@@ -60,7 +60,7 @@ export const useRedemptions = () => {
|
|
|
60
60
|
return {
|
|
61
61
|
...result,
|
|
62
62
|
transactionHash: signingResult.transactionHash,
|
|
63
|
-
signature: signingResult.signature,
|
|
63
|
+
// signature: signingResult.signature,
|
|
64
64
|
isSigned: true,
|
|
65
65
|
signedAt: new Date().toISOString()
|
|
66
66
|
};
|
|
@@ -86,7 +86,7 @@ export const useRedemptions = () => {
|
|
|
86
86
|
console.error('Failed to redeem redemption:', error);
|
|
87
87
|
throw error;
|
|
88
88
|
}
|
|
89
|
-
}, [sdk, isInitialized, isAuthenticated,
|
|
89
|
+
}, [sdk, isInitialized, isAuthenticated, signAndSubmitTransactionWithJWT, isSignerAvailable]);
|
|
90
90
|
// Admin methods
|
|
91
91
|
const createRedemption = useCallback(async (redemptionData) => {
|
|
92
92
|
if (!isInitialized || !sdk) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTenants.d.ts","sourceRoot":"","sources":["../../src/hooks/useTenants.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAE/F,eAAO,MAAM,UAAU;yBAGuB,QAAQ,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"useTenants.d.ts","sourceRoot":"","sources":["../../src/hooks/useTenants.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAE/F,eAAO,MAAM,UAAU;yBAGuB,QAAQ,eAAe,CAAC;2BActB,QAAQ,qBAAqB,CAAC;yBAehC,QAAQ,MAAM,CAAC;qBAenB,QAAQ,QAAQ,EAAE,CAAC;;CAsB5D,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC"}
|
package/dist/hooks/useTenants.js
CHANGED
|
@@ -1,77 +1,210 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
interface
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
interface
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
type SubmissionResult = import('@explorins/pers-signer/react-native').SubmissionResult;
|
|
2
|
+
type AuthenticatedUser = import('@explorins/pers-signer/react-native').AuthenticatedUser;
|
|
3
|
+
type TransactionSigningResult = import('@explorins/pers-signer/react-native').TransactionSigningResult;
|
|
4
|
+
/**
|
|
5
|
+
* Return interface for the useTransactionSigner hook
|
|
6
|
+
*
|
|
7
|
+
* Provides secure transaction signing capabilities for EVM blockchain interactions
|
|
8
|
+
* and error handling for React Native applications.
|
|
9
|
+
*
|
|
10
|
+
* @interface TransactionSignerHook
|
|
11
|
+
* @property {Function} signAndSubmitTransactionWithJWT - Main method to sign and submit transactions
|
|
12
|
+
* @property {boolean} isSignerInitialized - Whether the signer SDK has been initialized
|
|
13
|
+
* @property {boolean} isSignerAvailable - Whether signing functionality is fully available
|
|
14
|
+
*/
|
|
15
|
+
interface TransactionSignerHook {
|
|
16
|
+
signAndSubmitTransactionWithJWT: (jwt: string) => Promise<SubmissionResult>;
|
|
17
|
+
isSignerInitialized: boolean;
|
|
18
|
+
isSignerAvailable: boolean;
|
|
15
19
|
}
|
|
16
20
|
/**
|
|
17
21
|
* React Native hook for blockchain transaction signing using PERS Signer SDK
|
|
18
22
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
23
|
+
* This hook provides a complete blockchain transaction signing solution for React Native
|
|
24
|
+
* applications, integrating with the PERS ecosystem for tourism loyalty and reward systems.
|
|
25
|
+
* It automatically handles WebAuthn authentication, transaction preparation, signing, and
|
|
26
|
+
* blockchain submission in a single convenient interface.
|
|
27
|
+
*
|
|
28
|
+
* **Features:**
|
|
29
|
+
* - Automatic WebAuthn provider initialization for React Native
|
|
30
|
+
* - 5-minute authentication caching to reduce repeated logins
|
|
31
|
+
* - Complete transaction lifecycle management (sign + submit)
|
|
32
|
+
* - Comprehensive error handling with detailed error messages
|
|
33
|
+
* - Real-time status monitoring for UI feedback
|
|
34
|
+
* - Automatic retry logic for network failures
|
|
35
|
+
*
|
|
36
|
+
* **Underlying SDK Methods:**
|
|
37
|
+
* The hook uses the PERS Signer SDK which provides 5 core methods:
|
|
38
|
+
* 1. `loginUser(jwtToken)` - Authenticate user with 5-minute caching
|
|
39
|
+
* 2. `signTransaction(signingData, jwtToken)` - Sign transactions with auto-login
|
|
40
|
+
* 3. `submitTransaction(signingResult, jwtToken)` - Submit signed transactions
|
|
41
|
+
* 4. `signPersTransaction(jwtToken)` - Legacy one-liner for backward compatibility
|
|
42
|
+
* 5. `signAndSubmitPersTransaction(jwtToken)` - Complete sign + submit flow (used by this hook)
|
|
43
|
+
*
|
|
44
|
+
* **Security:**
|
|
45
|
+
* - WebAuthn-based secure authentication (no passwords stored)
|
|
46
|
+
* - JWT token validation and expiration checking
|
|
47
|
+
* - Secure transaction signing using device biometrics/PIN
|
|
48
|
+
* - No sensitive data stored locally
|
|
49
|
+
*
|
|
50
|
+
* @returns {TransactionSignerHook} Hook interface with signing methods and status
|
|
21
51
|
*
|
|
22
52
|
* @example
|
|
53
|
+
* **Basic Usage:**
|
|
23
54
|
* ```typescript
|
|
24
|
-
*
|
|
25
|
-
*
|
|
55
|
+
* import { useTransactionSigner } from '@explorins/pers-sdk-react-native';
|
|
56
|
+
*
|
|
57
|
+
* function TransactionScreen() {
|
|
58
|
+
* const {
|
|
59
|
+
* signAndSubmitTransactionWithJWT,
|
|
60
|
+
* isSignerAvailable,
|
|
61
|
+
* isSignerInitialized
|
|
62
|
+
* } = useTransactionSigner();
|
|
26
63
|
*
|
|
27
64
|
* const handleSign = async (jwtFromRedemption: string) => {
|
|
65
|
+
* if (!isSignerAvailable) {
|
|
66
|
+
* console.error('Signer not available');
|
|
67
|
+
* return;
|
|
68
|
+
* }
|
|
69
|
+
*
|
|
28
70
|
* try {
|
|
29
|
-
* const result = await
|
|
71
|
+
* const result = await signAndSubmitTransactionWithJWT(jwtFromRedemption);
|
|
30
72
|
* if (result.success) {
|
|
31
|
-
* console.log('Transaction
|
|
73
|
+
* console.log('Transaction completed:', result.transactionHash);
|
|
74
|
+
* // Handle successful transaction
|
|
75
|
+
* if (result.shouldRedirect && result.redirectUrl) {
|
|
76
|
+
* // Navigate to success page or external URL
|
|
77
|
+
* }
|
|
32
78
|
* }
|
|
33
79
|
* } catch (error) {
|
|
34
|
-
* console.error('
|
|
80
|
+
* console.error('Transaction failed:', error.message);
|
|
81
|
+
* // Handle error (show user-friendly message)
|
|
35
82
|
* }
|
|
36
83
|
* };
|
|
37
84
|
*
|
|
38
85
|
* return (
|
|
39
|
-
* <
|
|
40
|
-
*
|
|
41
|
-
*
|
|
86
|
+
* <View style={styles.container}>
|
|
87
|
+
* <TouchableOpacity
|
|
88
|
+
* onPress={() => handleSign(redeemJWT)}
|
|
89
|
+
* disabled={!isSignerAvailable}
|
|
90
|
+
* style={[styles.button, !isSignerAvailable && styles.disabled]}
|
|
91
|
+
* >
|
|
92
|
+
* <Text style={styles.buttonText}>
|
|
93
|
+
* {isSignerInitialized ? 'Sign Transaction' : 'Initializing...'}
|
|
94
|
+
* </Text>
|
|
95
|
+
* </TouchableOpacity>
|
|
96
|
+
* </View>
|
|
42
97
|
* );
|
|
43
98
|
* }
|
|
44
99
|
* ```
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* **Advanced Usage with Error Handling:**
|
|
103
|
+
* ```typescript
|
|
104
|
+
* function AdvancedTransactionComponent() {
|
|
105
|
+
* const [isLoading, setIsLoading] = useState(false);
|
|
106
|
+
* const [error, setError] = useState<string | null>(null);
|
|
107
|
+
* const { signAndSubmitTransactionWithJWT, isSignerAvailable } = useTransactionSigner();
|
|
108
|
+
*
|
|
109
|
+
* const handleTransaction = async (jwt: string) => {
|
|
110
|
+
* setIsLoading(true);
|
|
111
|
+
* setError(null);
|
|
112
|
+
*
|
|
113
|
+
* try {
|
|
114
|
+
* const result = await signAndSubmitTransactionWithJWT(jwt);
|
|
115
|
+
*
|
|
116
|
+
* if (result.success) {
|
|
117
|
+
* // Success handling
|
|
118
|
+
* Alert.alert(
|
|
119
|
+
* 'Success',
|
|
120
|
+
* `Transaction completed!\nHash: ${result.transactionHash}`
|
|
121
|
+
* );
|
|
122
|
+
* } else {
|
|
123
|
+
* throw new Error(result.error || 'Transaction failed');
|
|
124
|
+
* }
|
|
125
|
+
* } catch (err) {
|
|
126
|
+
* const errorMessage = err instanceof Error ? err.message : 'Unknown error';
|
|
127
|
+
* setError(errorMessage);
|
|
128
|
+
*
|
|
129
|
+
* // Different error handling based on error type
|
|
130
|
+
* if (errorMessage.includes('expired')) {
|
|
131
|
+
* Alert.alert('Session Expired', 'Please log in again');
|
|
132
|
+
* } else if (errorMessage.includes('network')) {
|
|
133
|
+
* Alert.alert('Network Error', 'Please check your connection');
|
|
134
|
+
* } else {
|
|
135
|
+
* Alert.alert('Transaction Failed', errorMessage);
|
|
136
|
+
* }
|
|
137
|
+
* } finally {
|
|
138
|
+
* setIsLoading(false);
|
|
139
|
+
* }
|
|
140
|
+
* };
|
|
141
|
+
*
|
|
142
|
+
* return (
|
|
143
|
+
* <View>
|
|
144
|
+
* {error && (
|
|
145
|
+
* <Text style={styles.errorText}>{error}</Text>
|
|
146
|
+
* )}
|
|
147
|
+
* <TouchableOpacity
|
|
148
|
+
* onPress={() => handleTransaction(jwtToken)}
|
|
149
|
+
* disabled={!isSignerAvailable || isLoading}
|
|
150
|
+
* >
|
|
151
|
+
* <Text>
|
|
152
|
+
* {isLoading ? 'Processing...' : 'Sign & Submit Transaction'}
|
|
153
|
+
* </Text>
|
|
154
|
+
* </TouchableOpacity>
|
|
155
|
+
* </View>
|
|
156
|
+
* );
|
|
157
|
+
* }
|
|
158
|
+
* ```
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* **Integration with PERS SDK:**
|
|
162
|
+
* ```typescript
|
|
163
|
+
* import { usePersSDK } from '@explorins/pers-sdk-react-native';
|
|
164
|
+
* import { useTransactionSigner } from '@explorins/pers-sdk-react-native';
|
|
165
|
+
*
|
|
166
|
+
* function RedemptionFlow() {
|
|
167
|
+
* const { user, redeemTokens } = usePersSDK();
|
|
168
|
+
* const { signAndSubmitTransactionWithJWT } = useTransactionSigner();
|
|
169
|
+
*
|
|
170
|
+
* const handleRedemption = async (tokenAmount: number) => {
|
|
171
|
+
* try {
|
|
172
|
+
* // Step 1: Create redemption with PERS SDK
|
|
173
|
+
* const redemption = await redeemTokens({
|
|
174
|
+
* tokenAmount,
|
|
175
|
+
* destinationAddress: user?.walletAddress
|
|
176
|
+
* });
|
|
177
|
+
*
|
|
178
|
+
* // Step 2: Sign and submit transaction
|
|
179
|
+
* const txResult = await signAndSubmitTransactionWithJWT(redemption.jwtToken);
|
|
180
|
+
*
|
|
181
|
+
* if (txResult.success) {
|
|
182
|
+
* console.log('Redemption completed:', txResult.transactionHash);
|
|
183
|
+
* }
|
|
184
|
+
* } catch (error) {
|
|
185
|
+
* console.error('Redemption failed:', error);
|
|
186
|
+
* }
|
|
187
|
+
* };
|
|
188
|
+
* }
|
|
189
|
+
* ```
|
|
190
|
+
*
|
|
191
|
+
* @see {@link SubmissionResult} for transaction result structure
|
|
192
|
+
* @see {@link TransactionSigningResult} for signing result details
|
|
193
|
+
* @see {@link AuthenticatedUser} for user authentication data
|
|
194
|
+
*
|
|
195
|
+
* @since 1.5.0
|
|
45
196
|
*/
|
|
46
|
-
export declare const useTransactionSigner: () =>
|
|
47
|
-
/**
|
|
48
|
-
* Sign a blockchain transaction using JWT token (recommended method)
|
|
49
|
-
*/
|
|
50
|
-
signTransactionWithJWT: (jwt: string) => Promise<TransactionSigningResult>;
|
|
51
|
-
/**
|
|
52
|
-
* Legacy transaction signing method
|
|
53
|
-
* @deprecated Use signTransactionWithJWT instead
|
|
54
|
-
*/
|
|
55
|
-
signTransaction: (jwt: string) => Promise<TransactionSigningResult>;
|
|
56
|
-
/**
|
|
57
|
-
* Manual user authentication (for advanced use cases)
|
|
58
|
-
*/
|
|
59
|
-
authenticateUser: (identifier: string) => Promise<SignerAuthenticatedUser | null>;
|
|
60
|
-
/**
|
|
61
|
-
* Whether the transaction signer has been initialized
|
|
62
|
-
*/
|
|
63
|
-
isSignerInitialized: boolean;
|
|
64
|
-
/**
|
|
65
|
-
* Whether transaction signing is available (all requirements met)
|
|
66
|
-
*/
|
|
67
|
-
isSignerAvailable: boolean;
|
|
68
|
-
};
|
|
69
|
-
/**
|
|
70
|
-
* Type definition for the transaction signer hook
|
|
71
|
-
*/
|
|
72
|
-
export type TransactionSignerHook = ReturnType<typeof useTransactionSigner>;
|
|
197
|
+
export declare const useTransactionSigner: () => TransactionSignerHook;
|
|
73
198
|
/**
|
|
74
|
-
*
|
|
199
|
+
* Type exports for external usage
|
|
200
|
+
*
|
|
201
|
+
* These types are re-exported from the PERS Signer SDK for convenience
|
|
202
|
+
* when working with transaction signing in React Native applications.
|
|
203
|
+
*
|
|
204
|
+
* @see {@link SubmissionResult} - Complete transaction submission result
|
|
205
|
+
* @see {@link AuthenticatedUser} - User authentication data structure
|
|
206
|
+
* @see {@link TransactionSigningResult} - Transaction signing result details
|
|
207
|
+
* @see {@link TransactionSignerHook} - Hook return interface
|
|
75
208
|
*/
|
|
76
|
-
export type {
|
|
209
|
+
export type { SubmissionResult, AuthenticatedUser, TransactionSigningResult, TransactionSignerHook };
|
|
77
210
|
//# sourceMappingURL=useTransactionSigner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTransactionSigner.d.ts","sourceRoot":"","sources":["../../src/hooks/useTransactionSigner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useTransactionSigner.d.ts","sourceRoot":"","sources":["../../src/hooks/useTransactionSigner.ts"],"names":[],"mappings":"AAMA,KAAK,gBAAgB,GAAG,OAAO,qCAAqC,EAAE,gBAAgB,CAAC;AACvF,KAAK,iBAAiB,GAAG,OAAO,qCAAqC,EAAE,iBAAiB,CAAC;AACzF,KAAK,wBAAwB,GAAG,OAAO,qCAAqC,EAAE,wBAAwB,CAAC;AAcvG;;;;;;;;;;GAUG;AACH,UAAU,qBAAqB;IAC7B,+BAA+B,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5E,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAKD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgLG;AACH,eAAO,MAAM,oBAAoB,QAAO,qBA4LvC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,CAAC"}
|