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