@onairos/react-native 3.1.0 → 3.1.1

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.
@@ -122,12 +122,12 @@ export declare const disconnectPlatform: (platform: string, username: string) =>
122
122
  error?: string;
123
123
  }>;
124
124
  /**
125
- * Store PIN for user (uses developer API key for now, should be JWT in future)
126
- * @param username Username
125
+ * Store PIN for user (uses JWT authentication and extracts username from JWT)
127
126
  * @param pin User PIN
127
+ * @param username Optional username (if not provided, extracts from JWT)
128
128
  * @returns Promise with result
129
129
  */
130
- export declare const storePIN: (username: string, pin: string) => Promise<{
130
+ export declare const storePIN: (pin: string, username?: string) => Promise<{
131
131
  success: boolean;
132
132
  error?: string;
133
133
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"platformAuthService.d.ts","sourceRoot":"","sources":["../../../src/services/platformAuthService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platformAuthService.d.ts","sourceRoot":"","sources":["../../../src/services/platformAuthService.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,eAAO,MAAM,6BAA6B,QAAa,QAAQ,IAAI,CAkBlE,CAAC;AAoCF;;GAEG;AACH,eAAO,MAAM,YAAY,aAAc,MAAM,KAAG,OAG/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,aAAc,MAAM,KAAG,MAGlD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,aAAc,MAAM,KAAG,MAGnD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,aAAoB,MAAM,YAAY,MAAM,YAAY,MAAM,KAAG,QAAQ,MAAM,GAAG,IAAI,CAsJ/G,CAAC;AAgEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,aAAoB,MAAM,aAAa,MAAM,KAAG,QAAQ,OAAO,CA4N7F,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,QAAS,MAAM,KAAG,MAAM,GAAG,IAW1D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAS,MAAM,KAAG,OAG7C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAa,QAAQ;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAgExF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAa,QAAQ;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAuCpG,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,QAAa,QAAQ,OAAO,CA2D5D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,QAAS,MAAM,KAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAgCxG,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,WAAY;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,SAYA,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,UAC5B,MAAM,aACH,OAAO,KAChB,QAAQ;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAmChE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,UACnB,MAAM,QACP,MAAM,aACF,OAAO,KAChB,QAAQ;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA8CxG,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,UAChC,MAAM,aACH,OAAO,KAChB,QAAQ;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAgCnE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,aAAoB,MAAM,YAAY,MAAM,KAAG,QAAQ;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAgCzH,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,QAAe,MAAM,aAAa,MAAM,KAAG,QAAQ;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA8C3G,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAAa,QAAQ,MAAM,GAAG,IAAI,CA0B/D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAAa,QAAQ,IAAI,CAyBtD,CAAC"}
@@ -70,10 +70,11 @@ export declare const updatePlatformConnections: (platforms: Record<string, any>,
70
70
  debug: boolean;
71
71
  }) => Promise<ApiResponse<any>>;
72
72
  /**
73
- * Store user PIN (uses JWT)
73
+ * Store user PIN (uses JWT and extracts username from JWT)
74
74
  */
75
- export declare const storePIN: (username: string, pin: string, options?: {
76
- debug: boolean;
75
+ export declare const storePIN: (pin: string, options?: {
76
+ debug?: boolean;
77
+ username?: string;
77
78
  }) => Promise<ApiResponse<any>>;
78
79
  /**
79
80
  * Get current JWT token
@@ -1 +1 @@
1
- {"version":3,"file":"onairosApi.d.ts","sourceRoot":"","sources":["../../../src/utils/onairosApi.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAKrD,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,GAAG,CAAC;KACf,CAAC;CACH;AAGD,MAAM,MAAM,YAAY,GACpB,eAAe,GACf,eAAe,GACf,YAAY,GACZ,cAAc,GACd,kBAAkB,GAClB,eAAe,CAAC;AAGpB,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,GAAG,CAAC;gBAEF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAO9E;AAgND;;GAEG;AACH,eAAO,MAAM,mBAAmB,aACpB,MAAM;;MAEf,QAAQ;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAiBhD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,gBACX,QAAQ,kBAAkB,CAAC;;MAEvC,QAAQ,YAAY;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ9D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,gBACV,QAAQ,kBAAkB,CAAC;;MAEvC,QAAQ,YAAY;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,MAAM,CAAA;CAAE,CAAC,CAQpE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,iBACT,MAAM;;;iBAEgB,MAAM;kBAAgB,MAAM;GAKjE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,aAChB,MAAM;;MAEf,QAAQ,YAAY,GAAG,CAAC,CAI1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc;;MAExB,QAAQ,YAAY,GAAG,CAAC,CAI1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB,cACzB,OAAO,MAAM,EAAE,GAAG,CAAC;;MAE7B,QAAQ,YAAY,GAAG,CAAC,CAK1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,aACT,MAAM,OACX,MAAM;;MAEV,QAAQ,YAAY,GAAG,CAAC,CAK1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAa,QAAQ,MAAM,GAAG,IAAI,CAEjE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,QAAO,OAE7C,CAAC"}
1
+ {"version":3,"file":"onairosApi.d.ts","sourceRoot":"","sources":["../../../src/utils/onairosApi.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAKrD,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,GAAG,CAAC;KACf,CAAC;CACH;AAGD,MAAM,MAAM,YAAY,GACpB,eAAe,GACf,eAAe,GACf,YAAY,GACZ,cAAc,GACd,kBAAkB,GAClB,eAAe,CAAC;AAGpB,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,GAAG,CAAC;gBAEF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAO9E;AAgND;;GAEG;AACH,eAAO,MAAM,mBAAmB,aACpB,MAAM;;MAEf,QAAQ;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAiBhD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,gBACX,QAAQ,kBAAkB,CAAC;;MAEvC,QAAQ,YAAY;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ9D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,gBACV,QAAQ,kBAAkB,CAAC;;MAEvC,QAAQ,YAAY;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,MAAM,CAAA;CAAE,CAAC,CAQpE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,iBACT,MAAM;;;iBAEgB,MAAM;kBAAgB,MAAM;GAKjE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,aAChB,MAAM;;MAEf,QAAQ,YAAY,GAAG,CAAC,CAI1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc;;MAExB,QAAQ,YAAY,GAAG,CAAC,CAI1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB,cACzB,OAAO,MAAM,EAAE,GAAG,CAAC;;MAE7B,QAAQ,YAAY,GAAG,CAAC,CAK1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,QACd,MAAM,YACF;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,KAC9C,QAAQ,YAAY,GAAG,CAAC,CAiB1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAa,QAAQ,MAAM,GAAG,IAAI,CAEjE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,QAAO,OAE7C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onairos/react-native",
3
- "version": "3.1.0",
3
+ "version": "3.1.1",
4
4
  "description": "Onairos React Native SDK for social media authentication and AI model training",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
package/src/index.ts CHANGED
@@ -22,6 +22,9 @@ export { Onairos } from './components/Onairos';
22
22
  export {
23
23
  initializeApiKey,
24
24
  ADMIN_API_KEY,
25
+ extractUsernameFromJWT,
26
+ extractUserDataFromJWT,
27
+ decodeJWTPayload,
25
28
  } from './services/apiKeyService';
26
29
 
27
30
  // Authentication & PIN Management
@@ -352,6 +352,136 @@ export const clearJWT = async (): Promise<void> => {
352
352
  }
353
353
  };
354
354
 
355
+ /**
356
+ * React Native compatible base64 decoder
357
+ * @param str Base64 encoded string
358
+ * @returns Decoded string
359
+ */
360
+ const base64Decode = (str: string): string => {
361
+ // Simple base64 decoding for React Native
362
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
363
+ let result = '';
364
+ let i = 0;
365
+
366
+ str = str.replace(/[^A-Za-z0-9+/]/g, '');
367
+
368
+ while (i < str.length) {
369
+ const a = chars.indexOf(str.charAt(i++));
370
+ const b = chars.indexOf(str.charAt(i++));
371
+ const c = chars.indexOf(str.charAt(i++));
372
+ const d = chars.indexOf(str.charAt(i++));
373
+
374
+ const bitmap = (a << 18) | (b << 12) | (c << 6) | d;
375
+
376
+ result += String.fromCharCode((bitmap >> 16) & 255);
377
+ if (c !== 64) result += String.fromCharCode((bitmap >> 8) & 255);
378
+ if (d !== 64) result += String.fromCharCode(bitmap & 255);
379
+ }
380
+
381
+ return result;
382
+ };
383
+
384
+ /**
385
+ * Decode JWT token payload (React Native compatible)
386
+ * @param token JWT token string
387
+ * @returns Decoded payload or null if invalid
388
+ */
389
+ export const decodeJWTPayload = (token: string): any => {
390
+ try {
391
+ // Split JWT token (header.payload.signature)
392
+ const parts = token.split('.');
393
+ if (parts.length !== 3) {
394
+ console.error('❌ Invalid JWT token format');
395
+ return null;
396
+ }
397
+
398
+ // Decode payload (base64url to base64)
399
+ const payload = parts[1];
400
+ const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');
401
+
402
+ // Add padding if needed
403
+ const padded = base64.padEnd(Math.ceil(base64.length / 4) * 4, '=');
404
+
405
+ // Decode base64 to JSON using React Native compatible decoder
406
+ const decoded = base64Decode(padded);
407
+ return JSON.parse(decoded);
408
+ } catch (error) {
409
+ console.error('❌ Failed to decode JWT token:', error);
410
+ return null;
411
+ }
412
+ };
413
+
414
+ /**
415
+ * Extract username from JWT token
416
+ * @param token JWT token (optional, uses stored token if not provided)
417
+ * @returns Username or null if not found
418
+ */
419
+ export const extractUsernameFromJWT = (token?: string): string | null => {
420
+ try {
421
+ const jwtToken = token || userToken;
422
+ if (!jwtToken) {
423
+ console.warn('⚠️ No JWT token available for username extraction');
424
+ return null;
425
+ }
426
+
427
+ const payload = decodeJWTPayload(jwtToken);
428
+ if (!payload) {
429
+ return null;
430
+ }
431
+
432
+ // Try different possible username fields in order of preference
433
+ const username = payload.userName || payload.username || payload.userId || payload.email;
434
+
435
+ if (globalConfig?.enableLogging) {
436
+ console.log('👤 Extracted username from JWT:', username);
437
+ }
438
+
439
+ return username || null;
440
+ } catch (error) {
441
+ console.error('❌ Failed to extract username from JWT:', error);
442
+ return null;
443
+ }
444
+ };
445
+
446
+ /**
447
+ * Extract user data from JWT token
448
+ * @param token JWT token (optional, uses stored token if not provided)
449
+ * @returns User data object or null if not found
450
+ */
451
+ export const extractUserDataFromJWT = (token?: string): any => {
452
+ try {
453
+ const jwtToken = token || userToken;
454
+ if (!jwtToken) {
455
+ console.warn('⚠️ No JWT token available for user data extraction');
456
+ return null;
457
+ }
458
+
459
+ const payload = decodeJWTPayload(jwtToken);
460
+ if (!payload) {
461
+ return null;
462
+ }
463
+
464
+ const userData = {
465
+ id: payload.id,
466
+ email: payload.email,
467
+ userId: payload.userId,
468
+ userName: payload.userName || payload.username,
469
+ verified: payload.verified,
470
+ iat: payload.iat,
471
+ exp: payload.exp
472
+ };
473
+
474
+ if (globalConfig?.enableLogging) {
475
+ console.log('👤 Extracted user data from JWT:', userData);
476
+ }
477
+
478
+ return userData;
479
+ } catch (error) {
480
+ console.error('❌ Failed to extract user data from JWT:', error);
481
+ return null;
482
+ }
483
+ };
484
+
355
485
  /**
356
486
  * Check if user is authenticated with JWT token
357
487
  * @returns True if user has valid JWT token
@@ -1,7 +1,7 @@
1
1
  import { Platform, Linking } from 'react-native';
2
2
  import AsyncStorage from '@react-native-async-storage/async-storage';
3
3
  import type { PlatformAuthConfig } from '../types';
4
- import { makeDeveloperRequest, getApiConfig, storeJWT } from './apiKeyService';
4
+ import { makeDeveloperRequest, getApiConfig, storeJWT, extractUsernameFromJWT } from './apiKeyService';
5
5
 
6
6
  // 🔑 CRITICAL: Use two-tier authentication system
7
7
  // - Developer API key for email verification requests
@@ -989,23 +989,34 @@ export const disconnectPlatform = async (platform: string, username: string): Pr
989
989
  };
990
990
 
991
991
  /**
992
- * Store PIN for user (uses developer API key for now, should be JWT in future)
993
- * @param username Username
992
+ * Store PIN for user (uses JWT authentication and extracts username from JWT)
994
993
  * @param pin User PIN
994
+ * @param username Optional username (if not provided, extracts from JWT)
995
995
  * @returns Promise with result
996
996
  */
997
- export const storePIN = async (username: string, pin: string): Promise<{ success: boolean; error?: string }> => {
997
+ export const storePIN = async (pin: string, username?: string): Promise<{ success: boolean; error?: string }> => {
998
998
  try {
999
- console.log('🔐 Storing PIN for user:', username);
999
+ // Extract username from JWT if not provided
1000
+ const userToStore = username || extractUsernameFromJWT();
1000
1001
 
1001
- // Make authenticated request to store PIN
1002
+ if (!userToStore) {
1003
+ console.error('❌ No username available - either provide username or ensure JWT token is valid');
1004
+ return {
1005
+ success: false,
1006
+ error: 'No username available for PIN storage'
1007
+ };
1008
+ }
1009
+
1010
+ console.log('🔐 Storing PIN for user:', userToStore);
1011
+
1012
+ // Make authenticated request to store PIN (using developer API key for now)
1002
1013
  const response = await makeDeveloperRequest('/store-pin/web', {
1003
1014
  method: 'POST',
1004
1015
  headers: {
1005
1016
  'Content-Type': 'application/json',
1006
1017
  },
1007
1018
  body: JSON.stringify({
1008
- username,
1019
+ username: userToStore,
1009
1020
  pin
1010
1021
  })
1011
1022
  });
@@ -1013,7 +1024,7 @@ export const storePIN = async (username: string, pin: string): Promise<{ success
1013
1024
  const data = await response.json();
1014
1025
 
1015
1026
  if (response.ok && data.success) {
1016
- console.log('✅ PIN stored successfully');
1027
+ console.log('✅ PIN stored successfully for user:', userToStore);
1017
1028
  return { success: true };
1018
1029
  } else {
1019
1030
  console.error('❌ Failed to store PIN:', data.error);
@@ -243,6 +243,11 @@ declare module '@onairos/react-native' {
243
243
  // SDK Initialization Functions
244
244
  export function initializeApiKey(config: any): Promise<void>;
245
245
  export const ADMIN_API_KEY: string;
246
+
247
+ // JWT Token Functions
248
+ export function extractUsernameFromJWT(token?: string): string | null;
249
+ export function extractUserDataFromJWT(token?: string): any;
250
+ export function decodeJWTPayload(token: string): any;
246
251
 
247
252
  // Programmatic Flow
248
253
  export function executeOnairosFlow(config: any): Promise<any>;
@@ -2,7 +2,7 @@ import { Platform } from 'react-native';
2
2
  import NetInfo from '@react-native-community/netinfo';
3
3
  import { OnairosCredentials } from './secureStorage';
4
4
  import { logDebug } from './debugHelper';
5
- import { getJWT, makeUserRequest, makeDeveloperRequest, isUserAuthenticated } from '../services/apiKeyService';
5
+ import { getJWT, makeUserRequest, makeDeveloperRequest, isUserAuthenticated, extractUsernameFromJWT } from '../services/apiKeyService';
6
6
 
7
7
  // API response types
8
8
  export interface ApiResponse<T = any> {
@@ -352,16 +352,27 @@ export const updatePlatformConnections = async (
352
352
  };
353
353
 
354
354
  /**
355
- * Store user PIN (uses JWT)
355
+ * Store user PIN (uses JWT and extracts username from JWT)
356
356
  */
357
357
  export const storePIN = async (
358
- username: string,
359
358
  pin: string,
360
- options = { debug: false }
359
+ options: { debug?: boolean; username?: string } = {}
361
360
  ): Promise<ApiResponse<any>> => {
361
+ const { debug = false, username } = options;
362
+
363
+ // Extract username from JWT if not provided
364
+ const userToStore = username || extractUsernameFromJWT();
365
+
366
+ if (!userToStore) {
367
+ throw new ApiError(
368
+ 'No username available - either provide username or ensure JWT token is valid',
369
+ 'auth_error'
370
+ );
371
+ }
372
+
362
373
  return makeUserApiRequest('store-pin/mobile', 'POST', {
363
- data: { username, pin },
364
- debug: options.debug,
374
+ data: { username: userToStore, pin },
375
+ debug,
365
376
  });
366
377
  };
367
378