@magmamath/students-features 0.9.110 → 0.9.111-rc-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/dist/commonjs/features/chatbot/TTS_HIGHLIGHTING.md +109 -0
  2. package/dist/commonjs/features/chatbot/components/Chat/Chat.js +25 -22
  3. package/dist/commonjs/features/chatbot/components/Chat/Chat.js.map +1 -1
  4. package/dist/commonjs/features/chatbot/components/ChatMessage/ChatMessage.js.map +1 -1
  5. package/dist/commonjs/features/chatbot/components/ChatMessage/MessageContent.js +20 -4
  6. package/dist/commonjs/features/chatbot/components/ChatMessage/MessageContent.js.map +1 -1
  7. package/dist/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.js +6 -2
  8. package/dist/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.js.map +1 -1
  9. package/dist/commonjs/features/chatbot/components/Chatbot.js +6 -2
  10. package/dist/commonjs/features/chatbot/components/Chatbot.js.map +1 -1
  11. package/dist/commonjs/features/chatbot/helpers/textToSSML.js +22 -0
  12. package/dist/commonjs/features/chatbot/helpers/textToSSML.js.map +1 -0
  13. package/dist/commonjs/features/chatbot/model/ChatBotModel.js +4 -6
  14. package/dist/commonjs/features/chatbot/model/ChatBotModel.js.map +1 -1
  15. package/dist/commonjs/features/chatbot/model/t2s.js +125 -32
  16. package/dist/commonjs/features/chatbot/model/t2s.js.map +1 -1
  17. package/dist/commonjs/features/chatbot/types/t2s.types.js.map +1 -1
  18. package/dist/commonjs/index.js +1 -13
  19. package/dist/commonjs/index.js.map +1 -1
  20. package/dist/commonjs/types/common.types.js +0 -4
  21. package/dist/module/features/chatbot/TTS_HIGHLIGHTING.md +109 -0
  22. package/dist/module/features/chatbot/components/Chat/Chat.js +25 -22
  23. package/dist/module/features/chatbot/components/Chat/Chat.js.map +1 -1
  24. package/dist/module/features/chatbot/components/ChatMessage/ChatMessage.js.map +1 -1
  25. package/dist/module/features/chatbot/components/ChatMessage/MessageContent.js +20 -4
  26. package/dist/module/features/chatbot/components/ChatMessage/MessageContent.js.map +1 -1
  27. package/dist/module/features/chatbot/components/ChatMessage/ReceivedMessage.js +6 -2
  28. package/dist/module/features/chatbot/components/ChatMessage/ReceivedMessage.js.map +1 -1
  29. package/dist/module/features/chatbot/components/Chatbot.js +6 -2
  30. package/dist/module/features/chatbot/components/Chatbot.js.map +1 -1
  31. package/dist/module/features/chatbot/helpers/textToSSML.js +16 -0
  32. package/dist/module/features/chatbot/helpers/textToSSML.js.map +1 -0
  33. package/dist/module/features/chatbot/index.js.map +1 -1
  34. package/dist/module/features/chatbot/model/ChatBotModel.js +4 -6
  35. package/dist/module/features/chatbot/model/ChatBotModel.js.map +1 -1
  36. package/dist/module/features/chatbot/model/t2s.js +126 -33
  37. package/dist/module/features/chatbot/model/t2s.js.map +1 -1
  38. package/dist/module/features/chatbot/types/t2s.types.js.map +1 -1
  39. package/dist/module/index.js +0 -1
  40. package/dist/module/index.js.map +1 -1
  41. package/dist/module/types/common.types.js +0 -2
  42. package/dist/typescript/commonjs/features/chatbot/components/Chat/Chat.d.ts +4 -1
  43. package/dist/typescript/commonjs/features/chatbot/components/Chat/Chat.d.ts.map +1 -1
  44. package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/ChatMessage.d.ts +3 -1
  45. package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/ChatMessage.d.ts.map +1 -1
  46. package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/MessageContent.d.ts +4 -2
  47. package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/MessageContent.d.ts.map +1 -1
  48. package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.d.ts +1 -1
  49. package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.d.ts.map +1 -1
  50. package/dist/typescript/commonjs/features/chatbot/components/Chatbot.d.ts +4 -1
  51. package/dist/typescript/commonjs/features/chatbot/components/Chatbot.d.ts.map +1 -1
  52. package/dist/typescript/commonjs/features/chatbot/helpers/textToSSML.d.ts +7 -0
  53. package/dist/typescript/commonjs/features/chatbot/helpers/textToSSML.d.ts.map +1 -0
  54. package/dist/typescript/commonjs/features/chatbot/index.d.ts +1 -1
  55. package/dist/typescript/commonjs/features/chatbot/index.d.ts.map +1 -1
  56. package/dist/typescript/commonjs/features/chatbot/model/ChatBotModel.d.ts.map +1 -1
  57. package/dist/typescript/commonjs/features/chatbot/model/t2s.d.ts +20 -9
  58. package/dist/typescript/commonjs/features/chatbot/model/t2s.d.ts.map +1 -1
  59. package/dist/typescript/commonjs/features/chatbot/types/api.types.d.ts +2 -0
  60. package/dist/typescript/commonjs/features/chatbot/types/api.types.d.ts.map +1 -1
  61. package/dist/typescript/commonjs/features/chatbot/types/t2s.types.d.ts +10 -0
  62. package/dist/typescript/commonjs/features/chatbot/types/t2s.types.d.ts.map +1 -1
  63. package/dist/typescript/commonjs/index.d.ts +0 -1
  64. package/dist/typescript/commonjs/index.d.ts.map +1 -1
  65. package/dist/typescript/commonjs/types/common.types.d.ts +0 -2
  66. package/dist/typescript/commonjs/types/common.types.d.ts.map +1 -1
  67. package/dist/typescript/module/features/chatbot/components/Chat/Chat.d.ts +4 -1
  68. package/dist/typescript/module/features/chatbot/components/Chat/Chat.d.ts.map +1 -1
  69. package/dist/typescript/module/features/chatbot/components/ChatMessage/ChatMessage.d.ts +3 -1
  70. package/dist/typescript/module/features/chatbot/components/ChatMessage/ChatMessage.d.ts.map +1 -1
  71. package/dist/typescript/module/features/chatbot/components/ChatMessage/MessageContent.d.ts +4 -2
  72. package/dist/typescript/module/features/chatbot/components/ChatMessage/MessageContent.d.ts.map +1 -1
  73. package/dist/typescript/module/features/chatbot/components/ChatMessage/ReceivedMessage.d.ts +1 -1
  74. package/dist/typescript/module/features/chatbot/components/ChatMessage/ReceivedMessage.d.ts.map +1 -1
  75. package/dist/typescript/module/features/chatbot/components/Chatbot.d.ts +4 -1
  76. package/dist/typescript/module/features/chatbot/components/Chatbot.d.ts.map +1 -1
  77. package/dist/typescript/module/features/chatbot/helpers/textToSSML.d.ts +7 -0
  78. package/dist/typescript/module/features/chatbot/helpers/textToSSML.d.ts.map +1 -0
  79. package/dist/typescript/module/features/chatbot/index.d.ts +1 -1
  80. package/dist/typescript/module/features/chatbot/index.d.ts.map +1 -1
  81. package/dist/typescript/module/features/chatbot/model/ChatBotModel.d.ts.map +1 -1
  82. package/dist/typescript/module/features/chatbot/model/t2s.d.ts +20 -9
  83. package/dist/typescript/module/features/chatbot/model/t2s.d.ts.map +1 -1
  84. package/dist/typescript/module/features/chatbot/types/api.types.d.ts +2 -0
  85. package/dist/typescript/module/features/chatbot/types/api.types.d.ts.map +1 -1
  86. package/dist/typescript/module/features/chatbot/types/t2s.types.d.ts +10 -0
  87. package/dist/typescript/module/features/chatbot/types/t2s.types.d.ts.map +1 -1
  88. package/dist/typescript/module/index.d.ts +0 -1
  89. package/dist/typescript/module/index.d.ts.map +1 -1
  90. package/dist/typescript/module/types/common.types.d.ts +0 -2
  91. package/dist/typescript/module/types/common.types.d.ts.map +1 -1
  92. package/package.json +1 -1
  93. package/src/features/chatbot/TTS_HIGHLIGHTING.md +109 -0
  94. package/src/features/chatbot/components/Chat/Chat.tsx +28 -19
  95. package/src/features/chatbot/components/ChatMessage/ChatMessage.tsx +3 -1
  96. package/src/features/chatbot/components/ChatMessage/MessageContent.tsx +30 -3
  97. package/src/features/chatbot/components/ChatMessage/ReceivedMessage.tsx +4 -0
  98. package/src/features/chatbot/components/Chatbot.tsx +7 -0
  99. package/src/features/chatbot/helpers/textToSSML.ts +15 -0
  100. package/src/features/chatbot/index.ts +1 -1
  101. package/src/features/chatbot/model/ChatBotModel.ts +3 -7
  102. package/src/features/chatbot/model/t2s.ts +147 -32
  103. package/src/features/chatbot/types/api.types.ts +1 -3
  104. package/src/features/chatbot/types/t2s.types.ts +7 -0
  105. package/src/index.ts +0 -1
  106. package/src/types/common.types.ts +0 -4
  107. package/dist/commonjs/features/openEnded/components/OpenEndedAttemptsLimit.js +0 -34
  108. package/dist/commonjs/features/openEnded/components/OpenEndedAttemptsLimit.js.map +0 -1
  109. package/dist/commonjs/features/openEnded/components/OpenEndedScoreLabel.js +0 -68
  110. package/dist/commonjs/features/openEnded/components/OpenEndedScoreLabel.js.map +0 -1
  111. package/dist/commonjs/features/openEnded/index.js +0 -48
  112. package/dist/commonjs/features/openEnded/index.js.map +0 -1
  113. package/dist/commonjs/features/openEnded/oe.helpers.js +0 -26
  114. package/dist/commonjs/features/openEnded/oe.helpers.js.map +0 -1
  115. package/dist/commonjs/features/openEnded/oe.types.js +0 -14
  116. package/dist/commonjs/features/openEnded/oe.types.js.map +0 -1
  117. package/dist/commonjs/shared/common.constants.js +0 -9
  118. package/dist/commonjs/shared/common.constants.js.map +0 -1
  119. package/dist/module/features/openEnded/components/OpenEndedAttemptsLimit.js +0 -28
  120. package/dist/module/features/openEnded/components/OpenEndedAttemptsLimit.js.map +0 -1
  121. package/dist/module/features/openEnded/components/OpenEndedScoreLabel.js +0 -62
  122. package/dist/module/features/openEnded/components/OpenEndedScoreLabel.js.map +0 -1
  123. package/dist/module/features/openEnded/index.js +0 -7
  124. package/dist/module/features/openEnded/index.js.map +0 -1
  125. package/dist/module/features/openEnded/oe.helpers.js +0 -21
  126. package/dist/module/features/openEnded/oe.helpers.js.map +0 -1
  127. package/dist/module/features/openEnded/oe.types.js +0 -10
  128. package/dist/module/features/openEnded/oe.types.js.map +0 -1
  129. package/dist/module/shared/common.constants.js +0 -5
  130. package/dist/module/shared/common.constants.js.map +0 -1
  131. package/dist/typescript/commonjs/features/openEnded/components/OpenEndedAttemptsLimit.d.ts +0 -7
  132. package/dist/typescript/commonjs/features/openEnded/components/OpenEndedAttemptsLimit.d.ts.map +0 -1
  133. package/dist/typescript/commonjs/features/openEnded/components/OpenEndedScoreLabel.d.ts +0 -12
  134. package/dist/typescript/commonjs/features/openEnded/components/OpenEndedScoreLabel.d.ts.map +0 -1
  135. package/dist/typescript/commonjs/features/openEnded/index.d.ts +0 -5
  136. package/dist/typescript/commonjs/features/openEnded/index.d.ts.map +0 -1
  137. package/dist/typescript/commonjs/features/openEnded/oe.helpers.d.ts +0 -13
  138. package/dist/typescript/commonjs/features/openEnded/oe.helpers.d.ts.map +0 -1
  139. package/dist/typescript/commonjs/features/openEnded/oe.types.d.ts +0 -7
  140. package/dist/typescript/commonjs/features/openEnded/oe.types.d.ts.map +0 -1
  141. package/dist/typescript/commonjs/shared/common.constants.d.ts +0 -2
  142. package/dist/typescript/commonjs/shared/common.constants.d.ts.map +0 -1
  143. package/dist/typescript/module/features/openEnded/components/OpenEndedAttemptsLimit.d.ts +0 -7
  144. package/dist/typescript/module/features/openEnded/components/OpenEndedAttemptsLimit.d.ts.map +0 -1
  145. package/dist/typescript/module/features/openEnded/components/OpenEndedScoreLabel.d.ts +0 -12
  146. package/dist/typescript/module/features/openEnded/components/OpenEndedScoreLabel.d.ts.map +0 -1
  147. package/dist/typescript/module/features/openEnded/index.d.ts +0 -5
  148. package/dist/typescript/module/features/openEnded/index.d.ts.map +0 -1
  149. package/dist/typescript/module/features/openEnded/oe.helpers.d.ts +0 -13
  150. package/dist/typescript/module/features/openEnded/oe.helpers.d.ts.map +0 -1
  151. package/dist/typescript/module/features/openEnded/oe.types.d.ts +0 -7
  152. package/dist/typescript/module/features/openEnded/oe.types.d.ts.map +0 -1
  153. package/dist/typescript/module/shared/common.constants.d.ts +0 -2
  154. package/dist/typescript/module/shared/common.constants.d.ts.map +0 -1
  155. package/src/features/openEnded/components/OpenEndedAttemptsLimit.tsx +0 -26
  156. package/src/features/openEnded/components/OpenEndedScoreLabel.tsx +0 -68
  157. package/src/features/openEnded/index.ts +0 -4
  158. package/src/features/openEnded/oe.helpers.ts +0 -31
  159. package/src/features/openEnded/oe.types.ts +0 -6
  160. package/src/shared/common.constants.ts +0 -3
