@miso.ai/client-sdk-ui 1.11.4-beta.0 → 1.11.4-beta.1

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.
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.completions = completions;
7
7
  exports.data = data;
8
- exports.event = event;
9
8
  exports.feedback = feedback;
10
9
  exports.filters = filters;
11
10
  exports.input = input;
@@ -45,9 +44,6 @@ function data() {
45
44
  function view(role) {
46
45
  return role ? `view:${role}` : 'view';
47
46
  }
48
- function event() {
49
- return 'event';
50
- }
51
47
  function tracker() {
52
48
  return 'tracker';
53
49
  }
@@ -154,7 +154,8 @@ class TypewriterLayout extends _progressive.default {
154
154
  const container = (0, _utils.containerElement)(this, element, state);
155
155
  // TODO: distinguish between first render and element replacement
156
156
  let result;
157
- if (!rendered || state.streak !== rendered.streak) {
157
+ const newStreak = !rendered || state.streak !== rendered.streak;
158
+ if (newStreak) {
158
159
  // new typing streak
159
160
  result = this._renderer.clear(container, rendered);
160
161
  } else {
@@ -166,7 +167,7 @@ class TypewriterLayout extends _progressive.default {
166
167
  writeToState(result);
167
168
  const ongoing = state.status === _constants.STATUS.READY && !result.done;
168
169
  // silence on consecutive ongoing renders
169
- const silent = ongoing && (!rendered || rendered.status === _constants.STATUS.READY);
170
+ const silent = ongoing && (!rendered || rendered.status === _constants.STATUS.READY) && !newStreak;
170
171
  notifyUpdate({
171
172
  ongoing
172
173
  }, {
@@ -4,4 +4,4 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _default = exports.default = '1.11.4-beta.0';
7
+ var _default = exports.default = '1.11.4-beta.1';
@@ -94,6 +94,9 @@ class AnswerBasedWorkflow extends _base.default {
94
94
  // restart
95
95
  super.restart();
96
96
  }
97
+ _shallEmitLifecycleEvent(name, event) {
98
+ return name === 'answer-stage' || super._shallEmitLifecycleEvent(name, event);
99
+ }
97
100
  _emitInterruptEventIfNecessary() {
98
101
  const state = this._hub.states[_index.fields.view(this._roles.main)] || {};
99
102
  if (state.session && state.status !== _constants.STATUS.INITIAL && (state.status !== _constants.STATUS.READY || state.ongoing)) {
@@ -104,13 +107,26 @@ class AnswerBasedWorkflow extends _base.default {
104
107
  }
105
108
  _onMainViewUpdate(state) {
106
109
  const {
107
- status
110
+ status,
111
+ session
108
112
  } = state;
109
113
  const done = status === _constants.STATUS.READY && !state.ongoing;
110
114
  const erroneous = status === _constants.STATUS.ERRONEOUS;
111
115
  const eventName = done ? 'done' : erroneous ? 'error' : status;
116
+ // answer-stage
117
+ const context = this._getSessionContext(session);
118
+ const oldAnswerStage = context.answerStage;
119
+ const newAnswerStage = state.meta && state.meta.answer_stage;
120
+ if (newAnswerStage && newAnswerStage !== oldAnswerStage) {
121
+ this._emitLifecycleEvent('answer-stage', Object.freeze(Object.assign({}, state, {
122
+ answer_stage: newAnswerStage
123
+ })));
124
+ context.answerStage = newAnswerStage;
125
+ }
126
+ // ready, done, or error
112
127
  this._emitLifecycleEvent(eventName, state);
113
128
  if (done || erroneous) {
129
+ // finally
114
130
  this._emitLifecycleEvent('finally', state);
115
131
  }
116
132
  }
@@ -76,6 +76,7 @@ class Workflow extends _commons.Component {
76
76
  this._hub = injectLogger(new _index.Hub(), function () {
77
77
  return _this._log(...arguments);
78
78
  });
79
+ this._sessionContext = new WeakMap();
79
80
  this._initProperties(args);
80
81
  this._initActors(args);
81
82
  this._initSubscriptions(args);
@@ -121,6 +122,15 @@ class Workflow extends _commons.Component {
121
122
  _initSession() {
122
123
  this.restart();
123
124
  }
125
+ _getSessionContext(session) {
126
+ let context = this._sessionContext.get(session);
127
+ if (!context) {
128
+ this._sessionContext.set(session, context = {});
129
+ }
130
+ return context;
131
+ }
132
+
133
+ // properties //
124
134
  get uuid() {
125
135
  return this.session && this.session.uuid;
126
136
  }
@@ -173,7 +183,20 @@ class Workflow extends _commons.Component {
173
183
  this._emitLifecycleEvent('finally', state);
174
184
  }
175
185
  }
186
+ _shallEmitLifecycleEvent(name, _ref3) {
187
+ let {
188
+ session
189
+ } = _ref3;
190
+ const context = this._getSessionContext(session);
191
+ const events = context.lifecycleEvents || (context.lifecycleEvents = new Set());
192
+ const emitted = events.has(name);
193
+ events.add(name);
194
+ return !emitted;
195
+ }
176
196
  _emitLifecycleEvent(name, event) {
197
+ if (!this._shallEmitLifecycleEvent(name, event)) {
198
+ return;
199
+ }
177
200
  this._emit(name, event);
178
201
  }
179
202
 
@@ -14,6 +14,7 @@ var _index2 = require("../layout/index.js");
14
14
  var _hybridSearchAnswer = _interopRequireDefault(require("./hybrid-search-answer.js"));
15
15
  var _hybridSearchResults = _interopRequireDefault(require("./hybrid-search-results.js"));
16
16
  var _hybridSearchViews = _interopRequireDefault(require("./hybrid-search-views.js"));
17
+ var _options = require("./options.js");
17
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
19
  const DEFAULT_API_OPTIONS = Object.freeze({
19
20
  group: _commons.API.GROUP.ASK,
@@ -101,6 +102,12 @@ class HybridSearch extends _base.default {
101
102
  }
102
103
 
103
104
  // properties //
105
+ get answer() {
106
+ return this._answer;
107
+ }
108
+ get results() {
109
+ return this._results;
110
+ }
104
111
  get questionId() {
105
112
  return this._answer.questionId;
106
113
  }
@@ -132,4 +139,5 @@ class HybridSearch extends _base.default {
132
139
  super._destroy();
133
140
  }
134
141
  }
135
- exports.default = HybridSearch;
142
+ exports.default = HybridSearch;
143
+ (0, _options.makeConfigurable)(HybridSearch.prototype, ['pagination']);
package/package.json CHANGED
@@ -26,7 +26,7 @@
26
26
  "url": "https://github.com/MisoAI/miso-client-js-sdk/issues"
27
27
  },
28
28
  "dependencies": {
29
- "@miso.ai/commons": "1.11.4-beta.0"
29
+ "@miso.ai/commons": "1.11.4-beta.1"
30
30
  },
31
- "version": "1.11.4-beta.0"
31
+ "version": "1.11.4-beta.1"
32
32
  }
@@ -34,10 +34,6 @@ export function view(role) {
34
34
  return role ? `view:${role}` : 'view';
35
35
  }
36
36
 
37
- export function event() {
38
- return 'event';
39
- }
40
-
41
37
  export function tracker() {
42
38
  return 'tracker';
43
39
  }
@@ -130,7 +130,8 @@ export default class TypewriterLayout extends ProgressiveLayout {
130
130
  const container = containerElement(this, element, state);
131
131
  // TODO: distinguish between first render and element replacement
132
132
  let result;
133
- if (!rendered || state.streak !== rendered.streak) {
133
+ const newStreak = !rendered || state.streak !== rendered.streak;
134
+ if (newStreak) {
134
135
  // new typing streak
135
136
  result = this._renderer.clear(container, rendered);
136
137
  } else {
@@ -141,7 +142,7 @@ export default class TypewriterLayout extends ProgressiveLayout {
141
142
 
142
143
  const ongoing = state.status === STATUS.READY && !result.done;
143
144
  // silence on consecutive ongoing renders
144
- const silent = ongoing && (!rendered || rendered.status === STATUS.READY);
145
+ const silent = ongoing && (!rendered || rendered.status === STATUS.READY) && !newStreak;
145
146
  notifyUpdate({ ongoing }, { silent });
146
147
 
147
148
  ongoing && loop();
package/src/version.js CHANGED
@@ -1 +1 @@
1
- export default '1.11.4-beta.0';
1
+ export default '1.11.4-beta.1';
@@ -91,6 +91,10 @@ export default class AnswerBasedWorkflow extends Workflow {
91
91
  super.restart();
92
92
  }
93
93
 
94
+ _shallEmitLifecycleEvent(name, event) {
95
+ return name === 'answer-stage' || super._shallEmitLifecycleEvent(name, event);
96
+ }
97
+
94
98
  _emitInterruptEventIfNecessary() {
95
99
  const state = this._hub.states[fields.view(this._roles.main)] || {};
96
100
  if (state.session && state.status !== STATUS.INITIAL && (state.status !== STATUS.READY || state.ongoing)) {
@@ -101,12 +105,22 @@ export default class AnswerBasedWorkflow extends Workflow {
101
105
  }
102
106
 
103
107
  _onMainViewUpdate(state) {
104
- const { status } = state;
108
+ const { status, session } = state;
105
109
  const done = status === STATUS.READY && !state.ongoing;
106
110
  const erroneous = status === STATUS.ERRONEOUS;
107
111
  const eventName = done ? 'done' : erroneous ? 'error' : status;
112
+ // answer-stage
113
+ const context = this._getSessionContext(session);
114
+ const oldAnswerStage = context.answerStage;
115
+ const newAnswerStage = state.meta && state.meta.answer_stage;
116
+ if (newAnswerStage && newAnswerStage !== oldAnswerStage) {
117
+ this._emitLifecycleEvent('answer-stage', Object.freeze({ ...state, answer_stage: newAnswerStage }));
118
+ context.answerStage = newAnswerStage;
119
+ }
120
+ // ready, done, or error
108
121
  this._emitLifecycleEvent(eventName, state);
109
122
  if (done || erroneous) {
123
+ // finally
110
124
  this._emitLifecycleEvent('finally', state);
111
125
  }
112
126
  }
@@ -61,6 +61,7 @@ export default class Workflow extends Component {
61
61
  this._defaults = args.defaults;
62
62
  this._options = options || new WorkflowOptions(context && context._options, args.defaults);
63
63
  this._hub = injectLogger(new Hub(), (...args) => this._log(...args));
64
+ this._sessionContext = new WeakMap();
64
65
 
65
66
  this._initProperties(args);
66
67
  this._initActors(args);
@@ -97,6 +98,15 @@ export default class Workflow extends Component {
97
98
  this.restart();
98
99
  }
99
100
 
101
+ _getSessionContext(session) {
102
+ let context = this._sessionContext.get(session);
103
+ if (!context) {
104
+ this._sessionContext.set(session, context = {});
105
+ }
106
+ return context;
107
+ }
108
+
109
+ // properties //
100
110
  get uuid() {
101
111
  return this.session && this.session.uuid;
102
112
  }
@@ -152,7 +162,18 @@ export default class Workflow extends Component {
152
162
  }
153
163
  }
154
164
 
165
+ _shallEmitLifecycleEvent(name, { session }) {
166
+ const context = this._getSessionContext(session);
167
+ const events = context.lifecycleEvents || (context.lifecycleEvents = new Set());
168
+ const emitted = events.has(name);
169
+ events.add(name);
170
+ return !emitted;
171
+ }
172
+
155
173
  _emitLifecycleEvent(name, event) {
174
+ if (!this._shallEmitLifecycleEvent(name, event)) {
175
+ return;
176
+ }
156
177
  this._emit(name, event);
157
178
  }
158
179
 
@@ -8,6 +8,7 @@ import { SearchBoxLayout, TextLayout } from '../layout/index.js';
8
8
  import HybridSearchAnswer from './hybrid-search-answer.js';
9
9
  import HybridSearchResults from './hybrid-search-results.js';
10
10
  import HybridSearchViewsActor from './hybrid-search-views.js';
11
+ import { makeConfigurable } from './options.js';
11
12
 
12
13
  const DEFAULT_API_OPTIONS = Object.freeze({
13
14
  group: API.GROUP.ASK,
@@ -117,6 +118,14 @@ export default class HybridSearch extends Workflow {
117
118
  }
118
119
 
119
120
  // properties //
121
+ get answer() {
122
+ return this._answer;
123
+ }
124
+
125
+ get results() {
126
+ return this._results;
127
+ }
128
+
120
129
  get questionId() {
121
130
  return this._answer.questionId;
122
131
  }
@@ -152,3 +161,5 @@ export default class HybridSearch extends Workflow {
152
161
  }
153
162
 
154
163
  }
164
+
165
+ makeConfigurable(HybridSearch.prototype, ['pagination']);