@magmamath/students-features 0.3.0-rc.18 → 0.3.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/dist/commonjs/features/chatbot/components/Alternatives/Alternatives.js +9 -6
  2. package/dist/commonjs/features/chatbot/components/Alternatives/Alternatives.js.map +1 -1
  3. package/dist/commonjs/features/chatbot/components/ChatControls/ChatControls.js +5 -13
  4. package/dist/commonjs/features/chatbot/components/ChatControls/ChatControls.js.map +1 -1
  5. package/dist/commonjs/features/chatbot/components/ChatMessage/MessageLoader.js +3 -4
  6. package/dist/commonjs/features/chatbot/components/ChatMessage/MessageLoader.js.map +1 -1
  7. package/dist/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.js +4 -5
  8. package/dist/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.js.map +1 -1
  9. package/dist/commonjs/features/chatbot/components/ChatMessages/ChatbotMessages.js +9 -6
  10. package/dist/commonjs/features/chatbot/components/ChatMessages/ChatbotMessages.js.map +1 -1
  11. package/dist/commonjs/features/chatbot/components/Chatbot.js +9 -8
  12. package/dist/commonjs/features/chatbot/components/Chatbot.js.map +1 -1
  13. package/dist/commonjs/features/chatbot/model/ChatBotModel.js +108 -107
  14. package/dist/commonjs/features/chatbot/model/ChatBotModel.js.map +1 -1
  15. package/dist/commonjs/features/chatbot/model/api.js.map +1 -1
  16. package/dist/commonjs/features/chatbot/model/t2s.js +2 -1
  17. package/dist/commonjs/features/chatbot/model/t2s.js.map +1 -1
  18. package/dist/commonjs/features/chatbot/model/translation.js +140 -121
  19. package/dist/commonjs/features/chatbot/model/translation.js.map +1 -1
  20. package/dist/commonjs/features/chatbot/types/model.types.js.map +1 -1
  21. package/dist/commonjs/index.js +1 -9
  22. package/dist/commonjs/index.js.map +1 -1
  23. package/dist/commonjs/lib/effector/createEntityFieldStore.js +13 -14
  24. package/dist/commonjs/lib/effector/createEntityFieldStore.js.map +1 -1
  25. package/dist/commonjs/shared/icons/ChatbotIcon.js +106 -613
  26. package/dist/commonjs/shared/icons/ChatbotIcon.js.map +1 -1
  27. package/dist/module/features/chatbot/components/Alternatives/Alternatives.js +9 -6
  28. package/dist/module/features/chatbot/components/Alternatives/Alternatives.js.map +1 -1
  29. package/dist/module/features/chatbot/components/ChatControls/ChatControls.js +5 -13
  30. package/dist/module/features/chatbot/components/ChatControls/ChatControls.js.map +1 -1
  31. package/dist/module/features/chatbot/components/ChatMessage/MessageLoader.js +3 -4
  32. package/dist/module/features/chatbot/components/ChatMessage/MessageLoader.js.map +1 -1
  33. package/dist/module/features/chatbot/components/ChatMessage/ReceivedMessage.js +4 -5
  34. package/dist/module/features/chatbot/components/ChatMessage/ReceivedMessage.js.map +1 -1
  35. package/dist/module/features/chatbot/components/ChatMessages/ChatbotMessages.js +9 -6
  36. package/dist/module/features/chatbot/components/ChatMessages/ChatbotMessages.js.map +1 -1
  37. package/dist/module/features/chatbot/components/Chatbot.js +9 -8
  38. package/dist/module/features/chatbot/components/Chatbot.js.map +1 -1
  39. package/dist/module/features/chatbot/index.js.map +1 -1
  40. package/dist/module/features/chatbot/model/ChatBotModel.js +109 -108
  41. package/dist/module/features/chatbot/model/ChatBotModel.js.map +1 -1
  42. package/dist/module/features/chatbot/model/api.js.map +1 -1
  43. package/dist/module/features/chatbot/model/t2s.js +2 -1
  44. package/dist/module/features/chatbot/model/t2s.js.map +1 -1
  45. package/dist/module/features/chatbot/model/translation.js +141 -122
  46. package/dist/module/features/chatbot/model/translation.js.map +1 -1
  47. package/dist/module/features/chatbot/types/model.types.js.map +1 -1
  48. package/dist/module/index.js +0 -1
  49. package/dist/module/index.js.map +1 -1
  50. package/dist/module/lib/effector/createEntityFieldStore.js +13 -12
  51. package/dist/module/lib/effector/createEntityFieldStore.js.map +1 -1
  52. package/dist/module/shared/icons/ChatbotIcon.js +107 -614
  53. package/dist/module/shared/icons/ChatbotIcon.js.map +1 -1
  54. package/dist/typescript/commonjs/features/chatbot/components/Alternatives/Alternatives.d.ts.map +1 -1
  55. package/dist/typescript/commonjs/features/chatbot/components/ChatControls/ChatControls.d.ts +1 -5
  56. package/dist/typescript/commonjs/features/chatbot/components/ChatControls/ChatControls.d.ts.map +1 -1
  57. package/dist/typescript/commonjs/features/chatbot/components/ChatMessages/ChatbotMessages.d.ts.map +1 -1
  58. package/dist/typescript/commonjs/features/chatbot/components/Chatbot.d.ts +1 -5
  59. package/dist/typescript/commonjs/features/chatbot/components/Chatbot.d.ts.map +1 -1
  60. package/dist/typescript/commonjs/features/chatbot/index.d.ts +1 -2
  61. package/dist/typescript/commonjs/features/chatbot/index.d.ts.map +1 -1
  62. package/dist/typescript/commonjs/features/chatbot/model/ChatBotModel.d.ts +49 -20
  63. package/dist/typescript/commonjs/features/chatbot/model/ChatBotModel.d.ts.map +1 -1
  64. package/dist/typescript/commonjs/features/chatbot/model/api.d.ts +7 -5
  65. package/dist/typescript/commonjs/features/chatbot/model/api.d.ts.map +1 -1
  66. package/dist/typescript/commonjs/features/chatbot/model/t2s.d.ts +1 -1
  67. package/dist/typescript/commonjs/features/chatbot/model/t2s.d.ts.map +1 -1
  68. package/dist/typescript/commonjs/features/chatbot/model/translation.d.ts +14 -30
  69. package/dist/typescript/commonjs/features/chatbot/model/translation.d.ts.map +1 -1
  70. package/dist/typescript/commonjs/features/chatbot/types/api.types.d.ts +0 -1
  71. package/dist/typescript/commonjs/features/chatbot/types/api.types.d.ts.map +1 -1
  72. package/dist/typescript/commonjs/features/chatbot/types/model.types.d.ts +7 -10
  73. package/dist/typescript/commonjs/features/chatbot/types/model.types.d.ts.map +1 -1
  74. package/dist/typescript/commonjs/features/chatbot/types/translation.types.d.ts +5 -20
  75. package/dist/typescript/commonjs/features/chatbot/types/translation.types.d.ts.map +1 -1
  76. package/dist/typescript/commonjs/index.d.ts +0 -1
  77. package/dist/typescript/commonjs/index.d.ts.map +1 -1
  78. package/dist/typescript/commonjs/lib/effector/createEntityFieldStore.d.ts +5 -6
  79. package/dist/typescript/commonjs/lib/effector/createEntityFieldStore.d.ts.map +1 -1
  80. package/dist/typescript/commonjs/shared/icons/ChatbotIcon.d.ts.map +1 -1
  81. package/dist/typescript/module/features/chatbot/components/Alternatives/Alternatives.d.ts.map +1 -1
  82. package/dist/typescript/module/features/chatbot/components/ChatControls/ChatControls.d.ts +1 -5
  83. package/dist/typescript/module/features/chatbot/components/ChatControls/ChatControls.d.ts.map +1 -1
  84. package/dist/typescript/module/features/chatbot/components/ChatMessages/ChatbotMessages.d.ts.map +1 -1
  85. package/dist/typescript/module/features/chatbot/components/Chatbot.d.ts +1 -5
  86. package/dist/typescript/module/features/chatbot/components/Chatbot.d.ts.map +1 -1
  87. package/dist/typescript/module/features/chatbot/index.d.ts +1 -2
  88. package/dist/typescript/module/features/chatbot/index.d.ts.map +1 -1
  89. package/dist/typescript/module/features/chatbot/model/ChatBotModel.d.ts +49 -20
  90. package/dist/typescript/module/features/chatbot/model/ChatBotModel.d.ts.map +1 -1
  91. package/dist/typescript/module/features/chatbot/model/api.d.ts +7 -5
  92. package/dist/typescript/module/features/chatbot/model/api.d.ts.map +1 -1
  93. package/dist/typescript/module/features/chatbot/model/t2s.d.ts +1 -1
  94. package/dist/typescript/module/features/chatbot/model/t2s.d.ts.map +1 -1
  95. package/dist/typescript/module/features/chatbot/model/translation.d.ts +14 -30
  96. package/dist/typescript/module/features/chatbot/model/translation.d.ts.map +1 -1
  97. package/dist/typescript/module/features/chatbot/types/api.types.d.ts +0 -1
  98. package/dist/typescript/module/features/chatbot/types/api.types.d.ts.map +1 -1
  99. package/dist/typescript/module/features/chatbot/types/model.types.d.ts +7 -10
  100. package/dist/typescript/module/features/chatbot/types/model.types.d.ts.map +1 -1
  101. package/dist/typescript/module/features/chatbot/types/translation.types.d.ts +5 -20
  102. package/dist/typescript/module/features/chatbot/types/translation.types.d.ts.map +1 -1
  103. package/dist/typescript/module/index.d.ts +0 -1
  104. package/dist/typescript/module/index.d.ts.map +1 -1
  105. package/dist/typescript/module/lib/effector/createEntityFieldStore.d.ts +5 -6
  106. package/dist/typescript/module/lib/effector/createEntityFieldStore.d.ts.map +1 -1
  107. package/dist/typescript/module/shared/icons/ChatbotIcon.d.ts.map +1 -1
  108. package/package.json +1 -1
  109. package/src/features/chatbot/components/Alternatives/Alternatives.tsx +9 -4
  110. package/src/features/chatbot/components/ChatControls/ChatControls.tsx +3 -6
  111. package/src/features/chatbot/components/ChatMessage/MessageLoader.tsx +2 -3
  112. package/src/features/chatbot/components/ChatMessage/ReceivedMessage.tsx +3 -4
  113. package/src/features/chatbot/components/ChatMessages/ChatbotMessages.tsx +9 -4
  114. package/src/features/chatbot/components/Chatbot.tsx +8 -5
  115. package/src/features/chatbot/index.ts +1 -7
  116. package/src/features/chatbot/model/ChatBotModel.ts +113 -102
  117. package/src/features/chatbot/model/api.ts +33 -24
  118. package/src/features/chatbot/model/t2s.ts +2 -1
  119. package/src/features/chatbot/model/translation.ts +161 -147
  120. package/src/features/chatbot/types/api.types.ts +0 -1
  121. package/src/features/chatbot/types/model.types.ts +7 -12
  122. package/src/features/chatbot/types/translation.types.ts +5 -21
  123. package/src/index.ts +0 -1
  124. package/src/lib/effector/createEntityFieldStore.ts +9 -11
  125. package/src/shared/icons/ChatbotIcon.tsx +85 -500
  126. package/dist/commonjs/features/chatbot/model/messagesHelper.js +0 -46
  127. package/dist/commonjs/features/chatbot/model/messagesHelper.js.map +0 -1
  128. package/dist/commonjs/features/chatbot/model/translation.helpers.js +0 -69
  129. package/dist/commonjs/features/chatbot/model/translation.helpers.js.map +0 -1
  130. package/dist/commonjs/lib/helpers/types.js +0 -2
  131. package/dist/commonjs/lib/helpers/types.js.map +0 -1
  132. package/dist/module/features/chatbot/model/messagesHelper.js +0 -41
  133. package/dist/module/features/chatbot/model/messagesHelper.js.map +0 -1
  134. package/dist/module/features/chatbot/model/translation.helpers.js +0 -63
  135. package/dist/module/features/chatbot/model/translation.helpers.js.map +0 -1
  136. package/dist/module/lib/helpers/types.js +0 -2
  137. package/dist/module/lib/helpers/types.js.map +0 -1
  138. package/dist/typescript/commonjs/features/chatbot/model/messagesHelper.d.ts +0 -21
  139. package/dist/typescript/commonjs/features/chatbot/model/messagesHelper.d.ts.map +0 -1
  140. package/dist/typescript/commonjs/features/chatbot/model/translation.helpers.d.ts +0 -10
  141. package/dist/typescript/commonjs/features/chatbot/model/translation.helpers.d.ts.map +0 -1
  142. package/dist/typescript/commonjs/lib/helpers/types.d.ts +0 -2
  143. package/dist/typescript/commonjs/lib/helpers/types.d.ts.map +0 -1
  144. package/dist/typescript/module/features/chatbot/model/messagesHelper.d.ts +0 -21
  145. package/dist/typescript/module/features/chatbot/model/messagesHelper.d.ts.map +0 -1
  146. package/dist/typescript/module/features/chatbot/model/translation.helpers.d.ts +0 -10
  147. package/dist/typescript/module/features/chatbot/model/translation.helpers.d.ts.map +0 -1
  148. package/dist/typescript/module/lib/helpers/types.d.ts +0 -2
  149. package/dist/typescript/module/lib/helpers/types.d.ts.map +0 -1
  150. package/src/features/chatbot/model/messagesHelper.ts +0 -48
  151. package/src/features/chatbot/model/translation.helpers.ts +0 -58
  152. package/src/lib/helpers/types.ts +0 -1
