@wise/dynamic-flow-client 5.3.0 → 5.4.0

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 (28) hide show
  1. package/build/main.css +6 -0
  2. package/build/main.js +577 -251
  3. package/build/main.mjs +581 -255
  4. package/build/types/domain/components/RootDomainComponent.d.ts +7 -1
  5. package/build/types/domain/components/SelectInputComponent.d.ts +1 -2
  6. package/build/types/domain/components/SubflowDomainComponent.d.ts +16 -0
  7. package/build/types/domain/components/step/StepDomainComponent.d.ts +3 -3
  8. package/build/types/domain/features/eventNames.d.ts +1 -0
  9. package/build/types/domain/features/events.d.ts +2 -1
  10. package/build/types/domain/mappers/mapStepToComponent.d.ts +2 -0
  11. package/build/types/domain/prefetching/request-cache.d.ts +7 -7
  12. package/build/types/domain/types.d.ts +17 -3
  13. package/build/types/flow/executeRequest.d.ts +39 -0
  14. package/build/types/flow/executeSubmission.d.ts +6 -33
  15. package/build/types/flow/getResponseType.d.ts +1 -1
  16. package/build/types/flow/getSafeHttpClient.d.ts +1 -0
  17. package/build/types/flow/handleErrorResponse.d.ts +3 -0
  18. package/build/types/flow/response-utils.d.ts +2 -1
  19. package/build/types/getSubflowCallbacks.d.ts +14 -0
  20. package/build/types/index.d.ts +4 -0
  21. package/build/types/renderers/mappers/subflowComponentToRendererProps.d.ts +4 -0
  22. package/build/types/test-utils/DynamicFlowWiseModal.d.ts +12 -0
  23. package/build/types/test-utils/getMergedTestRenderers.d.ts +2 -0
  24. package/build/types/types.d.ts +2 -0
  25. package/build/types/useDynamicFlowController.d.ts +1 -1
  26. package/build/types/useDynamicFlowModal.d.ts +16 -0
  27. package/package.json +16 -16
  28. package/build/types/flow/makeSubmissionRequest.d.ts +0 -3
@@ -3,15 +3,19 @@ import { AnalyticsEventDispatcher } from '../features/events';
3
3
  import { BaseComponent, DomainComponent, LoadingState, LocalValue, SchemaComponent, ScrollToTop, UpdateComponent } from '../types';
4
4
  import { ModalComponent } from './ModalComponent';
5
5
  import { StepDomainComponent } from './step/StepDomainComponent';
6
+ import { SubflowDomainComponent } from './SubflowDomainComponent';
7
+ import { RequestCache } from '../prefetching/request-cache';
6
8
  export type RootDomainComponent = BaseComponent & {
7
9
  type: 'root';
8
10
  kind: 'step';
9
11
  stepComponent: StepDomainComponent | null;
10
12
  stepStack: StepDomainComponent[];
13
+ subflow: SubflowDomainComponent | null;
11
14
  backConfig: {
12
15
  isNativeBackEnabled: boolean;
13
16
  isFlowCancellable: boolean;
14
17
  };
18
+ requestCache: RequestCache;
15
19
  canPerformBack: () => boolean;
16
20
  dismissAllModals: () => void;
17
21
  dismissModal: () => void;
@@ -35,8 +39,10 @@ export type RootDomainComponent = BaseComponent & {
35
39
  clearStack: () => void;
36
40
  navigateBack: () => void;
37
41
  getRefreshUrl: () => string | null;
42
+ addSubflow: (subflow: SubflowDomainComponent) => void;
43
+ closeSubflow: () => void;
38
44
  };
39
45
  export declare const createRootDomainComponent: (updateComponent: UpdateComponent, scrollToTop: ScrollToTop, backConfig: {
40
46
  isNativeBackEnabled: boolean;
41
47
  isFlowCancellable: boolean;
42
- }) => RootDomainComponent;
48
+ }, requestCache: RequestCache) => RootDomainComponent;
@@ -1,9 +1,8 @@
1
1
  import type { Model } from '@wise/dynamic-flow-types/spec';
2
2
  import type { AnalyticsEventDispatcher } from '../features/events';
