@wise/dynamic-flow-client 5.8.0 → 5.9.0-experimental-rendererprops-9c9a4b8

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/build/main.js CHANGED
@@ -836,6 +836,7 @@ var getChildren = (node) => {
836
836
  case "heading":
837
837
  case "hidden":
838
838
  case "image":
839
+ case "loading-state":
839
840
  case "instructions":
840
841
  case "input-integer":
841
842
  case "list":
@@ -2091,7 +2092,7 @@ var debounce = (callback, waitMs) => {
2091
2092
  // src/domain/components/searchComponent/SearchComponent.ts
2092
2093
  var DEBOUNCE_TIME = 400;
2093
2094
  var createSearchComponent = (searchProps, performSearch, onBehavior, onComponentUpdate) => {
2094
- const { uid, analyticsId, control, emptyMessage, hint, margin, tags, title } = searchProps;
2095
+ const { uid, analyticsId, control, emptyMessage, initialState, hint, margin, tags, title } = searchProps;
2095
2096
  const update = getInputUpdateFunction(onComponentUpdate);
2096
2097
  let abortController = new AbortController();
2097
2098
  const search = (component2, query, searchConfig) => {
@@ -2102,10 +2103,10 @@ var createSearchComponent = (searchProps, performSearch, onBehavior, onComponent
2102
2103
  signal,
2103
2104
  query,
2104
2105
  config: searchConfig
2105
- }).then((results) => {
2106
+ }).then((state) => {
2106
2107
  if (!signal.aborted) {
2107
2108
  update(component2, (draft) => {
2108
- draft.results = results;
2109
+ draft.state = state != null ? state : initialState;
2109
2110
  draft.isLoading = false;
2110
2111
  draft.error = void 0;
2111
2112
  });
@@ -2127,22 +2128,34 @@ var createSearchComponent = (searchProps, performSearch, onBehavior, onComponent
2127
2128
  analyticsId,
2128
2129
  control,
2129
2130
  emptyMessage,
2131
+ initialState,
2130
2132
  hint,
2131
2133
  margin,
2134
+ state: initialState,
2132
2135
  tags,
2133
2136
  title,
2134
2137
  isLoading: false,
2135
2138
  query: "",
2136
- results: [],
2137
2139
  _update(updateFn) {
2138
2140
  update(this, updateFn);
2139
2141
  },
2140
2142
  onChange(query) {
2141
- this._update((draft) => {
2142
- draft.query = query;
2143
- draft.isLoading = true;
2144
- });
2145
- debouncedSearch(this, query.trim());
2143
+ if (query.trim()) {
2144
+ this._update((draft) => {
2145
+ draft.query = query;
2146
+ draft.isLoading = true;
2147
+ });
2148
+ debouncedSearch(this, query.trim());
2149
+ } else {
2150
+ abortController.abort();
2151
+ debouncedSearch.cancel();
2152
+ update(component, (draft) => {
2153
+ draft.query = query;
2154
+ draft.state = initialState;
2155
+ draft.isLoading = false;
2156
+ draft.error = void 0;
2157
+ });
2158
+ }
2146
2159
  },
2147
2160
  onSelect({ type, value }) {
2148
2161
  if (type === "action") {
@@ -2164,9 +2177,9 @@ var createSearchComponent = (searchProps, performSearch, onBehavior, onComponent
2164
2177
  };
2165
2178
 
2166
2179
  // src/domain/features/search/getPerformSearchFunction.ts
2167
- var getPerformSearchFunction = (httpClient, defaultConfig) => {
2180
+ var getPerformSearchFunction = (httpClient, mapLayoutToDomainComponent, defaultConfig) => {
2168
2181
  let latestSuccessfulRequestHash = hashRequest("", defaultConfig);
2169
- let latestSuccessfulResults = [];
2182
+ let latestSuccessfulResults = null;
2170
2183
  return async ({ config = defaultConfig, query, signal }) => {
2171
2184
  const requestHash = hashRequest(query, config);
2172
2185
  if (requestHash !== latestSuccessfulRequestHash) {
@@ -2184,6 +2197,14 @@ var getPerformSearchFunction = (httpClient, defaultConfig) => {
2184
2197
  }));
2185
2198
  const results = await parseResponse(response);
2186
2199
  latestSuccessfulRequestHash = requestHash;
2200
+ if (results.type === "layout") {
2201
+ const mappedLayoutResult = {
2202
+ type: "layout",
2203
+ content: results.content.map(mapLayoutToDomainComponent)
2204
+ };
2205
+ latestSuccessfulResults = mappedLayoutResult;
2206
+ return mappedLayoutResult;
2207
+ }
2187
2208
  latestSuccessfulResults = results;
2188
2209
  return results;
2189
2210
  }
@@ -2194,10 +2215,15 @@ var parseResponse = async (response) => {
2194
2215
  if (response.ok) {
2195
2216
  const body = await response.json().catch(() => null);
2196
2217
  if (isValidResponseBody(body)) {
2197
- if (body.results.length === 0) {
2198
- return [];
2218
+ if (body.type === "layout") {
2219
+ return body;
2220
+ }
2221
+ if (body.results) {
2222
+ return {
2223
+ type: "results",
2224
+ results: body.results
2225
+ };
2199
2226
  }
2200
- return body.results;
2201
2227
  }
2202
2228
  }
2203
2229
  throw Error("error response");
@@ -2208,21 +2234,49 @@ var addQueryParameter = (url, key, value) => {
2208
2234
  urlQueryParams.set(key, value);
2209
2235
  return `${urlBase}?${urlQueryParams.toString()}`;
2210
2236
  };
2211
- var isValidResponseBody = (body) => isObject(body) && "results" in body && isArray(body.results) && body.results.every(
2212
- (result) => isObject(result) && "title" in result && "type" in result && "value" in result
2213
- );
2237
+ var isValidResponseBody = (body) => {
2238
+ if (!isObject(body)) {
2239
+ return false;
2240
+ }
2241
+ if ("results" in body) {
2242
+ return isArray(body.results) && body.results.every(
2243
+ (result) => isObject(result) && "title" in result && "type" in result && "value" in result
2244
+ );
2245
+ }
2246
+ if ("type" in body && body.type === "layout" && "content" in body) {
2247
+ return isArray(body.content);
2248
+ }
2249
+ return false;
2250
+ };
2214
2251
  var hashRequest = (query, config) => JSON.stringify({ query, config });
2215
2252
 
2216
2253
  // src/domain/mappers/layout/searchLayoutToComponent.ts
2217
- var searchLayoutToComponent = (uid, { analyticsId, control, emptyMessage, hint, method, param, title, url, margin, tags }, mapperProps) => {
2254
+ var searchLayoutToComponent = (uid, {
2255
+ analyticsId,
2256
+ control,
2257
+ emptyMessage = "",
2258
+ initialState,
2259
+ hint,
2260
+ method,
2261
+ param,
2262
+ title,
2263
+ url,
2264
+ margin,
2265
+ tags
2266
+ }, mapperProps) => {
2218
2267
  const { httpClient, onBehavior, onComponentUpdate } = mapperProps;
2219
- const search = getPerformSearchFunction(httpClient, { method, param, url });
2268
+ const search = getPerformSearchFunction(
2269
+ httpClient,
2270
+ (layout, index) => mapLayoutToComponent(`${uid}-search-response-${index}`, layout, mapperProps, []),
2271
+ { method, param, url }
2272
+ );
2220
2273
  return createSearchComponent(
2221
2274
  {
2222
2275
  uid,
2223
2276
  analyticsId,
2224
2277
  control,
2225
- emptyMessage: emptyMessage != null ? emptyMessage : "",
2278
+ emptyMessage,
2279
+ initialState: getInitialState(uid, initialState, mapperProps),
2226
2280
  hint,
2227
2281
  margin: margin != null ? margin : "md",
2228
2282
  tags,
@@ -2233,6 +2287,33 @@ var searchLayoutToComponent = (uid, { analyticsId, control, emptyMessage, hint,
2233
2287
  onComponentUpdate
2234
2288
  );
2235
2289
  };
2290
+ var getInitialState = (uid, initialState, mapperProps) => {
2291
+ if (!initialState) {
2292
+ return emptyInitialState;
2293
+ }
2294
+ switch (initialState.type) {
2295
+ case "layout":
2296
+ return {
2297
+ type: "layout",
2298
+ content: initialState.content.map(
2299
+ (layout, index) => mapLayoutToComponent(`${uid}-initial-${index}`, layout, mapperProps, [])
2300
+ )
2301
+ };
2302
+ case "results":
2303
+ return {
2304
+ type: "results",
2305
+ results: initialState.results
2306
+ };
2307
+ default: {
2308
+ const exhaustiveCheck = initialState;
2309
+ return emptyInitialState;
2310
+ }
2311
+ }
2312
+ };
2313
+ var emptyInitialState = {
2314
+ type: "layout",
2315
+ content: []
2316
+ };
2236
2317
 
2237
2318
  // src/domain/components/SectionComponent.ts
2238
2319
  var createSectionComponent = (props) => {
@@ -6971,8 +7052,15 @@ var CoreRootRenderer = {
6971
7052
  }
6972
7053
  };
6973
7054
 
6974
- // src/renderers/getRenderFunction.tsx
7055
+ // src/renderers/EmptyLoadingStateRenderer.tsx
6975
7056
  var import_jsx_runtime5 = require("react/jsx-runtime");
7057
+ var EmptyLoadingStateRenderer = {
7058
+ canRenderType: "loading-state",
7059
+ render: () => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_jsx_runtime5.Fragment, {})
7060
+ };
7061
+
7062
+ // src/renderers/getRenderFunction.tsx
7063
+ var import_jsx_runtime6 = require("react/jsx-runtime");
6976
7064
  var getRenderFunction = (renderers) => {
6977
7065
  function ComponentRenderer(props) {
6978
7066
  const { type } = props;
@@ -6992,9 +7080,9 @@ var getRenderFunction = (renderers) => {
6992
7080
  }
6993
7081
  const render = (props) => {
6994
7082
  if (!props) {
6995
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_jsx_runtime5.Fragment, {});
7083
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_jsx_runtime6.Fragment, {});
6996
7084
  }
6997
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ComponentRenderer, __spreadValues({}, props), props.uid);
7085
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ComponentRenderer, __spreadValues({}, props), props.uid);
6998
7086
  };
6999
7087
  return render;
7000
7088
  };
@@ -7891,14 +7979,17 @@ var getToolbarProps = (toolbar, rendererMapperProps) => {
7891
7979
 
7892
7980
  // src/renderers/mappers/rootComponentToProps.ts
7893
7981
  var rootComponentToProps = (rootComponent, rendererMapperProps) => {
7894
- const childrenProps = rootComponent.getChildren().map((child) => {
7895
- if (child.type === "step") {
7896
- return stepComponentToProps(child, __spreadProps(__spreadValues({}, rendererMapperProps), {
7897
- showBack: rootComponent.canPerformBack()
7898
- }));
7899
- }
7900
- return componentToRendererProps(child, rendererMapperProps);
7901
- });
7982
+ const childrenProps = [
7983
+ __spreadValues({ type: "loading-state", uid: "loading-state" }, rendererMapperProps),
7984
+ ...rootComponent.getChildren().map((child) => {
7985
+ if (child.type === "step") {
7986
+ return stepComponentToProps(child, __spreadProps(__spreadValues({}, rendererMapperProps), {
7987
+ showBack: rootComponent.canPerformBack()
7988
+ }));
7989
+ }
7990
+ return componentToRendererProps(child, rendererMapperProps);
7991
+ })
7992
+ ];
7902
7993
  const subflow = rootComponent.subflow ? {
7903
7994
  presentation: rootComponent.subflow.presentation,
7904
7995
  children: rendererMapperProps.render(
@@ -7916,19 +8007,7 @@ var rootComponentToProps = (rootComponent, rendererMapperProps) => {
7916
8007
 
7917
8008
  // src/renderers/mappers/searchComponentToProps.ts
7918
8009
  var searchComponentToProps = (component, rendererMapperProps) => {
7919
- const {
7920
- uid,
7921
- control,
7922
- emptyMessage,
7923
- error,
7924
- hint,
7925
- isLoading,
7926
- margin,
7927
- query,
7928
- results,
7929
- title,
7930
- tags
7931
- } = component;
8010
+ const { uid, control, emptyMessage, error, hint, isLoading, margin, query, title, tags } = component;
7932
8011
  const onChange = component.onChange.bind(component);
7933
8012
  const onSelect = component.onSelect.bind(component);
7934
8013
  const state = getSearchState({
@@ -7936,7 +8015,8 @@ var searchComponentToProps = (component, rendererMapperProps) => {
7936
8015
  error,
7937
8016
  isLoading,
7938
8017
  query,
7939
- results,
8018
+ state: component.state,
8019
+ rendererMapperProps,
7940
8020
  onChange,
7941
8021
  onSelect
7942
8022
  });
@@ -7960,29 +8040,46 @@ var getSearchState = ({
7960
8040
  error,
7961
8041
  isLoading,
7962
8042
  query,
7963
- results,
8043
+ state,
8044
+ rendererMapperProps,
7964
8045
  onChange,
7965
8046
  onSelect
7966
8047
  }) => {
7967
- if (!query || isLoading) {
8048
+ if (isLoading) {
7968
8049
  return { type: "pending" };
7969
8050
  }
7970
8051
  if (error) {
7971
8052
  return { type: "error", onRetry: () => onChange(query) };
7972
8053
  }
7973
- if (results.length === 0) {
8054
+ if (!state) {
7974
8055
  return { type: "noResults", message: emptyMessage };
7975
8056
  }
7976
- const rendererResults = results.map((result) => {
7977
- var _a;
7978
- return __spreadProps(__spreadValues({}, result), {
7979
- id: result.type === "action" ? (_a = result.value.id) != null ? _a : result.value.$id : void 0,
7980
- image: mapSpecImage(result.image),
7981
- media: getDomainLayerMedia(result),
7982
- onClick: () => onSelect(result)
7983
- });
7984
- });
7985
- return { type: "results", results: rendererResults };
8057
+ if (state.type === "layout") {
8058
+ const { content } = state;
8059
+ const layoutProps = content.map(
8060
+ (component) => componentToRendererProps(component, rendererMapperProps)
8061
+ );
8062
+ return {
8063
+ type: "layout",
8064
+ layout: layoutProps.map((props) => rendererMapperProps.render(props)),
8065
+ layoutProps
8066
+ };
8067
+ }
8068
+ if (query && state.results.length === 0) {
8069
+ return { type: "noResults", message: emptyMessage };
8070
+ }
8071
+ return {
8072
+ type: "results",
8073
+ results: state.results.map((result) => {
8074
+ var _a;
8075
+ return __spreadProps(__spreadValues({}, result), {
8076
+ id: result.type === "action" ? (_a = result.value.id) != null ? _a : result.value.$id : void 0,
8077
+ image: mapSpecImage(result.image),
8078
+ media: getDomainLayerMedia(result),
8079
+ onClick: () => onSelect(result)
8080
+ });
8081
+ })
8082
+ };
7986
8083
  };
7987
8084
 
7988
8085
  // src/renderers/mappers/sectionComponentToProps.ts
@@ -8276,7 +8373,7 @@ function useStableCallback(handler) {
8276
8373
  }
8277
8374
 
8278
8375
  // src/useDynamicFlow.tsx
8279
- var import_jsx_runtime6 = require("react/jsx-runtime");
8376
+ var import_jsx_runtime7 = require("react/jsx-runtime");
8280
8377
  var className = "dynamic-flow";
8281
8378
  var noop3 = () => {
8282
8379
  };
@@ -8327,10 +8424,15 @@ function useDynamicFlow(props) {
8327
8424
  scrollToTop
8328
8425
  }));
8329
8426
  const render = (0, import_react3.useMemo)(
8330
- () => getRenderFunction([CoreRootRenderer, CoreContainerRenderer, ...renderers]),
8427
+ () => getRenderFunction([
8428
+ CoreRootRenderer,
8429
+ CoreContainerRenderer,
8430
+ ...renderers,
8431
+ EmptyLoadingStateRenderer
8432
+ ]),
8331
8433
  [renderers]
8332
8434
  );
8333
- const tree = componentToRendererProps(rootComponent, {
8435
+ const rendererProps = componentToRendererProps(rootComponent, {
8334
8436
  features,
8335
8437
  render,
8336
8438
  httpClient,
@@ -8342,9 +8444,13 @@ function useDynamicFlow(props) {
8342
8444
  controller: {
8343
8445
  getSubmittableValue: async () => rootComponent.getSubmittableValue(),
8344
8446
  validate: () => rootComponent.validate(),
8447
+ /**
8448
+ * @experimental This is not a public API and may be removed in the future without notice
8449
+ */
8450
+ rendererProps,
8345
8451
  cancel
8346
8452
  },
8347
- view: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
8453
+ view: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
8348
8454
  ErrorBoundary_default,
8349
8455
  {
8350
8456
  onError: (error) => {
@@ -8354,7 +8460,7 @@ function useDynamicFlow(props) {
8354
8460
  errorMessage: getErrorMessage(error)
8355
8461
  });
8356
8462
  },
8357
- children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { id: normalisedFlowId, className, children: render(tree) })
8463
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { id: normalisedFlowId, className, children: render(rendererProps) })
8358
8464
  }
8359
8465
  )
8360
8466
  };
package/build/main.mjs CHANGED
@@ -806,6 +806,7 @@ var getChildren = (node) => {
806
806
  case "heading":
807
807
  case "hidden":
808
808
  case "image":
809
+ case "loading-state":
809
810
  case "instructions":
810
811
  case "input-integer":
811
812
  case "list":
@@ -2061,7 +2062,7 @@ var debounce = (callback, waitMs) => {
2061
2062
  // src/domain/components/searchComponent/SearchComponent.ts
2062
2063
  var DEBOUNCE_TIME = 400;
2063
2064
  var createSearchComponent = (searchProps, performSearch, onBehavior, onComponentUpdate) => {
2064
- const { uid, analyticsId, control, emptyMessage, hint, margin, tags, title } = searchProps;
2065
+ const { uid, analyticsId, control, emptyMessage, initialState, hint, margin, tags, title } = searchProps;
2065
2066
  const update = getInputUpdateFunction(onComponentUpdate);
2066
2067
  let abortController = new AbortController();
2067
2068
  const search = (component2, query, searchConfig) => {
@@ -2072,10 +2073,10 @@ var createSearchComponent = (searchProps, performSearch, onBehavior, onComponent
2072
2073
  signal,
2073
2074
  query,
2074
2075
  config: searchConfig
2075
- }).then((results) => {
2076
+ }).then((state) => {
2076
2077
  if (!signal.aborted) {
2077
2078
  update(component2, (draft) => {
2078
- draft.results = results;
2079
+ draft.state = state != null ? state : initialState;
2079
2080
  draft.isLoading = false;
2080
2081
  draft.error = void 0;
2081
2082
  });
@@ -2097,22 +2098,34 @@ var createSearchComponent = (searchProps, performSearch, onBehavior, onComponent
2097
2098
  analyticsId,
2098
2099
  control,
2099
2100
  emptyMessage,
2101
+ initialState,
2100
2102
  hint,
2101
2103
  margin,
2104
+ state: initialState,
2102
2105
  tags,
2103
2106
  title,
2104
2107
  isLoading: false,
2105
2108
  query: "",
2106
- results: [],
2107
2109
  _update(updateFn) {
2108
2110
  update(this, updateFn);
2109
2111
  },
2110
2112
  onChange(query) {
2111
- this._update((draft) => {
2112
- draft.query = query;
2113
- draft.isLoading = true;
2114
- });
2115
- debouncedSearch(this, query.trim());
2113
+ if (query.trim()) {
2114
+ this._update((draft) => {
2115
+ draft.query = query;
2116
+ draft.isLoading = true;
2117
+ });
2118
+ debouncedSearch(this, query.trim());
2119
+ } else {
2120
+ abortController.abort();
2121
+ debouncedSearch.cancel();
2122
+ update(component, (draft) => {
2123
+ draft.query = query;
2124
+ draft.state = initialState;
2125
+ draft.isLoading = false;
2126
+ draft.error = void 0;
2127
+ });
2128
+ }
2116
2129
  },
2117
2130
  onSelect({ type, value }) {
2118
2131
  if (type === "action") {
@@ -2134,9 +2147,9 @@ var createSearchComponent = (searchProps, performSearch, onBehavior, onComponent
2134
2147
  };
2135
2148
 
2136
2149
  // src/domain/features/search/getPerformSearchFunction.ts
2137
- var getPerformSearchFunction = (httpClient, defaultConfig) => {
2150
+ var getPerformSearchFunction = (httpClient, mapLayoutToDomainComponent, defaultConfig) => {
2138
2151
  let latestSuccessfulRequestHash = hashRequest("", defaultConfig);
2139
- let latestSuccessfulResults = [];
2152
+ let latestSuccessfulResults = null;
2140
2153
  return async ({ config = defaultConfig, query, signal }) => {
2141
2154
  const requestHash = hashRequest(query, config);
2142
2155
  if (requestHash !== latestSuccessfulRequestHash) {
@@ -2154,6 +2167,14 @@ var getPerformSearchFunction = (httpClient, defaultConfig) => {
2154
2167
  }));
2155
2168
  const results = await parseResponse(response);
2156
2169
  latestSuccessfulRequestHash = requestHash;
2170
+ if (results.type === "layout") {
2171
+ const mappedLayoutResult = {
2172
+ type: "layout",
2173
+ content: results.content.map(mapLayoutToDomainComponent)
2174
+ };
2175
+ latestSuccessfulResults = mappedLayoutResult;
2176
+ return mappedLayoutResult;
2177
+ }
2157
2178
  latestSuccessfulResults = results;
2158
2179
  return results;
2159
2180
  }
@@ -2164,10 +2185,15 @@ var parseResponse = async (response) => {
2164
2185
  if (response.ok) {
2165
2186
  const body = await response.json().catch(() => null);
2166
2187
  if (isValidResponseBody(body)) {
2167
- if (body.results.length === 0) {
2168
- return [];
2188
+ if (body.type === "layout") {
2189
+ return body;
2190
+ }
2191
+ if (body.results) {
2192
+ return {
2193
+ type: "results",
2194
+ results: body.results
2195
+ };
2169
2196
  }
2170
- return body.results;
2171
2197
  }
2172
2198
  }
2173
2199
  throw Error("error response");
@@ -2178,21 +2204,49 @@ var addQueryParameter = (url, key, value) => {
2178
2204
  urlQueryParams.set(key, value);
2179
2205
  return `${urlBase}?${urlQueryParams.toString()}`;
2180
2206
  };
2181
- var isValidResponseBody = (body) => isObject(body) && "results" in body && isArray(body.results) && body.results.every(
2182
- (result) => isObject(result) && "title" in result && "type" in result && "value" in result
2183
- );
2207
+ var isValidResponseBody = (body) => {
2208
+ if (!isObject(body)) {
2209
+ return false;
2210
+ }
2211
+ if ("results" in body) {
2212
+ return isArray(body.results) && body.results.every(
2213
+ (result) => isObject(result) && "title" in result && "type" in result && "value" in result
2214
+ );
2215
+ }
2216
+ if ("type" in body && body.type === "layout" && "content" in body) {
2217
+ return isArray(body.content);
2218
+ }
2219
+ return false;
2220
+ };
2184
2221
  var hashRequest = (query, config) => JSON.stringify({ query, config });
2185
2222
 
2186
2223
  // src/domain/mappers/layout/searchLayoutToComponent.ts
2187
- var searchLayoutToComponent = (uid, { analyticsId, control, emptyMessage, hint, method, param, title, url, margin, tags }, mapperProps) => {
2224
+ var searchLayoutToComponent = (uid, {
2225
+ analyticsId,
2226
+ control,
2227
+ emptyMessage = "",
2228
+ initialState,
2229
+ hint,
2230
+ method,
2231
+ param,
2232
+ title,
2233
+ url,
2234
+ margin,
2235
+ tags
2236
+ }, mapperProps) => {
2188
2237
  const { httpClient, onBehavior, onComponentUpdate } = mapperProps;
2189
- const search = getPerformSearchFunction(httpClient, { method, param, url });
2238
+ const search = getPerformSearchFunction(
2239
+ httpClient,
2240
+ (layout, index) => mapLayoutToComponent(`${uid}-search-response-${index}`, layout, mapperProps, []),
2241
+ { method, param, url }
2242
+ );
2190
2243
  return createSearchComponent(
2191
2244
  {
2192
2245
  uid,
2193
2246
  analyticsId,
2194
2247
  control,
2195
- emptyMessage: emptyMessage != null ? emptyMessage : "",
2248
+ emptyMessage,
2249
+ initialState: getInitialState(uid, initialState, mapperProps),
2196
2250
  hint,
2197
2251
  margin: margin != null ? margin : "md",
2198
2252
  tags,
@@ -2203,6 +2257,33 @@ var searchLayoutToComponent = (uid, { analyticsId, control, emptyMessage, hint,
2203
2257
  onComponentUpdate
2204
2258
  );
2205
2259
  };
2260
+ var getInitialState = (uid, initialState, mapperProps) => {
2261
+ if (!initialState) {
2262
+ return emptyInitialState;
2263
+ }
2264
+ switch (initialState.type) {
2265
+ case "layout":
2266
+ return {
2267
+ type: "layout",
2268
+ content: initialState.content.map(
2269
+ (layout, index) => mapLayoutToComponent(`${uid}-initial-${index}`, layout, mapperProps, [])
2270
+ )
2271
+ };
2272
+ case "results":
2273
+ return {
2274
+ type: "results",
2275
+ results: initialState.results
2276
+ };
2277
+ default: {
2278
+ const exhaustiveCheck = initialState;
2279
+ return emptyInitialState;
2280
+ }
2281
+ }
2282
+ };
2283
+ var emptyInitialState = {
2284
+ type: "layout",
2285
+ content: []
2286
+ };
2206
2287
 
2207
2288
  // src/domain/components/SectionComponent.ts
2208
2289
  var createSectionComponent = (props) => {
@@ -6941,8 +7022,15 @@ var CoreRootRenderer = {
6941
7022
  }
6942
7023
  };
6943
7024
 
6944
- // src/renderers/getRenderFunction.tsx
7025
+ // src/renderers/EmptyLoadingStateRenderer.tsx
6945
7026
  import { Fragment as Fragment4, jsx as jsx5 } from "react/jsx-runtime";
7027
+ var EmptyLoadingStateRenderer = {
7028
+ canRenderType: "loading-state",
7029
+ render: () => /* @__PURE__ */ jsx5(Fragment4, {})
7030
+ };
7031
+
7032
+ // src/renderers/getRenderFunction.tsx
7033
+ import { Fragment as Fragment5, jsx as jsx6 } from "react/jsx-runtime";
6946
7034
  var getRenderFunction = (renderers) => {
6947
7035
  function ComponentRenderer(props) {
6948
7036
  const { type } = props;
@@ -6962,9 +7050,9 @@ var getRenderFunction = (renderers) => {
6962
7050
  }
6963
7051
  const render = (props) => {
6964
7052
  if (!props) {
6965
- return /* @__PURE__ */ jsx5(Fragment4, {});
7053
+ return /* @__PURE__ */ jsx6(Fragment5, {});
6966
7054
  }
6967
- return /* @__PURE__ */ jsx5(ComponentRenderer, __spreadValues({}, props), props.uid);
7055
+ return /* @__PURE__ */ jsx6(ComponentRenderer, __spreadValues({}, props), props.uid);
6968
7056
  };
6969
7057
  return render;
6970
7058
  };
@@ -7861,14 +7949,17 @@ var getToolbarProps = (toolbar, rendererMapperProps) => {
7861
7949
 
7862
7950
  // src/renderers/mappers/rootComponentToProps.ts
7863
7951
  var rootComponentToProps = (rootComponent, rendererMapperProps) => {
7864
- const childrenProps = rootComponent.getChildren().map((child) => {
7865
- if (child.type === "step") {
7866
- return stepComponentToProps(child, __spreadProps(__spreadValues({}, rendererMapperProps), {
7867
- showBack: rootComponent.canPerformBack()
7868
- }));
7869
- }
7870
- return componentToRendererProps(child, rendererMapperProps);
7871
- });
7952
+ const childrenProps = [
7953
+ __spreadValues({ type: "loading-state", uid: "loading-state" }, rendererMapperProps),
7954
+ ...rootComponent.getChildren().map((child) => {
7955
+ if (child.type === "step") {
7956
+ return stepComponentToProps(child, __spreadProps(__spreadValues({}, rendererMapperProps), {
7957
+ showBack: rootComponent.canPerformBack()
7958
+ }));
7959
+ }
7960
+ return componentToRendererProps(child, rendererMapperProps);
7961
+ })
7962
+ ];
7872
7963
  const subflow = rootComponent.subflow ? {
7873
7964
  presentation: rootComponent.subflow.presentation,
7874
7965
  children: rendererMapperProps.render(
@@ -7886,19 +7977,7 @@ var rootComponentToProps = (rootComponent, rendererMapperProps) => {
7886
7977
 
7887
7978
  // src/renderers/mappers/searchComponentToProps.ts
7888
7979
  var searchComponentToProps = (component, rendererMapperProps) => {
7889
- const {
7890
- uid,
7891
- control,
7892
- emptyMessage,
7893
- error,
7894
- hint,
7895
- isLoading,
7896
- margin,
7897
- query,
7898
- results,
7899
- title,
7900
- tags
7901
- } = component;
7980
+ const { uid, control, emptyMessage, error, hint, isLoading, margin, query, title, tags } = component;
7902
7981
  const onChange = component.onChange.bind(component);
7903
7982
  const onSelect = component.onSelect.bind(component);
7904
7983
  const state = getSearchState({
@@ -7906,7 +7985,8 @@ var searchComponentToProps = (component, rendererMapperProps) => {
7906
7985
  error,
7907
7986
  isLoading,
7908
7987
  query,
7909
- results,
7988
+ state: component.state,
7989
+ rendererMapperProps,
7910
7990
  onChange,
7911
7991
  onSelect
7912
7992
  });
@@ -7930,29 +8010,46 @@ var getSearchState = ({
7930
8010
  error,
7931
8011
  isLoading,
7932
8012
  query,
7933
- results,
8013
+ state,
8014
+ rendererMapperProps,
7934
8015
  onChange,
7935
8016
  onSelect
7936
8017
  }) => {
7937
- if (!query || isLoading) {
8018
+ if (isLoading) {
7938
8019
  return { type: "pending" };
7939
8020
  }
7940
8021
  if (error) {
7941
8022
  return { type: "error", onRetry: () => onChange(query) };
7942
8023
  }
7943
- if (results.length === 0) {
8024
+ if (!state) {
7944
8025
  return { type: "noResults", message: emptyMessage };
7945
8026
  }
7946
- const rendererResults = results.map((result) => {
7947
- var _a;
7948
- return __spreadProps(__spreadValues({}, result), {
7949
- id: result.type === "action" ? (_a = result.value.id) != null ? _a : result.value.$id : void 0,
7950
- image: mapSpecImage(result.image),
7951
- media: getDomainLayerMedia(result),
7952
- onClick: () => onSelect(result)
7953
- });
7954
- });
7955
- return { type: "results", results: rendererResults };
8027
+ if (state.type === "layout") {
8028
+ const { content } = state;
8029
+ const layoutProps = content.map(
8030
+ (component) => componentToRendererProps(component, rendererMapperProps)
8031
+ );
8032
+ return {
8033
+ type: "layout",
8034
+ layout: layoutProps.map((props) => rendererMapperProps.render(props)),
8035
+ layoutProps
8036
+ };
8037
+ }
8038
+ if (query && state.results.length === 0) {
8039
+ return { type: "noResults", message: emptyMessage };
8040
+ }
8041
+ return {
8042
+ type: "results",
8043
+ results: state.results.map((result) => {
8044
+ var _a;
8045
+ return __spreadProps(__spreadValues({}, result), {
8046
+ id: result.type === "action" ? (_a = result.value.id) != null ? _a : result.value.$id : void 0,
8047
+ image: mapSpecImage(result.image),
8048
+ media: getDomainLayerMedia(result),
8049
+ onClick: () => onSelect(result)
8050
+ });
8051
+ })
8052
+ };
7956
8053
  };
7957
8054
 
7958
8055
  // src/renderers/mappers/sectionComponentToProps.ts
@@ -8246,7 +8343,7 @@ function useStableCallback(handler) {
8246
8343
  }
8247
8344
 
8248
8345
  // src/useDynamicFlow.tsx
8249
- import { jsx as jsx6 } from "react/jsx-runtime";
8346
+ import { jsx as jsx7 } from "react/jsx-runtime";
8250
8347
  var className = "dynamic-flow";
8251
8348
  var noop3 = () => {
8252
8349
  };
@@ -8297,10 +8394,15 @@ function useDynamicFlow(props) {
8297
8394
  scrollToTop
8298
8395
  }));
8299
8396
  const render = useMemo(
8300
- () => getRenderFunction([CoreRootRenderer, CoreContainerRenderer, ...renderers]),
8397
+ () => getRenderFunction([
8398
+ CoreRootRenderer,
8399
+ CoreContainerRenderer,
8400
+ ...renderers,
8401
+ EmptyLoadingStateRenderer
8402
+ ]),
8301
8403
  [renderers]
8302
8404
  );
8303
- const tree = componentToRendererProps(rootComponent, {
8405
+ const rendererProps = componentToRendererProps(rootComponent, {
8304
8406
  features,
8305
8407
  render,
8306
8408
  httpClient,
@@ -8312,9 +8414,13 @@ function useDynamicFlow(props) {
8312
8414
  controller: {
8313
8415
  getSubmittableValue: async () => rootComponent.getSubmittableValue(),
8314
8416
  validate: () => rootComponent.validate(),
8417
+ /**
8418
+ * @experimental This is not a public API and may be removed in the future without notice
8419
+ */
8420
+ rendererProps,
8315
8421
  cancel
8316
8422
  },
8317
- view: /* @__PURE__ */ jsx6(
8423
+ view: /* @__PURE__ */ jsx7(
8318
8424
  ErrorBoundary_default,
8319
8425
  {
8320
8426
  onError: (error) => {
@@ -8324,7 +8430,7 @@ function useDynamicFlow(props) {
8324
8430
  errorMessage: getErrorMessage(error)
8325
8431
  });
8326
8432
  },
8327
- children: /* @__PURE__ */ jsx6("div", { id: normalisedFlowId, className, children: render(tree) })
8433
+ children: /* @__PURE__ */ jsx7("div", { id: normalisedFlowId, className, children: render(rendererProps) })
8328
8434
  }
8329
8435
  )
8330
8436
  };
@@ -1,5 +1,5 @@
1
1
  import type { SearchResult } from '@wise/dynamic-flow-types/spec';
2
- import type { BaseLayoutComponent, OnBehavior, OnComponentUpdate } from '../../types';
2
+ import type { BaseLayoutComponent, LayoutComponent, OnBehavior, OnComponentUpdate } from '../../types';
3
3
  export type SearchConfig = {
4
4
  method: string;
5
5
  param: string;
@@ -10,19 +10,27 @@ export type SearchProps = {
10
10
  query: string;
11
11
  signal: AbortSignal;
12
12
  };
13
- export type PerformSearch = (props: SearchProps) => Promise<SearchResult[]>;
13
+ export type SearchResultsState = {
14
+ type: 'layout';
15
+ content: LayoutComponent[];
16
+ } | {
17
+ type: 'results';
18
+ results: SearchResult[];
19
+ };
20
+ export type PerformSearch = (props: SearchProps) => Promise<SearchResultsState | null>;
14
21
  export type SearchComponent = BaseLayoutComponent & {
15
22
  type: 'search';
16
23
  kind: 'layout';
17
24
  emptyMessage: string;
25
+ initialState: SearchResultsState;
18
26
  hint?: string;
19
27
  isLoading: boolean;
20
28
  query: string;
21
29
  title: string;
22
- results: SearchResult[];
30
+ state: SearchResultsState;
23
31
  error?: string;
24
32
  onChange: (query: string) => void;
25
33
  onSelect: (result: SearchResult) => void;
26
34
  };
27
- export declare const createSearchComponent: (searchProps: Pick<SearchComponent, "uid" | "analyticsId" | "control" | "emptyMessage" | "hint" | "margin" | "tags" | "title">, performSearch: PerformSearch, onBehavior: OnBehavior, onComponentUpdate: OnComponentUpdate) => SearchComponent;
35
+ export declare const createSearchComponent: (searchProps: Pick<SearchComponent, "uid" | "analyticsId" | "control" | "emptyMessage" | "initialState" | "hint" | "margin" | "tags" | "title">, performSearch: PerformSearch, onBehavior: OnBehavior, onComponentUpdate: OnComponentUpdate) => SearchComponent;
28
36
  //# sourceMappingURL=SearchComponent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SearchComponent.d.ts","sourceRoot":"","sources":["../../../../../src/domain/components/searchComponent/SearchComponent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAKtF,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;AAE5E,MAAM,MAAM,eAAe,GAAG,mBAAmB,GAAG;IAClD,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;CAC1C,CAAC;AAIF,eAAO,MAAM,qBAAqB,GAChC,aAAa,IAAI,CACf,eAAe,EACf,KAAK,GAAG,aAAa,GAAG,SAAS,GAAG,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAC1F,EACD,eAAe,aAAa,EAC5B,YAAY,UAAU,EACtB,mBAAmB,iBAAiB,KACnC,eA+EF,CAAC"}
1
+ {"version":3,"file":"SearchComponent.d.ts","sourceRoot":"","sources":["../../../../../src/domain/components/searchComponent/SearchComponent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EACf,UAAU,EACV,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAKrB,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B,GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB,CAAC;AAEN,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;AAEvF,MAAM,MAAM,eAAe,GAAG,mBAAmB,GAAG;IAClD,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,kBAAkB,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,kBAAkB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;CAC1C,CAAC;AAIF,eAAO,MAAM,qBAAqB,GAChC,aAAa,IAAI,CACf,eAAe,EACb,KAAK,GACL,aAAa,GACb,SAAS,GACT,cAAc,GACd,cAAc,GACd,MAAM,GACN,QAAQ,GACR,MAAM,GACN,OAAO,CACV,EACD,eAAe,aAAa,EAC5B,YAAY,UAAU,EACtB,mBAAmB,iBAAiB,KACnC,eA6FF,CAAC"}
@@ -1,4 +1,6 @@
1
1
  import type { SearchConfig, PerformSearch } from '../../components/searchComponent/SearchComponent';
2
2
  import type { HttpClient } from '../../../types';
3
- export declare const getPerformSearchFunction: (httpClient: HttpClient, defaultConfig: SearchConfig) => PerformSearch;
3
+ import type { Layout } from '@wise/dynamic-flow-types/spec';
4
+ import { LayoutComponent } from '../../types';
5
+ export declare const getPerformSearchFunction: (httpClient: HttpClient, mapLayoutToDomainComponent: (layout: Layout, index: number) => LayoutComponent, defaultConfig: SearchConfig) => PerformSearch;
4
6
  //# sourceMappingURL=getPerformSearchFunction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getPerformSearchFunction.d.ts","sourceRoot":"","sources":["../../../../../src/domain/features/search/getPerformSearchFunction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kDAAkD,CAAC;AAEpG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,eAAO,MAAM,wBAAwB,GACnC,YAAY,UAAU,EACtB,eAAe,YAAY,KAC1B,aA+BF,CAAC"}
1
+ {"version":3,"file":"getPerformSearchFunction.d.ts","sourceRoot":"","sources":["../../../../../src/domain/features/search/getPerformSearchFunction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EAEd,MAAM,kDAAkD,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAwC,MAAM,+BAA+B,CAAC;AAClG,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,wBAAwB,GACnC,YAAY,UAAU,EACtB,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,eAAe,EAC9E,eAAe,YAAY,KAC1B,aAyCF,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { SearchLayout } from '@wise/dynamic-flow-types/spec';
2
+ import { SearchComponent } from '../../components/searchComponent/SearchComponent';
2
3
  import type { MapperProps } from '../schema/types';
3
- export declare const searchLayoutToComponent: (uid: string, { analyticsId, control, emptyMessage, hint, method, param, title, url, margin, tags }: SearchLayout, mapperProps: MapperProps) => import("../../components/searchComponent/SearchComponent").SearchComponent;
4
+ export declare const searchLayoutToComponent: (uid: string, { analyticsId, control, emptyMessage, initialState, hint, method, param, title, url, margin, tags, }: SearchLayout, mapperProps: MapperProps) => SearchComponent;
4
5
  //# sourceMappingURL=searchLayoutToComponent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"searchLayoutToComponent.d.ts","sourceRoot":"","sources":["../../../../../src/domain/mappers/layout/searchLayoutToComponent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGlE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,eAAO,MAAM,uBAAuB,GAClC,KAAK,MAAM,EACX,uFAAuF,YAAY,EACnG,aAAa,WAAW,+EAoBzB,CAAC"}
1
+ {"version":3,"file":"searchLayoutToComponent.d.ts","sourceRoot":"","sources":["../../../../../src/domain/mappers/layout/searchLayoutToComponent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAEL,eAAe,EAEhB,MAAM,kDAAkD,CAAC;AAG1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,eAAO,MAAM,uBAAuB,GAClC,KAAK,MAAM,EACX,sGAYG,YAAY,EACf,aAAa,WAAW,oBA0BzB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { LoadingStateRendererProps, Renderer } from '@wise/dynamic-flow-types/renderers';
2
+ export declare const EmptyLoadingStateRenderer: Renderer<LoadingStateRendererProps>;
3
+ //# sourceMappingURL=EmptyLoadingStateRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyLoadingStateRenderer.d.ts","sourceRoot":"","sources":["../../../src/renderers/EmptyLoadingStateRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAE9F,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,yBAAyB,CAGzE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"rootComponentToProps.d.ts","sourceRoot":"","sources":["../../../../src/renderers/mappers/rootComponentToProps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAA4B,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAG3F,eAAO,MAAM,oBAAoB,GAC/B,eAAe,mBAAmB,EAClC,qBAAqB,mBAAmB,KACvC,iBA6BF,CAAC"}
1
+ {"version":3,"file":"rootComponentToProps.d.ts","sourceRoot":"","sources":["../../../../src/renderers/mappers/rootComponentToProps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAA4B,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAG3F,eAAO,MAAM,oBAAoB,GAC/B,eAAe,mBAAmB,EAClC,qBAAqB,mBAAmB,KACvC,iBA+BF,CAAC"}
@@ -1,5 +1,5 @@
1
- import type { SearchComponent } from '../../domain/components/searchComponent/SearchComponent';
2
1
  import type { SearchRendererProps } from '@wise/dynamic-flow-types/renderers';
2
+ import type { SearchComponent } from '../../domain/components/searchComponent/SearchComponent';
3
3
  import { RendererMapperProps } from './componentToRendererProps';
4
4
  export declare const searchComponentToProps: (component: SearchComponent, rendererMapperProps: RendererMapperProps) => SearchRendererProps;
5
5
  //# sourceMappingURL=searchComponentToProps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"searchComponentToProps.d.ts","sourceRoot":"","sources":["../../../../src/renderers/mappers/searchComponentToProps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yDAAyD,CAAC;AAC/F,OAAO,KAAK,EAAE,mBAAmB,EAAe,MAAM,oCAAoC,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAIjE,eAAO,MAAM,sBAAsB,GACjC,WAAW,eAAe,EAC1B,qBAAqB,mBAAmB,KACvC,mBA0CF,CAAC"}
1
+ {"version":3,"file":"searchComponentToProps.d.ts","sourceRoot":"","sources":["../../../../src/renderers/mappers/searchComponentToProps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAe,MAAM,oCAAoC,CAAC;AAE3F,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,yDAAyD,CAAC;AAGjE,OAAO,EAA4B,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAE3F,eAAO,MAAM,sBAAsB,GACjC,WAAW,eAAe,EAC1B,qBAAqB,mBAAmB,KACvC,mBAgCF,CAAC"}
@@ -1,3 +1,3 @@
1
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").MediaRendererProps> | 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> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").UpsellRendererProps>)[];
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").LoadingStateRendererProps> | 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").MediaRendererProps> | 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> | import("@wise/dynamic-flow-types/renderers").Renderer<import("@wise/dynamic-flow-types/renderers").UpsellRendererProps>)[];
3
3
  //# sourceMappingURL=getMergedTestRenderers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getMergedTestRenderers.d.ts","sourceRoot":"","sources":["../../../src/test-utils/getMergedTestRenderers.tsx"],"names":[],"mappings":"AACA,OAAwB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAM1E,eAAO,MAAM,sBAAsB,GAAI,OAAO,oBAAoB,0vKA8BjE,CAAC"}
1
+ {"version":3,"file":"getMergedTestRenderers.d.ts","sourceRoot":"","sources":["../../../src/test-utils/getMergedTestRenderers.tsx"],"names":[],"mappings":"AAKA,OAAwB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAM1E,eAAO,MAAM,sBAAsB,GAAI,OAAO,oBAAoB,03KAgCjE,CAAC"}
@@ -6,6 +6,10 @@ export declare function useDynamicFlow(props: DynamicFlowCoreProps): {
6
6
  controller: {
7
7
  getSubmittableValue: () => Promise<import("@wise/dynamic-flow-types/spec").JsonElement>;
8
8
  validate: () => boolean;
9
+ /**
10
+ * @experimental This is not a public API and may be removed in the future without notice
11
+ */
12
+ rendererProps: import("@wise/dynamic-flow-types/renderers").RendererProps;
9
13
  cancel: () => void;
10
14
  };
11
15
  view: import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"useDynamicFlow.d.ts","sourceRoot":"","sources":["../../src/useDynamicFlow.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AASpD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,oBAAoB;;;;;;;EAyFzD"}
1
+ {"version":3,"file":"useDynamicFlow.d.ts","sourceRoot":"","sources":["../../src/useDynamicFlow.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AASpD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,oBAAoB;;;;QA6EpD;;WAEG;;;;;EAoBR"}
@@ -10,6 +10,7 @@ export declare const useDynamicFlowModal: (props: DynamicFlowProps) => {
10
10
  controller: {
11
11
  getSubmittableValue: () => Promise<JsonElement>;
12
12
  validate: () => boolean;
13
+ rendererProps: import("@wise/dynamic-flow-types/renderers").RendererProps;
13
14
  cancel: () => void;
14
15
  };
15
16
  view: import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"useDynamicFlowModal.d.ts","sourceRoot":"","sources":["../../src/useDynamicFlowModal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAkB,MAAM,GAAG,CAAC;AAuBrD,eAAO,MAAM,mBAAmB,GAAI,OAAO,gBAAgB;;;;;;;;;;;;;CA2D1D,CAAC"}
1
+ {"version":3,"file":"useDynamicFlowModal.d.ts","sourceRoot":"","sources":["../../src/useDynamicFlowModal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAkB,MAAM,GAAG,CAAC;AAuBrD,eAAO,MAAM,mBAAmB,GAAI,OAAO,gBAAgB;;;;;;;;;;;;;;CA2D1D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wise/dynamic-flow-client",
3
- "version": "5.8.0",
3
+ "version": "5.9.0-experimental-rendererprops-9c9a4b8",
4
4
  "description": "Dynamic Flow web client",
5
5
  "license": "Apache-2.0",
6
6
  "main": "./build/main.js",
@@ -72,8 +72,8 @@
72
72
  "typescript": "5.9.3",
73
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",
@@ -86,7 +86,7 @@
86
86
  "react-intl": "^6 || ^7"
87
87
  },
88
88
  "dependencies": {
89
- "@wise/dynamic-flow-types": "4.8.0"
89
+ "@wise/dynamic-flow-types": "4.9.0-experimental-rendererprops-9c9a4b8"
90
90
  },
91
91
  "scripts": {
92
92
  "dev": "EXCLUDE_VISUAL_TESTS=true pnpm storybook dev -p 3003",