@glideidentity/web-client-sdk 5.0.0 → 5.0.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.
Files changed (89) hide show
  1. package/README.md +108 -8
  2. package/dist/adapters/angular/index.js +0 -1
  3. package/dist/adapters/angular/phone-auth.service.d.ts +0 -18
  4. package/dist/adapters/angular/phone-auth.service.js +0 -26
  5. package/dist/adapters/react/index.js +0 -3
  6. package/dist/adapters/react/useClient.js +0 -1
  7. package/dist/adapters/react/usePhoneAuth.js +1 -16
  8. package/dist/adapters/vanilla/client.js +0 -1
  9. package/dist/adapters/vanilla/index.js +0 -1
  10. package/dist/adapters/vanilla/phone-auth.js +0 -31
  11. package/dist/adapters/vue/index.js +0 -4
  12. package/dist/adapters/vue/useClient.js +0 -5
  13. package/dist/adapters/vue/usePhoneAuth.js +1 -20
  14. package/dist/browser/web-client-sdk.min.js +1 -1
  15. package/dist/browser.js +0 -6
  16. package/dist/core/client.js +0 -12
  17. package/dist/core/logger.js +1 -81
  18. package/dist/core/phone-auth/api-types.js +0 -83
  19. package/dist/core/phone-auth/client.js +27 -366
  20. package/dist/core/phone-auth/error-utils.js +1 -83
  21. package/dist/core/phone-auth/index.js +0 -1
  22. package/dist/core/phone-auth/status-types.d.ts +0 -78
  23. package/dist/core/phone-auth/status-types.js +0 -17
  24. package/dist/core/phone-auth/strategies/desktop.js +8 -126
  25. package/dist/core/phone-auth/strategies/index.d.ts +0 -4
  26. package/dist/core/phone-auth/strategies/index.js +0 -4
  27. package/dist/core/phone-auth/strategies/link.js +10 -88
  28. package/dist/core/phone-auth/strategies/ts43.d.ts +0 -19
  29. package/dist/core/phone-auth/strategies/ts43.js +2 -33
  30. package/dist/core/phone-auth/strategies/types.js +0 -4
  31. package/dist/core/phone-auth/type-guards.js +0 -131
  32. package/dist/core/phone-auth/types.js +0 -32
  33. package/dist/core/phone-auth/ui/mobile-debug-console.js +2 -28
  34. package/dist/core/phone-auth/ui/modal.d.ts +33 -55
  35. package/dist/core/phone-auth/ui/modal.js +889 -422
  36. package/dist/core/phone-auth/validation-utils.js +2 -40
  37. package/dist/core/version.js +1 -2
  38. package/dist/esm/adapters/angular/index.js +0 -1
  39. package/dist/esm/adapters/angular/phone-auth.service.d.ts +0 -18
  40. package/dist/esm/adapters/angular/phone-auth.service.js +0 -26
  41. package/dist/esm/adapters/react/index.js +0 -3
  42. package/dist/esm/adapters/react/useClient.js +0 -1
  43. package/dist/esm/adapters/react/usePhoneAuth.js +1 -16
  44. package/dist/esm/adapters/vanilla/client.js +0 -1
  45. package/dist/esm/adapters/vanilla/index.js +0 -1
  46. package/dist/esm/adapters/vanilla/phone-auth.d.ts +0 -24
  47. package/dist/esm/adapters/vanilla/phone-auth.js +0 -31
  48. package/dist/esm/adapters/vue/index.js +0 -4
  49. package/dist/esm/adapters/vue/useClient.js +0 -5
  50. package/dist/esm/adapters/vue/usePhoneAuth.js +1 -20
  51. package/dist/esm/browser.js +0 -6
  52. package/dist/esm/core/client.d.ts +0 -10
  53. package/dist/esm/core/client.js +0 -12
  54. package/dist/esm/core/logger.d.ts +0 -53
  55. package/dist/esm/core/logger.js +1 -81
  56. package/dist/esm/core/phone-auth/api-types.d.ts +0 -315
  57. package/dist/esm/core/phone-auth/api-types.js +0 -83
  58. package/dist/esm/core/phone-auth/client.d.ts +0 -144
  59. package/dist/esm/core/phone-auth/client.js +27 -366
  60. package/dist/esm/core/phone-auth/error-utils.d.ts +0 -29
  61. package/dist/esm/core/phone-auth/error-utils.js +1 -83
  62. package/dist/esm/core/phone-auth/index.js +1 -3
  63. package/dist/esm/core/phone-auth/status-types.d.ts +0 -78
  64. package/dist/esm/core/phone-auth/status-types.js +0 -17
  65. package/dist/esm/core/phone-auth/strategies/desktop.d.ts +0 -63
  66. package/dist/esm/core/phone-auth/strategies/desktop.js +8 -126
  67. package/dist/esm/core/phone-auth/strategies/index.d.ts +0 -4
  68. package/dist/esm/core/phone-auth/strategies/index.js +0 -4
  69. package/dist/esm/core/phone-auth/strategies/link.d.ts +0 -48
  70. package/dist/esm/core/phone-auth/strategies/link.js +10 -88
  71. package/dist/esm/core/phone-auth/strategies/ts43.d.ts +0 -19
  72. package/dist/esm/core/phone-auth/strategies/ts43.js +2 -33
  73. package/dist/esm/core/phone-auth/strategies/types.d.ts +0 -13
  74. package/dist/esm/core/phone-auth/strategies/types.js +0 -4
  75. package/dist/esm/core/phone-auth/type-guards.d.ts +0 -128
  76. package/dist/esm/core/phone-auth/type-guards.js +0 -131
  77. package/dist/esm/core/phone-auth/types.d.ts +0 -108
  78. package/dist/esm/core/phone-auth/types.js +0 -32
  79. package/dist/esm/core/phone-auth/ui/mobile-debug-console.d.ts +0 -4
  80. package/dist/esm/core/phone-auth/ui/mobile-debug-console.js +2 -28
  81. package/dist/esm/core/phone-auth/ui/modal.d.ts +27 -68
  82. package/dist/esm/core/phone-auth/ui/modal.js +889 -422
  83. package/dist/esm/core/phone-auth/validation-utils.d.ts +0 -31
  84. package/dist/esm/core/phone-auth/validation-utils.js +2 -40
  85. package/dist/esm/core/types.d.ts +0 -35
  86. package/dist/esm/core/version.js +1 -2
  87. package/dist/esm/index.js +1 -9
  88. package/dist/index.js +0 -7
  89. package/package.json +1 -1