3
3
  import type { SchemaOnChange } from '../features/schema-on-change/getSchemaOnChange';
4
- import type { InlineAlert, SupportingValues } from '../types';
4
+ import type { InlineAlert, SupportingValues, BaseInputComponent, LocalValue, Media, OnValueChange, RepeatableSummary, SchemaComponent, UpdateComponent } from '../types';
5
5
  import type { IsInvalidCheck } from '../features/validation/value-checks';
6
- import type { BaseInputComponent, LocalValue, Media, OnValueChange, RepeatableSummary, SchemaComponent, UpdateComponent } from '../types';
7
6
  export type SelectInputComponent = BaseInputComponent<LocalValue | null> & {
8
7
  type: 'select';
9
8
  kind: 'input';
@@ -0,0 +1,16 @@
1
+ import { JsonElement, Request } from '@wise/dynamic-flow-types/spec';
2
+ import { BaseComponent, UpdateComponent, Presentation } from '../types';
3
+ import { AnalyticsEventDispatcher } from '../features/events';
4
+ import { RequestCache } from '../prefetching/request-cache';
5
+ export type SubflowDomainComponent = BaseComponent & {
6
+ kind: 'layout';
7
+ type: 'subflow';
8
+ presentation: Presentation;
9
+ initialRequest: Request;
10
+ requestCache: RequestCache;
11
+ onCancellation: () => void;
12
+ onCompletion: (result: JsonElement) => void;
13
+ onEvent: AnalyticsEventDispatcher<string>;
14
+ onError: (error: unknown, status?: number) => void;
15
+ };
16
+ export declare const createSubflowDomainComponent: (subflowProps: Pick<SubflowDomainComponent, "initialRequest" | "presentation" | "requestCache" | "onCompletion" | "onCancellation" | "onError" | "onEvent">, updateComponent: UpdateComponent) => SubflowDomainComponent;
@@ -1,7 +1,7 @@
1
1
  import type { BaseComponent, DomainComponent, LayoutComponent, LoadingState, LocalValue, OnBehavior, SchemaComponent, UpdateComponent } from '../../types';
2
2
  import type { NavigationStackBehavior, Step } from '@wise/dynamic-flow-types/spec';
3
3
  import { Model } from '@wise/dynamic-flow-types/spec';
4
- import { SubmissionRequestCache } from '../../prefetching/request-cache';
4
+ import { RequestCache } from '../../prefetching/request-cache';
5
5
  import type { AnalyticsEventDispatcher } from '../../features/events';
6
6
  import type { StepPolling } from '../../features/polling/getStepPolling';
7
7
  import { StepRefreshAfter } from '../../features/refreshAfter/getStepRefreshAfter';
@@ -27,7 +27,7 @@ export type StepDomainComponent = BaseComponent & {
27
27
  title?: string;
28
28
  modals: ModalComponent[];
29
29
  tags?: string[];
30
- submissionRequestsCache: SubmissionRequestCache;
30
+ requestCache: RequestCache;
31
31
  dismissModal: () => void;
32
32
  dismissAllModals: () => void;
33
33
  showModal: (modal: ModalComponent) => void;
@@ -47,7 +47,7 @@ export type BackNavigation = {
47
47
  title?: string;
48
48
  onClick: () => void;
49
49
  };
50
- export declare const createStepComponent: (stepProps: Pick<StepDomainComponent, "uid" | "back" | "toolbar" | "layoutComponents" | "schemaComponents" | "footerComponents" | "control" | "description" | "error" | "externalConfirmation" | "loadingState" | "stackBehavior" | "etag" | "step" | "title" | "tags" | "submissionRequestsCache" | "trackEvent" | "onBehavior"> & {
50
+ export declare const createStepComponent: (stepProps: Pick<StepDomainComponent, "uid" | "back" | "toolbar" | "layoutComponents" | "schemaComponents" | "footerComponents" | "control" | "description" | "error" | "externalConfirmation" | "loadingState" | "stackBehavior" | "etag" | "step" | "title" | "tags" | "requestCache" | "trackEvent" | "onBehavior"> & {
51
51
  stepPolling?: StepPolling;
52
52
  stepRefreshAfter?: StepRefreshAfter;
53
53
  updateComponent: UpdateComponent;
@@ -0,0 +1 @@
1
+ export declare const eventNames: readonly ["Initiated", "Succeeded", "Failed", "Cancelled", "Step Shown", "Action Triggered", "Action Succeeded", "Action Aborted", "Action Failed", "Refresh Triggered", "Refresh Succeeded", "Refresh Aborted", "Refresh Failed", "OneOf Selected", "OneOf Option Selected", "PersistAsync Triggered", "PersistAsync Succeeded", "PersistAsync Failed", "Polling Failed", "ValidationAsync Triggered", "ValidationAsync Succeeded", "ValidationAsync Failed"];
@@ -1,6 +1,7 @@
1
+ import { eventNames } from './eventNames';
1
2
  export type AnalyticsEventHandler = (eventName: string, properties?: Record<string, unknown>) => void;
2
3
  export type AnalyticsEventDispatcher<E extends string = EventName> = (eventName: E, properties?: Record<string, unknown>) => void;
3
- export type EventName = 'Initiated' | 'Succeeded' | 'Failed' | 'Cancelled' | 'Step Shown' | 'Action Triggered' | 'Action Succeeded' | 'Action Aborted' | 'Action Failed' | 'Refresh Triggered' | 'Refresh Succeeded' | 'Refresh Aborted' | 'Refresh Failed' | 'OneOf Selected' | 'PersistAsync Triggered' | 'PersistAsync Succeeded' | 'PersistAsync Failed' | 'Polling Failed' | 'ValidationAsync Triggered' | 'ValidationAsync Succeeded' | 'ValidationAsync Failed' | 'Value Changed';
4
+ export type EventName = (typeof eventNames)[number];
4
5
  export type LogLevel = 'info' | 'warning' | 'error';
5
6
  export type LoggingEventHandler = (level: LogLevel, message: string, extra: Record<string, unknown>) => void;
6
7
  export type LoggingEventDispatcher = (level: LogLevel, message: string, extra?: Record<string, unknown>) => void;
@@ -1,4 +1,5 @@
1
1
  import type { AnalyticsEventDispatcher } from '../features/events';
2
+ import { RequestCache } from '../prefetching/request-cache';
2
3
  import type { LoadingState, OnPoll } from '../types';
3
4
  import type { MapperProps } from './schema/types';
4
5
  import { FeatureFlags } from './utils/FeatureFlags';
@@ -8,6 +9,7 @@ export type StepMapperProps = Omit<MapperProps, 'trackEvent' | 'registerSubmissi
8
9
  loadingState: LoadingState;
9
10
  trackEvent: AnalyticsEventDispatcher<string>;
10
11
  features: FeatureFlags;
12
+ flowRequestCache: RequestCache;
11
13
  onPoll: OnPoll;
12
14
  };
13
15
  export declare const mapStepToComponent: ({ uid: rootUid, loadingState, features, trackEvent, onPoll, onBehavior, ...restProps }: StepMapperProps) => import("../components/step/StepDomainComponent").StepDomainComponent;
@@ -1,9 +1,9 @@
1
1
  import { HttpClient } from '../../types';
2
- export type SubmissionRequestCache = {
3
- has: (...requestParams: Parameters<HttpClient>) => boolean;
4
- get: (...requestParams: Parameters<HttpClient>) => Promise<Response | null> | undefined;
5
- delete: (...requestParams: Parameters<HttpClient>) => boolean;
6
- set: (...[input, init, response]: [...Parameters<HttpClient>, Promise<Response | null>]) => void;
7
- clear: () => void;
2
+ export type RequestCache = {
3
+ get: (requestParams: Parameters<HttpClient>) => Promise<Response | null> | undefined;
4
+ set: (requestParams: Parameters<HttpClient>, responsePromise: Promise<Response | null>) => void;
8
5
  };
9
- export declare const makeRequestCache: () => SubmissionRequestCache;
6
+ export type RequestCacheEntries = readonly [Parameters<HttpClient>, Promise<Response | null>][];
7
+ export declare const makeRequestCacheWithParent: (parent: RequestCache | undefined) => RequestCache;
8
+ export declare const makeRequestCache: (initialValues?: RequestCacheEntries) => RequestCache;
9
+ export declare const normaliseRequestCache: (cache: RequestCache | RequestCacheEntries | undefined) => RequestCache;
@@ -1,4 +1,4 @@
1
- import type { Action, ActionBehavior, CopyBehavior, DismissBehavior, Icon, JsonElement, LinkBehavior, Margin, ModalBehavior, Model } from '@wise/dynamic-flow-types/spec';
1
+ import type { Action, ActionBehavior, CopyBehavior, DismissBehavior, Icon, JsonElement, LaunchConfig, LinkBehavior, Margin, ModalBehavior, Model } from '@wise/dynamic-flow-types/spec';
2
2
  import type { AlertComponent } from './components/AlertComponent';
3
3
  import type { AllOfComponent } from './components/AllOfComponent';
4
4
  import type { BooleanInputComponent } from './components/BooleanInputComponent';
@@ -42,7 +42,8 @@ import type { TabsComponent } from './components/TabsComponent';
42
42
  import type { TextInputComponent } from './components/TextInputComponent';
43
43
  import type { TupleComponent } from './components/TupleComponent';
44
44
  import type { UploadInputComponent } from './components/UploadInputComponent';
45
- export type DomainComponent = RootDomainComponent | StepDomainComponent | PersistAsyncComponent | AllOfComponent | BooleanInputComponent | ConstComponent | DateInputComponent | IntegerInputComponent | MultiSelectComponent | MultiUploadInputComponent | NumberInputComponent | ObjectComponent | RepeatableComponent | SelectInputComponent | TextInputComponent | TupleComponent | UploadInputComponent | AlertComponent | BoxComponent | ButtonComponent | ColumnsComponent | ContainerComponent | DecisionComponent | DividerComponent | ExternalConfirmationComponent | FormattedValueComponent | FormComponent | HeadingComponent | ImageComponent | InstructionsComponent | ListComponent | LoadingIndicatorComponent | MarkdownComponent | ModalLayoutComponent | ModalComponent | MoneyInputComponent | ParagraphComponent | ProgressComponent | ReviewComponent | SearchComponent | SectionComponent | StatusListComponent | TabsComponent;
45
+ import type { SubflowDomainComponent } from './components/SubflowDomainComponent';
46
+ export type DomainComponent = RootDomainComponent | StepDomainComponent | PersistAsyncComponent | AllOfComponent | BooleanInputComponent | ConstComponent | DateInputComponent | IntegerInputComponent | MultiSelectComponent | MultiUploadInputComponent | NumberInputComponent | ObjectComponent | RepeatableComponent | SelectInputComponent | TextInputComponent | TupleComponent | UploadInputComponent | AlertComponent | BoxComponent | ButtonComponent | ColumnsComponent | ContainerComponent | DecisionComponent | DividerComponent | ExternalConfirmationComponent | FormattedValueComponent | FormComponent | HeadingComponent | ImageComponent | InstructionsComponent | ListComponent | LoadingIndicatorComponent | MarkdownComponent | ModalLayoutComponent | ModalComponent | MoneyInputComponent | ParagraphComponent | ProgressComponent | ReviewComponent | SearchComponent | SectionComponent | StatusListComponent | SubflowDomainComponent | TabsComponent;
46
47
  export type SchemaComponent = DomainComponent & {
47
48
  kind: 'input';
48
49
  };
@@ -67,9 +68,14 @@ export type CallToAction = {
67
68
  href: string;
68
69
  onClick: () => void;
69
70
  };
70
- export type Behavior = (ActionBehavior | CopyBehavior | DismissBehavior | LinkBehavior | ModalBehavior | NonMergingActionBehaviour | NullBehavior | RefreshBehavior | BackBehaviour) & {
71
+ export type Behavior = (ActionBehavior | CopyBehavior | DismissBehavior | LinkBehavior | ModalBehavior | NonMergingActionBehaviour | NullBehavior | RefreshBehavior | BackBehaviour | SubflowBehavior) & {
71
72
  analytics?: Record<string, unknown>;
72
73
  };
74
+ export type Presentation = {
75
+ type: 'modal';
76
+ } | {
77
+ type: 'push';
78
+ };
73
79
  type NonMergingActionBehaviour = Omit<ActionBehavior, 'type'> & {
74
80
  type: 'non-merging-action';
75
81
  };
@@ -84,6 +90,14 @@ type RefreshBehavior = {
84
90
  type: 'refresh';
85
91
  url?: string;
86
92
  };
93
+ export type SubflowBehavior = {
94
+ type: 'subflow';
95
+ referrerId: string;
96
+ launchConfig: LaunchConfig;
97
+ resultKey?: string;
98
+ onCompletion?: Behavior;
99
+ onError?: Behavior;
100
+ };
87
101
  export type BaseComponent = {
88
102
  kind: 'step' | 'input' | 'layout';
89
103
  type: string;
@@ -0,0 +1,39 @@
1
+ import { ErrorResponseBody, Model, Request, Step } from '@wise/dynamic-flow-types/spec';
2
+ import { AnalyticsEventDispatcher, LoggingEventDispatcher } from '../domain/features/events';
3
+ import { RequestCache } from '../domain/prefetching/request-cache';
4
+ import { Behavior } from '../domain/types';
5
+ export type Command = {
6
+ type: 'complete';
7
+ result: Model;
8
+ } | {
9
+ type: 'replace-step';
10
+ step: Step;
11
+ etag: string | null;
12
+ } | {
13
+ type: 'error';
14
+ body?: {
15
+ analytics?: ErrorResponseBody['analytics'];
16
+ errors?: Step['errors'];
17
+ };
18
+ httpError?: {
19
+ message?: string;
20
+ statusCode?: number;
21
+ };
22
+ } | {
23
+ type: 'refresh';
24
+ body: {
25
+ refreshUrl: string;
26
+ errors?: Step['errors'];
27
+ };
28
+ } | {
29
+ type: 'behavior';
30
+ behavior: Behavior;
31
+ };
32
+ export declare const executeRequest: (props: {
33
+ exit?: boolean;
34
+ request: Request;
35
+ requestCache: RequestCache;
36
+ httpClient: typeof fetch;
37
+ trackEvent: AnalyticsEventDispatcher<string>;
38
+ logEvent: LoggingEventDispatcher;
39
+ }) => Promise<Command>;
@@ -1,42 +1,15 @@
1
- import type { Action, ErrorResponseBody, Model, Step } from '@wise/dynamic-flow-types/spec';
1
+ import type { Action, Model, Request } from '@wise/dynamic-flow-types/spec';
2
2
  import type { AnalyticsEventDispatcher, LoggingEventDispatcher } from '../domain/features/events';
3
- import { SubmissionRequestCache } from '../domain/prefetching/request-cache';
4
- import type { Behavior } from '../domain/types';
3
+ import { RequestCache } from '../domain/prefetching/request-cache';
5
4
  import { HttpClient } from '../types';
6
- type Command = {
7
- type: 'complete';
8
- result: Model;
9
- } | {
10
- type: 'replace-step';
11
- step: Step;
12
- etag: string | null;
13
- } | {
14
- type: 'error';
15
- body?: {
16
- analytics?: ErrorResponseBody['analytics'];
17
- errors?: Step['errors'];
18
- };
19
- httpError?: {
20
- message?: string;
21
- statusCode?: number;
22
- };
23
- } | {
24
- type: 'refresh';
25
- body: {
26
- refreshUrl: string;
27
- errors?: Step['errors'];
28
- };
29
- } | {
30
- type: 'behavior';
31
- behavior: Behavior;
32
- };
5
+ import { Command } from './executeRequest';
33
6
  export declare const executeSubmission: (props: {
34
7
  action: Action;
35
8
  model: Model;
36
9
  isInitial: boolean;
37
- requestCache: SubmissionRequestCache | undefined;
10
+ requestCache: RequestCache;
38
11
  httpClient: HttpClient;
39
- trackEvent: AnalyticsEventDispatcher;
12
+ trackEvent: AnalyticsEventDispatcher<string>;
40
13
  logEvent: LoggingEventDispatcher;
41
14
  }) => Promise<Command>;
42
- export {};
15
+ export declare const createRequestFromAction: (action: Action, model: Model) => Request;
@@ -1,4 +1,4 @@
1
- declare const responseTypes: readonly ["step", "action", "exit", "modal"];
1
+ declare const responseTypes: readonly ["step", "action", "exit", "modal", "subflow"];
2
2
  export type ResponseType = (typeof responseTypes)[number];
3
3
  /**
4
4
  * Returns either 'step', 'action', or 'exit' based on the response headers and body.
@@ -0,0 +1 @@
1
+ export declare const getSafeHttpClient: (httpClient: typeof fetch) => (input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]) => Promise<Response | null>;
@@ -0,0 +1,3 @@
1
+ import { AnalyticsEventDispatcher } from '../domain/features/events';
2
+ import { Command } from './executeRequest';
3
+ export declare const handleErrorResponse: (response: Response, actionId: string | undefined, trackEvent: AnalyticsEventDispatcher) => Promise<Command>;
@@ -1,10 +1,11 @@
1
- import type { ActionResponseBody, ErrorResponseBody, JsonElement, ModalBehavior, Step } from '@wise/dynamic-flow-types/spec';
1
+ import type { ActionResponseBody, ErrorResponseBody, JsonElement, ModalBehavior, Step, SubflowResponseBody } from '@wise/dynamic-flow-types/spec';
2
2
  export declare const assertResponseIsValid: (response: unknown) => void;
3
3
  export declare const parseResponseBodyAsJsonElement: (response: Response) => Promise<JsonElement>;
4
4
  export declare const parseResponseBodyAsText: (response: Response) => Promise<string | null>;
5
5
  export declare function isActionResponseBody(body: unknown): body is ActionResponseBody;
6
6
  export declare function assertActionResponseBody(body: unknown): asserts body is ActionResponseBody;
7
7
  export declare function assertModalResponseBody(body: unknown): asserts body is Omit<ModalBehavior, 'type'>;
8
+ export declare function assertSubflowResponseBody(body: unknown): asserts body is SubflowResponseBody;
8
9
  export declare function isErrorResponseBody(body: unknown): body is ErrorResponseBody;
9
10
  export declare function assertErrorResponseBody(body: unknown): asserts body is ErrorResponseBody;
10
11
  export declare function assertStepResponseBody(body: unknown): asserts body is Step;
@@ -0,0 +1,14 @@
1
+ import { OnBehavior, SubflowBehavior } from './domain/types';
2
+ import { AnalyticsEventDispatcher } from './domain/features/events';
3
+ import { SubflowDomainComponent } from './domain/components/SubflowDomainComponent';
4
+ type Props = {
5
+ behavior: SubflowBehavior;
6
+ onBehavior: OnBehavior;
7
+ close: () => void;
8
+ onError: (error: unknown, analytics?: Record<string, unknown>, status?: number) => void;
9
+ onEvent: AnalyticsEventDispatcher<string>;
10
+ restart: () => void;
11
+ };
12
+ type SubflowCallbacks = Pick<SubflowDomainComponent, 'onCompletion' | 'onError' | 'onEvent' | 'onCancellation'>;
13
+ export declare const getSubflowCallbacks: ({ behavior, close, restart, onBehavior, onError, onEvent, }: Props) => SubflowCallbacks;
14
+ export {};
@@ -3,4 +3,8 @@ export { default as translations } from './i18n';
3
3
  export type { DynamicFlowCoreProps as DynamicFlowProps } from './types';
4
4
  export { findRendererPropsByType } from './renderers/utils';
5
5
  export { useDynamicFlow } from './useDynamicFlow';
6
+ export { useDynamicFlowModal } from './useDynamicFlowModal';
6
7
  export { DynamicFlowCore as DynamicFlow } from './DynamicFlowCore';
8
+ export { makeRequestCache } from './domain/prefetching/request-cache';
9
+ export type { EventName } from './domain/features/events';
10
+ export { eventNames } from './domain/features/eventNames';
@@ -0,0 +1,4 @@
1
+ import { SubflowRendererProps } from '@wise/dynamic-flow-types/renderers';
2
+ import { SubflowDomainComponent } from '../../domain/components/SubflowDomainComponent';
3
+ import { RendererMapperProps } from './componentToRendererProps';
4
+ export declare const subflowComponentToRendererProps: (component: SubflowDomainComponent, rendererMapperProps: RendererMapperProps) => SubflowRendererProps;
@@ -0,0 +1,12 @@
1
+ import { DynamicFlowCoreProps } from '../types';
2
+ type MakeOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
3
+ export type DynamicFlowWiseProps = MakeOptional<DynamicFlowCoreProps, 'renderers' | 'onLink'> & {
4
+ onAnalytics?: DynamicFlowWiseProps['onEvent'];
5
+ };
6
+ /**
7
+ * This component is only used in tests.
8
+ */
9
+ export declare function DynamicFlowWiseModal(props: DynamicFlowWiseProps & {
10
+ open?: boolean;
11
+ }): import("react/jsx-runtime").JSX.Element;
12
+ export {};
@@ -0,0 +1,2 @@
1
+ import { DynamicFlowWiseProps } from './DynamicFlowWise';
2
+ export declare const getMergedTestRenderers: (props: DynamicFlowWiseProps) => (import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").CoreContainerRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").RootRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").StepRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").AlertRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").BoxRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").ColumnsRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").DecisionRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").DividerRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").ExternalConfirmationRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").FormattedValueRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").FormRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").HeadingRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").InstructionsRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").ListRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").LoadingIndicatorRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").MarkdownRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").ImageRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").ModalLayoutRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").ModalRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").ParagraphRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").ProgressRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").ReviewRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").SearchRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").StatusListRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").CheckboxInputRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").ButtonRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").DateInputRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").HiddenRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").IntegerInputRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").MoneyInputRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").NumberInputRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").RepeatableRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").FormSectionRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").SelectInputRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").SectionRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").SubflowRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").MultiSelectInputRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").TabsRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").TextInputRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").UploadInputRendererProps> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").MultiUploadInputRendererProps>)[];
@@ -1,6 +1,7 @@
1
1
  import type { Renderers } from '@wise/dynamic-flow-types/renderers';
