@ozura/elements 1.3.1-next.73 → 1.3.1-next.75
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 +45 -5
- package/dist/oz-elements.esm.js.map +1 -1
- package/dist/oz-elements.umd.js +45 -5
- package/dist/oz-elements.umd.js.map +1 -1
- package/dist/react/index.cjs.js +69 -9
- package/dist/react/index.cjs.js.map +1 -1
- package/dist/react/index.esm.js +69 -10
- package/dist/react/index.esm.js.map +1 -1
- package/dist/react/react/index.d.ts +20 -2
- package/dist/react/sdk/OzVault.d.ts +20 -1
- package/dist/react/types/index.d.ts +15 -0
- package/dist/react/vue/index.d.ts +20 -2
- package/dist/server/sdk/OzVault.d.ts +20 -1
- package/dist/server/types/index.d.ts +15 -0
- package/dist/server/vue/index.d.ts +20 -2
- package/dist/types/sdk/OzVault.d.ts +20 -1
- package/dist/types/types/index.d.ts +15 -0
- package/dist/types/vue/index.d.ts +20 -2
- package/dist/vue/index.cjs.js +74 -7
- package/dist/vue/index.cjs.js.map +1 -1
- package/dist/vue/index.esm.js +74 -8
- package/dist/vue/index.esm.js.map +1 -1
- package/dist/vue/sdk/OzVault.d.ts +20 -1
- package/dist/vue/types/index.d.ts +15 -0
- package/dist/vue/vue/index.d.ts +20 -2
- package/package.json +1 -1
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
* ```
|
|
46
46
|
*/
|
|
47
47
|
import React from 'react';
|
|
48
|
-
import type { ElementOptions, ElementChangeEvent, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, FontSource, Appearance } from '../types';
|
|
48
|
+
import type { ElementOptions, ElementChangeEvent, TokenizeOptions, TokenResponse, BankTokenizeOptions, BankTokenResponse, FontSource, Appearance, FieldStatesSnapshot } from '../types';
|
|
49
49
|
export interface OzElementsProps {
|
|
50
50
|
/** System pub key for the tokenize endpoint. Obtain from Ozura admin.
|
|
51
51
|
*
|
|
@@ -235,6 +235,12 @@ export interface UseOzElementsReturn {
|
|
|
235
235
|
* <button disabled={!ready || !isComplete} onClick={() => createToken()}>Pay</button>
|
|
236
236
|
*/
|
|
237
237
|
isComplete: boolean;
|
|
238
|
+
/**
|
|
239
|
+
* Like `isComplete`, but for bank-account fields (`OzBankCard` /
|
|
240
|
+
* `createBankElement`). Card and bank completion are tracked independently, so
|
|
241
|
+
* a card-only form isn't gated on bank fields and vice versa.
|
|
242
|
+
*/
|
|
243
|
+
isBankComplete: boolean;
|
|
238
244
|
/**
|
|
239
245
|
* `true` while `createToken()` or `createBankToken()` is in progress,
|
|
240
246
|
* including the transparent wax-key refresh phase. Use this to keep the
|
|
@@ -251,6 +257,18 @@ export interface UseOzElementsReturn {
|
|
|
251
257
|
* an `<OzElements>` provider tree.
|
|
252
258
|
*/
|
|
253
259
|
export declare function useOzElements(): UseOzElementsReturn;
|
|
260
|
+
/**
|
|
261
|
+
* Reactive snapshot of every created field's state, keyed by element type
|
|
262
|
+
* (e.g. `cardNumber`, `cvv`, `accountNumber`). Each entry is
|
|
263
|
+
* `{ empty, complete, valid, error?, cardBrand? }`. Recomputes whenever any
|
|
264
|
+
* field fires a change event. Must be called inside an `<OzElements>` provider;
|
|
265
|
+
* returns `{}` otherwise.
|
|
266
|
+
*
|
|
267
|
+
* @example
|
|
268
|
+
* const states = useFieldStates();
|
|
269
|
+
* if (states.cvv?.error) showCvvError(states.cvv.error);
|
|
270
|
+
*/
|
|
271
|
+
export declare function useFieldStates(): FieldStatesSnapshot;
|
|
254
272
|
export interface OzFieldProps {
|
|
255
273
|
/** CSS-in-JS style object applied to the inner input. */
|
|
256
274
|
style?: ElementOptions['style'];
|
|
@@ -437,6 +455,6 @@ export interface OzBankCardProps {
|
|
|
437
455
|
* individually instead.
|
|
438
456
|
*/
|
|
439
457
|
export declare function OzBankCard({ style, styles, classNames, labels, labelStyle, labelClassName, gap, hideErrors, errorStyle, errorClassName, renderError, onChange, onReady, onFocus, onBlur, disabled, className, placeholders, }: OzBankCardProps): import("react/jsx-runtime").JSX.Element;
|
|
440
|
-
export type { ElementChangeEvent, TokenizeOptions, TokenResponse, CardMetadata, BankTokenizeOptions, BankTokenResponse, BankAccountMetadata, BankElementType, Appearance, AppearanceVariables, OzTheme } from '../types';
|
|
458
|
+
export type { ElementChangeEvent, TokenizeOptions, TokenResponse, CardMetadata, BankTokenizeOptions, BankTokenResponse, BankAccountMetadata, BankElementType, Appearance, AppearanceVariables, OzTheme, FieldState, FieldStatesSnapshot } from '../types';
|
|
441
459
|
export type { OzErrorCode } from '../sdk/errors';
|
|
442
460
|
export { createSessionFetcher, createFetchWaxKey } from '../sdk';
|
|
@@ -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;
|
|
@@ -121,6 +122,24 @@ export declare class OzVault {
|
|
|
121
122
|
* });
|
|
122
123
|
*/
|
|
123
124
|
get isComplete(): boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Like {@link isComplete}, but for bank-account elements created via
|
|
127
|
+
* {@link createBankElement}. Card and bank fields are tracked separately so a
|
|
128
|
+
* card-only checkout is never gated on bank fields (and vice versa), matching
|
|
129
|
+
* the `createToken()` / `createBankToken()` split. A vault with both card and
|
|
130
|
+
* bank elements exposes each completion state independently.
|
|
131
|
+
*/
|
|
132
|
+
get isBankComplete(): boolean;
|
|
133
|
+
/** True iff the set is non-empty and every element has reported complete-and-valid. */
|
|
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;
|
|
124
143
|
/**
|
|
125
144
|
* `true` while a `createToken()` or `createBankToken()` call is in progress
|
|
126
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. */
|
|
@@ -229,6 +229,12 @@ export interface UseOzElementsReturn {
|
|
|
229
229
|
* // <button :disabled="!ready || !isComplete" @click="createToken()">Pay</button>
|
|
230
230
|
*/
|
|
231
231
|
isComplete: ComputedRef<boolean>;
|
|
232
|
+
/**
|
|
233
|
+
* Like `isComplete`, but for bank-account fields (`createBankElement`). Card
|
|
234
|
+
* and bank completion are tracked independently, so a card-only form isn't
|
|
235
|
+
* gated on bank fields and vice versa.
|
|
236
|
+
*/
|
|
237
|
+
isBankComplete: ComputedRef<boolean>;
|
|
232
238
|
/**
|
|
233
239
|
* `true` while `createToken()` or `createBankToken()` is in progress,
|
|
234
240
|
* including the transparent wax-key refresh phase. Use this to keep the
|
|
@@ -247,6 +253,18 @@ export interface UseOzElementsReturn {
|
|
|
247
253
|
* @throws {Error} if called outside an <OzElements> provider
|
|
248
254
|
*/
|
|
249
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>;
|
|
250
268
|
/** Props accepted by all individual field components (OzCardNumber, OzExpiry, OzCvv, etc.). */
|
|
251
269
|
export interface OzFieldProps {
|
|
252
270
|
placeholder?: string;
|
|
@@ -353,4 +371,4 @@ export declare const OzBankRoutingNumber: import("vue").DefineComponent<{
|
|
|
353
371
|
placeholder: string;
|
|
354
372
|
disabled: boolean;
|
|
355
373
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
356
|
-
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;
|
|
@@ -121,6 +122,24 @@ export declare class OzVault {
|
|
|
121
122
|
* });
|
|
122
123
|
*/
|
|
123
124
|
get isComplete(): boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Like {@link isComplete}, but for bank-account elements created via
|
|
127
|
+
* {@link createBankElement}. Card and bank fields are tracked separately so a
|
|
128
|
+
* card-only checkout is never gated on bank fields (and vice versa), matching
|
|
129
|
+
* the `createToken()` / `createBankToken()` split. A vault with both card and
|
|
130
|
+
* bank elements exposes each completion state independently.
|
|
131
|
+
*/
|
|
132
|
+
get isBankComplete(): boolean;
|
|
133
|
+
/** True iff the set is non-empty and every element has reported complete-and-valid. */
|
|
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;
|
|
124
143
|
/**
|
|
125
144
|
* `true` while a `createToken()` or `createBankToken()` call is in progress
|
|
126
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. */
|
|
@@ -229,6 +229,12 @@ export interface UseOzElementsReturn {
|
|
|
229
229
|
* // <button :disabled="!ready || !isComplete" @click="createToken()">Pay</button>
|
|
230
230
|
*/
|
|
231
231
|
isComplete: ComputedRef<boolean>;
|
|
232
|
+
/**
|
|
233
|
+
* Like `isComplete`, but for bank-account fields (`createBankElement`). Card
|
|
234
|
+
* and bank completion are tracked independently, so a card-only form isn't
|
|
235
|
+
* gated on bank fields and vice versa.
|
|
236
|
+
*/
|
|
237
|
+
isBankComplete: ComputedRef<boolean>;
|
|
232
238
|
/**
|
|
233
239
|
* `true` while `createToken()` or `createBankToken()` is in progress,
|
|
234
240
|
* including the transparent wax-key refresh phase. Use this to keep the
|
|
@@ -247,6 +253,18 @@ export interface UseOzElementsReturn {
|
|
|
247
253
|
* @throws {Error} if called outside an <OzElements> provider
|
|
248
254
|
*/
|
|
249
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>;
|
|
250
268
|
/** Props accepted by all individual field components (OzCardNumber, OzExpiry, OzCvv, etc.). */
|
|
251
269
|
export interface OzFieldProps {
|
|
252
270
|
placeholder?: string;
|
|
@@ -353,4 +371,4 @@ export declare const OzBankRoutingNumber: import("vue").DefineComponent<{
|
|
|
353
371
|
placeholder: string;
|
|
354
372
|
disabled: boolean;
|
|
355
373
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
356
|
-
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;
|
|
@@ -121,6 +122,24 @@ export declare class OzVault {
|
|
|
121
122
|
* });
|
|
122
123
|
*/
|
|
123
124
|
get isComplete(): boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Like {@link isComplete}, but for bank-account elements created via
|
|
127
|
+
* {@link createBankElement}. Card and bank fields are tracked separately so a
|
|
128
|
+
* card-only checkout is never gated on bank fields (and vice versa), matching
|
|
129
|
+
* the `createToken()` / `createBankToken()` split. A vault with both card and
|
|
130
|
+
* bank elements exposes each completion state independently.
|
|
131
|
+
*/
|
|
132
|
+
get isBankComplete(): boolean;
|
|
133
|
+
/** True iff the set is non-empty and every element has reported complete-and-valid. */
|
|
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;
|
|
124
143
|
/**
|
|
125
144
|
* `true` while a `createToken()` or `createBankToken()` call is in progress
|
|
126
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. */
|
|
@@ -229,6 +229,12 @@ export interface UseOzElementsReturn {
|
|
|
229
229
|
* // <button :disabled="!ready || !isComplete" @click="createToken()">Pay</button>
|
|
230
230
|
*/
|
|
231
231
|
isComplete: ComputedRef<boolean>;
|
|
232
|
+
/**
|
|
233
|
+
* Like `isComplete`, but for bank-account fields (`createBankElement`). Card
|
|
234
|
+
* and bank completion are tracked independently, so a card-only form isn't
|
|
235
|
+
* gated on bank fields and vice versa.
|
|
236
|
+
*/
|
|
237
|
+
isBankComplete: ComputedRef<boolean>;
|
|
232
238
|
/**
|
|
233
239
|
* `true` while `createToken()` or `createBankToken()` is in progress,
|
|
234
240
|
* including the transparent wax-key refresh phase. Use this to keep the
|
|
@@ -247,6 +253,18 @@ export interface UseOzElementsReturn {
|
|
|
247
253
|
* @throws {Error} if called outside an <OzElements> provider
|
|
248
254
|
*/
|
|
249
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>;
|
|
250
268
|
/** Props accepted by all individual field components (OzCardNumber, OzExpiry, OzCvv, etc.). */
|
|
251
269
|
export interface OzFieldProps {
|
|
252
270
|
placeholder?: string;
|
|
@@ -353,4 +371,4 @@ export declare const OzBankRoutingNumber: import("vue").DefineComponent<{
|
|
|
353
371
|
placeholder: string;
|
|
354
372
|
disabled: boolean;
|
|
355
373
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
356
|
-
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;
|
|
@@ -1263,13 +1265,41 @@ class OzVault {
|
|
|
1263
1265
|
* });
|
|
1264
1266
|
*/
|
|
1265
1267
|
get isComplete() {
|
|
1266
|
-
|
|
1268
|
+
return this.allComplete([...this.elementsByType.values()]);
|
|
1269
|
+
}
|
|
1270
|
+
/**
|
|
1271
|
+
* Like {@link isComplete}, but for bank-account elements created via
|
|
1272
|
+
* {@link createBankElement}. Card and bank fields are tracked separately so a
|
|
1273
|
+
* card-only checkout is never gated on bank fields (and vice versa), matching
|
|
1274
|
+
* the `createToken()` / `createBankToken()` split. A vault with both card and
|
|
1275
|
+
* bank elements exposes each completion state independently.
|
|
1276
|
+
*/
|
|
1277
|
+
get isBankComplete() {
|
|
1278
|
+
return this.allComplete([...this.bankElementsByType.values()]);
|
|
1279
|
+
}
|
|
1280
|
+
/** True iff the set is non-empty and every element has reported complete-and-valid. */
|
|
1281
|
+
allComplete(els) {
|
|
1282
|
+
if (els.length === 0)
|
|
1267
1283
|
return false;
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1284
|
+
return els.every(el => this.completionState.get(el.frameId) === true);
|
|
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 }));
|
|
1271
1301
|
}
|
|
1272
|
-
return
|
|
1302
|
+
return snapshot;
|
|
1273
1303
|
}
|
|
1274
1304
|
/**
|
|
1275
1305
|
* `true` while a `createToken()` or `createBankToken()` call is in progress
|
|
@@ -1323,6 +1353,7 @@ class OzVault {
|
|
|
1323
1353
|
if (existing) {
|
|
1324
1354
|
this.elements.delete(existing.frameId);
|
|
1325
1355
|
this.completionState.delete(existing.frameId);
|
|
1356
|
+
this.fieldStates.delete(existing.frameId);
|
|
1326
1357
|
existing.destroy();
|
|
1327
1358
|
}
|
|
1328
1359
|
const el = new OzElement(type, options, this.vaultId, this.frameBaseUrl, this.fonts, this.resolvedAppearance, () => {
|
|
@@ -1330,9 +1361,11 @@ class OzVault {
|
|
|
1330
1361
|
// don't grow unboundedly in SPA scenarios with repeated mount/unmount cycles.
|
|
1331
1362
|
this.elements.delete(el.frameId);
|
|
1332
1363
|
this.completionState.delete(el.frameId);
|
|
1364
|
+
this.fieldStates.delete(el.frameId);
|
|
1333
1365
|
}, this._debug);
|
|
1334
1366
|
this.elements.set(el.frameId, el);
|
|
1335
1367
|
typeMap.set(type, el);
|
|
1368
|
+
this.fieldStates.set(el.frameId, { empty: true, complete: false, valid: false });
|
|
1336
1369
|
return el;
|
|
1337
1370
|
}
|
|
1338
1371
|
/**
|
|
@@ -1632,6 +1665,10 @@ class OzVault {
|
|
|
1632
1665
|
for (const frameId of this.completionState.keys()) {
|
|
1633
1666
|
this.completionState.set(frameId, false);
|
|
1634
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
|
+
}
|
|
1635
1672
|
// NOTE: _tokenizeSuccessCount is intentionally NOT reset.
|
|
1636
1673
|
// It reflects real server-side wax key budget consumption. Zeroing it
|
|
1637
1674
|
// would desync the proactive refresh logic from the vault's state and
|
|
@@ -1679,6 +1716,7 @@ class OzVault {
|
|
|
1679
1716
|
this.elementsByType.clear();
|
|
1680
1717
|
this.bankElementsByType.clear();
|
|
1681
1718
|
this.completionState.clear();
|
|
1719
|
+
this.fieldStates.clear();
|
|
1682
1720
|
this._tokenizeSuccessCount = 0;
|
|
1683
1721
|
(_a = this.tokenizerFrame) === null || _a === void 0 ? void 0 : _a.remove();
|
|
1684
1722
|
this.tokenizerFrame = null;
|
|
@@ -1883,6 +1921,8 @@ class OzVault {
|
|
|
1883
1921
|
const valid = msg.valid;
|
|
1884
1922
|
const wasComplete = (_a = this.completionState.get(el.frameId)) !== null && _a !== void 0 ? _a : false;
|
|
1885
1923
|
this.completionState.set(el.frameId, complete && valid);
|
|
1924
|
+
this.fieldStates.set(el.frameId, Object.assign(Object.assign({ empty: msg.empty, complete,
|
|
1925
|
+
valid }, (typeof msg.error === 'string' ? { error: msg.error } : {})), (typeof msg.cardBrand === 'string' ? { cardBrand: msg.cardBrand } : {})));
|
|
1886
1926
|
// Require valid too — avoids advancing at 13 digits for unknown-brand cards
|
|
1887
1927
|
// where isComplete() fires before the user has finished typing.
|
|
1888
1928
|
const justCompleted = complete && valid && !wasComplete;
|
|
@@ -2461,13 +2501,39 @@ function useOzElements() {
|
|
|
2461
2501
|
notifyChange();
|
|
2462
2502
|
}
|
|
2463
2503
|
};
|
|
2464
|
-
const reset = () => {
|
|
2504
|
+
const reset = () => {
|
|
2505
|
+
var _a;
|
|
2506
|
+
(_a = vault.value) === null || _a === void 0 ? void 0 : _a.reset();
|
|
2507
|
+
// reset() clears completion state and cancels any in-flight tokenization;
|
|
2508
|
+
// bump changeTick so the derived computeds below recompute.
|
|
2509
|
+
notifyChange();
|
|
2510
|
+
};
|
|
2465
2511
|
// `void changeTick.value` registers a reactive dependency so these recompute when
|
|
2466
2512
|
// notifyChange() fires (field change / tokenize start-stop). vault.isComplete and
|
|
2467
2513
|
// vault.isTokenizing read non-reactive internal Maps/flags that Vue cannot track.
|
|
2468
2514
|
const isComplete = vue.computed(() => { var _a, _b; void changeTick.value; return (_b = (_a = vault.value) === null || _a === void 0 ? void 0 : _a.isComplete) !== null && _b !== void 0 ? _b : false; });
|
|
2515
|
+
const isBankComplete = vue.computed(() => { var _a, _b; void changeTick.value; return (_b = (_a = vault.value) === null || _a === void 0 ? void 0 : _a.isBankComplete) !== null && _b !== void 0 ? _b : false; });
|
|
2469
2516
|
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; });
|
|
2470
|
-
return { createToken, createBankToken, ready, initError, tokenizeCount, reset, isComplete, isTokenizing };
|
|
2517
|
+
return { createToken, createBankToken, ready, initError, tokenizeCount, reset, isComplete, isBankComplete, isTokenizing };
|
|
2518
|
+
}
|
|
2519
|
+
/**
|
|
2520
|
+
* Reactive snapshot of every created field's state, keyed by element type
|
|
2521
|
+
* (e.g. `cardNumber`, `cvv`, `accountNumber`). Each entry is
|
|
2522
|
+
* `{ empty, complete, valid, error?, cardBrand? }`. Recomputes whenever any
|
|
2523
|
+
* field fires a change event.
|
|
2524
|
+
*
|
|
2525
|
+
* @throws if called outside an `<OzElements>` provider tree.
|
|
2526
|
+
* @example
|
|
2527
|
+
* const fields = useFieldStates();
|
|
2528
|
+
* // fields.value.cvv?.error
|
|
2529
|
+
*/
|
|
2530
|
+
function useFieldStates() {
|
|
2531
|
+
const ctx = vue.inject(OZ_KEY);
|
|
2532
|
+
if (!ctx) {
|
|
2533
|
+
throw new Error('[OzVault] useFieldStates() must be called inside an <OzElements> provider');
|
|
2534
|
+
}
|
|
2535
|
+
const { vault, changeTick } = ctx;
|
|
2536
|
+
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 : {}; });
|
|
2471
2537
|
}
|
|
2472
2538
|
function createFieldComponent(displayName, mountElement) {
|
|
2473
2539
|
return vue.defineComponent({
|
|
@@ -2535,5 +2601,6 @@ exports.OzCardNumber = OzCardNumber;
|
|
|
2535
2601
|
exports.OzCvv = OzCvv;
|
|
2536
2602
|
exports.OzElements = OzElements;
|
|
2537
2603
|
exports.OzExpiry = OzExpiry;
|
|
2604
|
+
exports.useFieldStates = useFieldStates;
|
|
2538
2605
|
exports.useOzElements = useOzElements;
|
|
2539
2606
|
//# sourceMappingURL=index.cjs.js.map
|