@magmamath/students-features 0.3.0-rc.9 → 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 (139) 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 +70 -88
  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/translation.helpers.js +69 -0
  21. package/dist/commonjs/features/chatbot/model/translation.helpers.js.map +1 -0
  22. package/dist/commonjs/features/chatbot/model/translation.js +106 -135
  23. package/dist/commonjs/features/chatbot/model/translation.js.map +1 -1
  24. package/dist/commonjs/features/chatbot/types/model.types.js.map +1 -1
  25. package/dist/commonjs/index.js +9 -1
  26. package/dist/commonjs/index.js.map +1 -1
  27. package/dist/commonjs/lib/helpers/types.js +2 -0
  28. package/dist/commonjs/lib/helpers/types.js.map +1 -0
  29. package/dist/commonjs/shared/icons/ChatbotIcon.js +613 -106
  30. package/dist/commonjs/shared/icons/ChatbotIcon.js.map +1 -1
  31. package/dist/module/features/chatbot/components/Alternatives/Alternatives.js +6 -9
  32. package/dist/module/features/chatbot/components/Alternatives/Alternatives.js.map +1 -1
  33. package/dist/module/features/chatbot/components/ChatControls/ChatControls.js +13 -5
  34. package/dist/module/features/chatbot/components/ChatControls/ChatControls.js.map +1 -1
  35. package/dist/module/features/chatbot/components/ChatMessage/MessageLoader.js +4 -3
  36. package/dist/module/features/chatbot/components/ChatMessage/MessageLoader.js.map +1 -1
  37. package/dist/module/features/chatbot/components/ChatMessage/MessageTextToSpeech.js +2 -3
  38. package/dist/module/features/chatbot/components/ChatMessage/MessageTextToSpeech.js.map +1 -1
  39. package/dist/module/features/chatbot/components/ChatMessage/ReceivedMessage.js +5 -4
  40. package/dist/module/features/chatbot/components/ChatMessage/ReceivedMessage.js.map +1 -1
  41. package/dist/module/features/chatbot/components/ChatMessages/ChatbotMessages.js +6 -9
  42. package/dist/module/features/chatbot/components/ChatMessages/ChatbotMessages.js.map +1 -1
  43. package/dist/module/features/chatbot/components/Chatbot.js +8 -9
  44. package/dist/module/features/chatbot/components/Chatbot.js.map +1 -1
  45. package/dist/module/features/chatbot/index.js.map +1 -1
  46. package/dist/module/features/chatbot/model/ChatBotModel.js +71 -89
  47. package/dist/module/features/chatbot/model/ChatBotModel.js.map +1 -1
  48. package/dist/module/features/chatbot/model/api.js.map +1 -1
  49. package/dist/module/features/chatbot/model/messagesHelper.js +41 -0
  50. package/dist/module/features/chatbot/model/messagesHelper.js.map +1 -0
  51. package/dist/module/features/chatbot/model/translation.helpers.js +63 -0
  52. package/dist/module/features/chatbot/model/translation.helpers.js.map +1 -0
  53. package/dist/module/features/chatbot/model/translation.js +107 -136
  54. package/dist/module/features/chatbot/model/translation.js.map +1 -1
  55. package/dist/module/features/chatbot/types/model.types.js.map +1 -1
  56. package/dist/module/index.js +1 -0
  57. package/dist/module/index.js.map +1 -1
  58. package/dist/module/lib/helpers/types.js +2 -0
  59. package/dist/module/lib/helpers/types.js.map +1 -0
  60. package/dist/module/shared/icons/ChatbotIcon.js +614 -107
  61. package/dist/module/shared/icons/ChatbotIcon.js.map +1 -1
  62. package/dist/typescript/commonjs/features/chatbot/components/Alternatives/Alternatives.d.ts.map +1 -1
  63. package/dist/typescript/commonjs/features/chatbot/components/ChatControls/ChatControls.d.ts +5 -1
  64. package/dist/typescript/commonjs/features/chatbot/components/ChatControls/ChatControls.d.ts.map +1 -1
  65. package/dist/typescript/commonjs/features/chatbot/components/ChatMessages/ChatbotMessages.d.ts.map +1 -1
  66. package/dist/typescript/commonjs/features/chatbot/components/Chatbot.d.ts +5 -1
  67. package/dist/typescript/commonjs/features/chatbot/components/Chatbot.d.ts.map +1 -1
  68. package/dist/typescript/commonjs/features/chatbot/index.d.ts +2 -1
  69. package/dist/typescript/commonjs/features/chatbot/index.d.ts.map +1 -1
  70. package/dist/typescript/commonjs/features/chatbot/model/ChatBotModel.d.ts +12 -6
  71. package/dist/typescript/commonjs/features/chatbot/model/ChatBotModel.d.ts.map +1 -1
  72. package/dist/typescript/commonjs/features/chatbot/model/api.d.ts +5 -7
  73. package/dist/typescript/commonjs/features/chatbot/model/api.d.ts.map +1 -1
  74. package/dist/typescript/commonjs/features/chatbot/model/messagesHelper.d.ts +21 -0
  75. package/dist/typescript/commonjs/features/chatbot/model/messagesHelper.d.ts.map +1 -0
  76. package/dist/typescript/commonjs/features/chatbot/model/translation.d.ts +9 -9
  77. package/dist/typescript/commonjs/features/chatbot/model/translation.d.ts.map +1 -1
  78. package/dist/typescript/commonjs/features/chatbot/model/translation.helpers.d.ts +10 -0
  79. package/dist/typescript/commonjs/features/chatbot/model/translation.helpers.d.ts.map +1 -0
  80. package/dist/typescript/commonjs/features/chatbot/types/api.types.d.ts +1 -0
  81. package/dist/typescript/commonjs/features/chatbot/types/api.types.d.ts.map +1 -1
  82. package/dist/typescript/commonjs/features/chatbot/types/model.types.d.ts +6 -3
  83. package/dist/typescript/commonjs/features/chatbot/types/model.types.d.ts.map +1 -1
  84. package/dist/typescript/commonjs/features/chatbot/types/translation.types.d.ts +20 -5
  85. package/dist/typescript/commonjs/features/chatbot/types/translation.types.d.ts.map +1 -1
  86. package/dist/typescript/commonjs/index.d.ts +1 -0
  87. package/dist/typescript/commonjs/index.d.ts.map +1 -1
  88. package/dist/typescript/commonjs/lib/helpers/types.d.ts +2 -0
  89. package/dist/typescript/commonjs/lib/helpers/types.d.ts.map +1 -0
  90. package/dist/typescript/commonjs/shared/icons/ChatbotIcon.d.ts.map +1 -1
  91. package/dist/typescript/module/features/chatbot/components/Alternatives/Alternatives.d.ts.map +1 -1
  92. package/dist/typescript/module/features/chatbot/components/ChatControls/ChatControls.d.ts +5 -1
  93. package/dist/typescript/module/features/chatbot/components/ChatControls/ChatControls.d.ts.map +1 -1
  94. package/dist/typescript/module/features/chatbot/components/ChatMessages/ChatbotMessages.d.ts.map +1 -1
  95. package/dist/typescript/module/features/chatbot/components/Chatbot.d.ts +5 -1
  96. package/dist/typescript/module/features/chatbot/components/Chatbot.d.ts.map +1 -1
  97. package/dist/typescript/module/features/chatbot/index.d.ts +2 -1
  98. package/dist/typescript/module/features/chatbot/index.d.ts.map +1 -1
  99. package/dist/typescript/module/features/chatbot/model/ChatBotModel.d.ts +12 -6
  100. package/dist/typescript/module/features/chatbot/model/ChatBotModel.d.ts.map +1 -1
  101. package/dist/typescript/module/features/chatbot/model/api.d.ts +5 -7
  102. package/dist/typescript/module/features/chatbot/model/api.d.ts.map +1 -1
  103. package/dist/typescript/module/features/chatbot/model/messagesHelper.d.ts +21 -0
  104. package/dist/typescript/module/features/chatbot/model/messagesHelper.d.ts.map +1 -0
  105. package/dist/typescript/module/features/chatbot/model/translation.d.ts +9 -9
  106. package/dist/typescript/module/features/chatbot/model/translation.d.ts.map +1 -1
  107. package/dist/typescript/module/features/chatbot/model/translation.helpers.d.ts +10 -0
  108. package/dist/typescript/module/features/chatbot/model/translation.helpers.d.ts.map +1 -0
  109. package/dist/typescript/module/features/chatbot/types/api.types.d.ts +1 -0
  110. package/dist/typescript/module/features/chatbot/types/api.types.d.ts.map +1 -1
  111. package/dist/typescript/module/features/chatbot/types/model.types.d.ts +6 -3
  112. package/dist/typescript/module/features/chatbot/types/model.types.d.ts.map +1 -1
  113. package/dist/typescript/module/features/chatbot/types/translation.types.d.ts +20 -5
  114. package/dist/typescript/module/features/chatbot/types/translation.types.d.ts.map +1 -1
  115. package/dist/typescript/module/index.d.ts +1 -0
  116. package/dist/typescript/module/index.d.ts.map +1 -1
  117. package/dist/typescript/module/lib/helpers/types.d.ts +2 -0
  118. package/dist/typescript/module/lib/helpers/types.d.ts.map +1 -0
  119. package/dist/typescript/module/shared/icons/ChatbotIcon.d.ts.map +1 -1
  120. package/package.json +1 -1
  121. package/src/features/chatbot/components/Alternatives/Alternatives.tsx +4 -9
  122. package/src/features/chatbot/components/ChatControls/ChatControls.tsx +6 -3
  123. package/src/features/chatbot/components/ChatMessage/MessageLoader.tsx +3 -2
  124. package/src/features/chatbot/components/ChatMessage/MessageTextToSpeech.tsx +1 -2
  125. package/src/features/chatbot/components/ChatMessage/ReceivedMessage.tsx +4 -3
  126. package/src/features/chatbot/components/ChatMessages/ChatbotMessages.tsx +4 -9
  127. package/src/features/chatbot/components/Chatbot.tsx +5 -8
  128. package/src/features/chatbot/index.ts +7 -1
  129. package/src/features/chatbot/model/ChatBotModel.ts +63 -88
  130. package/src/features/chatbot/model/api.ts +24 -33
  131. package/src/features/chatbot/model/messagesHelper.ts +48 -0
  132. package/src/features/chatbot/model/translation.helpers.ts +58 -0
  133. package/src/features/chatbot/model/translation.ts +112 -160
  134. package/src/features/chatbot/types/api.types.ts +1 -0
  135. package/src/features/chatbot/types/model.types.ts +7 -3
  136. package/src/features/chatbot/types/translation.types.ts +21 -5
  137. package/src/index.ts +1 -0
  138. package/src/lib/helpers/types.ts +1 -0
  139. package/src/shared/icons/ChatbotIcon.tsx +500 -85