2
2
  import type { Model, Step } from '@wise/dynamic-flow-types/spec';
3
3
  import type { AnalyticsEventHandler, LoggingEventHandler } from './domain/features/events';
4
+ import { RequestCache, RequestCacheEntries } from './domain/prefetching/request-cache';
4
5
  export type DynamicFlowCoreProps = {
5
6
  flowId: string;
6
7
  initialAction?: InitialAction;
@@ -8,6 +9,7 @@ export type DynamicFlowCoreProps = {
8
9
  httpClient: HttpClient;
9
10
  renderers: Renderers;
10
11
  features?: Record<string, unknown>;
12
+ requestCache?: RequestCache | RequestCacheEntries;
11
13
  onCancellation?: () => void;
12
14
  onCompletion: (result: Model) => void;
13
15
  onCopy?: (copiedString: string | null) => void;
@@ -5,7 +5,7 @@ import type { DynamicFlowCoreProps } from './types';
5
5
  type UseDynamicFlowCoreProps = Omit<DynamicFlowCoreProps, 'renderers' | 'features'> & {
6
6
  features: FeatureFlags;
7
7
  onValueChange?: OnValueChange;
8
- scrollToTop?: ScrollToTop;
8
+ scrollToTop: ScrollToTop;
9
9
  onLink: (url: string) => boolean;
10
10
  };
11
11
  export declare function useDynamicFlowController(props: UseDynamicFlowCoreProps): {
@@ -0,0 +1,16 @@
1
+ import { JsonElement } from '@wise/dynamic-flow-types/spec';
2
+ import { DynamicFlowProps } from '.';
3
+ export declare const useDynamicFlowModal: (props: DynamicFlowProps) => {
4
+ modal: {
5
+ body: import("react/jsx-runtime").JSX.Element;
6
+ open: boolean;
7
+ onClose: () => void;
8
+ onUnmount: () => void;
9
+ };
10
+ controller: {
11
+ getSubmittableValue: () => Promise<JsonElement>;
12
+ validate: () => boolean;
13
+ cancel: () => void;
14
+ };
15
+ view: import("react/jsx-runtime").JSX.Element;
16
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wise/dynamic-flow-client",
3
- "version": "5.3.0",
3
+ "version": "5.4.0",
4
4
  "description": "Dynamic Flow web client",
5
5
  "license": "Apache-2.0",
6
6
  "main": "./build/main.js",
@@ -32,14 +32,14 @@
32
32
  },
33
33
  "devDependencies": {
34
34
  "@chromatic-com/storybook": "4.1.3",
35
- "@formatjs/cli": "^6.11.0",
36
- "@storybook/addon-a11y": "^10.1.11",
37
- "@storybook/addon-docs": "^10.1.11",
38
- "@storybook/addon-links": "^10.1.11",
39
- "@storybook/react-vite": "10.1.11",
35
+ "@formatjs/cli": "^6.12.0",
36
+ "@storybook/addon-a11y": "^10.2.0",
37
+ "@storybook/addon-docs": "^10.2.0",
38
+ "@storybook/addon-links": "^10.2.0",
39
+ "@storybook/react-vite": "10.2.0",
40
40
  "@testing-library/dom": "10.4.1",
41
41
  "@testing-library/jest-dom": "6.9.1",
42
- "@testing-library/react": "16.3.1",
42
+ "@testing-library/react": "16.3.2",
43
43
  "@testing-library/user-event": "14.6.1",
44
44
  "@transferwise/components": "^46.121.1",
45
45
  "@transferwise/formatting": "^2.13.4",
@@ -54,8 +54,8 @@
54
54
  "@wise/art": "2.26.0",
55
55
  "@wise/components-theming": "^1.10.0",
56
56
  "esbuild": "0.27.0",
57
- "eslint-plugin-storybook": "10.1.11",
58
- "framer-motion": "^12.26.2",
57
+ "eslint-plugin-storybook": "10.2.0",
58
+ "framer-motion": "^12.29.0",
59
59
  "npm-run-all2": "8.0.4",
60
60
  "postcss": "^8.5.6",
61
61
  "postcss-cli": "^11.0.1",
@@ -63,17 +63,17 @@
63
63
  "react": "18.3.1",
64
64
  "react-dom": "18.3.1",
65
65
  "react-intl": "6.8.9",
66
- "storybook": "^10.1.11",
66
+ "storybook": "^10.2.0",
67
67
  "stylelint": "16.26.1",
68
68
  "stylelint-config-standard": "36.0.1",
69
69
  "stylelint-no-unsupported-browser-features": "8.0.5",
70
- "stylelint-value-no-unknown-custom-properties": "6.1.0",
70
+ "stylelint-value-no-unknown-custom-properties": "6.1.1",
71
71
  "tsx": "4.21.0",
72
72
  "typescript": "5.9.3",
73
- "vitest": "4.0.17",
73
+ "vitest": "4.0.18",
74
74
  "vitest-fetch-mock": "0.4.5",
75
- "@wise/dynamic-flow-fixtures": "0.0.1",
76
- "@wise/dynamic-flow-renderers": "0.0.0"
75
+ "@wise/dynamic-flow-renderers": "0.0.0",
76
+ "@wise/dynamic-flow-fixtures": "0.0.1"
77
77
  },
78
78
  "peerDependencies": {
79
79
  "@transferwise/components": "^46.104.0",
@@ -83,10 +83,10 @@
83
83
  "@wise/art": "^2.19.0",
84
84
  "react": "^18",
85
85
  "react-dom": "^18",
86
- "react-intl": "^6"
86
+ "react-intl": "^6 || ^7"
87
87
  },
88
88
  "dependencies": {
89
- "@wise/dynamic-flow-types": "4.4.0"
89
+ "@wise/dynamic-flow-types": "4.5.0"
90
90
  },
91
91
  "scripts": {
92
92
  "dev": "EXCLUDE_VISUAL_TESTS=true pnpm storybook dev -p 3003",
@@ -1,3 +0,0 @@
1
- import type { Action, JsonElement } from '@wise/dynamic-flow-types/spec';
2
- import { HttpClient } from '../types';
3
- export declare const makeSubmissionRequest: (action: Action, model: JsonElement) => Parameters<HttpClient>;