@magmamath/students-features 0.3.0-rc.13 → 0.3.0-rc.14

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 (95) hide show
  1. package/dist/commonjs/features/chatbot/components/Alternatives/Alternatives.js +1 -1
  2. package/dist/commonjs/features/chatbot/components/Alternatives/Alternatives.js.map +1 -1
  3. package/dist/commonjs/features/chatbot/components/ChatControls/ChatControls.js +1 -1
  4. package/dist/commonjs/features/chatbot/components/ChatControls/ChatControls.js.map +1 -1
  5. package/dist/commonjs/features/chatbot/components/Chatbot.js +1 -1
  6. package/dist/commonjs/features/chatbot/components/Chatbot.js.map +1 -1
  7. package/dist/commonjs/features/chatbot/model/ChatBotModel.js +34 -60
  8. package/dist/commonjs/features/chatbot/model/ChatBotModel.js.map +1 -1
  9. package/dist/commonjs/features/chatbot/model/api.js.map +1 -1
  10. package/dist/commonjs/features/chatbot/model/messagesHelper.js +46 -0
  11. package/dist/commonjs/features/chatbot/model/messagesHelper.js.map +1 -0
  12. package/dist/commonjs/features/chatbot/model/translation.helpers.js +62 -0
  13. package/dist/commonjs/features/chatbot/model/translation.helpers.js.map +1 -0
  14. package/dist/commonjs/features/chatbot/model/translation.js +94 -130
  15. package/dist/commonjs/features/chatbot/model/translation.js.map +1 -1
  16. package/dist/commonjs/features/chatbot/types/model.types.js.map +1 -1
  17. package/dist/commonjs/index.js +9 -1
  18. package/dist/commonjs/index.js.map +1 -1
  19. package/dist/commonjs/lib/helpers/types.js +2 -0
  20. package/dist/commonjs/lib/helpers/types.js.map +1 -0
  21. package/dist/module/features/chatbot/components/Alternatives/Alternatives.js +1 -1
  22. package/dist/module/features/chatbot/components/Alternatives/Alternatives.js.map +1 -1
  23. package/dist/module/features/chatbot/components/ChatControls/ChatControls.js +1 -1
  24. package/dist/module/features/chatbot/components/ChatControls/ChatControls.js.map +1 -1
  25. package/dist/module/features/chatbot/components/Chatbot.js +1 -1
  26. package/dist/module/features/chatbot/components/Chatbot.js.map +1 -1
  27. package/dist/module/features/chatbot/index.js.map +1 -1
  28. package/dist/module/features/chatbot/model/ChatBotModel.js +34 -60
  29. package/dist/module/features/chatbot/model/ChatBotModel.js.map +1 -1
  30. package/dist/module/features/chatbot/model/api.js.map +1 -1
  31. package/dist/module/features/chatbot/model/messagesHelper.js +41 -0
  32. package/dist/module/features/chatbot/model/messagesHelper.js.map +1 -0
  33. package/dist/module/features/chatbot/model/translation.helpers.js +57 -0
  34. package/dist/module/features/chatbot/model/translation.helpers.js.map +1 -0
  35. package/dist/module/features/chatbot/model/translation.js +95 -131
  36. package/dist/module/features/chatbot/model/translation.js.map +1 -1
  37. package/dist/module/features/chatbot/types/model.types.js.map +1 -1
  38. package/dist/module/index.js +1 -0
  39. package/dist/module/index.js.map +1 -1
  40. package/dist/module/lib/helpers/types.js +2 -0
  41. package/dist/module/lib/helpers/types.js.map +1 -0
  42. package/dist/typescript/commonjs/features/chatbot/index.d.ts +1 -1
  43. package/dist/typescript/commonjs/features/chatbot/index.d.ts.map +1 -1
  44. package/dist/typescript/commonjs/features/chatbot/model/ChatBotModel.d.ts +6 -6
  45. package/dist/typescript/commonjs/features/chatbot/model/ChatBotModel.d.ts.map +1 -1
  46. package/dist/typescript/commonjs/features/chatbot/model/api.d.ts +5 -7
  47. package/dist/typescript/commonjs/features/chatbot/model/api.d.ts.map +1 -1
  48. package/dist/typescript/commonjs/features/chatbot/model/messagesHelper.d.ts +21 -0
  49. package/dist/typescript/commonjs/features/chatbot/model/messagesHelper.d.ts.map +1 -0
  50. package/dist/typescript/commonjs/features/chatbot/model/translation.d.ts +9 -9
  51. package/dist/typescript/commonjs/features/chatbot/model/translation.d.ts.map +1 -1
  52. package/dist/typescript/commonjs/features/chatbot/model/translation.helpers.d.ts +20 -0
  53. package/dist/typescript/commonjs/features/chatbot/model/translation.helpers.d.ts.map +1 -0
  54. package/dist/typescript/commonjs/features/chatbot/types/model.types.d.ts +4 -0
  55. package/dist/typescript/commonjs/features/chatbot/types/model.types.d.ts.map +1 -1
  56. package/dist/typescript/commonjs/features/chatbot/types/translation.types.d.ts +19 -4
  57. package/dist/typescript/commonjs/features/chatbot/types/translation.types.d.ts.map +1 -1
  58. package/dist/typescript/commonjs/index.d.ts +1 -0
  59. package/dist/typescript/commonjs/index.d.ts.map +1 -1
  60. package/dist/typescript/commonjs/lib/helpers/types.d.ts +2 -0
  61. package/dist/typescript/commonjs/lib/helpers/types.d.ts.map +1 -0
  62. package/dist/typescript/module/features/chatbot/index.d.ts +1 -1
  63. package/dist/typescript/module/features/chatbot/index.d.ts.map +1 -1
  64. package/dist/typescript/module/features/chatbot/model/ChatBotModel.d.ts +6 -6
  65. package/dist/typescript/module/features/chatbot/model/ChatBotModel.d.ts.map +1 -1
  66. package/dist/typescript/module/features/chatbot/model/api.d.ts +5 -7
  67. package/dist/typescript/module/features/chatbot/model/api.d.ts.map +1 -1
  68. package/dist/typescript/module/features/chatbot/model/messagesHelper.d.ts +21 -0
  69. package/dist/typescript/module/features/chatbot/model/messagesHelper.d.ts.map +1 -0
  70. package/dist/typescript/module/features/chatbot/model/translation.d.ts +9 -9
  71. package/dist/typescript/module/features/chatbot/model/translation.d.ts.map +1 -1
  72. package/dist/typescript/module/features/chatbot/model/translation.helpers.d.ts +20 -0
  73. package/dist/typescript/module/features/chatbot/model/translation.helpers.d.ts.map +1 -0
  74. package/dist/typescript/module/features/chatbot/types/model.types.d.ts +4 -0
  75. package/dist/typescript/module/features/chatbot/types/model.types.d.ts.map +1 -1
  76. package/dist/typescript/module/features/chatbot/types/translation.types.d.ts +19 -4
  77. package/dist/typescript/module/features/chatbot/types/translation.types.d.ts.map +1 -1
  78. package/dist/typescript/module/index.d.ts +1 -0
  79. package/dist/typescript/module/index.d.ts.map +1 -1
  80. package/dist/typescript/module/lib/helpers/types.d.ts +2 -0
  81. package/dist/typescript/module/lib/helpers/types.d.ts.map +1 -0
  82. package/package.json +1 -1
  83. package/src/features/chatbot/components/Alternatives/Alternatives.tsx +1 -1
  84. package/src/features/chatbot/components/ChatControls/ChatControls.tsx +1 -1
  85. package/src/features/chatbot/components/Chatbot.tsx +1 -1
  86. package/src/features/chatbot/index.ts +6 -1
  87. package/src/features/chatbot/model/ChatBotModel.ts +36 -67
  88. package/src/features/chatbot/model/api.ts +24 -33
  89. package/src/features/chatbot/model/messagesHelper.ts +48 -0
  90. package/src/features/chatbot/model/translation.helpers.ts +50 -0
  91. package/src/features/chatbot/model/translation.ts +91 -147
  92. package/src/features/chatbot/types/model.types.ts +5 -0
  93. package/src/features/chatbot/types/translation.types.ts +20 -4
  94. package/src/index.ts +1 -0
  95. package/src/lib/helpers/types.ts +1 -0