@@ -4,9 +4,9 @@ import {
4
4
  restore,
5
5
  sample,
6
6
  type Store,
7
- type Effect,
8
7
  createStore,
9
8
  createEffect,
9
+ combine,
10
10
  } from 'effector'
11
11
  import { createControllerEffect, createEntityFieldStore } from '../../../lib/effector'
12
12
  import {
@@ -17,12 +17,12 @@ import {
17
17
  SetHintMessageProps,
18
18
  StartConversationFxData,
19
19
  } from '../types/model.types'
20
- import { GetAlternativesResponse, PostMessageResponse } from '../types/api.types'
21
- import { generateRandomId } from '../../../lib/helpers/helpers'
20
+ import { GetAlternativesResponse } from '../types/api.types'
22
21
  import { ChatbotAPI } from './api'
23
22
  import { ChatbotTranslation } from './translation'
24
23
  import { ChatTextToSpeechModel } from './t2s'
25
24
  import { AudioProvider } from '../types/t2s.types'
25
+ import { messagesHelper } from './messagesHelper'
26
26
 
27
27
  type ReinitConversationProps = {
28
28
  key: string
@@ -43,7 +43,6 @@ export class ChatbotModel {
43
43
  readonly toggleOpen = createEvent()
44
44
  readonly $isOpen = restore(this.setIsOpen, false).on(this.toggleOpen, (isOpen) => !isOpen)
45
45
 
46
- // separate messages and alternatives class?
47
46
  public readonly removeLastMessage = createEvent()
48
47
  private readonly setLastMessageKey = createEvent<string>()
49
48
  public readonly $lastMessageKey = restore(this.setLastMessageKey, null)
@@ -51,7 +50,7 @@ export class ChatbotModel {
51
50
  readonly setScrollActive = createEvent<boolean>()
52
51
  readonly $isScrollActive = restore(this.setScrollActive, false)
53
52
 
54
- readonly sendHelpRequestFx: Effect<SendHelpParams, PostMessageResponse | ConversationMessage>
53
+ readonly sendHelpRequestFx
55
54
 
56
55
  readonly defaultMessages: ChatbotModelProps['messages']
57
56
 
@@ -59,16 +58,28 @@ export class ChatbotModel {
59
58
  readonly threadIds = createEntityFieldStore<string>()
60
59
  readonly availableChats = createEntityFieldStore<boolean>()
61
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
+
62
78
  constructor({ api, messages, $key }: ChatbotModelProps) {
63
79
  this.api = new ChatbotAPI(api)
64
80
 
65
81
  this.defaultMessages = messages
66
- if ($key) {
67
- sample({
68
- source: $key,
69
- target: this.$currentKey,
70
- })
71
- }
82
+ if ($key) sample({ source: $key, target: this.$currentKey })
72
83
 
73
84
  this.$alternatives = restore(this.api.getAlternativesFx.doneData, null)
74
85
  .on(this.setAlternatives, (_, payload) => payload)
@@ -92,102 +103,67 @@ export class ChatbotModel {
92
103
  }
93
104
 
94
105
  private createSendHelpRequestFx() {
95
- return attach({
96
- source: [this.$currentKey, this.messages.$state, this.translation.$isTranslated],
97
- mapParams: (params: SendHelpParams, [key, messages, isTranslated]) => ({
106
+ const effect = attach({
107
+ source: [this.$currentKey, this.translation.$isTranslated],
108
+ mapParams: (params: SendHelpParams, [key, isTranslated]) => ({
98
109
  ...params,
99
110
  key,
100
- messages,
101
111
  isTranslated,
102
112
  }),
103
113
  effect: createControllerEffect(
104
114
  async ({
105
115
  payload,
106
- message = '',
107
- translationTargetLanguage,
116
+ message,
117
+ translationTargetLanguage: targetLanguage,
108
118
  translatedMessage,
109
119
  key,
110
- messages,
111
120
  isTranslated,
112
121
  }: SendHelpProps) => {
113
122
  this.setLastMessageKey(key)
114
-
115
- const currentMessages = messages[key] || []
116
-
117
123
  this.messages.setField({
118
124
  key,
119
- data: [
120
- ...currentMessages,
121
- {
122
- id: generateRandomId(),
123
- message: message ?? '',
124
- translatedMessage,
125
- isOwnMessage: true,
126
- threadId: payload.threadId ?? '',
127
- options: [],
128
- },
125
+ fn: (currentMessages) => [
126
+ ...(currentMessages || []),
127
+ messagesHelper.createOwn({ message, translatedMessage, threadId: payload.threadId }),
129
128
  ],
130
129
  })
131
130
 
132
131
  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
+ }
133
136
  if (isTranslated) {
134
- return await this.translation.translateMessageFx({
135
- targetLanguage: translationTargetLanguage as string,
136
- message: {
137
- ...response,
138
- id: generateRandomId(),
139
- isOwnMessage: false,
140
- },
141
- })
137
+ messages = await this.translation.translateMessagesFx({ targetLanguage, messages })
142
138
  }
143
139
 
144
- return response
140
+ this.messages.setField({
141
+ key,
142
+ fn: (currentMessages) => [...(currentMessages || []), ...messages],
143
+ })
144
+ this.threadIds.setField({ key, data: response.threadId })
145
145
  },
146
146
  ),
147
147
  })
148
- }
149
148
 
150
- private initChatReplyWatcher() {
151
149
  sample({
152
- clock: this.sendHelpRequestFx.doneData,
153
- source: [this.$currentKey, this.messages.$state] as const,
154
- fn: ([key, messages], response) => ({ key, messages: messages[key] || [], response }),
155
- }).watch(({ key, messages, response }) => {
156
- this.messages.setField({
157
- key,
158
- data: [
159
- ...messages,
160
- {
161
- id: generateRandomId(),
162
- message: response.message,
163
- isOwnMessage: false,
164
- threadId: response.threadId,
165
- options: response.options,
166
- translatedMessage:
167
- 'translatedMessage' in response ? response.translatedMessage : undefined,
168
- },
169
- ],
170
- })
171
-
172
- this.threadIds.setField({ key, data: response.threadId })
173
- })
174
-
175
- sample({
176
- clock: this.sendHelpRequestFx.fail,
177
- source: [this.$currentKey, this.messages.$state] as const,
178
- fn: ([key, messages]) => ({ key, data: [...messages[key], this.defaultMessages.error] }),
150
+ clock: effect.fail,
151
+ source: this.$currentChatData,
152
+ fn: ({ key, messages }) => ({ key, data: [...messages, this.defaultMessages.error] }),
179
153
  filter: (_, { error }) => error.message !== 'Request aborted manually',
180
154
  target: this.messages.setField,
181
155
  })
182
156
 
157
+ return effect
158
+ }
159
+
160
+ private initChatReplyWatcher() {
183
161
  sample({
184
162
  clock: this.removeLastMessage,
185
163
  source: [this.$lastMessageKey, this.messages.$state] as const,
186
164
  fn: ([lastMessageKey, messages]) => {
187
- const mockData = { key: '', data: [] }
188
- if (!lastMessageKey) return mockData
189
- const updatedMessages = messages[lastMessageKey]
190
- if (!updatedMessages?.length) return mockData
165
+ if (!lastMessageKey) return { key: '', data: [] }
166
+ const updatedMessages = [...messages[lastMessageKey]]
191
167
  updatedMessages.pop()
192
168
  return { key: lastMessageKey, data: updatedMessages }
193
169
  },
@@ -197,26 +173,19 @@ export class ChatbotModel {
197
173
  }
198
174
 
199
175
  public readonly startConversation = attach({
200
- source: {
201
- key: this.$currentKey,
202
- messages: this.messages.$state,
203
- },
204
- mapParams: (_: void, source) => ({
205
- key: source.key,
206
- messages: source.messages[source.key] ?? [],
207
- }),
176
+ source: this.$currentChatData,
177
+ mapParams: (_: void, source) => source,
208
178
  effect: createEffect(({ key, messages }: StartConversationFxData) => {
209
179
  if (messages.length) return this.reinitConversation({ key })
210
-
211
180
  this.messages.setField({ key, data: [this.defaultMessages.start] })
212
181
  this.availableChats.setField({ key, data: true })
213
182
  }),
214
183
  })
215
184
 
216
- public setHintMessage({ entityId, fieldId, ...message }: SetHintMessageProps) {
185
+ public setHintMessage({ key, ...message }: SetHintMessageProps) {
217
186
  const options = this.$alternatives.getState()?.options.hints ?? message.options
218
187
  this.messages.setField({
219
- key: `${entityId}-${fieldId}`,
188
+ key,
220
189
  fn: (messages) => {
221
190
  if (!messages || messages.length > 1) return
222
191
  return [{ ...message, options }]
@@ -228,12 +197,18 @@ export class ChatbotModel {
228
197
  this.messages.setField({
229
198
  key,
230
199
  fn: (messages) => {
231
- if (!messages?.length || messages.length > 1) return
232
- const lastMessage = messages[messages.length - 1]
200
+ if (!messages?.length || messages.length === 1) return
233
201
  const copy = [...messages]
234
- copy.splice(messages.length - 1, 1, {
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, {
235
210
  ...lastMessage,
236
- options: [{ text: 'Give me another hint', promptKey: '' }],
211
+ options: [this.defaultMessages.anotherHintOption],
237
212
  })
238
213
  return copy
239
214
  },
@@ -1,46 +1,37 @@
1
- import { createEffect, Effect } from 'effector'
2
-
1
+ import { createEffect } from 'effector'
3
2
  import { createControllerEffect } from '../../../lib/effector'
4
- import { ControlledEffect } from '../../../lib/effector/createControllerEffect'
5
3
  import { ChatbotModelProps } from '../types/model.types'
6
- import {
7
- GetAlternativesResponse,
8
- PostMessagePayload,
9
- PostMessageResponse,
10
- GoogleTranslatePayload,
11
- GoogleTranslateResponse,
12
- GoogleText2SpeechPayload,
13
- GoogleText2SpeechResponse,
14
- GetAlternativesPayload,
15
- } from '../types/api.types'
4
+ import { GoogleTranslatePayload, GoogleTranslateResponse } from '../types/api.types'
16
5
  import { replaceKatexSyntax } from '../helpers'
17
6
 
18
7
  export class ChatbotAPI {
19
- postMessageFx: ControlledEffect<PostMessagePayload, PostMessageResponse>
20
- getAlternativesFx: Effect<GetAlternativesPayload, GetAlternativesResponse>
21
- translateTextFx: Effect<GoogleTranslatePayload, GoogleTranslateResponse>
22
- textToSpeechTextFx: Effect<GoogleText2SpeechPayload, GoogleText2SpeechResponse>
8
+ public readonly postMessageFx
9
+ public readonly getAlternativesFx
10
+ public readonly translateTextFx
11
+ public readonly textToSpeechTextFx
23
12
 
24
13
  constructor(api: ChatbotModelProps['api']) {
25
14
  this.postMessageFx = createControllerEffect(api.postMessage)
26
15
  this.getAlternativesFx = createEffect(api.getAlternatives)
27
- this.translateTextFx = createEffect(async (payload: GoogleTranslatePayload) => {
28
- const response = await api.postTranslateText({
29
- ...payload,
30
- text: replaceKatexSyntax(payload.text),
31
- })
16
+ this.translateTextFx = createEffect(
17
+ async (payload: GoogleTranslatePayload): Promise<GoogleTranslateResponse> => {
18
+ const response = await api.postTranslateText({
19
+ ...payload,
20
+ text: replaceKatexSyntax(payload.text),
21
+ })
32
22
 
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
- })
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
+ )
44
35
  this.textToSpeechTextFx = createEffect(api.postTextToSpeech)
45
36
  }
46
37
  }
@@ -0,0 +1,48 @@
1
+ import { generateRandomId } from '../../../lib/helpers/helpers'
2
+ import { ConversationMessage, CreateMessageResponse } from '../types/model.types'
3
+
4
+ type OwnMessageProps = {
5
+ message?: string
6
+ translatedMessage?: string
7
+ threadId?: string | null
8
+ }
9
+
10
+ export class messagesHelper {
11
+ public static createAnswer(data: CreateMessageResponse): ConversationMessage {
12
+ return {
13
+ id: generateRandomId(),
14
+ isOwnMessage: false,
15
+ message: data.message,
16
+ threadId: data.threadId,
17
+ options: data.options,
18
+ translatedMessage: data.translatedMessage,
19
+ }
20
+ }
21
+
22
+ public static createLast(data: CreateMessageResponse) {
23
+ return {
24
+ id: generateRandomId(),
25
+ message: data.message,
26
+ translatedMessage: data.translatedMessage,
27
+ isOwnMessage: false,
28
+ options: [],
29
+ threadId: '',
30
+ endMessage: true,
31
+ }
32
+ }
33
+
34
+ public static createOwn({
35
+ message = '',
36
+ translatedMessage,
37
+ threadId,
38
+ }: OwnMessageProps): ConversationMessage {
39
+ return {
40
+ id: generateRandomId(),
41
+ message,
42
+ translatedMessage,
43
+ threadId: threadId || '',
44
+ isOwnMessage: true,
45
+ options: [],
46
+ }
47
+ }
48
+ }
@@ -0,0 +1,58 @@
1
+ import {
2
+ AddTranslationToAlternativesProps,
3
+ GetOptionsProps,
4
+ GetOptionsResult,
5
+ } from '../types/translation.types'
6
+ import { ChatAnswer, GetAlternativesResponse } from '../types/api.types'
7
+
8
+ export function getOptionsForTranslation({
9
+ lastMessage,
10
+ alternatives,
11
+ }: GetOptionsProps): GetOptionsResult {
12
+ if (!lastMessage) return { lastMessage: null, alternatives: null }
13
+ if (!lastMessage.options.length) {
14
+ if (!alternatives) return { lastMessage: null, alternatives: null }
15
+ const hintAlternatives = alternatives.options.hints ?? []
16
+ const defaultAlternatives = alternatives.options.default ?? []
17
+ return {
18
+ lastMessage: null,
19
+ alternatives: {
20
+ hints: hintAlternatives.map(({ text }) => text),
21
+ default: defaultAlternatives.map(({ text }) => text),
22
+ },
23
+ }
24
+ }
25
+
26
+ return {
27
+ lastMessage: lastMessage.options.map(({ text }) => text),
28
+ alternatives: null,
29
+ }
30
+ }
31
+
32
+ export function addTranslationsToAlternative({
33
+ alternatives,
34
+ translatedHints,
35
+ translatedDefaults,
36
+ }: AddTranslationToAlternativesProps): GetAlternativesResponse {
37
+ return {
38
+ ...alternatives,
39
+ options: {
40
+ ...alternatives.options,
41
+ hints: translatedHints.map((translatedText, index) => ({
42
+ ...alternatives.options.hints[index],
43
+ translatedText,
44
+ })),
45
+ default: translatedDefaults.map((translatedText, index) => ({
46
+ ...alternatives.options.default[index],
47
+ translatedText,
48
+ })),
49
+ },
50
+ }
51
+ }
52
+
53
+ export function addTranslationToOptions(options: ChatAnswer[], translations: string[]) {
54
+ return options.map((option, index) => ({
55
+ ...option,
56
+ translatedText: translations[index],
57
+ }))
58
+ }