@player-ui/storybook 0.4.0-next.9 → 0.4.1-next.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.
package/dist/index.cjs.js CHANGED
@@ -5,28 +5,53 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var React = require('react');
6
6
  var addons = require('@storybook/addons');
7
7
  var storybookDarkMode = require('storybook-dark-mode');
8
- var dequal = require('dequal');
8
+ var deepEqual = require('deep-equal');
9
9
  var Editor = require('@monaco-editor/react');
10
- var uuid = require('uuid');
11
- var table = require('@devtools-ds/table');
12
- var makeClass = require('clsx');
13
10
  var components = require('@storybook/components');
14
- var api = require('@storybook/api');
15
- var coreEvents = require('@storybook/core-events');
16
- var beaconPluginReact = require('@player-ui/beacon-plugin-react');
11
+ var reactRedux = require('react-redux');
12
+ var PlayerDSL = require('@player-tools/dsl');
13
+ var toolkit = require('@reduxjs/toolkit');
14
+ var reduxStateSync = require('redux-state-sync');
15
+ var browser = require('esbuild-wasm/lib/browser');
17
16
  var react$1 = require('@player-ui/react');
18
- var react = require('@chakra-ui/react');
17
+ var beaconPluginReact = require('@player-ui/beacon-plugin-react');
19
18
  var makeFlow = require('@player-ui/make-flow');
20
- var addonDocs = require('@storybook/addon-docs');
21
19
  var lzString = require('lz-string');
22
20
  var metricsPluginReact = require('@player-ui/metrics-plugin-react');
21
+ var uuid = require('uuid');
23
22
  var player = require('@player-ui/player');
23
+ var react = require('@chakra-ui/react');
24
+ var table = require('@devtools-ds/table');
25
+ var makeClass = require('clsx');
26
+ var api = require('@storybook/api');
27
+ var coreEvents = require('@storybook/core-events');
24
28
 
25
29
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
26
30
 
31
+ function _interopNamespace(e) {
32
+ if (e && e.__esModule) return e;
33
+ var n = Object.create(null);
34
+ if (e) {
35
+ Object.keys(e).forEach(function (k) {
36
+ if (k !== 'default') {
37
+ var d = Object.getOwnPropertyDescriptor(e, k);
38
+ Object.defineProperty(n, k, d.get ? d : {
39
+ enumerable: true,
40
+ get: function () { return e[k]; }
41
+ });
42
+ }
43
+ });
44
+ }
45
+ n["default"] = e;
46
+ return Object.freeze(n);
47
+ }
48
+
49
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
27
50
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
28
51
  var addons__default = /*#__PURE__*/_interopDefaultLegacy(addons);
52
+ var deepEqual__default = /*#__PURE__*/_interopDefaultLegacy(deepEqual);
29
53
  var Editor__default = /*#__PURE__*/_interopDefaultLegacy(Editor);
54
+ var PlayerDSL__namespace = /*#__PURE__*/_interopNamespace(PlayerDSL);
30
55
  var makeClass__default = /*#__PURE__*/_interopDefaultLegacy(makeClass);
31
56
 
32
57
  const ADDON_ID = "web-player/addon";
@@ -35,325 +60,73 @@ const EVENT_PANEL_ID = `${ADDON_ID}/events-panel`;
35
60
  const FLOW_REFRESH_TOOL_ID = `${ADDON_ID}/flow-refresh-tool`;
36
61
  const RENDER_SELECT_TOOL_ID = `${ADDON_ID}/render-select-tool`;
37
62
 