@@ -7,33 +7,64 @@ exports.ChatTextToSpeechModel = void 0;
7
7
  var _effector = require("effector");
8
8
  var _constants = require("../constants.js");
9
9
  var _t2sTypes = require("../types/t2s.types.js");
10
+ var _textToSSML = require("../helpers/textToSSML.js");
11
+ const WORD_MARK_REGEX = /^w_(\d+)$/;
12
+ const findCurrentMark = (timepoints, time) => {
13
+ for (let i = timepoints.length - 1; i >= 0; i--) {
14
+ if (timepoints[i].timeSeconds <= time) {
15
+ return timepoints[i].markName;
16
+ }
17
+ }
18
+ return undefined;
19
+ };
10
20
  class ChatTextToSpeechModel {
11
21
  audioCache = {};
22
+ highlightCache = {};
12
23
  audioProvider = null;
24
+ isHighlightEnabled = false;
25
+ lastHighlightedIndex = null;
13
26
  setCurrentPlayingId = (0, _effector.createEvent)();
14
27
  $currentPlayingId = (0, _effector.restore)(this.setCurrentPlayingId, null);
15
28
  setStatus = (0, _effector.createEvent)();
16
29
  $status = (0, _effector.restore)(this.setStatus, _t2sTypes.AudioStatus.STOPPED);
30
+ setTimepoints = (0, _effector.createEvent)();
31
+ $timepoints = (0, _effector.restore)(this.setTimepoints, []);
32
+ setTime = (0, _effector.createEvent)();
33
+ $time = (0, _effector.restore)(this.setTime, 0);
34
+ $highlightedWordIndex = (0, _effector.combine)(this.$timepoints, this.$time, this.$status, (timepoints, time, status) => {
35
+ if (!timepoints.length || status !== _t2sTypes.AudioStatus.PLAYING) {
36
+ return null;
37
+ }
38
+ const currentMark = findCurrentMark(timepoints, time);
39
+ if (!currentMark) return null;
40
+ const match = currentMark.match(WORD_MARK_REGEX);
41
+ const index = match ? parseInt(match[1], 10) : null;
42
+ // console.log('[TTS Debug] Computed highlightedWordIndex:', index, '(time:', time, ', mark:', currentMark, ')')
43
+ return index;
44
+ });
45
+ $highlightState = (0, _effector.combine)({
46
+ highlightedWordIndex: this.$highlightedWordIndex,
47
+ playingId: this.$currentPlayingId,
48
+ status: this.$status
49
+ });
17
50
  audioConfig = null;
18
51
  textSanitizer = value => value;
19
52
  constructor({
20
- api,
21
- $currentChatData,
22
- $isTranslated
53
+ api
23
54
  }) {
24
55
  this.api = api;
25
- this.$currentChatData = $currentChatData;
26
- this.$isTranslated = $isTranslated;
27
56
  }
28
57
  setAudioConfig(config) {
29
58
  this.audioConfig = config;
30
59
  }
31
60
  setConfig({
32
61
  audioProvider,
33
- textSanitizer
62
+ textSanitizer,
63
+ isHighlightEnabled
34
64
  }) {
35
65
  if (audioProvider) this.audioProvider = audioProvider;
36
66
  if (textSanitizer) this.textSanitizer = textSanitizer;
67
+ if (isHighlightEnabled !== undefined) this.isHighlightEnabled = isHighlightEnabled;
37
68
  }
38
69
  getCacheKey = (messageId, isTranslated) => {
39
70
  return `${messageId}-${isTranslated ? 'translated' : 'original'}`;
@@ -64,48 +95,108 @@ class ChatTextToSpeechModel {
64
95
  }
65
96
  if (messageId && !isCurrentMessage) {
66
97
  this.audioProvider.stop();
98
+ this.resetHighlight();
67
99
  }
68
100
  const cacheKey = this.getCacheKey(messageId, isTranslated);
69
- let audioPath = this.audioCache[cacheKey];
70
- this.setCurrentPlayingId(messageId);
71
- if (!audioPath) {
72
- const config = this.audioConfig;
73
- const response = await this.api.textToSpeechTextFx({
74
- input: {
75
- text
76
- },
77
- voice: config?.voice ?? _constants.DEFAULT_VOICE,
78
- audioConfig: config?.audioConfig ?? _constants.AUDIO_CONFIG,
79
- enableTimePointing: []
80
- });
101
+ const useHighlighting = this.isHighlightEnabled && !!this.audioProvider.onTimeUpdate;
102
+ // console.log('[TTS Debug] useHighlighting:', useHighlighting, '(isHighlightEnabled:', this.isHighlightEnabled, ', hasOnTimeUpdate:', !!this.audioProvider.onTimeUpdate, ')')
81
103
 
82
- // Response might be different type based on provided AUDIO_CONFIG
83
- if (typeof response.audioContent === 'string') {
84
- audioPath = `data:audio/mpeg;base64,${response.audioContent}`;
104
+ let audioPath;
105
+ let timepoints = [];
106
+ this.setCurrentPlayingId(messageId);
107
+ if (useHighlighting) {
108
+ const cached = this.highlightCache[cacheKey];
109
+ if (cached) {
110
+ audioPath = cached.audioPath;
111
+ timepoints = cached.timepoints;
85
112
  } else {
86
- audioPath = response?.audioContent ?? '';
113
+ const config = this.audioConfig;
114
+ const ssml = (0, _textToSSML.textToSSML)(text);
115
+ const response = await this.api.textToSpeechTextFx({
116
+ input: {
117
+ ssml
118
+ },
119
+ voice: config?.voice ?? _constants.DEFAULT_VOICE,
120
+ audioConfig: config?.audioConfig ?? _constants.AUDIO_CONFIG,
121
+ enableTimePointing: ['SSML_MARK']
122
+ });
123
+ if (typeof response.audioContent === 'string') {
124
+ audioPath = `data:audio/mpeg;base64,${response.audioContent}`;
125
+ } else {
126
+ audioPath = response?.audioContent ?? '';
127
+ }
128
+ timepoints = response.timepoints ?? [];
129
+ this.highlightCache[cacheKey] = {
130
+ audioPath,
131
+ timepoints
132
+ };
133
+ }
134
+ this.setTimepoints(timepoints);
135
+ // console.log('[TTS Debug] Timepoints set:', timepoints.length, timepoints)
136
+ this.setupTimeTracking();
137
+ } else {
138
+ audioPath = this.audioCache[cacheKey];
139
+ if (!audioPath) {
140
+ const config = this.audioConfig;
141
+ const response = await this.api.textToSpeechTextFx({
142
+ input: {
143
+ text
144
+ },
145
+ voice: config?.voice ?? _constants.DEFAULT_VOICE,
146
+ audioConfig: config?.audioConfig ?? _constants.AUDIO_CONFIG,
147
+ enableTimePointing: []
148
+ });
149
+ if (typeof response.audioContent === 'string') {
150
+ audioPath = `data:audio/mpeg;base64,${response.audioContent}`;
151
+ } else {
152
+ audioPath = response?.audioContent ?? '';
153
+ }
154
+ this.audioCache[cacheKey] = audioPath;
87
155
  }
88
- this.audioCache[cacheKey] = audioPath;
89
156
  }
90
157
  this.setStatus(_t2sTypes.AudioStatus.PLAYING);
91
158
  await this.audioProvider.play(audioPath, () => {
92
- this.setStatus(_t2sTypes.AudioStatus.STOPPED);
93
- this.setCurrentPlayingId(null);
159
+ this.onPlaybackComplete();
94
160
  });
95
161
  } catch (error) {
96
162
  this.reset();
97
163
  console.error('Error playing text-to-speech: ', error);
98
164
  }
99
165
  }
100
- async playLatest() {
101
- const lastMessage = this.$currentChatData.getState().messages.at(-1);
102
- if (!lastMessage) return;
103
- const isTranslated = this.$isTranslated.getState();
104
- return this.play({
105
- message: lastMessage,
106
- isTranslated
166
+ setupTimeTracking() {
167
+ if (!this.audioProvider?.onTimeUpdate) {
168
+ // console.log('[TTS Debug] No onTimeUpdate on audioProvider!')
169
+ return;
170
+ }
171
+
172
+ // console.log('[TTS Debug] Setting up time tracking')
173
+ this.lastHighlightedIndex = null;
174
+ this.audioProvider.onTimeUpdate(time => {
175
+ const timepoints = this.$timepoints.getState();
176
+ const currentMark = findCurrentMark(timepoints, time);
177
+ if (!currentMark) return;
178
+ const match = currentMark.match(WORD_MARK_REGEX);
179
+ const newIndex = match ? parseInt(match[1], 10) : null;
180
+
181
+ // Only update if word index changed
182
+ if (newIndex !== this.lastHighlightedIndex) {
183
+ // console.log('[TTS Debug] Word changed:', this.lastHighlightedIndex, '→', newIndex)
184
+ this.lastHighlightedIndex = newIndex;
185
+ this.setTime(time);
186
+ }
107
187
  });
108
188
  }
189
+ onPlaybackComplete = () => {
190
+ this.setStatus(_t2sTypes.AudioStatus.STOPPED);
191
+ this.setCurrentPlayingId(null);
192
+ this.resetHighlight();
193
+ this.audioProvider?.onTimeUpdate?.(null);
194
+ };
195
+ resetHighlight() {
196
+ this.setTimepoints([]);
197
+ this.setTime(0);
198
+ this.lastHighlightedIndex = null;
199
+ }
109
200
  stop() {
110
201
  if (!this.audioProvider) throw new Error('Audio provider is not set. Use setAudioProvider.');
111
202
  this.audioProvider.stop();
@@ -114,6 +205,8 @@ class ChatTextToSpeechModel {
114
205
  this.stop();
115
206
  this.setStatus(_t2sTypes.AudioStatus.STOPPED);
116
207
  this.setCurrentPlayingId(null);
208
+ this.resetHighlight();
209
+ this.audioProvider?.onTimeUpdate?.(null);
117
210
  });
118
211
  }
119
212
  exports.ChatTextToSpeechModel = ChatTextToSpeechModel;
@@ -1 +1 @@
1
- {"version":3,"names":["_effector","require","_constants","_t2sTypes","ChatTextToSpeechModel","audioCache","audioProvider","setCurrentPlayingId","createEvent","$currentPlayingId","restore","setStatus","$status","AudioStatus","STOPPED","audioConfig","textSanitizer","value","constructor","api","$currentChatData","$isTranslated","setAudioConfig","config","setConfig","getCacheKey","messageId","isTranslated","play","message","Error","messageText","translatedMessage","id","text","status","getState","playingId","isPlaying","PLAYING","isPaused","PAUSED","isCurrentMessage","pause","resume","stop","cacheKey","audioPath","response","textToSpeechTextFx","input","voice","DEFAULT_VOICE","AUDIO_CONFIG","enableTimePointing","audioContent","error","reset","console","playLatest","lastMessage","messages","at","createEffect","exports"],"sourceRoot":"../../../../../src","sources":["features/chatbot/model/t2s.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_effector","require","_constants","_t2sTypes","_textToSSML","WORD_MARK_REGEX","findCurrentMark","timepoints","time","i","length","timeSeconds","markName","undefined","ChatTextToSpeechModel","audioCache","highlightCache","audioProvider","isHighlightEnabled","lastHighlightedIndex","setCurrentPlayingId","createEvent","$currentPlayingId","restore","setStatus","$status","AudioStatus","STOPPED","setTimepoints","$timepoints","setTime","$time","$highlightedWordIndex","combine","status","PLAYING","currentMark","match","index","parseInt","$highlightState","highlightedWordIndex","playingId","audioConfig","textSanitizer","value","constructor","api","setAudioConfig","config","setConfig","getCacheKey","messageId","isTranslated","play","message","Error","messageText","translatedMessage","id","text","getState","isPlaying","isPaused","PAUSED","isCurrentMessage","pause","resume","stop","resetHighlight","cacheKey","useHighlighting","onTimeUpdate","audioPath","cached","ssml","textToSSML","response","textToSpeechTextFx","input","voice","DEFAULT_VOICE","AUDIO_CONFIG","enableTimePointing","audioContent","setupTimeTracking","onPlaybackComplete","error","reset","console","newIndex","createEffect","exports"],"sourceRoot":"../../../../../src","sources":["features/chatbot/model/t2s.ts"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["AudioStatus","exports"],"sourceRoot":"../../../../../src","sources":["features/chatbot/types/t2s.types.ts"],"mappings":";;;;;;IAEYA,WAAW,GAAAC,OAAA,CAAAD,WAAA,0BAAXA,WAAW;EAAXA,WAAW;EAAXA,WAAW;EAAXA,WAAW;EAAA,OAAXA,WAAW;AAAA","ignoreList":[]}
1
+ {"version":3,"names":["AudioStatus","exports"],"sourceRoot":"../../../../../src","sources":["features/chatbot/types/t2s.types.ts"],"mappings":";;;;;;IAGYA,WAAW,GAAAC,OAAA,CAAAD,WAAA,0BAAXA,WAAW;EAAXA,WAAW;EAAXA,WAAW;EAAXA,WAAW;EAAA,OAAXA,WAAW;AAAA","ignoreList":[]}
@@ -143,7 +143,7 @@ Object.keys(_index10).forEach(function (key) {
143
143
  }
144
144
  });
145
145
  });
146
- var _index11 = require("./features/openEnded/index.js");
146
+ var _index11 = require("./shared/icons/index.js");
147
147
  Object.keys(_index11).forEach(function (key) {
148
148
  if (key === "default" || key === "__esModule") return;
149
149
  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
@@ -155,16 +155,4 @@ Object.keys(_index11).forEach(function (key) {
155
155
  }
156
156
  });
157
157
  });
158
- var _index12 = require("./shared/icons/index.js");
159
- Object.keys(_index12).forEach(function (key) {
160
- if (key === "default" || key === "__esModule") return;
161
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
162
- if (key in exports && exports[key] === _index12[key]) return;
163
- Object.defineProperty(exports, key, {
164
- enumerable: true,
165
- get: function () {
166
- return _index12[key];
167
- }
168
- });
169
- });
170
158
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_index","require","_helpers","_index2","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_index3","_index4","_index5","_index6","_index7","_index8","_index9","_index10","_index11","_index12"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_index","require","_helpers","_index2","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_index3","_index4","_index5","_index6","_index7","_index8","_index9","_index10","_index11"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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","ignoreList":[]}
@@ -1,6 +1,2 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
2
  //# sourceMappingURL=common.types.js.map
@@ -0,0 +1,109 @@
1
+ # TTS Word-by-Word Highlighting
2
+
3
+ ## Overview
4
+
5
+ Word-by-word text highlighting synchronized with text-to-speech playback in the chatbot. The feature is optional and enabled via props.
6
+
7
+ ## How It Works
8
+
9
+ ```
10
+ ┌─────────────────────────────────────────────────────────────────┐
11
+ │ 1. User clicks TTS button on a message │
12
+ │ ↓ │
13
+ │ 2. Text is converted to SSML with word marks │
14
+ │ "Hello world" → <speak><mark name="w_0"/>Hello │
15
+ │ <mark name="w_1"/>world</speak> │
16
+ │ ↓ │
17
+ │ 3. Google TTS API returns audio + timepoints │
18
+ │ [{ markName: "w_0", timeSeconds: 0.0 }, │
19
+ │ { markName: "w_1", timeSeconds: 0.5 }] │
20
+ │ ↓ │
21
+ │ 4. Audio plays, ontimeupdate fires (~4x/sec) │
22
+ │ ↓ │
23
+ │ 5. Current time → find matching timepoint → word index │
24
+ │ ↓ │
25
+ │ 6. $highlightedWordIndex updates → UI re-renders highlighted │
26
+ └─────────────────────────────────────────────────────────────────┘
27
+ ```
28
+
29
+ ## Usage
30
+
31
+ ```tsx
32
+ // In students-web model setup
33
+ chatModel.bot.setUpT2S({
34
+ audioProvider: createT2SAudioProvider(),
35
+ textSanitizer: removeKatexPartFromTextToSpeech,
36
+ isHighlightEnabled: true, // Enable highlighting
37
+ })
38
+
39
+ // In component
40
+ <Chatbot
41
+ model={chatModel.bot}
42
+ isHighlightEnabled={true}
43
+ highlightConfig={{
44
+ MessageRenderer: ChatbotHighlightedMessage,
45
+ }}
46
+ />
47
+ ```
48
+
49
+ ## Files Modified
50
+
51
+ ### students-features
52
+
53
+ | File | Changes |
54
+ |------|---------|
55
+ | `types/t2s.types.ts` | Added `onTimeUpdate`, `getCurrentTime` to AudioProvider; added `HighlightConfig` type |
56
+ | `types/api.types.ts` | Added `ssml` option to GoogleText2SpeechPayload input |
57
+ | `helpers/textToSSML.ts` | NEW - Converts text to SSML with word marks |
58
+ | `model/t2s.ts` | Added `$highlightedWordIndex`, `$timepoints`, `$time` stores; SSML/timepoint handling |
59
+ | `components/Chatbot.tsx` | Added `isHighlightEnabled`, `highlightConfig` props |
60
+ | `components/Chat/Chat.tsx` | Passes highlight state to ChatMessage |
61
+ | `components/ChatMessage/*` | Passes highlight props through component chain |
62
+ | `components/ChatMessage/MessageContent.tsx` | Renders custom MessageRenderer when provided |
63
+
64
+ ### students-web
65
+
66
+ | File | Changes |
67
+ |------|---------|
68
+ | `chatbot/helpers.ts` | Added `onTimeUpdate`, `getCurrentTime` to AudioProvider |
69
+ | `chatbot/components/ChatbotHighlightedMessage.tsx` | NEW - Renders words with highlight styling |
70
+ | `chatbot/components/ChatbotHighlightedMessage.module.scss` | NEW - Yellow highlight styles |
71
+ | `chatbot/model/model.ts` | Enabled `isHighlightEnabled: true` |
72
+ | `PracticeMode/chatbot/PracticeChatbot.tsx` | Passes highlightConfig with MessageRenderer |
73
+
74
+ ## Key Components
75
+
76
+ ### textToSSML (students-features)
77
+ ```ts
78
+ textToSSML("Hello world")
79
+ // → '<speak><mark name="w_0"/>Hello <mark name="w_1"/>world</speak>'
80
+ ```
81
+
82
+ ### $highlightedWordIndex (students-features)
83
+ Effector store that computes current word index from timepoints + playback time.
84
+
85
+ ### ChatbotHighlightedMessage (students-web)
86
+ ```tsx
87
+ // Splits text, highlights word at highlightedIndex
88
+ <span className={isHighlighted ? styles.Highlighted : undefined}>
89
+ {word}
90
+ </span>
91
+ ```
92
+
93
+ ## Data Flow
94
+
95
+ ```
96
+ AudioProvider.onTimeUpdate(time)
97
+
98
+ t2s.setTime(time)
99
+
100
+ $highlightedWordIndex = findCurrentMark(timepoints, time) → parse index
101
+
102
+ Chat.tsx: useUnit(model.t2s.$highlightedWordIndex)
103
+
104
+ ChatMessage → ReceivedMessage → MessageContent
105
+
106
+ MessageRenderer({ text, highlightedIndex })
107
+
108
+ ChatbotHighlightedMessage renders highlighted word
109
+ ```
@@ -21,7 +21,9 @@ export const Chat = ({
21
21
  isTextToSpeechEnabled,
22
22
  isInputDisabled,
23
23
  colorScheme = ColorScheme.Blue,
24
- MessageWrapper
24
+ MessageWrapper,
25
+ isHighlightEnabled = false,
26
+ highlightConfig
25
27
  }) => {
26
28
  const dimensions = useWindowDimensions();
27
29
  const ref = useRef(null);
@@ -32,6 +34,7 @@ export const Chat = ({
32
34
  const isTranslated = useUnit(model.translation.$isTranslated);
33
35
  const audioStatus = useUnit(model.t2s.$status);
34
36
  const errorSpottingEnabled = useUnit(model.errorSpotting.$isEnabled);
37
+ const highlightedWordIndex = useUnit(model.t2s.$highlightedWordIndex);
35
38
  const messages = useStoreMap(model.$currentChatData, ({
36
39
  messages
37
40
  }) => messages);
@@ -54,27 +57,27 @@ export const Chat = ({
54
57
  },
55
58
  children: [isOpen && /*#__PURE__*/_jsxs(View, {
56
59
  style: [styles.gap, isInputDisabled && styles.messagesWithoutInput],
57
- children: [messages.map(message => /*#__PURE__*/_jsx(React.Fragment, {
58
- children: /*#__PURE__*/_jsx(ConditionalWrapper, {
59
- withWrapper: shouldWrapMessage,
60
- Wrapper: MessageWrapper,
61
- children: /*#__PURE__*/_jsx(ChatMessage, {
62
- isTranslated: isTranslated,
63
- withIcon: !message.isOwnMessage && message.id === lastMessageId,
64
- message: message,
65
- variant: message.isOwnMessage ? MessageVariant.SENT : MessageVariant.RECEIVED,
66
- colorScheme: colorScheme,
67
- withErrorSpotting: errorSpottingEnabled && !message.isOwnMessage,
68
- t2sState: {
69
- isEnabled: isTextToSpeechEnabled && !message.isOwnMessage,
70
- isActive: message.id === currentPlayingId,
71
- isLoading: isTextToSpeechPending,
72
- status: audioStatus,
73
- disabled: isTextToSpeechPending
74
- }
75
- })
76
- })
77
- }, message.id)), isHelpRequestPending && /*#__PURE__*/_jsx(MessageLoader, {
60
+ children: [messages.map(message => /*#__PURE__*/_jsx(ConditionalWrapper, {
61
+ withWrapper: shouldWrapMessage,
62
+ Wrapper: MessageWrapper,
63
+ children: /*#__PURE__*/_jsx(ChatMessage, {
64
+ isTranslated: isTranslated,
65
+ withIcon: !message.isOwnMessage && message.id === lastMessageId,
66
+ message: message,
67
+ variant: message.isOwnMessage ? MessageVariant.SENT : MessageVariant.RECEIVED,
68
+ colorScheme: colorScheme,
69
+ withErrorSpotting: errorSpottingEnabled && !message.isOwnMessage,
70
+ t2sState: {
71
+ isEnabled: isTextToSpeechEnabled && !message.isOwnMessage,
72
+ isActive: message.id === currentPlayingId,
73
+ isLoading: isTextToSpeechPending,
74
+ status: audioStatus,
75
+ disabled: isTextToSpeechPending
76
+ },
77
+ highlightedWordIndex: isHighlightEnabled && message.id === currentPlayingId ? highlightedWordIndex : null,
78
+ highlightConfig: highlightConfig
79
+ }, message.id)
80
+ })), isHelpRequestPending && /*#__PURE__*/_jsx(MessageLoader, {
78
81
  colorScheme: colorScheme
79
82
  })]
80
83
  }), isOpen && !isInputDisabled && /*#__PURE__*/_jsx(ChatInput, {
@@ -1 +1 @@
1
- {"version":3,"names":["React","useRef","Platform","ScrollView","StyleSheet","useWindowDimensions","View","useStoreMap","useUnit","ChatMessage","MessageLoader","ChatInput","MessageVariant","ColorScheme","ConditionalWrapper","jsx","_jsx","jsxs","_jsxs","TOOLBAR_HEIGHT","BOTTOM_OFFSET","select","web","default","Chat","model","isHintFeedback","isTextToSpeechEnabled","isInputDisabled","colorScheme","Blue","MessageWrapper","dimensions","ref","isOpen","$isOpen","isHelpRequestPending","sendHelpRequestFx","pending","isTextToSpeechPending","api","textToSpeechTextFx","currentPlayingId","t2s","$currentPlayingId","isTranslated","translation","$isTranslated","audioStatus","$status","errorSpottingEnabled","errorSpotting","$isEnabled","messages","$currentChatData","lastMessageId","at","id","MAX_HEIGHT","height","shouldWrapMessage","length","style","styles","container","maxHeight","children","bounces","contentContainerStyle","list","onContentSizeChange","_","current","scrollToEnd","setScrollActive","gap","messagesWithoutInput","map","message","Fragment","withWrapper","Wrapper","withIcon","isOwnMessage","variant","SENT","RECEIVED","withErrorSpotting","t2sState","isEnabled","isActive","isLoading","status","disabled","hasMessages","create","flex","alignItems","width","paddingVertical","paddingRight","marginBottom"],"sourceRoot":"../../../../../../src","sources":["features/chatbot/components/Chat/Chat.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useRef","Platform","ScrollView","StyleSheet","useWindowDimensions","View","useStoreMap","useUnit","ChatMessage","MessageLoader","ChatInput","MessageVariant","ColorScheme","ConditionalWrapper","jsx","_jsx","jsxs","_jsxs","TOOLBAR_HEIGHT","BOTTOM_OFFSET","select","web","default","Chat","model","isHintFeedback","isTextToSpeechEnabled","isInputDisabled","colorScheme","Blue","MessageWrapper","isHighlightEnabled","highlightConfig","dimensions","ref","isOpen","$isOpen","isHelpRequestPending","sendHelpRequestFx","pending","isTextToSpeechPending","api","textToSpeechTextFx","currentPlayingId","t2s","$currentPlayingId","isTranslated","translation","$isTranslated","audioStatus","$status","errorSpottingEnabled","errorSpotting","$isEnabled","highlightedWordIndex","$highlightedWordIndex","messages","$currentChatData","lastMessageId","at","id","MAX_HEIGHT","height","shouldWrapMessage","length","style","styles","container","maxHeight","children","bounces","contentContainerStyle","list","onContentSizeChange","_","current","scrollToEnd","setScrollActive","gap","messagesWithoutInput","map","message","withWrapper","Wrapper","withIcon","isOwnMessage","variant","SENT","RECEIVED","withErrorSpotting","t2sState","isEnabled","isActive","isLoading","status","disabled","hasMessages","create","flex","alignItems","width","paddingVertical","paddingRight","marginBottom"],"sourceRoot":"../../../../../../src","sources":["features/chatbot/components/Chat/Chat.tsx"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["React","ReceivedMessage","SentMessage","MessageVariant","jsx","_jsx","variantsMap","SENT","RECEIVED","ChatMessage","variant","props","Component"],"sourceRoot":"../../../../../../src","sources":["features/chatbot/components/ChatMessage/ChatMessage.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAyB,OAAO;AAE5C,SAASC,eAAe,QAAQ,sBAAmB;AACnD,SAASC,WAAW,QAAQ,kBAAe;AAE3C,SAASC,cAAc,QAAQ,4BAAyB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAgBxD,MAAMC,WAAgE,GAAG;EACvE,CAACH,cAAc,CAACI,IAAI,GAAGL,WAAW;EAClC,CAACC,cAAc,CAACK,QAAQ,GAAGP;AAC7B,CAAC;AAED,OAAO,MAAMQ,WAAW,GAAGA,CAAC;EAAEC,OAAO;EAAE,GAAGC;AAAwB,CAAC,KAAK;EACtE,MAAMC,SAAS,GAAGN,WAAW,CAACI,OAAO,CAAC;EACtC,oBAAOL,IAAA,CAACO,SAAS;IAAA,GAAKD;EAAK,CAAG,CAAC;AACjC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","ReceivedMessage","SentMessage","MessageVariant","jsx","_jsx","variantsMap","SENT","RECEIVED","ChatMessage","variant","props","Component"],"sourceRoot":"../../../../../../src","sources":["features/chatbot/components/ChatMessage/ChatMessage.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAyB,OAAO;AAE5C,SAASC,eAAe,QAAQ,sBAAmB;AACnD,SAASC,WAAW,QAAQ,kBAAe;AAE3C,SAASC,cAAc,QAAQ,4BAAyB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAkBxD,MAAMC,WAAgE,GAAG;EACvE,CAACH,cAAc,CAACI,IAAI,GAAGL,WAAW;EAClC,CAACC,cAAc,CAACK,QAAQ,GAAGP;AAC7B,CAAC;AAED,OAAO,MAAMQ,WAAW,GAAGA,CAAC;EAAEC,OAAO;EAAE,GAAGC;AAAwB,CAAC,KAAK;EACtE,MAAMC,SAAS,GAAGN,WAAW,CAACI,OAAO,CAAC;EACtC,oBAAOL,IAAA,CAACO,SAAS;IAAA,GAAKD;EAAK,CAAG,CAAC;AACjC,CAAC","ignoreList":[]}
@@ -12,11 +12,20 @@ const MessageContentWeb = ({
12
12
  t2sState,
13
13
  variant,
14
14
  colorScheme = ColorScheme.Blue,
15
- withErrorSpotting
15
+ withErrorSpotting,
16
+ highlightedWordIndex,
17
+ highlightConfig
16
18
  }) => {
19
+ const MessageRenderer = highlightConfig?.MessageRenderer;
20
+ // console.log('[TTS Debug] MessageContent - hasRenderer:', !!MessageRenderer, 'highlightedWordIndex:', highlightedWordIndex)
21
+
17
22
  return /*#__PURE__*/_jsxs(Text, {
18
23
  style: styles.messageText,
19
- children: [text, /*#__PURE__*/_jsx(MessageButtonsBlock, {
24
+ children: [MessageRenderer ? /*#__PURE__*/_jsx(MessageRenderer, {
25
+ text: text,
26
+ highlightedIndex: highlightedWordIndex ?? null,
27
+ colorScheme: colorScheme
28
+ }) : text, /*#__PURE__*/_jsx(MessageButtonsBlock, {
20
29
  message: message,
21
30
  t2sState: t2sState,
22
31
  variant: variant,
@@ -31,12 +40,19 @@ const MessageContentMobile = ({
31
40
  t2sState,
32
41
  variant,
33
42
  colorScheme = ColorScheme.Blue,
34
- withErrorSpotting
43
+ withErrorSpotting,
44
+ highlightedWordIndex,
45
+ highlightConfig
35
46
  }) => {
47
+ const MessageRenderer = highlightConfig?.MessageRenderer;
36
48
  return /*#__PURE__*/_jsxs(_Fragment, {
37
49
  children: [/*#__PURE__*/_jsxs(Text, {
38
50
  style: [styles.messageText, styles.mobileMessageText],
39
- children: [text, /*#__PURE__*/_jsx(View, {
51
+ children: [MessageRenderer ? /*#__PURE__*/_jsx(MessageRenderer, {
52
+ text: text,
53
+ highlightedIndex: highlightedWordIndex ?? null,
54
+ colorScheme: colorScheme
55
+ }) : text, /*#__PURE__*/_jsx(View, {
40
56
  style: {
41
57
  width: getSpacerSize(message, t2sState)
42
58
  }
@@ -1 +1 @@
1
- {"version":3,"names":["React","Platform","StyleSheet","Text","View","ColorScheme","MessageButtonsBlock","getSpacerSize","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","MessageContentWeb","message","text","t2sState","variant","colorScheme","Blue","withErrorSpotting","style","styles","messageText","children","MessageContentMobile","mobileMessageText","width","MessageContent","select","web","default","create","flex","fontSize","fontWeight","fontFamily","color","lineHeight"],"sourceRoot":"../../../../../../src","sources":["features/chatbot/components/ChatMessage/MessageContent.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,QAAQ,EAAEC,UAAU,EAAEC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AAI/D,SAASC,WAAW,QAAQ,4BAAyB;AAErD,SAASC,mBAAmB,QAAQ,0BAAuB;AAC3D,SAASC,aAAa,QAAQ,cAAW;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA,EAAAC,QAAA,IAAAC,SAAA;AAYzC,MAAMC,iBAAiB,GAAGA,CAAC;EACzBC,OAAO;EACPC,IAAI;EACJC,QAAQ;EACRC,OAAO;EACPC,WAAW,GAAGd,WAAW,CAACe,IAAI;EAC9BC;AACmB,CAAC,KAAK;EACzB,oBACEV,KAAA,CAACR,IAAI;IAACmB,KAAK,EAAEC,MAAM,CAACC,WAAY;IAAAC,QAAA,GAC7BT,IAAI,eACLP,IAAA,CAACH,mBAAmB;MAClBS,OAAO,EAAEA,OAAQ;MACjBE,QAAQ,EAAEA,QAAS;MACnBC,OAAO,EAAEA,OAAQ;MACjBC,WAAW,EAAEA,WAAY;MACzBE,iBAAiB,EAAEA;IAAkB,CACtC,CAAC;EAAA,CACE,CAAC;AAEX,CAAC;AAED,MAAMK,oBAAoB,GAAGA,CAAC;EAC5BX,OAAO;EACPC,IAAI;EACJC,QAAQ;EACRC,OAAO;EACPC,WAAW,GAAGd,WAAW,CAACe,IAAI;EAC9BC;AACmB,CAAC,KAAK;EACzB,oBACEV,KAAA,CAAAE,SAAA;IAAAY,QAAA,gBACEd,KAAA,CAACR,IAAI;MAACmB,KAAK,EAAE,CAACC,MAAM,CAACC,WAAW,EAAED,MAAM,CAACI,iBAAiB,CAAE;MAAAF,QAAA,GACzDT,IAAI,eACLP,IAAA,CAACL,IAAI;QAACkB,KAAK,EAAE;UAAEM,KAAK,EAAErB,aAAa,CAACQ,OAAO,EAAEE,QAAQ;QAAE;MAAE,CAAE,CAAC;IAAA,CACxD,CAAC,eACPR,IAAA,CAACH,mBAAmB;MAClBS,OAAO,EAAEA,OAAQ;MACjBE,QAAQ,EAAEA,QAAS;MACnBC,OAAO,EAAEA,OAAQ;MACjBC,WAAW,EAAEA,WAAY;MACzBE,iBAAiB,EAAEA;IAAkB,CACtC,CAAC;EAAA,CACF,CAAC;AAEP,CAAC;AAED,OAAO,MAAMQ,cAAc,GAAG5B,QAAQ,CAAC6B,MAAM,CAAC;EAC5CC,GAAG,EAAEjB,iBAAiB;EACtBkB,OAAO,EAAEN;AACX,CAAC,CAAC;AAEF,MAAMH,MAAM,GAAGrB,UAAU,CAAC+B,MAAM,CAAC;EAC/BT,WAAW,EAAE;IACXU,IAAI,EAAE,CAAC;IACPC,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE,GAAG;IACfC,UAAU,EAAE,cAAc;IAC1BC,KAAK,EAAE,SAAS;IAChBV,KAAK,EAAE;EACT,CAAC;EACDD,iBAAiB,EAAE;IACjBY,UAAU,EAAE;EACd;AACF,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","Platform","StyleSheet","Text","View","ColorScheme","MessageButtonsBlock","getSpacerSize","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","MessageContentWeb","message","text","t2sState","variant","colorScheme","Blue","withErrorSpotting","highlightedWordIndex","highlightConfig","MessageRenderer","style","styles","messageText","children","highlightedIndex","MessageContentMobile","mobileMessageText","width","MessageContent","select","web","default","create","flex","fontSize","fontWeight","fontFamily","color","lineHeight"],"sourceRoot":"../../../../../../src","sources":["features/chatbot/components/ChatMessage/MessageContent.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,QAAQ,EAAEC,UAAU,EAAEC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AAI/D,SAASC,WAAW,QAAQ,4BAAyB;AAErD,SAASC,mBAAmB,QAAQ,0BAAuB;AAC3D,SAASC,aAAa,QAAQ,cAAW;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA,EAAAC,QAAA,IAAAC,SAAA;AAczC,MAAMC,iBAAiB,GAAGA,CAAC;EACzBC,OAAO;EACPC,IAAI;EACJC,QAAQ;EACRC,OAAO;EACPC,WAAW,GAAGd,WAAW,CAACe,IAAI;EAC9BC,iBAAiB;EACjBC,oBAAoB;EACpBC;AACmB,CAAC,KAAK;EACzB,MAAMC,eAAe,GAAGD,eAAe,EAAEC,eAAe;EACxD;;EAEA,oBACEb,KAAA,CAACR,IAAI;IAACsB,KAAK,EAAEC,MAAM,CAACC,WAAY;IAAAC,QAAA,GAC7BJ,eAAe,gBACdf,IAAA,CAACe,eAAe;MACdR,IAAI,EAAEA,IAAK;MACXa,gBAAgB,EAAEP,oBAAoB,IAAI,IAAK;MAC/CH,WAAW,EAAEA;IAAY,CAC1B,CAAC,GAEFH,IACD,eACDP,IAAA,CAACH,mBAAmB;MAClBS,OAAO,EAAEA,OAAQ;MACjBE,QAAQ,EAAEA,QAAS;MACnBC,OAAO,EAAEA,OAAQ;MACjBC,WAAW,EAAEA,WAAY;MACzBE,iBAAiB,EAAEA;IAAkB,CACtC,CAAC;EAAA,CACE,CAAC;AAEX,CAAC;AAED,MAAMS,oBAAoB,GAAGA,CAAC;EAC5Bf,OAAO;EACPC,IAAI;EACJC,QAAQ;EACRC,OAAO;EACPC,WAAW,GAAGd,WAAW,CAACe,IAAI;EAC9BC,iBAAiB;EACjBC,oBAAoB;EACpBC;AACmB,CAAC,KAAK;EACzB,MAAMC,eAAe,GAAGD,eAAe,EAAEC,eAAe;EAExD,oBACEb,KAAA,CAAAE,SAAA;IAAAe,QAAA,gBACEjB,KAAA,CAACR,IAAI;MAACsB,KAAK,EAAE,CAACC,MAAM,CAACC,WAAW,EAAED,MAAM,CAACK,iBAAiB,CAAE;MAAAH,QAAA,GACzDJ,eAAe,gBACdf,IAAA,CAACe,eAAe;QACdR,IAAI,EAAEA,IAAK;QACXa,gBAAgB,EAAEP,oBAAoB,IAAI,IAAK;QAC/CH,WAAW,EAAEA;MAAY,CAC1B,CAAC,GAEFH,IACD,eACDP,IAAA,CAACL,IAAI;QAACqB,KAAK,EAAE;UAAEO,KAAK,EAAEzB,aAAa,CAACQ,OAAO,EAAEE,QAAQ;QAAE;MAAE,CAAE,CAAC;IAAA,CACxD,CAAC,eACPR,IAAA,CAACH,mBAAmB;MAClBS,OAAO,EAAEA,OAAQ;MACjBE,QAAQ,EAAEA,QAAS;MACnBC,OAAO,EAAEA,OAAQ;MACjBC,WAAW,EAAEA,WAAY;MACzBE,iBAAiB,EAAEA;IAAkB,CACtC,CAAC;EAAA,CACF,CAAC;AAEP,CAAC;AAED,OAAO,MAAMY,cAAc,GAAGhC,QAAQ,CAACiC,MAAM,CAAC;EAC5CC,GAAG,EAAErB,iBAAiB;EACtBsB,OAAO,EAAEN;AACX,CAAC,CAAC;AAEF,MAAMJ,MAAM,GAAGxB,UAAU,CAACmC,MAAM,CAAC;EAC/BV,WAAW,EAAE;IACXW,IAAI,EAAE,CAAC;IACPC,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE,GAAG;IACfC,UAAU,EAAE,cAAc;IAC1BC,KAAK,EAAE,SAAS;IAChBV,KAAK,EAAE;EACT,CAAC;EACDD,iBAAiB,EAAE;IACjBY,UAAU,EAAE;EACd;AACF,CAAC,CAAC","ignoreList":[]}
@@ -13,7 +13,9 @@ export const ReceivedMessage = ({
13
13
  t2sState,
14
14
  withIcon,
15
15
  colorScheme = ColorScheme.Blue,
16
- withErrorSpotting
16
+ withErrorSpotting,
17
+ highlightedWordIndex,
18
+ highlightConfig
17
19
  }) => {
18
20
  const text = isTranslated ? message.translatedMessage : message.message;
19
21
  return /*#__PURE__*/_jsxs(View, {
@@ -32,7 +34,9 @@ export const ReceivedMessage = ({
32
34
  t2sState: t2sState,
33
35
  text: text ?? '',
34
36
  colorScheme: colorScheme,
35
- withErrorSpotting: withErrorSpotting
37
+ withErrorSpotting: withErrorSpotting,
38
+ highlightedWordIndex: highlightedWordIndex,
39
+ highlightConfig: highlightConfig
36
40
  })
37
41
  })]
38
42
  });