@@ -1,23 +1,16 @@
1
+ import { attach, createEffect, createEvent, EventCallable, restore, sample, Store } from 'effector'
1
2
  import {
2
- createEvent,
3
- restore,
4
- attach,
5
- createEffect,
6
- type Effect,
7
- sample,
8
- Store,
9
- EventCallable,
10
- } from 'effector'
11
- import {
12
- TranslateAlternativesFxProps,
3
+ AddTranslationToAlternativesProps,
13
4
  TranslateBatchFxProps,
14
5
  TranslateMessageFxProps,
6
+ TranslateRequestProps,
15
7
  } from '../types/translation.types'
16
8
  import { ChatbotModelProps, ConversationMessage } from '../types/model.types'
17
9
  import { GetAlternativesResponse } from '../types/api.types'
18
10
  import { decodeHTMLEntities } from '../helpers'
19
11
  import { ChatbotAPI } from './api'
20
12
  import { EntityFieldStore } from '../../../lib/effector/createEntityFieldStore'
13
+ import { addTranslationsToAlternative, getOptionsForTranslation } from './translation.helpers'
21
14
 
22
15
  type ChatbotTranslationProps = {
23
16
  api: ChatbotAPI
@@ -40,12 +33,7 @@ export class ChatbotTranslation {
40
33
  readonly setIsTranslated = createEvent<boolean>()
41
34
  readonly $isTranslated = restore(this.setIsTranslated, false)
42
35
 
43
- readonly translateMessageFx: Effect<TranslateMessageFxProps, ConversationMessage>
44
- readonly translateBatchFx: Effect<TranslateBatchFxProps['params'], ConversationMessage[]>
45
- readonly translateAlternativesFx: Effect<
46
- TranslateAlternativesFxProps['params'],
47
- GetAlternativesResponse | null
48
- >
36
+ readonly translateAllMessagesFx
49
37
 
50
38
  constructor({
51
39
  api,
@@ -60,10 +48,15 @@ export class ChatbotTranslation {
60
48
  this.messagesModel = messagesModel
61
49
  this.alternativesModel = alternativesModel
62
50
 
63
- this.translateAlternativesFx = this.createTranslateAlternativesEffect()
64
- this.translateMessageFx = this.createTranslateMessageEffect()
65
- this.translateBatchFx = this.createTranslateBatchEffect()
66
-
51
+ this.translateAllMessagesFx = attach({
52
+ source: [this.$key, this.messagesModel.$state, this.alternativesModel.$store],
53
+ mapParams: (params: TranslateBatchFxProps['params'], [key, messages, alternatives]) => ({
54
+ params,
55
+ messages: messages[key] ?? [],
56
+ alternatives,
57
+ }),
58
+ effect: this.translateBatchFx,
59
+ })
67
60
  this.initTranslationSamples()
68
61
  }
69
62
 
@@ -73,7 +66,7 @@ export class ChatbotTranslation {
73
66
  return true
74
67
  }
75
68
 
76
- const allTranslated = messages.every(message => message.translatedMessage)
69
+ const allTranslated = messages.every((message) => message.translatedMessage)
77
70
  if (allTranslated) {
78
71
  this.setIsTranslated(true)
79
72
  return true
@@ -84,69 +77,91 @@ export class ChatbotTranslation {
84
77
 
85
78
  private initTranslationSamples() {
86
79
  sample({
87
- clock: this.translateBatchFx.doneData,
80
+ clock: this.translateAllMessagesFx.doneData,
88
81
  source: [this.$key] as const,
89
82
  fn: ([key], translatedMessages) => ({ key, data: translatedMessages }),
90
83
  target: this.messagesModel.setField,
91
84
  })
92
85
  }
93
86
 
94
- private createTranslateAlternativesEffect() {
95
- return attach({
96
- source: [this.alternativesModel.$store],
97
- mapParams: (params: TranslateAlternativesFxProps['params'], [alternatives]) => ({
98
- params,
99
- alternatives,
100
- }),
101
- effect: createEffect(async ({ alternatives, params }: TranslateAlternativesFxProps) => {
102
- const hintAlternatives = alternatives?.options.hints ?? []
103
- const defaultAlternatives = alternatives?.options.default ?? []
104
-
105
- const translatedAlternatives = { ...alternatives }
106
-
107
- if (hintAlternatives.length) {
108
- const hintText = hintAlternatives.map(({ text }) => text)
109
- const response = await this.api.translateTextFx({
110
- text: hintText,
111
- targetLanguage: params.targetLanguage,
112
- })
113
-
114
- if (translatedAlternatives.options) {
115
- translatedAlternatives.options.hints = hintAlternatives.map((alternative, index) => ({
116
- ...alternative,
117
- translatedMessage: decodeHTMLEntities(
118
- response.data.translations[index].translatedText,
119
- ),
120
- }))
121
- }
122
- }
87
+ private async translateRequest<List extends Record<string, string[]>>(
88
+ props: TranslateRequestProps<List>,
89
+ ) {
90
+ const text = Object.values(props.text).flat()
123
91
 
124
- if (defaultAlternatives.length) {
125
- const defaultText = defaultAlternatives.map(({ text }) => text)
126
- const response = await this.api.translateTextFx({
127
- text: defaultText,
128
- targetLanguage: params.targetLanguage,
129
- })
130
-
131
- if (translatedAlternatives.options) {
132
- translatedAlternatives.options.default = defaultAlternatives.map(
133
- (alternative, index) => ({
134
- ...alternative,
135
- translatedText: decodeHTMLEntities(
136
- response.data.translations[index].translatedText,
137
- ),
138
- }),
139
- )
140
- }
141
- }
92
+ const response = await this.api.translateTextFx({
93
+ text,
94
+ targetLanguage: props.targetLanguage,
95
+ })
142
96
 
143
- return translatedAlternatives as GetAlternativesResponse | null
144
- }),
97
+ const translatedText = response.data.translations.map(({ translatedText }) =>
98
+ decodeHTMLEntities(translatedText),
99
+ )
100
+
101
+ const result = {} as Record<keyof List, string[]>
102
+ Object.keys(props.text).forEach((key) => {
103
+ const count = props.text[key].length
104
+ result[key as keyof List] = translatedText.splice(0, count)
145
105
  })
106
+ return result
146
107
  }
147
108
 
148
- private createTranslateMessageEffect() {
149
- return createEffect(async ({ message, targetLanguage }: TranslateMessageFxProps) => {
109
+ private addTranslationToAlternatives(props: AddTranslationToAlternativesProps) {
110
+ this.alternativesModel.set(addTranslationsToAlternative(props))
111
+ }
112
+
113
+ private readonly translateBatchFx = createEffect(
114
+ async ({ messages, params, alternatives }: TranslateBatchFxProps) => {
115
+ if (this.shouldSkipTranslation(messages)) {
116
+ return messages
117
+ }
118
+
119
+ const defaultMessages = [this.defaultMessages.error, this.defaultMessages.endMessage]
120
+ const defaultOptions = [this.defaultMessages.anotherHintOption]
121
+ const options = getOptionsForTranslation({ lastMessage: messages.at(-1), alternatives })
122
+
123
+ const translatedTextsList = await this.translateRequest({
124
+ text: {
125
+ messages: messages.map(({ message }) => message),
126
+ defaultMessages: defaultMessages.map(({ message }) => message),
127
+ defaultOptions: defaultOptions.map(({ text }) => text),
128
+ lastMessage: options.lastMessage || [],
129
+ alternativesHints: options.alternatives?.hints || [],
130
+ alternativesDefaults: options.alternatives?.default || [],
131
+ },
132
+ targetLanguage: params.targetLanguage,
133
+ })
134
+
135
+ translatedTextsList.defaultMessages.forEach((message, index) => {
136
+ defaultMessages[index].translatedMessage = message
137
+ })
138
+ translatedTextsList.defaultOptions.forEach((message, index) => {
139
+ defaultOptions[index].translatedText = message
140
+ })
141
+ if (options.alternatives && alternatives) {
142
+ this.addTranslationToAlternatives({
143
+ alternatives,
144
+ translatedHints: translatedTextsList.alternativesHints,
145
+ translatedDefaults: translatedTextsList.alternativesDefaults,
146
+ })
147
+ }
148
+
149
+ // TODO: move this AFTER state update in sample and remove initTranslationSamples it is not needed
150
+ this.setIsTranslated(true)
151
+
152
+ return messages.map((message, index) => {
153
+ const isLastMessage = index === messages.length - 1
154
+ return {
155
+ ...message,
156
+ options: isLastMessage ? translatedTextsList.lastMessage : message.options,
157
+ translatedMessage: translatedTextsList.messages[index],
158
+ }
159
+ }) as ConversationMessage[]
160
+ },
161
+ )
162
+
163
+ public readonly translateMessageFx = createEffect(
164
+ async ({ message, targetLanguage }: TranslateMessageFxProps) => {
150
165
  const optionsText = message.options.map(({ text }) => text)
151
166
  const response = await this.api.translateTextFx({
152
167
  text: [message.message, ...optionsText],
@@ -165,79 +180,8 @@ export class ChatbotTranslation {
165
180
  translatedMessage: decodeHTMLEntities(response.data.translations[0].translatedText),
166
181
  options: newOptions,
167
182
  } as ConversationMessage
168
- })
169
- }
170
-
171
- private createTranslateBatchEffect() {
172
- return attach({
173
- source: [this.$key, this.messagesModel.$state],
174
- mapParams: (params: TranslateBatchFxProps['params'], [key, messages]) => ({
175
- params,
176
- messages: messages[key] ?? [],
177
- }),
178
- effect: createEffect(async ({ messages, params }: TranslateBatchFxProps) => {
179
- if (this.shouldSkipTranslation(messages)) {
180
- return messages
181
- }
182
-
183
- const messagesText = messages.map(({ message }) => message)
184
- const response = await this.api.translateTextFx({
185
- text: messagesText,
186
- targetLanguage: params.targetLanguage,
187
- })
188
-
189
- const lastMessage = messages.at(-1)
190
- const lastMessageTranslatedOptions = lastMessage
191
- ? await this.translateMessageOptions(lastMessage, params.targetLanguage)
192
- : undefined
193
-
194
- const errorMessageTranslationResponse = await this.api.translateTextFx({
195
- text: [this.defaultMessages.error.message],
196
- targetLanguage: params.targetLanguage,
197
- })
198
-
199
- this.defaultMessages.error.translatedMessage = decodeHTMLEntities(
200
- errorMessageTranslationResponse.data.translations[0].translatedText,
201
- )
202
-
203
- // TODO: move this AFTER state update in sample and remove initTranslationSamples it is not needed
204
- // TODO: maybe just one request to translate everything
205
- this.setIsTranslated(true)
206
-
207
- const translatedMessages = response.data.translations.map(
208
- ({ translatedText }) => translatedText,
209
- )
210
-
211
- return messages.map((message, index) => {
212
- const isLastMessage = index === messages.length - 1
213
- return {
214
- ...message,
215
- options: isLastMessage ? lastMessageTranslatedOptions : message.options,
216
- translatedMessage: decodeHTMLEntities(translatedMessages[index]),
217
- }
218
- }) as ConversationMessage[]
219
- }),
220
- })
221
- }
222
-
223
- private async translateMessageOptions(message: ConversationMessage, targetLanguage: string) {
224
- if (!message?.options?.length) {
225
- const translatedAlternatives = await this.translateAlternativesFx({ targetLanguage })
226
- this.alternativesModel.set(translatedAlternatives)
227
- return
228
- }
229
-
230
- const optionsText = message.options.map(({ text }) => text)
231
- const response = await this.api.translateTextFx({
232
- text: optionsText,
233
- targetLanguage,
234
- })
235
-
236
- return message.options.map((option, index) => ({
237
- ...option,
238
- translatedText: decodeHTMLEntities(response.data.translations[index].translatedText),
239
- }))
240
- }
183
+ },
184
+ )
241
185
 
242
186
  public reset() {
243
187
  this.setIsTranslated(false)
@@ -10,6 +10,7 @@ import {
10
10
  ChatAnswer,
11
11
  GetAlternativesPayload,
12
12
  } from './api.types'
13
+ import { AccomplishTo } from '../../../lib/helpers/types'
13
14
 
14
15
  export type ConversationMessage = {
15
16
  id: string
@@ -32,6 +33,8 @@ export type ChatbotModelProps = {
32
33
  messages: {
33
34
  error: ConversationMessage
34
35
  start: ConversationMessage
36
+ endMessage: ConversationMessage
37
+ anotherHintOption: ChatAnswer
35
38
  }
36
39
  }
37
40
 
@@ -66,3 +69,5 @@ export type ChatbotRenderer = {
66
69
  variant: MessageVariant
67
70
  withTextToSpeech: boolean
68
71
  }
72
+
73
+ export type CreateMessageResponse = AccomplishTo<PostMessageResponse, ConversationMessage>
@@ -6,6 +6,7 @@ export type TranslateBatchFxProps = {
6
6
  params: {
7
7
  targetLanguage: string
8
8
  }
9
+ alternatives: GetAlternativesResponse | null
9
10
  }
10
11
 
11
12
  export type TranslateMessageFxProps = {
@@ -13,9 +14,24 @@ export type TranslateMessageFxProps = {
13
14
  targetLanguage: string
14
15
  }
15
16
 
16
- export type TranslateAlternativesFxProps = {
17
+ export type AddTranslationToAlternativesProps = {
18
+ alternatives: GetAlternativesResponse
19
+ translatedHints: string[]
20
+ translatedDefaults: string[]
21
+ }
22
+ export type GetOptionsProps = {
17
23
  alternatives: GetAlternativesResponse | null
18
- params: {
19
- targetLanguage: string
20
- }
24
+ lastMessage: ConversationMessage | undefined
25
+ }
26
+ export type GetOptionsResult = {
27
+ lastMessage: string[] | null
28
+ alternatives: {
29
+ hints: string[]
30
+ default: string[]
31
+ } | null
32
+ }
33
+
34
+ export type TranslateRequestProps<List extends Record<string, string[]>> = {
35
+ text: List
36
+ targetLanguage: string
21
37
  }
package/src/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { useFeaturesLocalization, setFeaturesLocalization, Locale } from './shared/translation'
2
2
  export type { LocalizationConfig } from './shared/translation'
3
+ export { generateRandomId } from './lib/helpers/helpers'
3
4
  export * from './features/chatbot'
4
5
  export * from './features/feedback'
@@ -0,0 +1 @@
1
+ export type AccomplishTo<T, To> = Partial<Omit<To, keyof T>> & T