38
- var __defProp$2 = Object.defineProperty;
39
- var __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;
40
- var __hasOwnProp$2 = Object.prototype.hasOwnProperty;
41
- var __propIsEnum$2 = Object.prototype.propertyIsEnumerable;
42
- var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
43
- var __spreadValues$2 = (a, b) => {
63
+ var __defProp$4 = Object.defineProperty;
64
+ var __getOwnPropSymbols$4 = Object.getOwnPropertySymbols;
65
+ var __hasOwnProp$4 = Object.prototype.hasOwnProperty;
66
+ var __propIsEnum$4 = Object.prototype.propertyIsEnumerable;
67
+ var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
68
+ var __spreadValues$4 = (a, b) => {
44
69
  for (var prop in b || (b = {}))
45
- if (__hasOwnProp$2.call(b, prop))
46
- __defNormalProp$2(a, prop, b[prop]);
47
- if (__getOwnPropSymbols$2)
48
- for (var prop of __getOwnPropSymbols$2(b)) {
49
- if (__propIsEnum$2.call(b, prop))
50
- __defNormalProp$2(a, prop, b[prop]);
70
+ if (__hasOwnProp$4.call(b, prop))
71
+ __defNormalProp$4(a, prop, b[prop]);
72
+ if (__getOwnPropSymbols$4)
73
+ for (var prop of __getOwnPropSymbols$4(b)) {
74
+ if (__propIsEnum$4.call(b, prop))
75
+ __defNormalProp$4(a, prop, b[prop]);
51
76
  }
52
77
  return a;
53
78
  };
54
- function createEvent(base) {
55
- return __spreadValues$2({
56
- id: uuid.v4(),
57
- time: Date.now()
58
- }, base);
59
- }
60
-
61
- function subscribe(chan, eventName, callback) {
62
- const handler = (payload) => {
63
- callback(JSON.parse(payload));
64
- };
65
- chan.addListener(eventName, handler);
66
- return () => {
67
- chan.removeListener(eventName, handler);
68
- };
69
- }
70
- function publish(chan, event) {
71
- chan.emit(event.type, JSON.stringify(event));
72
- }
73
- function useStateActions(chan) {
74
- return React__default["default"].useMemo(() => ({
75
- addEvents: (events) => {
76
- publish(chan, {
77
- type: "@@player/event/add",
78
- events
79
- });
80
- },
81
- setMetrics: (metrics) => {
82
- publish(chan, {
83
- type: "@@player/metrics/set",
84
- metrics
85
- });
86
- },
87
- clearEvents: () => {
88
- publish(chan, {
89
- type: "@@player/event/clear"
90
- });
91
- },
92
- setFlow: (flow) => {
93
- publish(chan, {
94
- type: "@@player/flow/set",
95
- flow
96
- });
97
- },
98
- resetFlow: () => {
99
- publish(chan, { type: "@@player/flow/reset" });
100
- },
101
- setPlatform: (platform) => {
102
- publish(chan, { type: "@@player/platform/set", platform });
103
- }
104
- }), [chan]);
105
- }
106
- function useEventState(chan) {
107
- const [events, setEvents] = React__default["default"].useState([]);
108
- React__default["default"].useEffect(() => {
109
- const unsubAdd = subscribe(chan, "@@player/event/add", (evt) => setEvents((old) => [...old, ...evt.events]));
110
- const unsubClear = subscribe(chan, "@@player/event/clear", () => {
111
- setEvents([]);
112
- });
113
- return () => {
114
- unsubAdd();
115
- unsubClear();
116
- };
117
- }, [chan]);
118
- return events;
119
- }
120
- function useFlowState(chan) {
121
- const [flow, setFlow] = React__default["default"].useState();
122
- React__default["default"].useEffect(() => {
123
- return subscribe(chan, "@@player/flow/set", (evt) => {
124
- setFlow(evt.flow);
125
- });
126
- }, [chan]);
127
- return flow;
128
- }
129
-
130
- const EditorPanel = (props) => {
131
- const { active } = props;
132
- const darkMode = storybookDarkMode.useDarkMode();
133
- const flow = useFlowState(props.api.getChannel());
134
- const actions = useStateActions(props.api.getChannel());
135
- const [editorValue, setEditorValue] = React__default["default"].useState(flow ? JSON.stringify(flow, null, 2) : "{}");
136
- const updateTimerRef = React__default["default"].useRef(void 0);
137
- function clearPending() {
138
- if (updateTimerRef.current) {
139
- clearTimeout(updateTimerRef.current);
140
- updateTimerRef.current = void 0;
141
- }
142
- }
143
- React__default["default"].useEffect(() => {
144
- if (!active) {
145
- return;
146
- }
147
- try {
148
- if (editorValue) {
149
- const parsed = JSON.parse(editorValue);
150
- if (dequal.dequal(flow, parsed)) {
151
- return;
152
- }
153
- }
154
- } catch (e) {
155
- }
156
- setEditorValue(JSON.stringify(flow, null, 2));
157
- }, [flow, active]);
158
- if (!active) {
159
- return null;
160
- }
161
- const onChange = (val) => {
162
- clearPending();
163
- setEditorValue(val != null ? val : "");
164
- try {
165
- if (val) {
166
- const parsed = JSON.parse(val);
167
- if (!dequal.dequal(parsed, flow)) {
168
- updateTimerRef.current = setTimeout(() => {
169
- if (active) {
170
- actions.setFlow(parsed);
171
- }
172
- }, 1e3);
173
- }
79
+ var __async$2 = (__this, __arguments, generator) => {
80
+ return new Promise((resolve, reject) => {
81
+ var fulfilled = (value) => {
82
+ try {
83
+ step(generator.next(value));
84
+ } catch (e) {
85
+ reject(e);
174
86
  }
175
- } catch (e) {
176
- }
177
- };
178
- return /* @__PURE__ */ React__default["default"].createElement("div", null, /* @__PURE__ */ React__default["default"].createElement(Editor__default["default"], {
179
- theme: darkMode ? "vs-dark" : "light",
180
- value: editorValue,
181
- language: "json",
182
- options: {
183
- formatOnPaste: true
184
- },
185
- onChange
186
- }));
187
- };
188
-
189
- var e=[],t=[];function n(n,r){if(n&&"undefined"!=typeof document){var a,s=!0===r.prepend?"prepend":"append",d=!0===r.singleTag,i="string"==typeof r.container?document.querySelector(r.container):document.getElementsByTagName("head")[0];if(d){var u=e.indexOf(i);-1===u&&(u=e.push(i)-1,t[u]={}),a=t[u]&&t[u][s]?t[u][s]:t[u][s]=c();}else a=c();65279===n.charCodeAt(0)&&(n=n.substring(1)),a.styleSheet?a.styleSheet.cssText+=n:a.appendChild(document.createTextNode(n));}function c(){var e=document.createElement("style");if(e.setAttribute("type","text/css"),r.attributes)for(var t=Object.keys(r.attributes),n=0;n<t.length;n++)e.setAttribute(t[n],r.attributes[t[n]]);var a="prepend"===s?"afterbegin":"beforeend";return i.insertAdjacentElement(a,e),e}}
190
-
191
- var css = "\n.events_header__1bcc1085 td {\n width: 200px;\n}\n\n.events_body__1bcc1085 td {\n}\n";
192
- var modules_2563542d = {"header":"events_header__1bcc1085","body":"events_body__1bcc1085"};
193
- n(css,{});
194
-
195
- var __defProp$1 = Object.defineProperty;
196
- var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
197
- var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
198
- var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
199
- var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
200
- var __spreadValues$1 = (a, b) => {
201
- for (var prop in b || (b = {}))
202
- if (__hasOwnProp$1.call(b, prop))
203
- __defNormalProp$1(a, prop, b[prop]);
204
- if (__getOwnPropSymbols$1)
205
- for (var prop of __getOwnPropSymbols$1(b)) {
206
- if (__propIsEnum$1.call(b, prop))
207
- __defNormalProp$1(a, prop, b[prop]);
208
- }
209
- return a;
210
- };
211
- const ExtraCells = (event) => {
212
- var _a, _b;
213
- if (event.type === "log") {
214
- return /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, /* @__PURE__ */ React__default["default"].createElement("td", null, event.severity), /* @__PURE__ */ React__default["default"].createElement("td", null, event.message.map((a) => JSON.stringify(a)).join(" ")));
215
- }
216
- if (event.type === "dataChange") {
217
- return /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, /* @__PURE__ */ React__default["default"].createElement("td", null, event.binding), /* @__PURE__ */ React__default["default"].createElement("td", null, `${JSON.stringify(event.from)} \u279C ${JSON.stringify(event.to)}`));
218
- }
219
- if (event.type === "stateChange") {
220
- let name = event.state;
221
- if (event.state === "completed") {
222
- name = `${name} (${event.error ? "error" : "success"})`;
223
- }
224
- return /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, /* @__PURE__ */ React__default["default"].createElement("td", null, name), /* @__PURE__ */ React__default["default"].createElement("td", null, (_b = (_a = event.outcome) != null ? _a : event.error) != null ? _b : ""));
225
- }
226
- if (event.type === "metric") {
227
- return /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, /* @__PURE__ */ React__default["default"].createElement("td", null, event.metricType), /* @__PURE__ */ React__default["default"].createElement("td", null, event.message));
228
- }
229
- return null;
230
- };
231
- const EventsPanel = (props) => {
232
- const events = useEventState(props.api.getChannel());
233
- const darkMode = storybookDarkMode.useDarkMode();
234
- if (!props.active) {
235
- return null;
236
- }
237
- return /* @__PURE__ */ React__default["default"].createElement("div", {
238
- className: makeClass__default["default"](modules_2563542d.wrapper, {
239
- [modules_2563542d.dark]: darkMode
240
- })
241
- }, /* @__PURE__ */ React__default["default"].createElement(table.Table, {
242
- colorScheme: darkMode ? "dark" : "light"
243
- }, /* @__PURE__ */ React__default["default"].createElement(table.Head, {
244
- className: modules_2563542d.header
245
- }, /* @__PURE__ */ React__default["default"].createElement(table.Row, null, /* @__PURE__ */ React__default["default"].createElement(table.HeadCell, null, "Time"), /* @__PURE__ */ React__default["default"].createElement(table.HeadCell, null, "Type"), /* @__PURE__ */ React__default["default"].createElement(table.HeadCell, null), /* @__PURE__ */ React__default["default"].createElement(table.HeadCell, null))), /* @__PURE__ */ React__default["default"].createElement(table.Body, {
246
- className: modules_2563542d.body
247
- }, events.map((evt) => /* @__PURE__ */ React__default["default"].createElement(table.Row, {
248
- key: evt.id
249
- }, /* @__PURE__ */ React__default["default"].createElement(table.Cell, null, evt.time), /* @__PURE__ */ React__default["default"].createElement(table.Cell, null, evt.type), /* @__PURE__ */ React__default["default"].createElement(ExtraCells, __spreadValues$1({}, evt)))))));
250
- };
251
-
252
- const FlowRefresh = ({ api }) => {
253
- const actions = useStateActions(api.getChannel());
254
- return /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, /* @__PURE__ */ React__default["default"].createElement(components.Separator, null), /* @__PURE__ */ React__default["default"].createElement(components.IconButton, {
255
- title: "Reset the current flow",
256
- onClick: () => {
257
- actions.resetFlow();
258
- }
259
- }, /* @__PURE__ */ React__default["default"].createElement(components.Icons, {
260
- icon: "sync"
261
- })));
262
- };
263
-
264
- const RenderSelection = ({ api: api$1 }) => {
265
- const params = api.useParameter("appetizeTokens", {});
266
- const actions = useStateActions(api$1.getChannel());
267
- const [selectedPlatform, setPlatform] = React__default["default"].useState("web");
268
- React__default["default"].useEffect(() => {
269
- const listener = () => {
270
- setPlatform("web");
271
87
  };
272
- api$1.getChannel().addListener(coreEvents.STORY_CHANGED, listener);
273
- return () => {
274
- api$1.getChannel().removeListener(coreEvents.STORY_CHANGED, listener);
88
+ var rejected = (value) => {
89
+ try {
90
+ step(generator.throw(value));
91
+ } catch (e) {
92
+ reject(e);
93
+ }
275
94
  };
276
- }, [api$1]);
277
- const mobilePlatforms = Object.keys(params);
278
- if (mobilePlatforms.length === 0) {
279
- return null;
280
- }
281
- return /* @__PURE__ */ React__default["default"].createElement(components.WithTooltip, {
282
- closeOnClick: true,
283
- placement: "top",
284
- trigger: "click",
285
- tooltip: ({ onHide }) => /* @__PURE__ */ React__default["default"].createElement(components.TooltipLinkList, {
286
- links: ["web", ...mobilePlatforms].map((platform) => ({
287
- id: platform,
288
- title: platform,
289
- onClick: () => {
290
- setPlatform(platform);
291
- actions.setPlatform(platform);
292
- onHide();
293
- },
294
- value: platform,
295
- active: platform === selectedPlatform
296
- }))
297
- })
298
- }, /* @__PURE__ */ React__default["default"].createElement(components.IconButton, {
299
- title: "Change the render target"
300
- }, /* @__PURE__ */ React__default["default"].createElement(components.Icons, {
301
- icon: selectedPlatform === "web" ? "browser" : "mobile"
302
- })));
95
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
96
+ step((generator = generator.apply(__this, __arguments)).next());
97
+ });
303
98
  };
304
-
305
- function register() {
306
- addons__default["default"].register(ADDON_ID, (api) => {
307
- addons__default["default"].addPanel(EVENT_PANEL_ID, {
308
- title: "Events",
309
- render: ({ active, key }) => /* @__PURE__ */ React__default["default"].createElement(EventsPanel, {
310
- key,
311
- api,
312
- active: Boolean(active)
313
- })
314
- });
315
- addons__default["default"].addPanel(FLOW_PANEL_ID, {
316
- title: "Flow",
317
- render: ({ active, key }) => /* @__PURE__ */ React__default["default"].createElement(EditorPanel, {
318
- key,
319
- api,
320
- active: Boolean(active)
321
- })
322
- });
323
- addons__default["default"].add(FLOW_REFRESH_TOOL_ID, {
324
- title: "Refresh Flow",
325
- type: addons.types.TOOL,
326
- render: () => /* @__PURE__ */ React__default["default"].createElement(FlowRefresh, {
327
- api
328
- })
329
- });
330
- addons__default["default"].add(RENDER_SELECT_TOOL_ID, {
331
- title: "Render Selection",
332
- type: addons.types.TOOL,
333
- render: () => /* @__PURE__ */ React__default["default"].createElement(RenderSelection, {
334
- api
335
- })
99
+ const setup = (() => __async$2(undefined, null, function* () {
100
+ try {
101
+ yield browser.initialize({
102
+ worker: true,
103
+ wasmURL: "https://unpkg.com/esbuild-wasm@0.14.23/esbuild.wasm"
336
104
  });
337
- });
338
- }
339
-
340
- function useEditorFlow(initialFlow) {
341
- const stateActions = useStateActions(addons__default["default"].getChannel());
342
- const flow = useFlowState(addons__default["default"].getChannel());
343
- const docsContext = React__default["default"].useContext(addonDocs.DocsContext);
344
- React__default["default"].useEffect(() => {
345
- stateActions.setFlow(initialFlow);
346
- }, [initialFlow]);
347
- React__default["default"].useEffect(() => {
348
- if (!flow) {
349
- stateActions.setFlow(initialFlow);
350
- }
351
- }, [flow]);
352
- if (docsContext.id) {
353
- return initialFlow;
105
+ } catch (e) {
354
106
  }
355
- return flow != null ? flow : initialFlow;
356
- }
107
+ }))();
108
+ const execute = (code, options) => __async$2(undefined, null, function* () {
109
+ const { additionalModules = {} } = options != null ? options : {};
110
+ yield setup;
111
+ const result = yield browser.transform(code, {
112
+ loader: "tsx",
113
+ format: "cjs",
114
+ tsconfigRaw: {
115
+ compilerOptions: {}
116
+ }
117
+ });
118
+ const mods = __spreadValues$4({
119
+ react: React__namespace,
120
+ "@player-tools/dsl": PlayerDSL__namespace
121
+ }, additionalModules);
122
+ const mod = eval(`(function(require, module){ ${result.code}})`);
123
+ const exp = {};
124
+ const req = (name) => {
125
+ return mods[name];
126
+ };
127
+ mod(req, exp);
128
+ return exp.exports;
129
+ });
357
130
 
358
131
  const DEVICE_HEIGHT = {
359
132
  iphonexs: 845
@@ -390,13 +163,35 @@ const Appetize = (props) => {
390
163
  });
391
164
  };
392
165
 
166
+ var __defProp$3 = Object.defineProperty;
167
+ var __getOwnPropSymbols$3 = Object.getOwnPropertySymbols;
168
+ var __hasOwnProp$3 = Object.prototype.hasOwnProperty;
169
+ var __propIsEnum$3 = Object.prototype.propertyIsEnumerable;
170
+ var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
171
+ var __spreadValues$3 = (a, b) => {
172
+ for (var prop in b || (b = {}))
173
+ if (__hasOwnProp$3.call(b, prop))
174
+ __defNormalProp$3(a, prop, b[prop]);
175
+ if (__getOwnPropSymbols$3)
176
+ for (var prop of __getOwnPropSymbols$3(b)) {
177
+ if (__propIsEnum$3.call(b, prop))
178
+ __defNormalProp$3(a, prop, b[prop]);
179
+ }
180
+ return a;
181
+ };
182
+ function createEvent(base) {
183
+ return __spreadValues$3({
184
+ id: uuid.v4(),
185
+ time: Date.now()
186
+ }, base);
187
+ }
188
+
393
189
  class StorybookPlayerPlugin {
394
- constructor(actions) {
190
+ constructor(dispatch) {
395
191
  this.name = "Storybook";
396
- this.actions = actions;
192
+ this.dispatch = dispatch;
397
193
  this.metricsPlugin = new metricsPluginReact.MetricsPlugin({
398
194
  onUpdate: (metrics) => {
399
- actions.setMetrics(metrics);
400
195
  },
401
196
  onRenderEnd: (timing) => {
402
197
  this.onMetricChange(timing, "render");
@@ -412,7 +207,7 @@ class StorybookPlayerPlugin {
412
207
  applyReact(rp) {
413
208
  rp.registerPlugin(this.metricsPlugin);
414
209
  rp.player.hooks.dataController.tap(this.name, (dc) => {
415
- this.actions.clearEvents();
210
+ this.dispatch(clearEvents());
416
211
  dc.hooks.onUpdate.tap(this.name, (dataUpdates) => {
417
212
  const events = dataUpdates.map((dataUpdate) => createEvent({
418
213
  type: "dataChange",
@@ -420,42 +215,42 @@ class StorybookPlayerPlugin {
420
215
  from: dataUpdate.oldValue,
421
216
  to: dataUpdate.newValue
422
217
  }));
423
- this.actions.addEvents(events);
218
+ this.dispatch(addEvents(events));
424
219
  });
425
220
  });
426
221
  rp.player.logger.hooks.log.tap(this.name, (severity, data) => {
427
- this.actions.addEvents([
222
+ this.dispatch(addEvents([
428
223
  createEvent({
429
224
  type: "log",
430
225
  message: data,
431
226
  severity
432
227
  })
433
- ]);
228
+ ]));
434
229
  });
435
230
  rp.player.hooks.state.tap(this.name, (newState) => {
436
231
  if ("error" in newState) {
437
- this.actions.addEvents([
232
+ this.dispatch(addEvents([
438
233
  createEvent({
439
234
  type: "stateChange",
440
235
  state: newState.status,
441
236
  error: newState.error.message
442
237
  })
443
- ]);
238
+ ]));
444
239
  } else if (newState.status === "completed") {
445
- this.actions.addEvents([
240
+ this.dispatch(addEvents([
446
241
  createEvent({
447
242
  type: "stateChange",
448
243
  state: newState.status,
449
244
  outcome: newState.endState.outcome
450
245
  })
451
- ]);
246
+ ]));
452
247
  } else {
453
- this.actions.addEvents([
248
+ this.dispatch(addEvents([
454
249
  createEvent({
455
250
  type: "stateChange",
456
251
  state: newState.status
457
252
  })
458
- ]);
253
+ ]));
459
254
  }
460
255
  });
461
256
  }
@@ -463,13 +258,13 @@ class StorybookPlayerPlugin {
463
258
  if (!timing.completed) {
464
259
  return;
465
260
  }
466
- this.actions.addEvents([
261
+ this.dispatch(addEvents([
467
262
  createEvent({
468
263
  type: "metric",
469
264
  metricType,
470
265
  message: `Duration: ${timing.duration.toFixed(0)} ms`
471
266
  })
472
- ]);
267
+ ]));
473
268
  }
474
269
  }
475
270
 
@@ -502,38 +297,57 @@ const PlayerFlowSummary = (props) => {
502
297
  }, "Reset"));
503
298
  };
504
299
 
505
- var __defProp = Object.defineProperty;
506
- var __defProps = Object.defineProperties;
507
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
508
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
509
- var __hasOwnProp = Object.prototype.hasOwnProperty;
510
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
511
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
512
- var __spreadValues = (a, b) => {
300
+ const useFlowSetListener = (chan) => {
301
+ const dispatch = reactRedux.useDispatch();
302
+ React__default["default"].useEffect(() => {
303
+ const handler = (payload) => {
304
+ try {
305
+ const { flow } = JSON.parse(payload);
306
+ dispatch(setJSONEditorValue({ value: flow }));
307
+ } catch (e) {
308
+ console.error("Unable to set JSON payload from storybook event", e);
309
+ }
310
+ };
311
+ const eventName = "@@player/flow/set";
312
+ chan.addListener(eventName, handler);
313
+ return () => {
314
+ chan.removeListener(eventName, handler);
315
+ };
316
+ }, [chan]);
317
+ };
318
+
319
+ var __defProp$2 = Object.defineProperty;
320
+ var __defProps$1 = Object.defineProperties;
321
+ var __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;
322
+ var __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;
323
+ var __hasOwnProp$2 = Object.prototype.hasOwnProperty;
324
+ var __propIsEnum$2 = Object.prototype.propertyIsEnumerable;
325
+ var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
326
+ var __spreadValues$2 = (a, b) => {
513
327
  for (var prop in b || (b = {}))
514
- if (__hasOwnProp.call(b, prop))
515
- __defNormalProp(a, prop, b[prop]);
516
- if (__getOwnPropSymbols)
517
- for (var prop of __getOwnPropSymbols(b)) {
518
- if (__propIsEnum.call(b, prop))
519
- __defNormalProp(a, prop, b[prop]);
328
+ if (__hasOwnProp$2.call(b, prop))
329
+ __defNormalProp$2(a, prop, b[prop]);
330
+ if (__getOwnPropSymbols$2)
331
+ for (var prop of __getOwnPropSymbols$2(b)) {
332
+ if (__propIsEnum$2.call(b, prop))
333
+ __defNormalProp$2(a, prop, b[prop]);
520
334
  }
521
335
  return a;
522
336
  };
523
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
337
+ var __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));
524
338
  var __objRest = (source, exclude) => {
525
339
  var target = {};
526
340
  for (var prop in source)
527
- if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
341
+ if (__hasOwnProp$2.call(source, prop) && exclude.indexOf(prop) < 0)
528
342
  target[prop] = source[prop];
529
- if (source != null && __getOwnPropSymbols)
530
- for (var prop of __getOwnPropSymbols(source)) {
531
- if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
343
+ if (source != null && __getOwnPropSymbols$2)
344
+ for (var prop of __getOwnPropSymbols$2(source)) {
345
+ if (exclude.indexOf(prop) < 0 && __propIsEnum$2.call(source, prop))
532
346
  target[prop] = source[prop];
533
347
  }
534
348
  return target;
535
349
  };
536
- var __async = (__this, __arguments, generator) => {
350
+ var __async$1 = (__this, __arguments, generator) => {
537
351
  return new Promise((resolve, reject) => {
538
352
  var fulfilled = (value) => {
539
353
  try {
@@ -554,6 +368,7 @@ var __async = (__this, __arguments, generator) => {
554
368
  });
555
369
  };
556
370
  const ReactPlayerPluginContext = React__default["default"].createContext({ plugins: [] });
371
+ const DSLPluginContext = React__default["default"].createContext({});
557
372
  const PlayerRenderContext = React__default["default"].createContext({
558
373
  platform: "web"
559
374
  });
@@ -561,38 +376,30 @@ const StorybookControlsContext = React__default["default"].createContext({
561
376
  controls: {}
562
377
  });
563
378
  const PlayerOptionsContext = React__default["default"].createContext({ options: {} });
564
- const LocalPlayerStory = (props) => {
565
- var _a, _b;
566
- let flow = useEditorFlow(props.flow);
567
- const renderContext = React__default["default"].useContext(PlayerRenderContext);
568
- const pluginContext = React__default["default"].useContext(ReactPlayerPluginContext);
569
- const controlsContext = React__default["default"].useContext(StorybookControlsContext);
570
- const optionsContext = React__default["default"].useContext(PlayerOptionsContext);
571
- const options = __spreadValues({}, optionsContext == null ? void 0 : optionsContext.options);
572
- const stateActions = useStateActions(addons__default["default"].getChannel());
573
- const plugins = (_b = (_a = props.webPlugins) != null ? _a : pluginContext == null ? void 0 : pluginContext.plugins) != null ? _b : [];
379
+ const PlayerJsonEditorStory = () => {
380
+ const jsonEditorValue = useJSONEditorValue();
381
+ useFlowSetListener(addons__default["default"].getChannel());
382
+ const { plugins } = React__default["default"].useContext(ReactPlayerPluginContext);
383
+ const dispatch = reactRedux.useDispatch();
574
384
  const [playerState, setPlayerState] = React__default["default"].useState("not-started");
575
385
  const [trackedBeacons, setTrackedBeacons] = React__default["default"].useState([]);
576
- const rp = React__default["default"].useMemo(() => {
577
- var _a2;
386
+ const wp = React__default["default"].useMemo(() => {
578
387
  const beaconPlugin = new beaconPluginReact.BeaconPlugin({
579
388
  callback: (beacon) => {
580
389
  setTrackedBeacons((t) => [...t, beacon]);
581
390
  }
582
391
  });
583
- return new react$1.ReactPlayer(__spreadProps(__spreadValues({}, options), {
584
- plugins: [
585
- new StorybookPlayerPlugin(stateActions),
586
- beaconPlugin,
587
- ...plugins,
588
- ...(_a2 = options == null ? void 0 : options.plugins) != null ? _a2 : []
589
- ]
590
- }));
591
- }, [plugins, flow]);
392
+ return new react$1.ReactPlayer({
393
+ plugins: [new StorybookPlayerPlugin(dispatch), beaconPlugin, ...plugins]
394
+ });
395
+ }, [dispatch, plugins]);
592
396
  const startFlow = () => {
397
+ if ((jsonEditorValue == null ? void 0 : jsonEditorValue.state) !== "loaded") {
398
+ return;
399
+ }
593
400
  setPlayerState("in-progress");
594
401
  setTrackedBeacons([]);
595
- rp.start(flow).then(() => {
402
+ wp.start(jsonEditorValue.value).then(() => {
596
403
  setPlayerState("completed");
597
404
  }).catch((e) => {
598
405
  console.error("Error starting flow", e);
@@ -601,31 +408,8 @@ const LocalPlayerStory = (props) => {
601
408
  };
602
409
  React__default["default"].useEffect(() => {
603
410
  startFlow();
604
- }, [rp]);
605
- React__default["default"].useEffect(() => {
606
- var _a2;
607
- if (controlsContext) {
608
- flow = __spreadProps(__spreadValues({}, flow), {
609
- data: __spreadValues(__spreadValues({}, (_a2 = flow.data) != null ? _a2 : {}), controlsContext)
610
- });
611
- stateActions.setFlow(flow);
612
- }
613
- }, [controlsContext]);
614
- React__default["default"].useEffect(() => {
615
- return subscribe(addons__default["default"].getChannel(), "@@player/flow/reset", () => {
616
- startFlow();
617
- });
618
- }, [rp]);
619
- if (renderContext.platform !== "web" && renderContext.token) {
620
- return /* @__PURE__ */ React__default["default"].createElement(Appetize, {
621
- flow,
622
- platform: renderContext.platform,
623
- token: renderContext.token,
624
- baseUrl: renderContext.baseUrl,
625
- osVersions: renderContext.appetizeVersions
626
- });
627
- }
628
- const currentState = rp.player.getState();
411
+ }, [wp, jsonEditorValue]);
412
+ const currentState = wp.player.getState();
629
413
  if (playerState === "completed" && currentState.status === "completed") {
630
414
  return /* @__PURE__ */ React__default["default"].createElement(PlayerFlowSummary, {
631
415
  reset: startFlow,
@@ -639,15 +423,44 @@ const LocalPlayerStory = (props) => {
639
423
  error: currentState.error
640
424
  });
641
425
  }
642
- return /* @__PURE__ */ React__default["default"].createElement(rp.Component, null);
426
+ return /* @__PURE__ */ React__default["default"].createElement(wp.Component, null);
427
+ };
428
+ const LocalPlayerStory = (props) => {
429
+ var _a, _b;
430
+ const flow = useInitialJsonEditorValue(props.mock);
431
+ const platform = reactRedux.useSelector((state) => state.platform.platform);
432
+ const renderContext = React__default["default"].useContext(PlayerRenderContext);
433
+ const webPlayerContext = React__default["default"].useContext(ReactPlayerPluginContext);
434
+ const { options } = React__default["default"].useContext(PlayerOptionsContext);
435
+ if (platform === "web") {
436
+ return /* @__PURE__ */ React__default["default"].createElement(ReactPlayerPluginContext.Provider, {
437
+ value: props.webPlugins || (options == null ? void 0 : options.plugins) ? __spreadProps$1(__spreadValues$2({}, webPlayerContext), {
438
+ plugins: [
439
+ ...webPlayerContext.plugins,
440
+ ...(_a = props.webPlugins) != null ? _a : [],
441
+ ...(_b = options == null ? void 0 : options.plugins) != null ? _b : []
442
+ ]
443
+ }) : webPlayerContext
444
+ }, /* @__PURE__ */ React__default["default"].createElement(PlayerJsonEditorStory, null));
445
+ }
446
+ if (renderContext.platform !== "web" && renderContext.token && (flow == null ? void 0 : flow.state) === "loaded") {
447
+ return /* @__PURE__ */ React__default["default"].createElement(Appetize, {
448
+ flow: flow.value,
449
+ platform: renderContext.platform,
450
+ token: renderContext.token,
451
+ baseUrl: renderContext.baseUrl,
452
+ osVersions: renderContext.appetizeVersions
453
+ });
454
+ }
455
+ return /* @__PURE__ */ React__default["default"].createElement(components.Placeholder, null, "Unable to render flow");
643
456
  };
644
- function wrapInLazy(Component, flowFactory, other) {
645
- const asPlayer = () => __async(this, null, function* () {
646
- const mock = typeof flowFactory === "function" ? yield flowFactory() : flowFactory;
457
+ function wrapInLazy(Component, mockFactory, other) {
458
+ const asPlayer = () => __async$1(this, null, function* () {
459
+ const mock = typeof mockFactory === "function" ? yield mockFactory() : mockFactory;
647
460
  const Comp = () => {
648
- const flow = __spreadValues(__spreadValues({}, makeFlow.makeFlow("default" in mock ? mock.default : mock)), other != null ? other : {});
461
+ const flow = __spreadValues$2(__spreadValues$2({}, makeFlow.makeFlow("default" in mock ? mock.default : mock)), other != null ? other : {});
649
462
  return /* @__PURE__ */ React__default["default"].createElement(Component, {
650
- flow
463
+ mock: flow
651
464
  });
652
465
  };
653
466
  return {
@@ -658,44 +471,621 @@ function wrapInLazy(Component, flowFactory, other) {
658
471
  }
659
472
  const PlayerStory = (props) => {
660
473
  const _a = props, { flow, storybookControls, options } = _a, other = __objRest(_a, ["flow", "storybookControls", "options"]);
474
+ useContentKind("json");
661
475
  const MockComp = React__default["default"].useMemo(() => wrapInLazy(LocalPlayerStory, flow, other), []);
662
- return /* @__PURE__ */ React__default["default"].createElement("div", null, /* @__PURE__ */ React__default["default"].createElement(react.ChakraProvider, null, /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Suspense, {
663
- fallback: /* @__PURE__ */ React__default["default"].createElement(react.Spinner, null)
476
+ return /* @__PURE__ */ React__default["default"].createElement("div", null, /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Suspense, {
477
+ fallback: "Loading..."
664
478
  }, /* @__PURE__ */ React__default["default"].createElement(StorybookControlsContext.Provider, {
665
- value: __spreadValues({}, storybookControls)
479
+ value: __spreadValues$2({}, storybookControls)
666
480
  }, /* @__PURE__ */ React__default["default"].createElement(PlayerOptionsContext.Provider, {
667
481
  value: {
668
482
  options
669
483
  }
670
- }, /* @__PURE__ */ React__default["default"].createElement(MockComp, null)), " "))));
484
+ }, /* @__PURE__ */ React__default["default"].createElement(MockComp, null)))));
485
+ };
486
+ const DSLLocalPlayerStory = (props) => {
487
+ const dslContext = React__default["default"].useContext(DSLPluginContext);
488
+ useContentKind("dsl");
489
+ useCompiledEditorValue(props.dslContent, {
490
+ additionalModules: dslContext == null ? void 0 : dslContext.additionalModules
491
+ });
492
+ return /* @__PURE__ */ React__default["default"].createElement(PlayerJsonEditorStory, null);
493
+ };
494
+ const DSLPlayerStory = (props) => {
495
+ const _a = props, { dslContent } = _a, other = __objRest(_a, ["dslContent"]);
496
+ const AsLazyComp = React__default["default"].useMemo(() => {
497
+ const loadFlow = () => __async$1(undefined, null, function* () {
498
+ let content = yield dslContent();
499
+ if (typeof content === "object") {
500
+ content = content.default;
501
+ }
502
+ return {
503
+ default: () => {
504
+ return /* @__PURE__ */ React__default["default"].createElement(DSLLocalPlayerStory, __spreadValues$2({
505
+ dslContent: content
506
+ }, other));
507
+ }
508
+ };
509
+ });
510
+ return React__default["default"].lazy(loadFlow);
511
+ }, [dslContent]);
512
+ return /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Suspense, {
513
+ fallback: "Loading..."
514
+ }, /* @__PURE__ */ React__default["default"].createElement(AsLazyComp, null));
671
515
  };
672
516
 
673
- const PlayerDecorator = (story, ctx) => {
517
+ function createDSLStory(loader, options) {
518
+ const Comp = () => /* @__PURE__ */ React__default["default"].createElement(DSLPlayerStory, {
519
+ dslContent: loader
520
+ });
521
+ if (options == null ? void 0 : options.args) {
522
+ Comp.args = options.args;
523
+ }
524
+ return Comp;
525
+ }
526
+
527
+ var __defProp$1 = Object.defineProperty;
528
+ var __defProps = Object.defineProperties;
529
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
530
+ var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
531
+ var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
532
+ var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
533
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
534
+ var __spreadValues$1 = (a, b) => {
535
+ for (var prop in b || (b = {}))
536
+ if (__hasOwnProp$1.call(b, prop))
537
+ __defNormalProp$1(a, prop, b[prop]);
538
+ if (__getOwnPropSymbols$1)
539
+ for (var prop of __getOwnPropSymbols$1(b)) {
540
+ if (__propIsEnum$1.call(b, prop))
541
+ __defNormalProp$1(a, prop, b[prop]);
542
+ }
543
+ return a;
544
+ };
545
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
546
+ var __async = (__this, __arguments, generator) => {
547
+ return new Promise((resolve, reject) => {
548
+ var fulfilled = (value) => {
549
+ try {
550
+ step(generator.next(value));
551
+ } catch (e) {
552
+ reject(e);
553
+ }
554
+ };
555
+ var rejected = (value) => {
556
+ try {
557
+ step(generator.throw(value));
558
+ } catch (e) {
559
+ reject(e);
560
+ }
561
+ };
562
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
563
+ step((generator = generator.apply(__this, __arguments)).next());
564
+ });
565
+ };
566
+ const compiler = new PlayerDSL.DSLCompiler();
567
+ const resetEditor = toolkit.createAction("@@player/flow/reset");
568
+ const setDSLEditorValue = toolkit.createAction("setDSLEditorValue");
569
+ const setCompiledEditorResult = toolkit.createAction("setCompiledEditorResult");
570
+ const setEditorContentType = toolkit.createAction("setEditorContentType");
571
+ const setJSONEditorValue = toolkit.createAction("setJSONEditorValue");
572
+ const updateAndCompileDSLFlow = toolkit.createAsyncThunk("editor/dsl/compile", (context, thunkAPI) => __async(undefined, null, function* () {
674
573
  var _a;
675
- const playerParams = ctx.parameters;
676
- const [selectedPlatform, setPlatform] = React__default["default"].useState("web");
677
- React__default["default"].useEffect(() => {
678
- return subscribe(addons__default["default"].getChannel(), "@@player/platform/set", (evt) => {
679
- setPlatform(evt.platform);
574
+ const content = (_a = thunkAPI.getState().editor.dsl) == null ? void 0 : _a.value;
575
+ if (!content) {
576
+ throw new Error("No content to compile");
577
+ }
578
+ try {
579
+ const transpiledResult = yield execute(content, {
580
+ additionalModules: context.additionalModules
680
581
  });
582
+ if (transpiledResult) {
583
+ const compiled = yield compiler.serialize(transpiledResult.default);
584
+ thunkAPI.dispatch(setCompiledEditorResult({ result: compiled.value }));
585
+ }
586
+ } catch (e) {
587
+ thunkAPI.dispatch(setCompiledEditorResult({
588
+ errors: {
589
+ transpileErrors: [
590
+ {
591
+ message: e.message
592
+ }
593
+ ]
594
+ }
595
+ }));
596
+ }
597
+ }));
598
+ const setPlatform = toolkit.createAction("@@player/platform/set");
599
+ const unsetPlatform = toolkit.createAction("@@player/platform/unset");
600
+ const platformReducer = toolkit.createReducer({
601
+ platform: "web"
602
+ }, (builder) => {
603
+ builder.addCase(setPlatform, (state, action) => {
604
+ state.platform = action.payload.platform;
605
+ });
606
+ builder.addCase(unsetPlatform, (state) => {
607
+ state.platform = void 0;
608
+ });
609
+ });
610
+ const setCompilationErrors = toolkit.createAction("setCompilationErrors");
611
+ const flowEditorReducer = toolkit.createReducer({
612
+ json: { state: "initial" },
613
+ dsl: { state: "initial" },
614
+ contentType: void 0
615
+ }, (builder) => {
616
+ builder.addCase(setEditorContentType, (state, action) => {
617
+ state.contentType = action.payload.contentType;
618
+ if (action.payload.contentType === "json") {
619
+ state.dsl = { state: "initial" };
620
+ }
621
+ });
622
+ builder.addCase(setDSLEditorValue, (state, action) => {
623
+ state.dsl = {
624
+ state: "loaded",
625
+ value: action.payload.value,
626
+ needsCompile: true,
627
+ compilationErrors: void 0
628
+ };
629
+ });
630
+ builder.addCase(setCompilationErrors, (state, action) => {
631
+ var _a;
632
+ if (((_a = state.dsl) == null ? void 0 : _a.state) === "loaded") {
633
+ state.dsl.compilationErrors = action.payload;
634
+ }
635
+ });
636
+ builder.addCase(updateAndCompileDSLFlow.pending, (state) => {
637
+ state.json = { state: "loading" };
638
+ });
639
+ builder.addCase(resetEditor, (state) => {
640
+ state.json = { state: "initial" };
641
+ state.dsl = { state: "initial" };
642
+ });
643
+ builder.addCase(updateAndCompileDSLFlow.rejected, (state) => {
644
+ state.dsl = { state: "error" };
645
+ });
646
+ builder.addCase(setCompiledEditorResult, (state, action) => {
647
+ var _a;
648
+ if (((_a = state.dsl) == null ? void 0 : _a.state) === "loaded") {
649
+ state.dsl.needsCompile = false;
650
+ state.dsl.compilationErrors = action.payload.errors;
651
+ }
652
+ if (action.payload.result) {
653
+ state.json = { state: "loaded", value: action.payload.result };
654
+ }
655
+ });
656
+ builder.addCase(setJSONEditorValue, (state, action) => {
657
+ state.json = { state: "loaded", value: action.payload.value };
658
+ });
659
+ });
660
+ const addEvents = toolkit.createAction("@@player/events/add");
661
+ const clearEvents = toolkit.createAction("@@player/events/clear");
662
+ const eventsReducer = toolkit.createReducer([], (builder) => {
663
+ builder.addCase(addEvents, (state, action) => {
664
+ state.push(...action.payload);
665
+ });
666
+ builder.addCase(clearEvents, () => {
667
+ return [];
668
+ });
669
+ });
670
+ const STATE_SYNC_CHANNEL_NAME = (() => {
671
+ if (sessionStorage.getItem("player:channel")) {
672
+ return sessionStorage.getItem("player:channel");
673
+ }
674
+ const channel = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
675
+ sessionStorage.setItem("player:channel", channel);
676
+ return channel;
677
+ })();
678
+ const store = toolkit.configureStore({
679
+ reducer: {
680
+ editor: flowEditorReducer,
681
+ platform: platformReducer,
682
+ events: eventsReducer
683
+ },
684
+ middleware: (getDefaultMiddleware) => {
685
+ return [
686
+ ...getDefaultMiddleware(),
687
+ reduxStateSync.createStateSyncMiddleware({
688
+ channel: STATE_SYNC_CHANNEL_NAME,
689
+ blacklist: [
690
+ "editor/dsl/compile/pending",
691
+ "editor/dsl/compile/fulfilled",
692
+ "editor/dsl/compile/rejected"
693
+ ]
694
+ })
695
+ ];
696
+ },
697
+ devTools: true
698
+ });
699
+ reduxStateSync.initStateWithPrevTab(store);
700
+ const StateProvider = (props) => {
701
+ return /* @__PURE__ */ React__default["default"].createElement(reactRedux.Provider, __spreadProps(__spreadValues$1({}, props), {
702
+ store
703
+ }));
704
+ };
705
+ const useJSONEditorValue = () => {
706
+ return reactRedux.useSelector((state) => {
707
+ return state.editor.json;
708
+ });
709
+ };
710
+ const useDSLEditorValue = () => {
711
+ const dslEditorValue = reactRedux.useSelector((state) => {
712
+ return state.editor.dsl;
713
+ });
714
+ return dslEditorValue;
715
+ };
716
+ const useContentKind = (contentTypeToSet) => {
717
+ const dispatch = reactRedux.useDispatch();
718
+ const contentType = reactRedux.useSelector((state) => {
719
+ return state.editor.contentType;
720
+ });
721
+ React__default["default"].useEffect(() => {
722
+ if (contentTypeToSet && contentTypeToSet !== contentType) {
723
+ dispatch(setEditorContentType({
724
+ contentType: contentTypeToSet
725
+ }));
726
+ }
727
+ }, [contentType, contentTypeToSet, dispatch]);
728
+ return contentType;
729
+ };
730
+ const useCompiledEditorValue = (initialValue, options) => {
731
+ useContentKind("dsl");
732
+ const dispatch = reactRedux.useDispatch();
733
+ const dslEditorValue = reactRedux.useSelector((s) => {
734
+ return s.editor.dsl;
735
+ });
736
+ React__default["default"].useEffect(() => {
737
+ store.dispatch(setDSLEditorValue({ value: initialValue }));
738
+ }, []);
739
+ React__default["default"].useEffect(() => {
740
+ if ((dslEditorValue == null ? void 0 : dslEditorValue.state) === "initial") {
741
+ dispatch(setDSLEditorValue({ value: initialValue }));
742
+ }
743
+ }, [dslEditorValue, initialValue]);
744
+ React__default["default"].useEffect(() => {
745
+ if ((dslEditorValue == null ? void 0 : dslEditorValue.state) === "loaded" && dslEditorValue.needsCompile) {
746
+ dispatch(updateAndCompileDSLFlow({
747
+ additionalModules: options == null ? void 0 : options.additionalModules
748
+ }));
749
+ }
750
+ }, [dslEditorValue, options == null ? void 0 : options.additionalModules]);
751
+ return dslEditorValue;
752
+ };
753
+ const useInitialJsonEditorValue = (initialValue) => {
754
+ const dispatch = reactRedux.useDispatch();
755
+ useContentKind("json");
756
+ const jsonEditorValue = reactRedux.useSelector((s) => {
757
+ return s.editor.json;
758
+ });
759
+ React__default["default"].useEffect(() => {
760
+ store.dispatch(setJSONEditorValue({ value: initialValue }));
681
761
  }, []);
762
+ React__default["default"].useEffect(() => {
763
+ if ((jsonEditorValue == null ? void 0 : jsonEditorValue.state) === "initial") {
764
+ dispatch(setJSONEditorValue({ value: initialValue }));
765
+ }
766
+ }, [jsonEditorValue, initialValue]);
767
+ return jsonEditorValue;
768
+ };
769
+
770
+ Editor.loader.init().then((m) => {
771
+ m.languages.typescript.typescriptDefaults.setCompilerOptions({
772
+ jsx: m.languages.typescript.JsxEmit.React
773
+ });
774
+ });
775
+ const JSONEditorPanel = () => {
776
+ const darkMode = storybookDarkMode.useDarkMode();
777
+ const jsonEditorValue = useJSONEditorValue();
778
+ const jsonValueAsString = (jsonEditorValue == null ? void 0 : jsonEditorValue.state) === "loaded" ? JSON.stringify(jsonEditorValue.value, null, 2) : "";
779
+ const dispatch = reactRedux.useDispatch();
780
+ const onChange = (val) => {
781
+ if (!val || (jsonEditorValue == null ? void 0 : jsonEditorValue.state) !== "loaded") {
782
+ return;
783
+ }
784
+ try {
785
+ const parsed = JSON.parse(val);
786
+ if (!deepEqual__default["default"](parsed, jsonEditorValue.value)) {
787
+ dispatch(setJSONEditorValue({
788
+ value: parsed
789
+ }));
790
+ }
791
+ } catch (e) {
792
+ }
793
+ };
794
+ return /* @__PURE__ */ React__default["default"].createElement(Editor__default["default"], {
795
+ theme: darkMode ? "dark" : "light",
796
+ value: jsonValueAsString,
797
+ language: "json",
798
+ options: {
799
+ formatOnPaste: true
800
+ },
801
+ onChange: (val) => {
802
+ onChange(val);
803
+ }
804
+ });
805
+ };
806
+ const CompileErrors = ({
807
+ errors
808
+ }) => {
809
+ var _a, _b;
810
+ if ((errors.compileErrors === void 0 || errors.compileErrors.length === 0) && (errors.transpileErrors === void 0 || errors.transpileErrors.length === 0)) {
811
+ return null;
812
+ }
813
+ return /* @__PURE__ */ React__default["default"].createElement("div", {
814
+ style: {
815
+ position: "absolute",
816
+ bottom: 0,
817
+ zIndex: 100,
818
+ background: "white",
819
+ padding: "8px",
820
+ border: "1px solid red",
821
+ color: "red",
822
+ width: "100%"
823
+ }
824
+ }, /* @__PURE__ */ React__default["default"].createElement("h3", null, "Errors"), (_a = errors.compileErrors) == null ? void 0 : _a.map((e) => /* @__PURE__ */ React__default["default"].createElement("pre", {
825
+ key: e.message
826
+ }, e.message)), (_b = errors.transpileErrors) == null ? void 0 : _b.map((e) => /* @__PURE__ */ React__default["default"].createElement("pre", {
827
+ key: e.message
828
+ }, e.message)));
829
+ };
830
+ const DSLEditorPanel = () => {
831
+ const darkMode = storybookDarkMode.useDarkMode();
832
+ const jsonEditorValue = useJSONEditorValue();
833
+ const dslEditorValue = useDSLEditorValue();
834
+ const dispatch = reactRedux.useDispatch();
835
+ const editorValue = (dslEditorValue == null ? void 0 : dslEditorValue.state) === "loaded" ? dslEditorValue.value : "";
836
+ const flow = (jsonEditorValue == null ? void 0 : jsonEditorValue.state) === "loaded" ? jsonEditorValue.value : "";
837
+ const compilationErrors = (dslEditorValue == null ? void 0 : dslEditorValue.state) === "loaded" ? dslEditorValue.compilationErrors : void 0;
838
+ const [selected, setSelected] = React__default["default"].useState("tsx");
839
+ const onChange = (val) => {
840
+ if (val) {
841
+ dispatch(setDSLEditorValue({
842
+ value: val
843
+ }));
844
+ }
845
+ };
846
+ return /* @__PURE__ */ React__default["default"].createElement("div", null, /* @__PURE__ */ React__default["default"].createElement(components.Tabs, {
847
+ selected,
848
+ actions: {
849
+ onSelect: (id) => {
850
+ setSelected(id);
851
+ }
852
+ }
853
+ }, /* @__PURE__ */ React__default["default"].createElement("div", {
854
+ id: "tsx",
855
+ title: "TSX"
856
+ }), /* @__PURE__ */ React__default["default"].createElement("div", {
857
+ id: "json",
858
+ title: "JSON (read-only)"
859
+ })), /* @__PURE__ */ React__default["default"].createElement("div", {
860
+ style: {
861
+ height: "calc(100% - 60px)"
862
+ }
863
+ }, selected === "tsx" && /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, compilationErrors && /* @__PURE__ */ React__default["default"].createElement(CompileErrors, {
864
+ errors: compilationErrors
865
+ }), /* @__PURE__ */ React__default["default"].createElement(Editor__default["default"], {
866
+ theme: darkMode ? "dark" : "light",
867
+ value: editorValue,
868
+ language: "typescript",
869
+ onChange: (val) => {
870
+ onChange(val);
871
+ }
872
+ })), selected === "json" && /* @__PURE__ */ React__default["default"].createElement(Editor__default["default"], {
873
+ options: {
874
+ readOnly: true
875
+ },
876
+ theme: darkMode ? "dark" : "light",
877
+ value: flow ? JSON.stringify(flow, null, 2) : "{}",
878
+ language: "json"
879
+ })));
880
+ };
881
+ const EditorPanel = (props) => {
882
+ const contentType = useContentKind();
883
+ if (!props.active) {
884
+ return null;
885
+ }
886
+ if (contentType === "dsl") {
887
+ return /* @__PURE__ */ React__default["default"].createElement(DSLEditorPanel, null);
888
+ }
889
+ if (contentType === "json") {
890
+ return /* @__PURE__ */ React__default["default"].createElement(JSONEditorPanel, null);
891
+ }
892
+ return /* @__PURE__ */ React__default["default"].createElement(components.Placeholder, null, "This story is not configured to allow flow edits.");
893
+ };
894
+
895
+ var e=[],t=[];function n(n,r){if(n&&"undefined"!=typeof document){var a,s=!0===r.prepend?"prepend":"append",d=!0===r.singleTag,i="string"==typeof r.container?document.querySelector(r.container):document.getElementsByTagName("head")[0];if(d){var u=e.indexOf(i);-1===u&&(u=e.push(i)-1,t[u]={}),a=t[u]&&t[u][s]?t[u][s]:t[u][s]=c();}else a=c();65279===n.charCodeAt(0)&&(n=n.substring(1)),a.styleSheet?a.styleSheet.cssText+=n:a.appendChild(document.createTextNode(n));}function c(){var e=document.createElement("style");if(e.setAttribute("type","text/css"),r.attributes)for(var t=Object.keys(r.attributes),n=0;n<t.length;n++)e.setAttribute(t[n],r.attributes[t[n]]);var a="prepend"===s?"afterbegin":"beforeend";return i.insertAdjacentElement(a,e),e}}
896
+
897
+ var css = "\n.events_header__1bcc1085 td {\n width: 200px;\n}\n\n.events_body__1bcc1085 td {\n}\n";
898
+ var modules_2563542d = {"header":"events_header__1bcc1085","body":"events_body__1bcc1085"};
899
+ n(css,{});
900
+
901
+ var __defProp = Object.defineProperty;
902
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
903
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
904
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
905
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
906
+ var __spreadValues = (a, b) => {
907
+ for (var prop in b || (b = {}))
908
+ if (__hasOwnProp.call(b, prop))
909
+ __defNormalProp(a, prop, b[prop]);
910
+ if (__getOwnPropSymbols)
911
+ for (var prop of __getOwnPropSymbols(b)) {
912
+ if (__propIsEnum.call(b, prop))
913
+ __defNormalProp(a, prop, b[prop]);
914
+ }
915
+ return a;
916
+ };
917
+ const ExtraCells = (event) => {
918
+ var _a, _b;
919
+ if (event.type === "log") {
920
+ return /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, /* @__PURE__ */ React__default["default"].createElement("td", null, event.severity), /* @__PURE__ */ React__default["default"].createElement("td", null, event.message.map((a) => JSON.stringify(a)).join(" ")));
921
+ }
922
+ if (event.type === "dataChange") {
923
+ return /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, /* @__PURE__ */ React__default["default"].createElement("td", null, event.binding), /* @__PURE__ */ React__default["default"].createElement("td", null, `${JSON.stringify(event.from)} \u279C ${JSON.stringify(event.to)}`));
924
+ }
925
+ if (event.type === "stateChange") {
926
+ let name = event.state;
927
+ if (event.state === "completed") {
928
+ name = `${name} (${event.error ? "error" : "success"})`;
929
+ }
930
+ return /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, /* @__PURE__ */ React__default["default"].createElement("td", null, name), /* @__PURE__ */ React__default["default"].createElement("td", null, (_b = (_a = event.outcome) != null ? _a : event.error) != null ? _b : ""));
931
+ }
932
+ if (event.type === "metric") {
933
+ return /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, /* @__PURE__ */ React__default["default"].createElement("td", null, event.metricType), /* @__PURE__ */ React__default["default"].createElement("td", null, event.message));
934
+ }
935
+ return null;
936
+ };
937
+ const EventsPanel = (props) => {
938
+ const events = reactRedux.useSelector((state) => state.events);
939
+ const darkMode = storybookDarkMode.useDarkMode();
940
+ const contentType = useContentKind();
941
+ if (!props.active) {
942
+ return null;
943
+ }
944
+ if (contentType === void 0) {
945
+ return /* @__PURE__ */ React__default["default"].createElement(components.Placeholder, null, "This story is not configured to receive Player events.");
946
+ }
947
+ return /* @__PURE__ */ React__default["default"].createElement("div", {
948
+ className: makeClass__default["default"](modules_2563542d.wrapper, {
949
+ [modules_2563542d.dark]: darkMode
950
+ })
951
+ }, /* @__PURE__ */ React__default["default"].createElement(table.Table, {
952
+ colorScheme: darkMode ? "dark" : "light"
953
+ }, /* @__PURE__ */ React__default["default"].createElement(table.Head, {
954
+ className: modules_2563542d.header
955
+ }, /* @__PURE__ */ React__default["default"].createElement(table.Row, null, /* @__PURE__ */ React__default["default"].createElement(table.HeadCell, null, "Time"), /* @__PURE__ */ React__default["default"].createElement(table.HeadCell, null, "Type"), /* @__PURE__ */ React__default["default"].createElement(table.HeadCell, null), /* @__PURE__ */ React__default["default"].createElement(table.HeadCell, null))), /* @__PURE__ */ React__default["default"].createElement(table.Body, {
956
+ className: modules_2563542d.body
957
+ }, events.map((evt) => /* @__PURE__ */ React__default["default"].createElement(table.Row, {
958
+ key: evt.id
959
+ }, /* @__PURE__ */ React__default["default"].createElement(table.Cell, null, evt.time), /* @__PURE__ */ React__default["default"].createElement(table.Cell, null, evt.type), /* @__PURE__ */ React__default["default"].createElement(ExtraCells, __spreadValues({}, evt)))))));
960
+ };
961
+
962
+ const FlowRefresh = () => {
963
+ const dispatch = reactRedux.useDispatch();
964
+ return /* @__PURE__ */ React__default["default"].createElement(React__default["default"].Fragment, null, /* @__PURE__ */ React__default["default"].createElement(components.Separator, null), /* @__PURE__ */ React__default["default"].createElement(components.IconButton, {
965
+ title: "Reset the current flow",
966
+ onClick: () => {
967
+ dispatch(resetEditor());
968
+ }
969
+ }, /* @__PURE__ */ React__default["default"].createElement(components.Icons, {
970
+ icon: "sync"
971
+ })));
972
+ };
973
+
974
+ const RenderSelection = ({ api: api$1 }) => {
975
+ const params = api.useParameter("appetizeTokens", {});
976
+ const dispatch = reactRedux.useDispatch();
977
+ const selectedPlatform = reactRedux.useSelector((state) => {
978
+ var _a;
979
+ return (_a = state.platform.platform) != null ? _a : "web";
980
+ });
981
+ React__default["default"].useEffect(() => {
982
+ const listener = () => {
983
+ dispatch(setPlatform({ platform: "web" }));
984
+ };
985
+ api$1.getChannel().addListener(coreEvents.STORY_CHANGED, listener);
986
+ return () => {
987
+ api$1.getChannel().removeListener(coreEvents.STORY_CHANGED, listener);
988
+ };
989
+ }, [api$1, dispatch]);
990
+ const mobilePlatforms = Object.keys(params);
991
+ if (mobilePlatforms.length === 0) {
992
+ return null;
993
+ }
994
+ return /* @__PURE__ */ React__default["default"].createElement(components.WithTooltip, {
995
+ closeOnClick: true,
996
+ placement: "top",
997
+ trigger: "click",
998
+ tooltip: ({ onHide }) => /* @__PURE__ */ React__default["default"].createElement(components.TooltipLinkList, {
999
+ links: ["web", ...mobilePlatforms].map((platform) => ({
1000
+ id: platform,
1001
+ title: platform,
1002
+ onClick: () => {
1003
+ setPlatform(platform);
1004
+ dispatch(setPlatform({ platform }));
1005
+ onHide();
1006
+ },
1007
+ value: platform,
1008
+ active: platform === selectedPlatform
1009
+ }))
1010
+ })
1011
+ }, /* @__PURE__ */ React__default["default"].createElement(components.IconButton, {
1012
+ title: "Change the render target"
1013
+ }, /* @__PURE__ */ React__default["default"].createElement(components.Icons, {
1014
+ icon: selectedPlatform === "web" ? "browser" : "mobile"
1015
+ })));
1016
+ };
1017
+
1018
+ function register() {
1019
+ addons__default["default"].register(ADDON_ID, (api) => {
1020
+ addons__default["default"].addPanel(EVENT_PANEL_ID, {
1021
+ title: "Events",
1022
+ render: ({ active, key }) => /* @__PURE__ */ React__default["default"].createElement(StateProvider, {
1023
+ key
1024
+ }, /* @__PURE__ */ React__default["default"].createElement(EventsPanel, {
1025
+ active: Boolean(active)
1026
+ }))
1027
+ });
1028
+ addons__default["default"].addPanel(FLOW_PANEL_ID, {
1029
+ title: "Flow",
1030
+ render: ({ active, key }) => /* @__PURE__ */ React__default["default"].createElement(StateProvider, {
1031
+ key
1032
+ }, /* @__PURE__ */ React__default["default"].createElement(EditorPanel, {
1033
+ active: Boolean(active)
1034
+ }))
1035
+ });
1036
+ addons__default["default"].add(FLOW_REFRESH_TOOL_ID, {
1037
+ title: "Refresh Flow",
1038
+ type: addons.types.TOOL,
1039
+ render: () => /* @__PURE__ */ React__default["default"].createElement(StateProvider, null, /* @__PURE__ */ React__default["default"].createElement(FlowRefresh, null))
1040
+ });
1041
+ addons__default["default"].add(RENDER_SELECT_TOOL_ID, {
1042
+ title: "Render Selection",
1043
+ type: addons.types.TOOL,
1044
+ render: () => /* @__PURE__ */ React__default["default"].createElement(StateProvider, null, /* @__PURE__ */ React__default["default"].createElement(RenderSelection, {
1045
+ api
1046
+ }))
1047
+ });
1048
+ });
1049
+ }
1050
+
1051
+ const PlayerRenderContextWrapper = (props) => {
1052
+ var _a;
1053
+ const { playerParams } = props;
1054
+ const platform = reactRedux.useSelector((s) => {
1055
+ var _a2;
1056
+ return (_a2 = s.platform.platform) != null ? _a2 : "web";
1057
+ });
682
1058
  return /* @__PURE__ */ React__default["default"].createElement(PlayerRenderContext.Provider, {
683
1059
  value: {
684
- platform: selectedPlatform,
685
- token: selectedPlatform === "web" ? void 0 : (_a = playerParams == null ? void 0 : playerParams.appetizeTokens) == null ? void 0 : _a[selectedPlatform],
1060
+ platform,
1061
+ token: platform === "web" ? void 0 : (_a = playerParams == null ? void 0 : playerParams.appetizeTokens) == null ? void 0 : _a[platform],
686
1062
  baseUrl: playerParams.appetizeBaseUrl,
687
1063
  appetizeVersions: playerParams.appetizeVersions
688
1064
  }
1065
+ }, props.children);
1066
+ };
1067
+ const PlayerDecorator = (story, ctx) => {
1068
+ var _a, _b;
1069
+ const playerParams = ctx.parameters;
1070
+ return /* @__PURE__ */ React__default["default"].createElement(StateProvider, null, /* @__PURE__ */ React__default["default"].createElement(PlayerRenderContextWrapper, {
1071
+ playerParams
689
1072
  }, /* @__PURE__ */ React__default["default"].createElement(ReactPlayerPluginContext.Provider, {
690
- value: { plugins: playerParams.reactPlayerPlugins }
691
- }, story()));
1073
+ value: { plugins: (_a = playerParams.reactPlayerPlugins) != null ? _a : [] }
1074
+ }, /* @__PURE__ */ React__default["default"].createElement(DSLPluginContext.Provider, {
1075
+ value: (_b = playerParams.dslEditor) != null ? _b : {}
1076
+ }, story()))));
692
1077
  };
693
1078
 
1079
+ exports.DSLLocalPlayerStory = DSLLocalPlayerStory;
1080
+ exports.DSLPlayerStory = DSLPlayerStory;
1081
+ exports.DSLPluginContext = DSLPluginContext;
694
1082
  exports.PlayerDecorator = PlayerDecorator;
695
1083
  exports.PlayerOptionsContext = PlayerOptionsContext;
696
1084
  exports.PlayerRenderContext = PlayerRenderContext;
697
1085
  exports.PlayerStory = PlayerStory;
698
1086
  exports.ReactPlayerPluginContext = ReactPlayerPluginContext;
699
1087
  exports.StorybookControlsContext = StorybookControlsContext;
1088
+ exports.createDSLStory = createDSLStory;
1089
+ exports.execute = execute;
700
1090
  exports.register = register;
701
1091
  //# sourceMappingURL=index.cjs.js.map