Skip to content

Commit 6738de5

Browse files
committed
refactor(davinci-client): introduce RichTextCollector to avoid breaking ReadOnlyCollector
ReadOnlyCollector now represents plain-text LABEL fields only. RichTextCollector is a new dedicated type for LABEL fields with richContent, so consumers can discriminate on collector.type without a breaking change to the existing ReadOnlyCollector output shape.
1 parent bde8c7e commit 6738de5

10 files changed

Lines changed: 271 additions & 71 deletions

File tree

e2e/davinci-app/components/label.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
* This software may be modified and distributed under the terms
55
* of the MIT license. See the LICENSE file for details.
66
*/
7-
import type { ReadOnlyCollector } from '@forgerock/davinci-client/types';
7+
import type { RichTextCollector } from '@forgerock/davinci-client/types';
88

9-
export default function (formEl: HTMLFormElement, collector: ReadOnlyCollector) {
9+
export default function (formEl: HTMLFormElement, collector: RichTextCollector) {
1010
const p = document.createElement('p');
1111
p.style.whiteSpace = 'pre-line';
1212
const { richContent } = collector.output;

packages/davinci-client/api-report/davinci-client.api.md

Lines changed: 77 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ export interface CollectorRichContent {
186186
}
187187

188188
// @public (undocumented)
189-
export type Collectors = FlowCollector | PasswordCollector | TextCollector | SingleSelectCollector | IdpCollector | SubmitCollector | ActionCollector<'ActionCollector'> | SingleValueCollector<'SingleValueCollector'> | MultiSelectCollector | DeviceAuthenticationCollector | DeviceRegistrationCollector | PhoneNumberCollector | ReadOnlyCollector | ValidatedTextCollector | ProtectCollector | PollingCollector | FidoRegistrationCollector | FidoAuthenticationCollector | QrCodeCollector | AgreementCollector | UnknownCollector;
189+
export type Collectors = FlowCollector | PasswordCollector | TextCollector | SingleSelectCollector | IdpCollector | SubmitCollector | ActionCollector<'ActionCollector'> | SingleValueCollector<'SingleValueCollector'> | MultiSelectCollector | DeviceAuthenticationCollector | DeviceRegistrationCollector | PhoneNumberCollector | PhoneNumberExtensionCollector | ReadOnlyCollector | RichTextCollector | ValidatedTextCollector | ProtectCollector | PollingCollector | FidoRegistrationCollector | FidoAuthenticationCollector | QrCodeCollector | AgreementCollector | UnknownCollector;
190190

191191
// @public
192192
export type CollectorValueType<T> = T extends {
@@ -220,7 +220,7 @@ export type CollectorValueType<T> = T extends {
220220
} ? string[] : string | string[] | PhoneNumberInputValue | FidoRegistrationInputValue | FidoAuthenticationInputValue;
221221

222222
// @public (undocumented)
223-
export type ComplexValueFields = DeviceAuthenticationField | DeviceRegistrationField | PhoneNumberField | FidoRegistrationField | FidoAuthenticationField | PollingField;
223+
export type ComplexValueFields = DeviceAuthenticationField | DeviceRegistrationField | PhoneNumberField | PhoneNumberExtensionField | FidoRegistrationField | FidoAuthenticationField | PollingField;
224224

225225
// @public (undocumented)
226226
export interface ContinueNode {
@@ -278,7 +278,7 @@ export function davinci<ActionType extends ActionTypes = ActionTypes>(input: {
278278
start: <QueryParams extends OutgoingQueryParams = OutgoingQueryParams>(options?: StartOptions<QueryParams> | undefined) => Promise<ContinueNode | ErrorNode | FailureNode | StartNode | SuccessNode>;
279279
update: <T extends SingleValueCollectors | MultiSelectCollector | ObjectValueCollectors | AutoCollectors>(collector: T) => Updater<T>;
280280
validate: (collector: SingleValueCollectors | ObjectValueCollectors | MultiValueCollectors | AutoCollectors) => Validator;
281-
poll: (collector: PollingCollector) => Poller;
281+
pollStatus: (collector: PollingCollector) => Poller;
282282
getClient: () => {
283283
action: string;
284284
collectors: Collectors[];
@@ -1037,13 +1037,13 @@ export type InferAutoCollectorType<T extends AutoCollectorTypes> = T extends 'Pr
10371037
export type InferMultiValueCollectorType<T extends MultiValueCollectorTypes> = T extends 'MultiSelectCollector' ? MultiValueCollectorWithValue<'MultiSelectCollector'> : MultiValueCollectorWithValue<'MultiValueCollector'> | MultiValueCollectorNoValue<'MultiValueCollector'>;
10381038

10391039
// @public
1040-
export type InferNoValueCollectorType<T extends NoValueCollectorTypes> = T extends 'ReadOnlyCollector' ? ReadOnlyCollector : T extends 'QrCodeCollector' ? QrCodeCollector : T extends 'AgreementCollector' ? AgreementCollector : NoValueCollectorBase<'NoValueCollector'>;
1040+
export type InferNoValueCollectorType<T extends NoValueCollectorTypes> = T extends 'ReadOnlyCollector' ? ReadOnlyCollector : T extends 'RichTextCollector' ? RichTextCollector : T extends 'QrCodeCollector' ? QrCodeCollector : T extends 'AgreementCollector' ? AgreementCollector : NoValueCollectorBase<'NoValueCollector'>;
10411041

10421042
// @public
10431043
export type InferSingleValueCollectorType<T extends SingleValueCollectorTypes> = T extends 'TextCollector' ? TextCollector : T extends 'SingleSelectCollector' ? SingleSelectCollector : T extends 'ValidatedTextCollector' ? ValidatedTextCollector : T extends 'PasswordCollector' ? PasswordCollector : SingleValueCollectorWithValue<'SingleValueCollector'> | SingleValueCollectorNoValue<'SingleValueCollector'>;
10441044

10451045
// @public (undocumented)
1046-
export type InferValueObjectCollectorType<T extends ObjectValueCollectorTypes> = T extends 'DeviceAuthenticationCollector' ? DeviceAuthenticationCollector : T extends 'DeviceRegistrationCollector' ? DeviceRegistrationCollector : T extends 'PhoneNumberCollector' ? PhoneNumberCollector : ObjectOptionsCollectorWithObjectValue<'ObjectValueCollector'> | ObjectOptionsCollectorWithStringValue<'ObjectValueCollector'>;
1046+
export type InferValueObjectCollectorType<T extends ObjectValueCollectorTypes> = T extends 'DeviceAuthenticationCollector' ? DeviceAuthenticationCollector : T extends 'DeviceRegistrationCollector' ? DeviceRegistrationCollector : T extends 'PhoneNumberCollector' ? PhoneNumberCollector : T extends 'PhoneNumberExtensionCollector' ? PhoneNumberExtensionCollector : ObjectOptionsCollectorWithObjectValue<'ObjectValueCollector'> | ObjectOptionsCollectorWithStringValue<'ObjectValueCollector'>;
10471047

10481048
// @public (undocumented)
10491049
export type InitFlow = () => Promise<FlowNode | InternalErrorResponse>;
@@ -1178,8 +1178,8 @@ value: Record<string, unknown>;
11781178
}, string>;
11791179

11801180
// @public
1181-
export const nodeCollectorReducer: Reducer<(TextCollector | SingleSelectCollector | ValidatedTextCollector | PasswordCollector | MultiSelectCollector | DeviceAuthenticationCollector | DeviceRegistrationCollector | PhoneNumberCollector | IdpCollector | SubmitCollector | FlowCollector | QrCodeCollector | ReadOnlyCollector | AgreementCollector | UnknownCollector | ProtectCollector | FidoRegistrationCollector | FidoAuthenticationCollector | PollingCollector | ActionCollector<"ActionCollector"> | SingleValueCollector<"SingleValueCollector">)[]> & {
1182-
getInitialState: () => (TextCollector | SingleSelectCollector | ValidatedTextCollector | PasswordCollector | MultiSelectCollector | DeviceAuthenticationCollector | DeviceRegistrationCollector | PhoneNumberCollector | IdpCollector | SubmitCollector | FlowCollector | QrCodeCollector | ReadOnlyCollector | AgreementCollector | UnknownCollector | ProtectCollector | FidoRegistrationCollector | FidoAuthenticationCollector | PollingCollector | ActionCollector<"ActionCollector"> | SingleValueCollector<"SingleValueCollector">)[];
1181+
export const nodeCollectorReducer: Reducer<(TextCollector | SingleSelectCollector | ValidatedTextCollector | PasswordCollector | MultiSelectCollector | PhoneNumberExtensionCollector | DeviceAuthenticationCollector | DeviceRegistrationCollector | PhoneNumberCollector | IdpCollector | SubmitCollector | FlowCollector | QrCodeCollector | ReadOnlyCollector | RichTextCollector | AgreementCollector | UnknownCollector | ProtectCollector | FidoRegistrationCollector | FidoAuthenticationCollector | PollingCollector | ActionCollector<"ActionCollector"> | SingleValueCollector<"SingleValueCollector">)[]> & {
1182+
getInitialState: () => (TextCollector | SingleSelectCollector | ValidatedTextCollector | PasswordCollector | MultiSelectCollector | PhoneNumberExtensionCollector | DeviceAuthenticationCollector | DeviceRegistrationCollector | PhoneNumberCollector | IdpCollector | SubmitCollector | FlowCollector | QrCodeCollector | ReadOnlyCollector | RichTextCollector | AgreementCollector | UnknownCollector | ProtectCollector | FidoRegistrationCollector | FidoAuthenticationCollector | PollingCollector | ActionCollector<"ActionCollector"> | SingleValueCollector<"SingleValueCollector">)[];
11831183
};
11841184

11851185
// @public (undocumented)
@@ -1209,10 +1209,10 @@ export interface NoValueCollectorBase<T extends NoValueCollectorTypes> {
12091209
}
12101210

12111211
// @public (undocumented)
1212-
export type NoValueCollectors = NoValueCollectorBase<'NoValueCollector'> | ReadOnlyCollector | QrCodeCollector | AgreementCollector;
1212+
export type NoValueCollectors = NoValueCollectorBase<'NoValueCollector'> | ReadOnlyCollector | RichTextCollector | QrCodeCollector | AgreementCollector;
12131213

12141214
// @public
1215-
export type NoValueCollectorTypes = 'ReadOnlyCollector' | 'NoValueCollector' | 'QrCodeCollector' | 'AgreementCollector';
1215+
export type NoValueCollectorTypes = 'ReadOnlyCollector' | 'RichTextCollector' | 'NoValueCollector' | 'QrCodeCollector' | 'AgreementCollector';
12161216

12171217
// @public
12181218
export interface OAuthDetails {
@@ -1291,10 +1291,10 @@ export type ObjectValueAutoCollectorTypes = 'ObjectValueAutoCollector' | 'FidoRe
12911291
export type ObjectValueCollector<T extends ObjectValueCollectorTypes> = ObjectOptionsCollectorWithObjectValue<T> | ObjectOptionsCollectorWithStringValue<T> | ObjectValueCollectorWithObjectValue<T>;
12921292

12931293
// @public (undocumented)
1294-
export type ObjectValueCollectors = DeviceAuthenticationCollector | DeviceRegistrationCollector | PhoneNumberCollector | ObjectOptionsCollectorWithObjectValue<'ObjectSelectCollector'> | ObjectOptionsCollectorWithStringValue<'ObjectSelectCollector'>;
1294+
export type ObjectValueCollectors = DeviceAuthenticationCollector | DeviceRegistrationCollector | PhoneNumberCollector | PhoneNumberExtensionCollector | ObjectOptionsCollectorWithObjectValue<'ObjectSelectCollector'> | ObjectOptionsCollectorWithStringValue<'ObjectSelectCollector'>;
12951295

12961296
// @public
1297-
export type ObjectValueCollectorTypes = 'DeviceAuthenticationCollector' | 'DeviceRegistrationCollector' | 'PhoneNumberCollector' | 'ObjectOptionsCollector' | 'ObjectValueCollector' | 'ObjectSelectCollector';
1297+
export type ObjectValueCollectorTypes = 'DeviceAuthenticationCollector' | 'DeviceRegistrationCollector' | 'PhoneNumberCollector' | 'PhoneNumberExtensionCollector' | 'ObjectOptionsCollector' | 'ObjectValueCollector' | 'ObjectSelectCollector';
12981298

12991299
// @public (undocumented)
13001300
export interface ObjectValueCollectorWithObjectValue<T extends ObjectValueCollectorTypes, IV = Record<string, string>, OV = Record<string, string>> {
@@ -1336,13 +1336,68 @@ export type PasswordCollector = SingleValueCollectorNoValue<'PasswordCollector'>
13361336
// @public (undocumented)
13371337
export type PhoneNumberCollector = ObjectValueCollectorWithObjectValue<'PhoneNumberCollector', PhoneNumberInputValue, PhoneNumberOutputValue>;
13381338

1339+
// @public (undocumented)
1340+
export interface PhoneNumberExtensionCollector {
1341+
// (undocumented)
1342+
category: 'ObjectValueCollector';
1343+
// (undocumented)
1344+
error: string | null;
1345+
// (undocumented)
1346+
id: string;
1347+
// (undocumented)
1348+
input: {
1349+
key: string;
1350+
value: PhoneNumberExtensionInputValue;
1351+
type: string;
1352+
validation: (ValidationRequired | ValidationPhoneNumber)[] | null;
1353+
};
1354+
// (undocumented)
1355+
name: string;
1356+
// (undocumented)
1357+
output: {
1358+
key: string;
1359+
label: string;
1360+
type: string;
1361+
extensionLabel: string;
1362+
value: PhoneNumberExtensionOutputValue;
1363+
};
1364+
// (undocumented)
1365+
type: 'PhoneNumberExtensionCollector';
1366+
}
1367+
1368+
// @public (undocumented)
1369+
export type PhoneNumberExtensionField = PhoneNumberField & {
1370+
showExtension: boolean;
1371+
extensionLabel: string;
1372+
};
1373+
1374+
// @public (undocumented)
1375+
export interface PhoneNumberExtensionInputValue {
1376+
// (undocumented)
1377+
countryCode: string;
1378+
// (undocumented)
1379+
extension: string;
1380+
// (undocumented)
1381+
phoneNumber: string;
1382+
}
1383+
1384+
// @public (undocumented)
1385+
export interface PhoneNumberExtensionOutputValue {
1386+
// (undocumented)
1387+
countryCode?: string;
1388+
// (undocumented)
1389+
extension?: string;
1390+
// (undocumented)
1391+
phoneNumber?: string;
1392+
}
1393+
13391394
// @public (undocumented)
13401395
export type PhoneNumberField = {
13411396
type: 'PHONE_NUMBER';
13421397
key: string;
13431398
label: string;
1344-
defaultCountryCode: string | null;
13451399
required: boolean;
1400+
defaultCountryCode: string | null;
13461401
validatePhoneNumber: boolean;
13471402
};
13481403

@@ -1444,7 +1499,6 @@ export interface ReadOnlyCollector extends NoValueCollectorBase<'ReadOnlyCollect
14441499
// (undocumented)
14451500
output: NoValueCollectorBase<'ReadOnlyCollector'>['output'] & {
14461501
content: string;
1447-
richContent: CollectorRichContent;
14481502
};
14491503
}
14501504

@@ -1500,6 +1554,15 @@ export type RichContentReplacement = {
15001554
target?: '_self' | '_blank';
15011555
};
15021556

1557+
// @public
1558+
export interface RichTextCollector extends NoValueCollectorBase<'RichTextCollector'> {
1559+
// (undocumented)
1560+
output: NoValueCollectorBase<'RichTextCollector'>['output'] & {
1561+
content: string;
1562+
richContent: CollectorRichContent;
1563+
};
1564+
}
1565+
15031566
// @public (undocumented)
15041567
export interface SelectorOption {
15051568
// (undocumented)
@@ -1751,7 +1814,7 @@ export type UnknownField = Record<string, unknown>;
17511814
// @public (undocumented)
17521815
export const updateCollectorValues: ActionCreatorWithPayload< {
17531816
id: string;
1754-
value: string | string[] | PhoneNumberInputValue | FidoRegistrationInputValue | FidoAuthenticationInputValue;
1817+
value: string | string[] | PhoneNumberInputValue | PhoneNumberExtensionInputValue | FidoRegistrationInputValue | FidoAuthenticationInputValue;
17551818
index?: number;
17561819
}, string>;
17571820

0 commit comments

Comments
 (0)