package/README.md CHANGED
@@ -14,9 +14,19 @@ The official web SDK for integrating Glide's carrier-grade phone verification in
14
14
  - 🛡️ **Type Safe**: Full TypeScript support with type guards and IntelliSense
15
15
  - 🎯 **Developer Friendly**: Clear error messages and browser compatibility checks
16
16
 
17
- ## What's New in v4.4
18
-
19
- ### 🎉 Enhanced Control & Better DX
17
+ ## What's New in v5.0
18
+
19
+ ### 🎨 Redesigned Modal UI
20
+ - **Glass Morphism Design**: Modern frosted glass aesthetic with blur effects
21
+ - **Multiple View Modes**: Choose between `toggle`, `dual`, or `pre-step` layouts
22
+ - **Theme Support**: `dark`, `light`, or `auto` (follows system preference)
23
+ - **OS Icons**: Apple and Android icons in toggle and dual mode
24
+ - **Smooth Animations**: Fade-in/scale transitions and sliding toggle switch
25
+ - **Help Interaction**: Expandable help panel with smooth slide-out animation
26
+ - **Body Scroll Lock**: Background page no longer scrolls when modal is open
27
+ - **Improved Accessibility**: Keyboard support (Escape to close), proper ARIA labels
28
+
29
+ ### 🎉 Enhanced Control & Better DX (v4.4)
20
30
  - **Extended Mode**: More control with `executionMode: 'extended'` for granular authentication flow
21
31
  - **Prevent Default UI**: Use `preventDefaultUI: true` to disable all SDK modals
22
32
  - **Type Guards**: Helper functions for type-safe result handling
