@ozura/elements 1.3.1-next.74 → 1.3.1-next.76
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/dist/oz-elements.esm.js +38 -0
- package/dist/oz-elements.esm.js.map +1 -1
- package/dist/oz-elements.umd.js +38 -0
- package/dist/oz-elements.umd.js.map +1 -1
- package/dist/react/index.cjs.js +54 -0
- package/dist/react/index.cjs.js.map +1 -1
- package/dist/react/index.esm.js +54 -1
- package/dist/react/index.esm.js.map +1 -1
- package/dist/react/react/index.d.ts +14 -2
- package/dist/react/sdk/OzVault.d.ts +10 -1
- package/dist/react/types/index.d.ts +15 -0
- package/dist/react/vue/index.d.ts +14 -2
- package/dist/server/sdk/OzVault.d.ts +10 -1
- package/dist/server/types/index.d.ts +15 -0
- package/dist/server/vue/index.d.ts +14 -2
- package/dist/types/sdk/OzVault.d.ts +10 -1
- package/dist/types/types/index.d.ts +15 -0
- package/dist/types/vue/index.d.ts +14 -2
- package/dist/vue/index.cjs.js +58 -0
- package/dist/vue/index.cjs.js.map +1 -1
- package/dist/vue/index.esm.js +58 -1
- package/dist/vue/index.esm.js.map +1 -1
- package/dist/vue/sdk/OzVault.d.ts +10 -1
- package/dist/vue/types/index.d.ts +15 -0
- package/dist/vue/vue/index.d.ts +14 -2
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OzElement } from './OzElement';
|
|
2
|
-
import { ElementType, BankElementType, ElementOptions, VaultOptions, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse } from '../types';
|
|
2
|
+
import { ElementType, BankElementType, ElementOptions, VaultOptions, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, FieldStatesSnapshot } from '../types';
|
|
3
3
|
/**
|
|
4
4
|
* The main entry point for OzElements. Creates and manages iframe-based
|
|
5
5
|
* card input elements that keep raw card data isolated from the merchant page.
|
|
@@ -33,6 +33,7 @@ export declare class OzVault {
|
|
|
33
33
|
private tokenizeResolvers;
|
|
34
34
|
private bankTokenizeResolvers;
|
|
35
35
|
private completionState;
|
|
36
|
+
private fieldStates;
|
|
36
37
|
private tokenizerFrame;
|
|
37
38
|
private tokenizerWindow;
|
|
38
39
|
private tokenizerReady;
|
|
@@ -131,6 +132,14 @@ export declare class OzVault {
|
|
|
131
132
|
get isBankComplete(): boolean;
|
|
132
133
|
/** True iff the set is non-empty and every element has reported complete-and-valid. */
|
|
133
134
|
private allComplete;
|
|
135
|
+
/**
|
|
136
|
+
* Snapshot of every created field's latest state, keyed by element type.
|
|
137
|
+
* Card and bank fields are combined (their type keys never collide). Useful for
|
|
138
|
+
* gating UI, rendering per-field errors, or showing the card brand without
|
|
139
|
+
* wiring an onChange listener per element. Returns shallow copies so callers
|
|
140
|
+
* cannot mutate the vault's internal state.
|
|
141
|
+
*/
|
|
142
|
+
getFieldStates(): FieldStatesSnapshot;
|
|
134
143
|
/**
|
|
135
144
|
* `true` while a `createToken()` or `createBankToken()` call is in progress
|
|
136
145
|
* (including the transparent wax-key refresh phase). Use this to keep the pay
|
|
@@ -92,6 +92,21 @@ export interface ElementChangeEvent {
|
|
|
92
92
|
/** Human-readable error when valid is false and the field has been touched */
|
|
93
93
|
error?: string;
|
|
94
94
|
}
|
|
95
|
+
export interface FieldState {
|
|
96
|
+
empty: boolean;
|
|
97
|
+
complete: boolean;
|
|
98
|
+
valid: boolean;
|
|
99
|
+
/** Present when valid is false and the field has been touched. */
|
|
100
|
+
error?: string;
|
|
101
|
+
/** Card brand — cardNumber field only. */
|
|
102
|
+
cardBrand?: string;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Snapshot of every created field's latest state, keyed by element type. Only
|
|
106
|
+
* fields that have been created are present; each is present from creation,
|
|
107
|
+
* starting at { empty:true, complete:false, valid:false } until first change.
|
|
108
|
+
*/
|
|
109
|
+
export type FieldStatesSnapshot = Partial<Record<ElementType | BankElementType, FieldState>>;
|
|
95
110
|
export type ElementType = 'cardNumber' | 'cvv' | 'expirationDate';
|
|
96
111
|
/** Bank account element types. */
|
|
97
112
|
export type BankElementType = 'accountNumber' | 'routingNumber';
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* ```
|
|
25
25
|
*/
|
|
26
26
|
import { type Ref, type PropType, type ComputedRef } from 'vue';
|
|
27
|
-
import type { ElementOptions, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, FontSource, Appearance } from '../types';
|
|
27
|
+
import type { ElementOptions, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, FontSource, Appearance, FieldStatesSnapshot } from '../types';
|
|
28
28
|
export interface OzElementsProps {
|
|
29
29
|
/** Omit when using a test vault key from a Test project at ozuravault.com.
|
|
30
30
|
* Required for production vault keys. */
|
|
@@ -253,6 +253,18 @@ export interface UseOzElementsReturn {
|
|
|
253
253
|
* @throws {Error} if called outside an <OzElements> provider
|
|
254
254
|
*/
|
|
255
255
|
export declare function useOzElements(): UseOzElementsReturn;
|
|
256
|
+
/**
|
|
257
|
+
* Reactive snapshot of every created field's state, keyed by element type
|
|
258
|
+
* (e.g. `cardNumber`, `cvv`, `accountNumber`). Each entry is
|
|
259
|
+
* `{ empty, complete, valid, error?, cardBrand? }`. Recomputes whenever any
|
|
260
|
+
* field fires a change event.
|
|
261
|
+
*
|
|
262
|
+
* @throws if called outside an `<OzElements>` provider tree.
|
|
263
|
+
* @example
|
|
264
|
+
* const fields = useFieldStates();
|
|
265
|
+
* // fields.value.cvv?.error
|
|
266
|
+
*/
|
|
267
|
+
export declare function useFieldStates(): ComputedRef<FieldStatesSnapshot>;
|
|
256
268
|
/** Props accepted by all individual field components (OzCardNumber, OzExpiry, OzCvv, etc.). */
|
|
257
269
|
export interface OzFieldProps {
|
|
258
270
|
placeholder?: string;
|
|
@@ -359,4 +371,4 @@ export declare const OzBankRoutingNumber: import("vue").DefineComponent<{
|
|
|
359
371
|
placeholder: string;
|
|
360
372
|
disabled: boolean;
|
|
361
373
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
362
|
-
export type { ElementChangeEvent, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, Appearance, FontSource, } from '../types';
|
|
374
|
+
export type { ElementChangeEvent, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, Appearance, FontSource, FieldState, FieldStatesSnapshot, } from '../types';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OzElement } from './OzElement';
|
|
2
|
-
import { ElementType, BankElementType, ElementOptions, VaultOptions, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse } from '../types';
|
|
2
|
+
import { ElementType, BankElementType, ElementOptions, VaultOptions, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, FieldStatesSnapshot } from '../types';
|
|
3
3
|
/**
|
|
4
4
|
* The main entry point for OzElements. Creates and manages iframe-based
|
|
5
5
|
* card input elements that keep raw card data isolated from the merchant page.
|
|
@@ -33,6 +33,7 @@ export declare class OzVault {
|
|
|
33
33
|
private tokenizeResolvers;
|
|
34
34
|
private bankTokenizeResolvers;
|
|
35
35
|
private completionState;
|
|
36
|
+
private fieldStates;
|
|
36
37
|
private tokenizerFrame;
|
|
37
38
|
private tokenizerWindow;
|
|
38
39
|
private tokenizerReady;
|
|
@@ -131,6 +132,14 @@ export declare class OzVault {
|
|
|
131
132
|
get isBankComplete(): boolean;
|
|
132
133
|
/** True iff the set is non-empty and every element has reported complete-and-valid. */
|
|
133
134
|
private allComplete;
|
|
135
|
+
/**
|
|
136
|
+
* Snapshot of every created field's latest state, keyed by element type.
|
|
137
|
+
* Card and bank fields are combined (their type keys never collide). Useful for
|
|
138
|
+
* gating UI, rendering per-field errors, or showing the card brand without
|
|
139
|
+
* wiring an onChange listener per element. Returns shallow copies so callers
|
|
140
|
+
* cannot mutate the vault's internal state.
|
|
141
|
+
*/
|
|
142
|
+
getFieldStates(): FieldStatesSnapshot;
|
|
134
143
|
/**
|
|
135
144
|
* `true` while a `createToken()` or `createBankToken()` call is in progress
|
|
136
145
|
* (including the transparent wax-key refresh phase). Use this to keep the pay
|
|
@@ -92,6 +92,21 @@ export interface ElementChangeEvent {
|
|
|
92
92
|
/** Human-readable error when valid is false and the field has been touched */
|
|
93
93
|
error?: string;
|
|
94
94
|
}
|
|
95
|
+
export interface FieldState {
|
|
96
|
+
empty: boolean;
|
|
97
|
+
complete: boolean;
|
|
98
|
+
valid: boolean;
|
|
99
|
+
/** Present when valid is false and the field has been touched. */
|
|
100
|
+
error?: string;
|
|
101
|
+
/** Card brand — cardNumber field only. */
|
|
102
|
+
cardBrand?: string;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Snapshot of every created field's latest state, keyed by element type. Only
|
|
106
|
+
* fields that have been created are present; each is present from creation,
|
|
107
|
+
* starting at { empty:true, complete:false, valid:false } until first change.
|
|
108
|
+
*/
|
|
109
|
+
export type FieldStatesSnapshot = Partial<Record<ElementType | BankElementType, FieldState>>;
|
|
95
110
|
export type ElementType = 'cardNumber' | 'cvv' | 'expirationDate';
|
|
96
111
|
/** Bank account element types. */
|
|
97
112
|
export type BankElementType = 'accountNumber' | 'routingNumber';
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* ```
|
|
25
25
|
*/
|
|
26
26
|
import { type Ref, type PropType, type ComputedRef } from 'vue';
|
|
27
|
-
import type { ElementOptions, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, FontSource, Appearance } from '../types';
|
|
27
|
+
import type { ElementOptions, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, FontSource, Appearance, FieldStatesSnapshot } from '../types';
|
|
28
28
|
export interface OzElementsProps {
|
|
29
29
|
/** Omit when using a test vault key from a Test project at ozuravault.com.
|
|
30
30
|
* Required for production vault keys. */
|
|
@@ -253,6 +253,18 @@ export interface UseOzElementsReturn {
|
|
|
253
253
|
* @throws {Error} if called outside an <OzElements> provider
|
|
254
254
|
*/
|
|
255
255
|
export declare function useOzElements(): UseOzElementsReturn;
|
|
256
|
+
/**
|
|
257
|
+
* Reactive snapshot of every created field's state, keyed by element type
|
|
258
|
+
* (e.g. `cardNumber`, `cvv`, `accountNumber`). Each entry is
|
|
259
|
+
* `{ empty, complete, valid, error?, cardBrand? }`. Recomputes whenever any
|
|
260
|
+
* field fires a change event.
|
|
261
|
+
*
|
|
262
|
+
* @throws if called outside an `<OzElements>` provider tree.
|
|
263
|
+
* @example
|
|
264
|
+
* const fields = useFieldStates();
|
|
265
|
+
* // fields.value.cvv?.error
|
|
266
|
+
*/
|
|
267
|
+
export declare function useFieldStates(): ComputedRef<FieldStatesSnapshot>;
|
|
256
268
|
/** Props accepted by all individual field components (OzCardNumber, OzExpiry, OzCvv, etc.). */
|
|
257
269
|
export interface OzFieldProps {
|
|
258
270
|
placeholder?: string;
|
|
@@ -359,4 +371,4 @@ export declare const OzBankRoutingNumber: import("vue").DefineComponent<{
|
|
|
359
371
|
placeholder: string;
|
|
360
372
|
disabled: boolean;
|
|
361
373
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
362
|
-
export type { ElementChangeEvent, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, Appearance, FontSource, } from '../types';
|
|
374
|
+
export type { ElementChangeEvent, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, Appearance, FontSource, FieldState, FieldStatesSnapshot, } from '../types';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OzElement } from './OzElement';
|
|
2
|
-
import { ElementType, BankElementType, ElementOptions, VaultOptions, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse } from '../types';
|
|
2
|
+
import { ElementType, BankElementType, ElementOptions, VaultOptions, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, FieldStatesSnapshot } from '../types';
|
|
3
3
|
/**
|
|
4
4
|
* The main entry point for OzElements. Creates and manages iframe-based
|
|
5
5
|
* card input elements that keep raw card data isolated from the merchant page.
|
|
@@ -33,6 +33,7 @@ export declare class OzVault {
|
|
|
33
33
|
private tokenizeResolvers;
|
|
34
34
|
private bankTokenizeResolvers;
|
|
35
35
|
private completionState;
|
|
36
|
+
private fieldStates;
|
|
36
37
|
private tokenizerFrame;
|
|
37
38
|
private tokenizerWindow;
|
|
38
39
|
private tokenizerReady;
|
|
@@ -131,6 +132,14 @@ export declare class OzVault {
|
|
|
131
132
|
get isBankComplete(): boolean;
|
|
132
133
|
/** True iff the set is non-empty and every element has reported complete-and-valid. */
|
|
133
134
|
private allComplete;
|
|
135
|
+
/**
|
|
136
|
+
* Snapshot of every created field's latest state, keyed by element type.
|
|
137
|
+
* Card and bank fields are combined (their type keys never collide). Useful for
|
|
138
|
+
* gating UI, rendering per-field errors, or showing the card brand without
|
|
139
|
+
* wiring an onChange listener per element. Returns shallow copies so callers
|
|
140
|
+
* cannot mutate the vault's internal state.
|
|
141
|
+
*/
|
|
142
|
+
getFieldStates(): FieldStatesSnapshot;
|
|
134
143
|
/**
|
|
135
144
|
* `true` while a `createToken()` or `createBankToken()` call is in progress
|
|
136
145
|
* (including the transparent wax-key refresh phase). Use this to keep the pay
|
|
@@ -92,6 +92,21 @@ export interface ElementChangeEvent {
|
|
|
92
92
|
/** Human-readable error when valid is false and the field has been touched */
|
|
93
93
|
error?: string;
|
|
94
94
|
}
|
|
95
|
+
export interface FieldState {
|
|
96
|
+
empty: boolean;
|
|
97
|
+
complete: boolean;
|
|
98
|
+
valid: boolean;
|
|
99
|
+
/** Present when valid is false and the field has been touched. */
|
|
100
|
+
error?: string;
|
|
101
|
+
/** Card brand — cardNumber field only. */
|
|
102
|
+
cardBrand?: string;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Snapshot of every created field's latest state, keyed by element type. Only
|
|
106
|
+
* fields that have been created are present; each is present from creation,
|
|
107
|
+
* starting at { empty:true, complete:false, valid:false } until first change.
|
|
108
|
+
*/
|
|
109
|
+
export type FieldStatesSnapshot = Partial<Record<ElementType | BankElementType, FieldState>>;
|
|
95
110
|
export type ElementType = 'cardNumber' | 'cvv' | 'expirationDate';
|
|
96
111
|
/** Bank account element types. */
|
|
97
112
|
export type BankElementType = 'accountNumber' | 'routingNumber';
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* ```
|
|
25
25
|
*/
|
|
26
26
|
import { type Ref, type PropType, type ComputedRef } from 'vue';
|
|
27
|
-
import type { ElementOptions, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, FontSource, Appearance } from '../types';
|
|
27
|
+
import type { ElementOptions, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, FontSource, Appearance, FieldStatesSnapshot } from '../types';
|
|
28
28
|
export interface OzElementsProps {
|
|
29
29
|
/** Omit when using a test vault key from a Test project at ozuravault.com.
|
|
30
30
|
* Required for production vault keys. */
|
|
@@ -253,6 +253,18 @@ export interface UseOzElementsReturn {
|
|
|
253
253
|
* @throws {Error} if called outside an <OzElements> provider
|
|
254
254
|
*/
|
|
255
255
|
export declare function useOzElements(): UseOzElementsReturn;
|
|
256
|
+
/**
|
|
257
|
+
* Reactive snapshot of every created field's state, keyed by element type
|
|
258
|
+
* (e.g. `cardNumber`, `cvv`, `accountNumber`). Each entry is
|
|
259
|
+
* `{ empty, complete, valid, error?, cardBrand? }`. Recomputes whenever any
|
|
260
|
+
* field fires a change event.
|
|
261
|
+
*
|
|
262
|
+
* @throws if called outside an `<OzElements>` provider tree.
|
|
263
|
+
* @example
|
|
264
|
+
* const fields = useFieldStates();
|
|
265
|
+
* // fields.value.cvv?.error
|
|
266
|
+
*/
|
|
267
|
+
export declare function useFieldStates(): ComputedRef<FieldStatesSnapshot>;
|
|
256
268
|
/** Props accepted by all individual field components (OzCardNumber, OzExpiry, OzCvv, etc.). */
|
|
257
269
|
export interface OzFieldProps {
|
|
258
270
|
placeholder?: string;
|
|
@@ -359,4 +371,4 @@ export declare const OzBankRoutingNumber: import("vue").DefineComponent<{
|
|
|
359
371
|
placeholder: string;
|
|
360
372
|
disabled: boolean;
|
|
361
373
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
362
|
-
export type { ElementChangeEvent, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, Appearance, FontSource, } from '../types';
|
|
374
|
+
export type { ElementChangeEvent, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, Appearance, FontSource, FieldState, FieldStatesSnapshot, } from '../types';
|
package/dist/vue/index.cjs.js
CHANGED
|
@@ -1066,6 +1066,8 @@ class OzVault {
|
|
|
1066
1066
|
this.bankTokenizeResolvers = new Map();
|
|
1067
1067
|
// Track completion state per element for auto-advance (only fire on transition)
|
|
1068
1068
|
this.completionState = new Map();
|
|
1069
|
+
// Latest per-field state for getFieldStates(), keyed by frameId.
|
|
1070
|
+
this.fieldStates = new Map();
|
|
1069
1071
|
this.tokenizerFrame = null;
|
|
1070
1072
|
this.tokenizerWindow = null;
|
|
1071
1073
|
this.tokenizerReady = false;
|
|
@@ -1281,6 +1283,24 @@ class OzVault {
|
|
|
1281
1283
|
return false;
|
|
1282
1284
|
return els.every(el => this.completionState.get(el.frameId) === true);
|
|
1283
1285
|
}
|
|
1286
|
+
/**
|
|
1287
|
+
* Snapshot of every created field's latest state, keyed by element type.
|
|
1288
|
+
* Card and bank fields are combined (their type keys never collide). Useful for
|
|
1289
|
+
* gating UI, rendering per-field errors, or showing the card brand without
|
|
1290
|
+
* wiring an onChange listener per element. Returns shallow copies so callers
|
|
1291
|
+
* cannot mutate the vault's internal state.
|
|
1292
|
+
*/
|
|
1293
|
+
getFieldStates() {
|
|
1294
|
+
var _a, _b;
|
|
1295
|
+
const snapshot = {};
|
|
1296
|
+
for (const [type, el] of this.elementsByType) {
|
|
1297
|
+
snapshot[type] = Object.assign({}, ((_a = this.fieldStates.get(el.frameId)) !== null && _a !== void 0 ? _a : { empty: true, complete: false, valid: false }));
|
|
1298
|
+
}
|
|
1299
|
+
for (const [type, el] of this.bankElementsByType) {
|
|
1300
|
+
snapshot[type] = Object.assign({}, ((_b = this.fieldStates.get(el.frameId)) !== null && _b !== void 0 ? _b : { empty: true, complete: false, valid: false }));
|
|
1301
|
+
}
|
|
1302
|
+
return snapshot;
|
|
1303
|
+
}
|
|
1284
1304
|
/**
|
|
1285
1305
|
* `true` while a `createToken()` or `createBankToken()` call is in progress
|
|
1286
1306
|
* (including the transparent wax-key refresh phase). Use this to keep the pay
|
|
@@ -1333,6 +1353,7 @@ class OzVault {
|
|
|
1333
1353
|
if (existing) {
|
|
1334
1354
|
this.elements.delete(existing.frameId);
|
|
1335
1355
|
this.completionState.delete(existing.frameId);
|
|
1356
|
+
this.fieldStates.delete(existing.frameId);
|
|
1336
1357
|
existing.destroy();
|
|
1337
1358
|
}
|
|
1338
1359
|
const el = new OzElement(type, options, this.vaultId, this.frameBaseUrl, this.fonts, this.resolvedAppearance, () => {
|
|
@@ -1340,9 +1361,11 @@ class OzVault {
|
|
|
1340
1361
|
// don't grow unboundedly in SPA scenarios with repeated mount/unmount cycles.
|
|
1341
1362
|
this.elements.delete(el.frameId);
|
|
1342
1363
|
this.completionState.delete(el.frameId);
|
|
1364
|
+
this.fieldStates.delete(el.frameId);
|
|
1343
1365
|
}, this._debug);
|
|
1344
1366
|
this.elements.set(el.frameId, el);
|
|
1345
1367
|
typeMap.set(type, el);
|
|
1368
|
+
this.fieldStates.set(el.frameId, { empty: true, complete: false, valid: false });
|
|
1346
1369
|
return el;
|
|
1347
1370
|
}
|
|
1348
1371
|
/**
|
|
@@ -1642,6 +1665,10 @@ class OzVault {
|
|
|
1642
1665
|
for (const frameId of this.completionState.keys()) {
|
|
1643
1666
|
this.completionState.set(frameId, false);
|
|
1644
1667
|
}
|
|
1668
|
+
// Mirror for field states: every created field returns to its default.
|
|
1669
|
+
for (const frameId of this.fieldStates.keys()) {
|
|
1670
|
+
this.fieldStates.set(frameId, { empty: true, complete: false, valid: false });
|
|
1671
|
+
}
|
|
1645
1672
|
// NOTE: _tokenizeSuccessCount is intentionally NOT reset.
|
|
1646
1673
|
// It reflects real server-side wax key budget consumption. Zeroing it
|
|
1647
1674
|
// would desync the proactive refresh logic from the vault's state and
|
|
@@ -1689,6 +1716,7 @@ class OzVault {
|
|
|
1689
1716
|
this.elementsByType.clear();
|
|
1690
1717
|
this.bankElementsByType.clear();
|
|
1691
1718
|
this.completionState.clear();
|
|
1719
|
+
this.fieldStates.clear();
|
|
1692
1720
|
this._tokenizeSuccessCount = 0;
|
|
1693
1721
|
(_a = this.tokenizerFrame) === null || _a === void 0 ? void 0 : _a.remove();
|
|
1694
1722
|
this.tokenizerFrame = null;
|
|
@@ -1850,6 +1878,10 @@ class OzVault {
|
|
|
1850
1878
|
// the previous session and justCompleted never fires, breaking auto-advance.
|
|
1851
1879
|
if (msg.type === 'OZ_FRAME_READY') {
|
|
1852
1880
|
this.completionState.set(frameId, false);
|
|
1881
|
+
// Mirror the completion reset: a reloaded iframe starts empty, so the
|
|
1882
|
+
// field state must return to default rather than serving pre-reload data
|
|
1883
|
+
// (e.g. a stale card brand) until the next OZ_CHANGE arrives.
|
|
1884
|
+
this.fieldStates.set(frameId, { empty: true, complete: false, valid: false });
|
|
1853
1885
|
if (msg.__ozVersion !== PROTOCOL_VERSION) {
|
|
1854
1886
|
console.warn(`[OzVault] Protocol version mismatch on element frame "${frameId}" — ` +
|
|
1855
1887
|
`SDK expects v${PROTOCOL_VERSION}, frame reported v${typeof msg.__ozVersion === 'number' ? msg.__ozVersion : '(none)'}. ` +
|
|
@@ -1891,8 +1923,14 @@ class OzVault {
|
|
|
1891
1923
|
var _a, _b, _c;
|
|
1892
1924
|
const complete = msg.complete;
|
|
1893
1925
|
const valid = msg.valid;
|
|
1926
|
+
// Narrow rather than blind-cast: a malformed/legacy frame that omits `empty`
|
|
1927
|
+
// must not write `undefined` into the public FieldState contract.
|
|
1928
|
+
const empty = typeof msg.empty === 'boolean' ? msg.empty : true;
|
|
1894
1929
|
const wasComplete = (_a = this.completionState.get(el.frameId)) !== null && _a !== void 0 ? _a : false;
|
|
1895
1930
|
this.completionState.set(el.frameId, complete && valid);
|
|
1931
|
+
this.fieldStates.set(el.frameId, Object.assign(Object.assign({ empty,
|
|
1932
|
+
complete,
|
|
1933
|
+
valid }, (typeof msg.error === 'string' ? { error: msg.error } : {})), (typeof msg.cardBrand === 'string' ? { cardBrand: msg.cardBrand } : {})));
|
|
1896
1934
|
// Require valid too — avoids advancing at 13 digits for unknown-brand cards
|
|
1897
1935
|
// where isComplete() fires before the user has finished typing.
|
|
1898
1936
|
const justCompleted = complete && valid && !wasComplete;
|
|
@@ -2486,6 +2524,25 @@ function useOzElements() {
|
|
|
2486
2524
|
const isTokenizing = vue.computed(() => { var _a, _b; void changeTick.value; return (_b = (_a = vault.value) === null || _a === void 0 ? void 0 : _a.isTokenizing) !== null && _b !== void 0 ? _b : false; });
|
|
2487
2525
|
return { createToken, createBankToken, ready, initError, tokenizeCount, reset, isComplete, isBankComplete, isTokenizing };
|
|
2488
2526
|
}
|
|
2527
|
+
/**
|
|
2528
|
+
* Reactive snapshot of every created field's state, keyed by element type
|
|
2529
|
+
* (e.g. `cardNumber`, `cvv`, `accountNumber`). Each entry is
|
|
2530
|
+
* `{ empty, complete, valid, error?, cardBrand? }`. Recomputes whenever any
|
|
2531
|
+
* field fires a change event.
|
|
2532
|
+
*
|
|
2533
|
+
* @throws if called outside an `<OzElements>` provider tree.
|
|
2534
|
+
* @example
|
|
2535
|
+
* const fields = useFieldStates();
|
|
2536
|
+
* // fields.value.cvv?.error
|
|
2537
|
+
*/
|
|
2538
|
+
function useFieldStates() {
|
|
2539
|
+
const ctx = vue.inject(OZ_KEY);
|
|
2540
|
+
if (!ctx) {
|
|
2541
|
+
throw new Error('[OzVault] useFieldStates() must be called inside an <OzElements> provider');
|
|
2542
|
+
}
|
|
2543
|
+
const { vault, changeTick } = ctx;
|
|
2544
|
+
return vue.computed(() => { var _a, _b; void changeTick.value; return (_b = (_a = vault.value) === null || _a === void 0 ? void 0 : _a.getFieldStates()) !== null && _b !== void 0 ? _b : {}; });
|
|
2545
|
+
}
|
|
2489
2546
|
function createFieldComponent(displayName, mountElement) {
|
|
2490
2547
|
return vue.defineComponent({
|
|
2491
2548
|
name: displayName,
|
|
@@ -2552,5 +2609,6 @@ exports.OzCardNumber = OzCardNumber;
|
|
|
2552
2609
|
exports.OzCvv = OzCvv;
|
|
2553
2610
|
exports.OzElements = OzElements;
|
|
2554
2611
|
exports.OzExpiry = OzExpiry;
|
|
2612
|
+
exports.useFieldStates = useFieldStates;
|
|
2555
2613
|
exports.useOzElements = useOzElements;
|
|
2556
2614
|
//# sourceMappingURL=index.cjs.js.map
|