@@ -4,9 +4,9 @@ import {
4
4
  restore,
5
5
  sample,
6
6
  type Store,
7
- createStore,
8
- createEffect,
7
+ type Effect,
9
8
  combine,
9
+ createStore,
10
10
  } from 'effector'
11
11
  import { createControllerEffect, createEntityFieldStore } from '../../../lib/effector'
12
12
  import {
@@ -15,17 +15,16 @@ import {
15
15
  SendHelpParams,
16
16
  SendHelpProps,
17
17
  SetHintMessageProps,
18
- StartConversationFxData,
19
18
  } from '../types/model.types'
20
- import { GetAlternativesResponse } from '../types/api.types'
19
+ import { ChatAnswer, GetAlternativesResponse, PostMessageResponse } from '../types/api.types'
20
+ import { generateRandomId } from '../../../lib/helpers/helpers'
21
21
  import { ChatbotAPI } from './api'
22
22
  import { ChatbotTranslation } from './translation'
23
23
  import { ChatTextToSpeechModel } from './t2s'
24
- import { AudioProvider } from '../types/t2s.types'
25
- import { messagesHelper } from './messagesHelper'
26
24
 
27
- type ReinitConversationProps = {
25
+ type AddOptionProps = {
28
26
  key: string
27
+ options: ChatAnswer[]
29
28
  }
30
29
 
31
30
  export class ChatbotModel {
@@ -41,129 +40,152 @@ export class ChatbotModel {
41
40
 
42
41
  readonly setIsOpen = createEvent<boolean>()
43
42
  readonly toggleOpen = createEvent()
44
- readonly $isOpen = restore(this.setIsOpen, false).on(this.toggleOpen, (isOpen) => !isOpen)
43
+ readonly $isOpen = restore(this.setIsOpen, false).on(this.toggleOpen, isOpen => !isOpen)
45
44
 
45
+ // separate messages and alternatives class?
46
46
  public readonly removeLastMessage = createEvent()
47
47
  private readonly setLastMessageKey = createEvent<string>()
48
- public readonly $lastMessageKey = restore(this.setLastMessageKey, null)
48
+ private readonly $lastMessageKey = restore(this.setLastMessageKey, null)
49
49
 
50
50
  readonly setScrollActive = createEvent<boolean>()
51
51
  readonly $isScrollActive = restore(this.setScrollActive, false)
52
52
 
53
- readonly sendHelpRequestFx
53
+ readonly sendHelpRequestFx: Effect<SendHelpParams, PostMessageResponse | ConversationMessage>
54
54
 
55
55
  readonly defaultMessages: ChatbotModelProps['messages']
56
56
 
57
- readonly messages = createEntityFieldStore<ConversationMessage[]>()
58
- readonly threadIds = createEntityFieldStore<string>()
59
- readonly availableChats = createEntityFieldStore<boolean>()
60
-
61
- public readonly $currentChatData = combine(
62
- {
63
- messages: this.messages.$state,
64
- threadIds: this.threadIds.$state,
65
- availableChats: this.availableChats.$state,
66
- key: this.$currentKey,
67
- },
68
- ({ messages, threadIds, availableChats, key }) => {
69
- return {
70
- messages: messages[key] ?? [],
71
- threadId: threadIds[key] ?? null,
72
- isAvailable: availableChats[key] ?? false,
73
- key,
74
- }
75
- },
76
- )
77
-
78
- constructor({ api, messages, $key }: ChatbotModelProps) {
57
+ constructor({ credits, api, messages, $key }: ChatbotModelProps) {
79
58
  this.api = new ChatbotAPI(api)
80
59
 
81
60
  this.defaultMessages = messages
82
- if ($key) sample({ source: $key, target: this.$currentKey })
61
+ if ($key) {
62
+ sample({
63
+ source: $key,
64
+ target: this.$currentKey,
65
+ })
66
+ } else if (credits) {
67
+ // sample({
68
+ // source: combine(
69
+ // credits,
70
+ // ({ $assignmentId, $exerciseId }) => `${$assignmentId}-${$exerciseId}`,
71
+ // ),
72
+ // target: this.$currentKey,
73
+ // })
74
+ }
83
75
 
84
76
  this.$alternatives = restore(this.api.getAlternativesFx.doneData, null)
85
77
  .on(this.setAlternatives, (_, payload) => payload)
86
78
  .reset(this.resetAlternatives)
87
79
 
88
- this.translation = new ChatbotTranslation({
89
- defaultMessages: messages,
90
- $key: this.$currentKey,
91
- api: this.api,
92
- messagesModel: this.messages,
93
- alternativesModel: {
94
- $store: this.$alternatives,
95
- set: this.setAlternatives,
96
- },
97
- })
98
-
80
+ // TODO: do not pass this, just what you need
81
+ this.translation = new ChatbotTranslation(this)
99
82
  this.t2s = new ChatTextToSpeechModel({ $isOpen: this.$isOpen, api: this.api })
100
83
 
101
84
  this.sendHelpRequestFx = this.createSendHelpRequestFx()
102
85
  this.initChatReplyWatcher()
103
86
  }
104
87
 
88
+ readonly messages = createEntityFieldStore<ConversationMessage[]>()
89
+ readonly threadIds = createEntityFieldStore<string>()
90
+ readonly availableChats = createEntityFieldStore<boolean>()
91
+
105
92
  private createSendHelpRequestFx() {
106
- const effect = attach({
107
- source: [this.$currentKey, this.translation.$isTranslated],
108
- mapParams: (params: SendHelpParams, [key, isTranslated]) => ({
93
+ return attach({
94
+ source: [this.$currentKey, this.messages.$state, this.translation.$isTranslated],
95
+ mapParams: (params: SendHelpParams, [key, messages, isTranslated]) => ({
109
96
  ...params,
110
97
  key,
98
+ messages,
111
99
  isTranslated,
112
100
  }),
113
101
  effect: createControllerEffect(
114
102
  async ({
115
103
  payload,
116
- message,
117
- translationTargetLanguage: targetLanguage,
104
+ message = '',
105
+ translationTargetLanguage,
118
106
  translatedMessage,
119
107
  key,
108
+ messages,
120
109
  isTranslated,
121
110
  }: SendHelpProps) => {
122
111
  this.setLastMessageKey(key)
112
+
113
+ const currentMessages = messages[key] || []
114
+
123
115
  this.messages.setField({
124
116
  key,
125
- fn: (currentMessages) => [
126
- ...(currentMessages || []),
127
- messagesHelper.createOwn({ message, translatedMessage, threadId: payload.threadId }),
117
+ data: [
118
+ ...currentMessages,
119
+ {
120
+ id: generateRandomId(),
121
+ message: message ?? '',
122
+ translatedMessage,
123
+ isOwnMessage: true,
124
+ threadId: payload.threadId ?? '',
125
+ options: [],
126
+ },
128
127
  ],
129
128
  })
130
129
 
131
130
  const response = await this.api.postMessageFx(payload)
132
- let messages = [messagesHelper.createAnswer(response)]
133
- if (response.endMessage) {
134
- messages.push(messagesHelper.createLast(this.defaultMessages.endMessage))
135
- }
136
131
  if (isTranslated) {
137
- messages = await this.translation.translateMessagesFx({ targetLanguage, messages })
132
+ return await this.translation.translateMessageFx({
133
+ targetLanguage: translationTargetLanguage as string,
134
+ message: {
135
+ ...response,
136
+ id: generateRandomId(),
137
+ isOwnMessage: false,
138
+ },
139
+ })
138
140
  }
139
141
 
140
- this.messages.setField({
141
- key,
142
- fn: (currentMessages) => [...(currentMessages || []), ...messages],
143
- })
144
- this.threadIds.setField({ key, data: response.threadId })
142
+ return response
145
143
  },
146
144
  ),
147
145
  })
146
+ }
147
+
148
+ private initChatReplyWatcher() {
149
+ sample({
150
+ clock: this.sendHelpRequestFx.doneData,
151
+ source: [this.$currentKey, this.messages.$state] as const,
152
+ fn: ([key, messages], response) => ({ key, messages: messages[key] || [], response }),
153
+ }).watch(({ key, messages, response }) => {
154
+ this.messages.setField({
155
+ key,
156
+ data: [
157
+ ...messages,
158
+ {
159
+ id: generateRandomId(),
160
+ message: response.message,
161
+ isOwnMessage: false,
162
+ threadId: response.threadId,
163
+ options: response.options,
164
+ translatedMessage:
165
+ 'translatedMessage' in response ? response.translatedMessage : undefined,
166
+ },
167
+ ],
168
+ })
169
+
170
+ this.threadIds.setField({ key, data: response.threadId })
171
+ })
148
172
 
149
173
  sample({
150
- clock: effect.fail,
151
- source: this.$currentChatData,
152
- fn: ({ key, messages }) => ({ key, data: [...messages, this.defaultMessages.error] }),
174
+ clock: this.sendHelpRequestFx.fail,
175
+ source: [this.$currentKey, this.messages.$state] as const,
176
+ fn: ([key, messages]) => ({ key, data: [...messages[key], this.defaultMessages.error] }),
153
177
  filter: (_, { error }) => error.message !== 'Request aborted manually',
154
178
  target: this.messages.setField,
155
179
  })
156
180
 
157
- return effect
158
- }
159
-
160
- private initChatReplyWatcher() {
161
181
  sample({
162
182
  clock: this.removeLastMessage,
163
183
  source: [this.$lastMessageKey, this.messages.$state] as const,
164
184
  fn: ([lastMessageKey, messages]) => {
165
- if (!lastMessageKey) return { key: '', data: [] }
166
- const updatedMessages = [...messages[lastMessageKey]]
185
+ const mockData = { key: '', data: [] }
186
+ if (!lastMessageKey) return mockData
187
+ const updatedMessages = messages[lastMessageKey]
188
+ if (!updatedMessages?.length) return mockData
167
189
  updatedMessages.pop()
168
190
  return { key: lastMessageKey, data: updatedMessages }
169
191
  },
@@ -172,48 +194,42 @@ export class ChatbotModel {
172
194
  })
173
195
  }
174
196
 
175
- public readonly startConversation = attach({
176
- source: this.$currentChatData,
177
- mapParams: (_: void, source) => source,
178
- effect: createEffect(({ key, messages }: StartConversationFxData) => {
179
- if (messages.length) return this.reinitConversation({ key })
180
- this.messages.setField({ key, data: [this.defaultMessages.start] })
181
- this.availableChats.setField({ key, data: true })
182
- }),
183
- })
184
-
185
- public setHintMessage({ key, ...message }: SetHintMessageProps) {
197
+ public startConversation() {
198
+ const key = this.$currentKey.getState()
199
+ const messages = this.messages.$state.getState()[key] ?? []
200
+
201
+ if (messages.length) return
202
+
203
+ this.messages.setField({ key, data: [this.defaultMessages.start] })
204
+ this.availableChats.setField({ key, data: true })
205
+ }
206
+
207
+ public setHintMessage({ entityId, fieldId, ...message }: SetHintMessageProps) {
186
208
  const options = this.$alternatives.getState()?.options.hints ?? message.options
187
209
  this.messages.setField({
188
- key,
189
- fn: (messages) => {
210
+ key: `${entityId}-${fieldId}`,
211
+ fn: messages => {
190
212
  if (!messages || messages.length > 1) return
191
213
  return [{ ...message, options }]
192
214
  },
193
215
  })
194
216
  }
195
217
 
196
- public readonly reinitConversation = createEffect(({ key }: ReinitConversationProps) => {
218
+ public addOption({ options, key }: AddOptionProps) {
197
219
  this.messages.setField({
198
220
  key,
199
- fn: (messages) => {
200
- if (!messages?.length || messages.length === 1) return
221
+ fn: messages => {
222
+ if (!messages?.length) return
223
+ const lastMessage = messages[messages.length - 1]
201
224
  const copy = [...messages]
202
- while (copy.at(-1)?.endMessage) {
203
- copy.pop()
204
- }
205
-
206
- const lastMessage = copy.at(-1)
207
- if (!lastMessage) return
208
-
209
- copy.splice(copy.length - 1, 1, {
225
+ copy.splice(messages.length - 1, 1, {
210
226
  ...lastMessage,
211
- options: [this.defaultMessages.anotherHintOption],
227
+ options: [...lastMessage.options, ...options],
212
228
  })
213
229
  return copy
214
230
  },
215
231
  })
216
- })
232
+ }
217
233
 
218
234
  public bindKey($store: Store<string>) {
219
235
  sample({
@@ -222,9 +238,4 @@ export class ChatbotModel {
222
238
  })
223
239
  return this
224
240
  }
225
-
226
- public setT2SAudioProvider(audioProvider: AudioProvider) {
227
- this.t2s.setAudioProvider(audioProvider)
228
- return this
229
- }
230
241
  }
@@ -1,37 +1,46 @@
1
- import { createEffect } from 'effector'
1
+ import { createEffect, Effect } from 'effector'
2
+
2
3
  import { createControllerEffect } from '../../../lib/effector'
4
+ import { ControlledEffect } from '../../../lib/effector/createControllerEffect'
3
5
  import { ChatbotModelProps } from '../types/model.types'
4
- import { GoogleTranslatePayload, GoogleTranslateResponse } from '../types/api.types'
6
+ import {
7
+ GetAlternativesResponse,
8
+ PostMessagePayload,
9
+ PostMessageResponse,
10
+ GoogleTranslatePayload,
11
+ GoogleTranslateResponse,
12
+ GoogleText2SpeechPayload,
13
+ GoogleText2SpeechResponse,
14
+ GetAlternativesPayload,
15
+ } from '../types/api.types'
5
16
  import { replaceKatexSyntax } from '../helpers'
6
17
 
7
18
  export class ChatbotAPI {
8
- public readonly postMessageFx
9
- public readonly getAlternativesFx
10
- public readonly translateTextFx
11
- public readonly textToSpeechTextFx
19
+ postMessageFx: ControlledEffect<PostMessagePayload, PostMessageResponse>
20
+ getAlternativesFx: Effect<GetAlternativesPayload, GetAlternativesResponse>
21
+ translateTextFx: Effect<GoogleTranslatePayload, GoogleTranslateResponse>
22
+ textToSpeechTextFx: Effect<GoogleText2SpeechPayload, GoogleText2SpeechResponse>
12
23
 
13
24
  constructor(api: ChatbotModelProps['api']) {
14
25
  this.postMessageFx = createControllerEffect(api.postMessage)
15
26
  this.getAlternativesFx = createEffect(api.getAlternatives)
16
- this.translateTextFx = createEffect(
17
- async (payload: GoogleTranslatePayload): Promise<GoogleTranslateResponse> => {
18
- const response = await api.postTranslateText({
19
- ...payload,
20
- text: replaceKatexSyntax(payload.text),
21
- })
27
+ this.translateTextFx = createEffect(async (payload: GoogleTranslatePayload) => {
28
+ const response = await api.postTranslateText({
29
+ ...payload,
30
+ text: replaceKatexSyntax(payload.text),
31
+ })
22
32
 
23
- return {
24
- ...response,
25
- data: {
26
- ...response.data,
27
- translations: response.data.translations.map((translation) => ({
28
- ...translation,
29
- translatedText: replaceKatexSyntax([translation.translatedText], true)[0],
30
- })),
31
- },
32
- }
33
- },
34
- )
33
+ return {
34
+ ...response,
35
+ data: {
36
+ ...response.data,
37
+ translations: response.data.translations.map(translation => ({
38
+ ...translation,
39
+ translatedText: replaceKatexSyntax([translation.translatedText], true)[0],
40
+ })),
41
+ },
42
+ }
43
+ })
35
44
  this.textToSpeechTextFx = createEffect(api.postTextToSpeech)
36
45
  }
37
46
  }
@@ -1,7 +1,8 @@
1
- import { restore, createEvent, Store, sample, createEffect } from 'effector'
1
+ import { restore, createEvent, Store, sample } from 'effector'
2
2
  import { AUDIO_CONFIG, DEFAULT_VOICE } from '../constants'
3
3
  import { AudioProvider, AudioStatus, PlayTextToSpeechProps } from '../types/t2s.types'
4
4
  import { ChatbotAPI } from './api'
5
+ import { createEffect } from 'effector/effector.umd'
5
6
 
6
7
  type ChatTextToSpeechModelProps = {
7
8
  $isOpen: Store<boolean>