@@ -31,6 +41,7 @@ The official web SDK for integrating Glide's carrier-grade phone verification in
31
41
  - [Installation](#installation)
32
42
  - [Development](#development)
33
43
  - [Quick Start](#quick-start)
44
+ - [Modal Customization](#modal-customization)
34
45
  - [Extended Mode - Advanced Control](#extended-mode---advanced-control)
35
46
  - [Authentication Strategies](#authentication-strategies)
36
47
  - [Framework Examples](#framework-examples)
@@ -146,6 +157,84 @@ function PhoneVerification() {
146
157
  }
147
158
  ```
148
159
 
160
+ ## Modal Customization
161
+
162
+ The SDK provides a built-in modal for QR code display with extensive customization options.
163
+
164
+ ### View Modes
165
+
166
+ Choose how the QR code is displayed to users:
167
+
168
+ | Mode | Description | Best For |
169
+ |------|-------------|----------|
170
+ | `toggle` | Single QR with iOS/Android sliding toggle switch | Default, clean UI |
171
+ | `dual` | Side-by-side QR codes for both platforms | When users might not know their OS |
172
+ | `pre-step` | OS selection screen before showing QR | Guided experience |
173
+
174
+ ```javascript
175
+ const credential = await phoneAuth.invokeSecurePrompt(prepareResult, {
176
+ modalOptions: {
177
+ viewMode: 'dual' // 'toggle' | 'dual' | 'pre-step'
178
+ }
179
+ });
180
+ ```
181
+
182
+ ### Theme Options
183
+
184
+ Control the modal's appearance:
185
+
186
+ ```javascript
187
+ const credential = await phoneAuth.invokeSecurePrompt(prepareResult, {
188
+ modalOptions: {
189
+ theme: 'auto', // 'dark' | 'light' | 'auto' (follows system preference)
190
+ title: 'Scan to Verify',
191
+ showCloseButton: true,
192
+ closeOnBackdrop: true,
193
+ closeOnEscape: true
194
+ }
195
+ });
196
+ ```
197
+
198
+ ### Full Modal Options
199
+
200
+ ```typescript
201
+ modalOptions: {
202
+ // View mode
203
+ viewMode?: 'toggle' | 'dual' | 'pre-step'; // Default: 'toggle'
204
+
205
+ // Theme
206
+ theme?: 'dark' | 'light' | 'auto'; // Default: 'auto'
207
+
208
+ // Content
209
+ title?: string; // Modal title
210
+
211
+ // Behavior
212
+ showCloseButton?: boolean; // Show X button (default: true)
213
+ closeOnBackdrop?: boolean; // Close when clicking outside (default: true)
214
+ closeOnEscape?: boolean; // Close on Escape key (default: true)
215
+
216
+ // Styling
217
+ className?: string; // Custom CSS class for modal
218
+ }
219
+ ```
220
+
221
+ ### View Mode Examples
222
+
223
+ **Toggle Mode** (default) - Clean single QR with platform switcher:
224
+ ```javascript
225
+ modalOptions: { viewMode: 'toggle' }
226
+ ```
227
+
228
+ **Dual Mode** - Both QR codes visible at once:
229
+ ```javascript
230
+ modalOptions: { viewMode: 'dual' }
231
+ ```
232
+
233
+ **Pre-step Mode** - User selects platform first:
234
+ ```javascript
235
+ modalOptions: { viewMode: 'pre-step' }
236
+ ```
237
+
149
238
  ## Extended Mode - Advanced Control
150
239
 
151
240
  The SDK supports an **Extended Mode** that provides granular control over the authentication flow. This mode returns an `ExtendedResponse` object with additional methods and data for custom implementations.
@@ -576,11 +665,22 @@ interface InvokeOptions {
576
665
 
577
666
  // UI customization (when preventDefaultUI is false)
578
667
  modalOptions?: {
579
- className?: string;
580
- title?: string;
581
- description?: string;
582
- buttonText?: string;
583
- showCloseButton?: boolean;
668
+ // View mode
669
+ viewMode?: 'toggle' | 'dual' | 'pre-step'; // Default: 'toggle'
670
+
671
+ // Theme
672
+ theme?: 'dark' | 'light' | 'auto'; // Default: 'auto' (system preference)
673
+
674
+ // Content
675
+ title?: string; // Modal title text
676
+
677
+ // Behavior
678
+ showCloseButton?: boolean; // Show X button (default: true)
679
+ closeOnBackdrop?: boolean; // Close on backdrop click (default: true)
680
+ closeOnEscape?: boolean; // Close on Escape key (default: true)
681
+
682
+ // Styling
683
+ className?: string; // Custom CSS class
584
684
  };
585
685
 
586
686
  // Callbacks
@@ -5,7 +5,6 @@ var client_service_1 = require("./client.service");
5
5
  Object.defineProperty(exports, "ClientService", { enumerable: true, get: function () { return client_service_1.ClientService; } });
6
6
  var phone_auth_service_1 = require("./phone-auth.service");
7
7
  Object.defineProperty(exports, "PhoneAuthService", { enumerable: true, get: function () { return phone_auth_service_1.PhoneAuthService; } });
8
- // Export error utilities
9
8
  var phone_auth_1 = require("../../core/phone-auth");
10
9
  Object.defineProperty(exports, "PhoneAuthErrorCode", { enumerable: true, get: function () { return phone_auth_1.PhoneAuthErrorCode; } });
11
10
  Object.defineProperty(exports, "isPhoneAuthError", { enumerable: true, get: function () { return phone_auth_1.isPhoneAuthError; } });
@@ -11,28 +11,10 @@ export declare class PhoneAuthService {
11
11
  result$: Observable<PhoneAuthResult | null>;
12
12
  currentStep$: Observable<AuthStep>;
13
13
  constructor();
14
- /**
15
- * Configure the phone auth client
16
- */
17
14
  configure(config: AuthConfig): void;
18
- /**
19
- * Check if browser supports secure phone authentication
20
- */
21
15
  isSupported(): boolean;
22
- /**
23
- * Verify phone number
24
- */
25
16
  verify(options: PhoneAuthOptions): Promise<PhoneAuthResult>;
26
- /**
27
- * Get phone number
28
- */
29
17
  getPhoneNumber(options?: Omit<PhoneAuthOptions, 'use_case' | 'phone_number'>): Promise<PhoneAuthResult>;
30
- /**
31
- * Verify specific phone number
32
- */
33
18
  verifyPhoneNumber(phoneNumber: string, options?: Omit<PhoneAuthOptions, 'use_case' | 'phone_number'>): Promise<PhoneAuthResult>;
34
- /**
35
- * Reset state
36
- */
37
19
  reset(): void;
38
20
  }
@@ -24,33 +24,22 @@ const phone_auth_1 = require("../../core/phone-auth");
24
24
  const rxjs_1 = require("rxjs");
25
25
  let PhoneAuthService = class PhoneAuthService {
26
26
  constructor() {
27
- // State subjects
28
27
  this.isLoadingSubject = new rxjs_1.BehaviorSubject(false);
29
28
  this.errorSubject = new rxjs_1.BehaviorSubject(null);
30
29
  this.resultSubject = new rxjs_1.BehaviorSubject(null);
31
30
  this.currentStepSubject = new rxjs_1.BehaviorSubject('idle');
32
- // Public observables
33
31
  this.isLoading$ = this.isLoadingSubject.asObservable();
34
32
  this.error$ = this.errorSubject.asObservable();
35
33
  this.result$ = this.resultSubject.asObservable();
36
34
  this.currentStep$ = this.currentStepSubject.asObservable();
37
35
  this.client = new phone_auth_1.PhoneAuthClient();
38
36
  }
39
- /**
40
- * Configure the phone auth client
41
- */
42
37
  configure(config) {
43
38
  this.client = new phone_auth_1.PhoneAuthClient(config);
44
39
  }
45
- /**
46
- * Check if browser supports secure phone authentication
47
- */
48
40
  isSupported() {
49
41
  return this.client.isSupported();
50
42
  }
51
- /**
52
- * Verify phone number
53
- */
54
43
  verify(options) {
55
44
  return __awaiter(this, void 0, void 0, function* () {
56
45
  this.isLoadingSubject.next(true);
@@ -58,19 +47,14 @@ let PhoneAuthService = class PhoneAuthService {
58
47
  this.resultSubject.next(null);
59
48
  this.currentStepSubject.next('requesting');
60
49
  try {
61
- // Step 1: Prepare request
62
50
  const preparedRequest = yield this.client.preparePhoneRequest(options);
63
- // Step 2: Show authenticating state
64
51
  this.currentStepSubject.next('authenticating');
65
52
  const credentialResponse = yield this.client.invokeSecurePrompt(preparedRequest);
66
- // Step 3: Process response through appropriate endpoint
67
53
  this.currentStepSubject.next('processing');
68
- // Cast to credential type - adapters never use headless mode
69
54
  const credential = credentialResponse;
70
55
  const processedResult = options.use_case === 'GetPhoneNumber'
71
56
  ? yield this.client.getPhoneNumber(credential, preparedRequest.session)
72
57
  : yield this.client.verifyPhoneNumber(credential, preparedRequest.session);
73
- // Create final result
74
58
  const isVerifyResponse = 'verified' in processedResult;
75
59
  const result = processedResult;
76
60
  this.resultSubject.next(result);
@@ -78,7 +62,6 @@ let PhoneAuthService = class PhoneAuthService {
78
62
  return result;
79
63
  }
80
64
  catch (error) {
81
- // Enhance error with context
82
65
  const authError = error;
83
66
  const enhancedError = Object.assign(Object.assign({}, authError), { context: authError.context || {
84
67
  useCase: options.use_case,
@@ -95,25 +78,16 @@ let PhoneAuthService = class PhoneAuthService {
95
78
  }
96
79
  });
97
80
  }
98
- /**
99
- * Get phone number
100
- */
101
81
  getPhoneNumber(options) {
102
82
  return __awaiter(this, void 0, void 0, function* () {
103
83
  return this.verify(Object.assign({ use_case: 'GetPhoneNumber' }, options));
104
84
  });
105
85
  }
106
- /**
107
- * Verify specific phone number
108
- */
109
86
  verifyPhoneNumber(phoneNumber, options) {
110
87
  return __awaiter(this, void 0, void 0, function* () {
111
88
  return this.verify(Object.assign({ use_case: 'VerifyPhoneNumber', phone_number: phoneNumber }, options));
112
89
  });
113
90
  }
114
- /**
115
- * Reset state
116
- */
117
91
  reset() {
118
92
  this.isLoadingSubject.next(false);
119
93
  this.errorSubject.next(null);
@@ -5,7 +5,6 @@ var usePhoneAuth_1 = require("./usePhoneAuth");
5
5
  Object.defineProperty(exports, "usePhoneAuth", { enumerable: true, get: function () { return usePhoneAuth_1.usePhoneAuth; } });
6
6
  var useClient_1 = require("./useClient");
7
7
  Object.defineProperty(exports, "useClient", { enumerable: true, get: function () { return useClient_1.useClient; } });
8
- // Export error utilities
9
8
  var phone_auth_1 = require("../../core/phone-auth");
10
9
  Object.defineProperty(exports, "PhoneAuthErrorCode", { enumerable: true, get: function () { return phone_auth_1.PhoneAuthErrorCode; } });
11
10
  Object.defineProperty(exports, "isPhoneAuthError", { enumerable: true, get: function () { return phone_auth_1.isPhoneAuthError; } });
@@ -16,13 +15,11 @@ Object.defineProperty(exports, "getRetryDelay", { enumerable: true, get: functio
16
15
  Object.defineProperty(exports, "isRetryableError", { enumerable: true, get: function () { return phone_auth_1.isRetryableError; } });
17
16
  Object.defineProperty(exports, "serializeError", { enumerable: true, get: function () { return phone_auth_1.serializeError; } });
18
17
  Object.defineProperty(exports, "createErrorBreadcrumb", { enumerable: true, get: function () { return phone_auth_1.createErrorBreadcrumb; } });
19
- // Export constants for use case and strategy
20
18
  var types_1 = require("../../core/phone-auth/types");
21
19
  Object.defineProperty(exports, "UseCase", { enumerable: true, get: function () { return types_1.USE_CASE; } });
22
20
  Object.defineProperty(exports, "AuthenticationStrategy", { enumerable: true, get: function () { return types_1.AUTHENTICATION_STRATEGY; } });
23
21
  Object.defineProperty(exports, "BrowserError", { enumerable: true, get: function () { return types_1.BrowserError; } });
24
22
  Object.defineProperty(exports, "BrowserErrorCode", { enumerable: true, get: function () { return types_1.BrowserErrorCode; } });
25
23
  Object.defineProperty(exports, "BrowserName", { enumerable: true, get: function () { return types_1.BrowserName; } });
26
- // Export the PhoneAuthClient class for direct use
27
24
  var phone_auth_2 = require("../../core/phone-auth");
28
25
  Object.defineProperty(exports, "PhoneAuthClient", { enumerable: true, get: function () { return phone_auth_2.PhoneAuthClient; } });
@@ -31,7 +31,6 @@ function useClient(config) {
31
31
  };
32
32
  }, []);
33
33
  const authenticate = (authUrl, options) => __awaiter(this, void 0, void 0, function* () {
34
- // Legacy authentication removed - use setToken directly
35
34
  const error = new Error('authenticate method is deprecated. Use client.setToken() directly.');
36
35
  setError(error);
37
36
  setLoading(false);
@@ -18,13 +18,8 @@ function usePhoneAuth(config = {}) {
18
18
  const [result, setResult] = (0, react_1.useState)(null);
19
19
  const [currentStep, setCurrentStep] = (0, react_1.useState)('idle');
20
20
  const lastRequestRef = (0, react_1.useRef)(null);
21
- // Create client instance with callbacks
22
- const client = (0, react_1.useMemo)(() => new phone_auth_1.PhoneAuthClient(Object.assign(Object.assign({}, config), {
23
- // Pass through callbacks if provided
24
- onCrossDeviceDetected: config.onCrossDeviceDetected, onRetryAttempt: config.onRetryAttempt })), [JSON.stringify(config)]);
25
- // Check browser support
21
+ const client = (0, react_1.useMemo)(() => new phone_auth_1.PhoneAuthClient(Object.assign(Object.assign({}, config), { onCrossDeviceDetected: config.onCrossDeviceDetected, onRetryAttempt: config.onRetryAttempt })), [JSON.stringify(config)]);
26
22
  const isSupported = (0, react_1.useMemo)(() => client.isSupported(), [client]);
27
- // Verify method with silent retry support
28
23
  const verify = (0, react_1.useCallback)((options) => __awaiter(this, void 0, void 0, function* () {
29
24
  setIsLoading(true);
30
25
  setError(null);
@@ -32,14 +27,12 @@ function usePhoneAuth(config = {}) {
32
27
  setCurrentStep('requesting');
33
28
  lastRequestRef.current = options;
34
29
  try {
35
- // Use the client's verify method which includes retry logic
36
30
  const verificationResult = yield client.verify(options);
37
31
  setResult(verificationResult);
38
32
  setCurrentStep('complete');
39
33
  return verificationResult;
40
34
  }
41
35
  catch (err) {
42
- // Error is only set after all retries are exhausted
43
36
  const authError = err;
44
37
  setError(authError);
45
38
  setCurrentStep('idle');
@@ -49,47 +42,39 @@ function usePhoneAuth(config = {}) {
49
42
  setIsLoading(false);
50
43
  }
51
44
  }), [client]);
52
- // Manual retry method
53
45
  const retryLastRequest = (0, react_1.useCallback)(() => __awaiter(this, void 0, void 0, function* () {
54
46
  if (!lastRequestRef.current) {
55
47
  throw new Error('No previous request to retry');
56
48
  }
57
49
  return verify(lastRequestRef.current);
58
50
  }), [verify]);
59
- // Convenience methods
60
51
  const getPhoneNumber = (0, react_1.useCallback)((options) => verify(Object.assign({ use_case: 'GetPhoneNumber' }, options)), [verify]);
61
52
  const verifyPhoneNumber = (0, react_1.useCallback)((phoneNumber, options) => verify(Object.assign({ use_case: 'VerifyPhoneNumber', phone_number: phoneNumber }, options)), [verify]);
62
- // Reset state
63
53
  const reset = (0, react_1.useCallback)(() => {
64
54
  setIsLoading(false);
65
55
  setError(null);
66
56
  setResult(null);
67
57
  setCurrentStep('idle');
68
58
  }, []);
69
- // Expose granular methods directly from client for better discoverability
70
59
  const preparePhoneRequest = (0, react_1.useCallback)((options) => client.preparePhoneRequest(options), [client]);
71
60
  const invokeSecurePrompt = (0, react_1.useCallback)((prepareResponse) => client.invokeSecurePrompt(prepareResponse), [client]);
72
61
  const getPhoneNumberCredential = (0, react_1.useCallback)((credentialResponse, session) => client.getPhoneNumber(credentialResponse, session), [client]);
73
62
  const verifyPhoneNumberCredential = (0, react_1.useCallback)((credentialResponse, session) => client.verifyPhoneNumber(credentialResponse, session), [client]);
74
63
  return {
75
- // State
76
64
  isLoading,
77
65
  error,
78
66
  result,
79
67
  currentStep,
80
68
  isSupported,
81
- // High-level methods
82
69
  verify,
83
70
  getPhoneNumber,
84
71
  verifyPhoneNumber,
85
72
  retryLastRequest,
86
73
  reset,
87
- // Granular methods (directly exposed for better discoverability)
88
74
  preparePhoneRequest,
89
75
  invokeSecurePrompt,
90
76
  getPhoneNumberCredential,
91
77
  verifyPhoneNumberCredential,
92
- // Client instance (still available for advanced usage)
93
78
  client
94
79
  };
95
80
  }
@@ -17,7 +17,6 @@ class VanillaClient {
17
17
  }
18
18
  authenticate(authUrl, options) {
19
19
  return __awaiter(this, void 0, void 0, function* () {
20
- // Legacy authentication removed - use setToken directly
21
20
  throw new Error('authenticate method is deprecated. Use client.setToken() directly.');
22
21
  });
23
22
  }
@@ -5,7 +5,6 @@ var client_1 = require("./client");
5
5
  Object.defineProperty(exports, "ClientManager", { enumerable: true, get: function () { return client_1.VanillaClient; } });
6
6
  var phone_auth_1 = require("./phone-auth");
7
7
  Object.defineProperty(exports, "PhoneAuthManager", { enumerable: true, get: function () { return phone_auth_1.PhoneAuthManager; } });
8
- // Export error utilities
9
8
  var phone_auth_2 = require("../../core/phone-auth");
10
9
  Object.defineProperty(exports, "PhoneAuthErrorCode", { enumerable: true, get: function () { return phone_auth_2.PhoneAuthErrorCode; } });
11
10
  Object.defineProperty(exports, "isPhoneAuthError", { enumerable: true, get: function () { return phone_auth_2.isPhoneAuthError; } });
@@ -23,18 +23,11 @@ class PhoneAuthManager {
23
23
  isSupported: this.client.isSupported()
24
24
  };
25
25
  }
26
- /**
27
- * Get current state
28
- */
29
26
  getState() {
30
27
  return Object.assign({}, this.state);
31
28
  }
32
- /**
33
- * Subscribe to state changes
34
- */
35
29
  subscribe(listener) {
36
30
  this.listeners.push(listener);
37
- // Return unsubscribe function
38
31
  return () => {
39
32
  const index = this.listeners.indexOf(listener);
40
33
  if (index !== -1) {
@@ -42,16 +35,10 @@ class PhoneAuthManager {
42
35
  }
43
36
  };
44
37
  }
45
- /**
46
- * Update state and notify listeners
47
- */
48
38
  updateState(updates) {
49
39
  this.state = Object.assign(Object.assign({}, this.state), updates);
50
40
  this.listeners.forEach(listener => listener(this.getState()));
51
41
  }
52
- /**
53
- * Verify phone number
54
- */
55
42
  verify(options) {
56
43
  return __awaiter(this, void 0, void 0, function* () {
57
44
  this.updateState({
@@ -61,19 +48,14 @@ class PhoneAuthManager {
61
48
  currentStep: 'requesting'
62
49
  });
63
50
  try {
64
- // Step 1: Prepare request
65
51
  const preparedRequest = yield this.client.preparePhoneRequest(options);
66
- // Step 2: Show authenticating state
67
52
  this.updateState({ currentStep: 'authenticating' });
68
53
  const credentialResponse = yield this.client.invokeSecurePrompt(preparedRequest);
69
- // Step 3: Process response through appropriate endpoint
70
54
  this.updateState({ currentStep: 'processing' });
71
- // Cast to credential type - adapters never use headless mode
72
55
  const credential = credentialResponse;
73
56
  const processedResult = options.use_case === 'GetPhoneNumber'
74
57
  ? yield this.client.getPhoneNumber(credential, preparedRequest.session)
75
58
  : yield this.client.verifyPhoneNumber(credential, preparedRequest.session);
76
- // Create final result
77
59
  const isVerifyResponse = 'verified' in processedResult;
78
60
  const result = processedResult;
79
61
  this.updateState({
@@ -84,7 +66,6 @@ class PhoneAuthManager {
84
66
  return result;
85
67
  }
86
68
  catch (error) {
87
- // Enhance error with context
88
69
  const authError = error;
89
70
  const enhancedError = Object.assign(Object.assign({}, authError), { context: authError.context || {
90
71
  useCase: options.use_case,
@@ -101,25 +82,16 @@ class PhoneAuthManager {
101
82
  }
102
83
  });
103
84
  }
104
- /**
105
- * Get phone number
106
- */
107
85
  getPhoneNumber(options) {
108
86
  return __awaiter(this, void 0, void 0, function* () {
109
87
  return this.verify(Object.assign({ use_case: 'GetPhoneNumber' }, options));
110
88
  });
111
89
  }
112
- /**
113
- * Verify specific phone number
114
- */
115
90
  verifyPhoneNumber(phoneNumber, options) {
116
91
  return __awaiter(this, void 0, void 0, function* () {
117
92
  return this.verify(Object.assign({ use_case: 'VerifyPhoneNumber', phone_number: phoneNumber }, options));
118
93
  });
119
94
  }
120
- /**
121
- * Reset state
122
- */
123
95
  reset() {
124
96
  this.updateState({
125
97
  isLoading: false,
@@ -128,9 +100,6 @@ class PhoneAuthManager {
128
100
  currentStep: 'idle'
129
101
  });
130
102
  }
131
- /**
132
- * Check if browser supports secure phone authentication
133
- */
134
103
  isSupported() {
135
104
  return this.state.isSupported;
136
105
  }
@@ -9,8 +9,6 @@ var client_1 = require("../../core/client");
9
9
  Object.defineProperty(exports, "SDKClient", { enumerable: true, get: function () { return client_1.SDKClient; } });
10
10
  var phone_auth_1 = require("../../core/phone-auth");
11
11
  Object.defineProperty(exports, "PhoneAuthClient", { enumerable: true, get: function () { return phone_auth_1.PhoneAuthClient; } });
12
- // API response types are already exported via core/phone-auth/types
13
- // Export error utilities
14
12
  var phone_auth_2 = require("../../core/phone-auth");
15
13
  Object.defineProperty(exports, "PhoneAuthErrorCode", { enumerable: true, get: function () { return phone_auth_2.PhoneAuthErrorCode; } });
16
14
  Object.defineProperty(exports, "isPhoneAuthError", { enumerable: true, get: function () { return phone_auth_2.isPhoneAuthError; } });
@@ -21,14 +19,12 @@ Object.defineProperty(exports, "getRetryDelay", { enumerable: true, get: functio
21
19
  Object.defineProperty(exports, "isRetryableError", { enumerable: true, get: function () { return phone_auth_2.isRetryableError; } });
22
20
  Object.defineProperty(exports, "serializeError", { enumerable: true, get: function () { return phone_auth_2.serializeError; } });
23
21
  Object.defineProperty(exports, "createErrorBreadcrumb", { enumerable: true, get: function () { return phone_auth_2.createErrorBreadcrumb; } });
24
- // Export constants for use case and strategy
25
22
  var types_1 = require("../../core/phone-auth/types");
26
23
  Object.defineProperty(exports, "UseCase", { enumerable: true, get: function () { return types_1.USE_CASE; } });
27
24
  Object.defineProperty(exports, "AuthenticationStrategy", { enumerable: true, get: function () { return types_1.AUTHENTICATION_STRATEGY; } });
28
25
  Object.defineProperty(exports, "BrowserError", { enumerable: true, get: function () { return types_1.BrowserError; } });
29
26
  Object.defineProperty(exports, "BrowserErrorCode", { enumerable: true, get: function () { return types_1.BrowserErrorCode; } });
30
27
  Object.defineProperty(exports, "BrowserName", { enumerable: true, get: function () { return types_1.BrowserName; } });
31
- // Export API constants from api-types
32
28
  var api_types_1 = require("../../core/phone-auth/api-types");
33
29
  Object.defineProperty(exports, "USE_CASE", { enumerable: true, get: function () { return api_types_1.USE_CASE; } });
34
30
  Object.defineProperty(exports, "ERROR_CODE", { enumerable: true, get: function () { return api_types_1.ERROR_CODE; } });
@@ -44,17 +44,14 @@ function useClient(config) {
44
44
  const authenticate = (authUrl) => __awaiter(this, void 0, void 0, function* () {
45
45
  loading.value = true;
46
46
  error.value = null;
47
- // Clean up previous authentication if exists
48
47
  if (cleanup) {
49
48
  cleanup();
50
49
  cleanup = null;
51
50
  }
52
- // Legacy authentication removed - use setToken directly
53
51
  error.value = new Error('authenticate method is deprecated. Use client.setToken() directly.');
54
52
  loading.value = false;
55
53
  throw error.value;
56
54
  });
57
- // Cleanup on component unmount
58
55
  (0, vue_1.onUnmounted)(() => {
59
56
  if (cleanup) {
60
57
  cleanup();
@@ -107,7 +104,6 @@ function useClient(config) {
107
104
  loading.value = false;
108
105
  }
109
106
  });
110
- // Low-level methods for advanced control
111
107
  const preparePhoneRequest = (options) => __awaiter(this, void 0, void 0, function* () {
112
108
  return client.value.phoneAuth.preparePhoneRequest(options);
113
109
  });
@@ -121,7 +117,6 @@ function useClient(config) {
121
117
  isSupported,
122
118
  getPhoneNumber,
123
119
  verifyPhoneNumber,
124
- // Low-level API for advanced usage
125
120
  preparePhoneRequest,
126
121
  invokeSecurePrompt
127
122
  };
@@ -13,43 +13,31 @@ exports.usePhoneAuth = usePhoneAuth;
13
13
  const vue_1 = require("vue");
14
14
  const phone_auth_1 = require("../../core/phone-auth");
15
15
  function usePhoneAuth(config = {}) {
16
- // State management
17
16
  const isLoading = (0, vue_1.ref)(false);
18
17
  const error = (0, vue_1.ref)(null);
19
18
  const result = (0, vue_1.ref)(null);
20
19
  const currentStep = (0, vue_1.ref)('idle');
21
- // Create client instance with callbacks
22
- const client = new phone_auth_1.PhoneAuthClient(Object.assign(Object.assign({}, config), {
23
- // Callbacks are now properly typed through AuthConfig
24
- onCrossDeviceDetected: config.onCrossDeviceDetected, onRetryAttempt: config.onRetryAttempt }));
25
- // Check browser support
20
+ const client = new phone_auth_1.PhoneAuthClient(Object.assign(Object.assign({}, config), { onCrossDeviceDetected: config.onCrossDeviceDetected, onRetryAttempt: config.onRetryAttempt }));
26
21
  const isSupported = (0, vue_1.computed)(() => client.isSupported());
27
- // Verify method - internal wrapper that converts to API format
28
22
  const verify = (options) => __awaiter(this, void 0, void 0, function* () {
29
23
  isLoading.value = true;
30
24
  error.value = null;
31
25
  result.value = null;
32
26
  currentStep.value = 'requesting';
33
27
  try {
34
- // Step 1: Prepare the request
35
28
  const preparedRequest = yield client.preparePhoneRequest(options);
36
- // Step 2: User authentication
37
29
  currentStep.value = 'authenticating';
38
30
  const credentialResponse = yield client.invokeSecurePrompt(preparedRequest);
39
- // Step 3: Process the response through appropriate endpoint
40
31
  currentStep.value = 'processing';
41
- // Cast to credential type - adapters never use headless mode
42
32
  const credential = credentialResponse;
43
33
  const verificationResult = options.use_case === 'GetPhoneNumber'
44
34
  ? yield client.getPhoneNumber(credential, preparedRequest.session)
45
35
  : yield client.verifyPhoneNumber(credential, preparedRequest.session);
46
- // Use the result directly - it's already the correct type
47
36
  result.value = verificationResult;
48
37
  currentStep.value = 'complete';
49
38
  return result.value;
50
39
  }
51
40
  catch (err) {
52
- // Enhance error with context if it's an AuthError
53
41
  const authError = err;
54
42
  const enhancedError = Object.assign(Object.assign({}, authError), { context: authError.context || {
55
43
  useCase: options.use_case,
@@ -65,39 +53,32 @@ function usePhoneAuth(config = {}) {
65
53
  isLoading.value = false;
66
54
  }
67
55
  });
68
- // Convenience methods
69
56
  const getPhoneNumber = (options) => verify(Object.assign({ use_case: 'GetPhoneNumber' }, options));
70
57
  const verifyPhoneNumber = (phoneNumber, options) => verify(Object.assign({ use_case: 'VerifyPhoneNumber', phone_number: phoneNumber }, options));
71
- // Reset state
72
58
  const reset = () => {
73
59
  isLoading.value = false;
74
60
  error.value = null;
75
61
  result.value = null;
76
62
  currentStep.value = 'idle';
77
63
  };
78
- // Expose granular methods directly from client for better discoverability
79
64
  const preparePhoneRequest = client.preparePhoneRequest.bind(client);
80
65
  const invokeSecurePrompt = client.invokeSecurePrompt.bind(client);
81
66
  const getPhoneNumberCredential = client.getPhoneNumber.bind(client);
82
67
  const verifyPhoneNumberCredential = client.verifyPhoneNumber.bind(client);
83
68
  return {
84
- // State (readonly)
85
69
  isLoading: (0, vue_1.readonly)(isLoading),
86
70
  error: (0, vue_1.readonly)(error),
87
71
  result: (0, vue_1.readonly)(result),
88
72
  currentStep: (0, vue_1.readonly)(currentStep),
89
73
  isSupported: (0, vue_1.readonly)(isSupported),
90
- // High-level methods
91
74
  verify,
92
75
  getPhoneNumber,
93
76
  verifyPhoneNumber,
94
77
  reset,
95
- // Granular methods (directly exposed for better discoverability)
96
78
  preparePhoneRequest,
97
79
  invokeSecurePrompt,
98
80
  getPhoneNumberCredential,
99
81
  verifyPhoneNumberCredential,
100
- // Client instance (still available for advanced usage)
101
82
  client
102
83
  };
103
84
  }