@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.
- package/dist/commonjs/features/chatbot/TTS_HIGHLIGHTING.md +109 -0
- package/dist/commonjs/features/chatbot/components/Chat/Chat.js +25 -22
- package/dist/commonjs/features/chatbot/components/Chat/Chat.js.map +1 -1
- package/dist/commonjs/features/chatbot/components/ChatMessage/ChatMessage.js.map +1 -1
- package/dist/commonjs/features/chatbot/components/ChatMessage/MessageContent.js +20 -4
- package/dist/commonjs/features/chatbot/components/ChatMessage/MessageContent.js.map +1 -1
- package/dist/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.js +6 -2
- package/dist/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.js.map +1 -1
- package/dist/commonjs/features/chatbot/components/Chatbot.js +6 -2
- package/dist/commonjs/features/chatbot/components/Chatbot.js.map +1 -1
- package/dist/commonjs/features/chatbot/helpers/textToSSML.js +22 -0
- package/dist/commonjs/features/chatbot/helpers/textToSSML.js.map +1 -0
- package/dist/commonjs/features/chatbot/model/ChatBotModel.js +4 -6
- package/dist/commonjs/features/chatbot/model/ChatBotModel.js.map +1 -1
- package/dist/commonjs/features/chatbot/model/t2s.js +125 -32
- package/dist/commonjs/features/chatbot/model/t2s.js.map +1 -1
- package/dist/commonjs/features/chatbot/types/t2s.types.js.map +1 -1
- package/dist/commonjs/index.js +1 -13
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/types/common.types.js +0 -4
- package/dist/module/features/chatbot/TTS_HIGHLIGHTING.md +109 -0
- package/dist/module/features/chatbot/components/Chat/Chat.js +25 -22
- package/dist/module/features/chatbot/components/Chat/Chat.js.map +1 -1
- package/dist/module/features/chatbot/components/ChatMessage/ChatMessage.js.map +1 -1
- package/dist/module/features/chatbot/components/ChatMessage/MessageContent.js +20 -4
- package/dist/module/features/chatbot/components/ChatMessage/MessageContent.js.map +1 -1
- package/dist/module/features/chatbot/components/ChatMessage/ReceivedMessage.js +6 -2
- package/dist/module/features/chatbot/components/ChatMessage/ReceivedMessage.js.map +1 -1
- package/dist/module/features/chatbot/components/Chatbot.js +6 -2
- package/dist/module/features/chatbot/components/Chatbot.js.map +1 -1
- package/dist/module/features/chatbot/helpers/textToSSML.js +16 -0
- package/dist/module/features/chatbot/helpers/textToSSML.js.map +1 -0
- package/dist/module/features/chatbot/index.js.map +1 -1
- package/dist/module/features/chatbot/model/ChatBotModel.js +4 -6
- package/dist/module/features/chatbot/model/ChatBotModel.js.map +1 -1
- package/dist/module/features/chatbot/model/t2s.js +126 -33
- package/dist/module/features/chatbot/model/t2s.js.map +1 -1
- package/dist/module/features/chatbot/types/t2s.types.js.map +1 -1
- package/dist/module/index.js +0 -1
- package/dist/module/index.js.map +1 -1
- package/dist/module/types/common.types.js +0 -2
- package/dist/typescript/commonjs/features/chatbot/components/Chat/Chat.d.ts +4 -1
- package/dist/typescript/commonjs/features/chatbot/components/Chat/Chat.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/ChatMessage.d.ts +3 -1
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/ChatMessage.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/MessageContent.d.ts +4 -2
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/MessageContent.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.d.ts +1 -1
- package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/chatbot/components/Chatbot.d.ts +4 -1
- package/dist/typescript/commonjs/features/chatbot/components/Chatbot.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/chatbot/helpers/textToSSML.d.ts +7 -0
- package/dist/typescript/commonjs/features/chatbot/helpers/textToSSML.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/chatbot/index.d.ts +1 -1
- package/dist/typescript/commonjs/features/chatbot/index.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/chatbot/model/ChatBotModel.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/chatbot/model/t2s.d.ts +20 -9
- package/dist/typescript/commonjs/features/chatbot/model/t2s.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/chatbot/types/api.types.d.ts +2 -0
- package/dist/typescript/commonjs/features/chatbot/types/api.types.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/chatbot/types/t2s.types.d.ts +10 -0
- package/dist/typescript/commonjs/features/chatbot/types/t2s.types.d.ts.map +1 -1
- package/dist/typescript/commonjs/index.d.ts +0 -1
- package/dist/typescript/commonjs/index.d.ts.map +1 -1
- package/dist/typescript/commonjs/types/common.types.d.ts +0 -2
- package/dist/typescript/commonjs/types/common.types.d.ts.map +1 -1
- package/dist/typescript/module/features/chatbot/components/Chat/Chat.d.ts +4 -1
- package/dist/typescript/module/features/chatbot/components/Chat/Chat.d.ts.map +1 -1
- package/dist/typescript/module/features/chatbot/components/ChatMessage/ChatMessage.d.ts +3 -1
- package/dist/typescript/module/features/chatbot/components/ChatMessage/ChatMessage.d.ts.map +1 -1
- package/dist/typescript/module/features/chatbot/components/ChatMessage/MessageContent.d.ts +4 -2
- package/dist/typescript/module/features/chatbot/components/ChatMessage/MessageContent.d.ts.map +1 -1
- package/dist/typescript/module/features/chatbot/components/ChatMessage/ReceivedMessage.d.ts +1 -1
- package/dist/typescript/module/features/chatbot/components/ChatMessage/ReceivedMessage.d.ts.map +1 -1
- package/dist/typescript/module/features/chatbot/components/Chatbot.d.ts +4 -1
- package/dist/typescript/module/features/chatbot/components/Chatbot.d.ts.map +1 -1
- package/dist/typescript/module/features/chatbot/helpers/textToSSML.d.ts +7 -0
- package/dist/typescript/module/features/chatbot/helpers/textToSSML.d.ts.map +1 -0
- package/dist/typescript/module/features/chatbot/index.d.ts +1 -1
- package/dist/typescript/module/features/chatbot/index.d.ts.map +1 -1
- package/dist/typescript/module/features/chatbot/model/ChatBotModel.d.ts.map +1 -1
- package/dist/typescript/module/features/chatbot/model/t2s.d.ts +20 -9
- package/dist/typescript/module/features/chatbot/model/t2s.d.ts.map +1 -1
- package/dist/typescript/module/features/chatbot/types/api.types.d.ts +2 -0
- package/dist/typescript/module/features/chatbot/types/api.types.d.ts.map +1 -1
- package/dist/typescript/module/features/chatbot/types/t2s.types.d.ts +10 -0
- package/dist/typescript/module/features/chatbot/types/t2s.types.d.ts.map +1 -1
- package/dist/typescript/module/index.d.ts +0 -1
- package/dist/typescript/module/index.d.ts.map +1 -1
- package/dist/typescript/module/types/common.types.d.ts +0 -2
- package/dist/typescript/module/types/common.types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/features/chatbot/TTS_HIGHLIGHTING.md +109 -0
- package/src/features/chatbot/components/Chat/Chat.tsx +28 -19
- package/src/features/chatbot/components/ChatMessage/ChatMessage.tsx +3 -1
- package/src/features/chatbot/components/ChatMessage/MessageContent.tsx +30 -3
- package/src/features/chatbot/components/ChatMessage/ReceivedMessage.tsx +4 -0
- package/src/features/chatbot/components/Chatbot.tsx +7 -0
- package/src/features/chatbot/helpers/textToSSML.ts +15 -0
- package/src/features/chatbot/index.ts +1 -1
- package/src/features/chatbot/model/ChatBotModel.ts +3 -7
- package/src/features/chatbot/model/t2s.ts +147 -32
- package/src/features/chatbot/types/api.types.ts +1 -3
- package/src/features/chatbot/types/t2s.types.ts +7 -0
- package/src/index.ts +0 -1
- package/src/types/common.types.ts +0 -4
- package/dist/commonjs/features/openEnded/components/OpenEndedAttemptsLimit.js +0 -34
- package/dist/commonjs/features/openEnded/components/OpenEndedAttemptsLimit.js.map +0 -1
- package/dist/commonjs/features/openEnded/components/OpenEndedScoreLabel.js +0 -68
- package/dist/commonjs/features/openEnded/components/OpenEndedScoreLabel.js.map +0 -1
- package/dist/commonjs/features/openEnded/index.js +0 -48
- package/dist/commonjs/features/openEnded/index.js.map +0 -1
- package/dist/commonjs/features/openEnded/oe.helpers.js +0 -26
- package/dist/commonjs/features/openEnded/oe.helpers.js.map +0 -1
- package/dist/commonjs/features/openEnded/oe.types.js +0 -14
- package/dist/commonjs/features/openEnded/oe.types.js.map +0 -1
- package/dist/commonjs/shared/common.constants.js +0 -9
- package/dist/commonjs/shared/common.constants.js.map +0 -1
- package/dist/module/features/openEnded/components/OpenEndedAttemptsLimit.js +0 -28
- package/dist/module/features/openEnded/components/OpenEndedAttemptsLimit.js.map +0 -1
- package/dist/module/features/openEnded/components/OpenEndedScoreLabel.js +0 -62
- package/dist/module/features/openEnded/components/OpenEndedScoreLabel.js.map +0 -1
- package/dist/module/features/openEnded/index.js +0 -7
- package/dist/module/features/openEnded/index.js.map +0 -1
- package/dist/module/features/openEnded/oe.helpers.js +0 -21
- package/dist/module/features/openEnded/oe.helpers.js.map +0 -1
- package/dist/module/features/openEnded/oe.types.js +0 -10
- package/dist/module/features/openEnded/oe.types.js.map +0 -1
- package/dist/module/shared/common.constants.js +0 -5
- package/dist/module/shared/common.constants.js.map +0 -1
- package/dist/typescript/commonjs/features/openEnded/components/OpenEndedAttemptsLimit.d.ts +0 -7
- package/dist/typescript/commonjs/features/openEnded/components/OpenEndedAttemptsLimit.d.ts.map +0 -1
- package/dist/typescript/commonjs/features/openEnded/components/OpenEndedScoreLabel.d.ts +0 -12
- package/dist/typescript/commonjs/features/openEnded/components/OpenEndedScoreLabel.d.ts.map +0 -1
- package/dist/typescript/commonjs/features/openEnded/index.d.ts +0 -5
- package/dist/typescript/commonjs/features/openEnded/index.d.ts.map +0 -1
- package/dist/typescript/commonjs/features/openEnded/oe.helpers.d.ts +0 -13
- package/dist/typescript/commonjs/features/openEnded/oe.helpers.d.ts.map +0 -1
- package/dist/typescript/commonjs/features/openEnded/oe.types.d.ts +0 -7
- package/dist/typescript/commonjs/features/openEnded/oe.types.d.ts.map +0 -1
- package/dist/typescript/commonjs/shared/common.constants.d.ts +0 -2
- package/dist/typescript/commonjs/shared/common.constants.d.ts.map +0 -1
- package/dist/typescript/module/features/openEnded/components/OpenEndedAttemptsLimit.d.ts +0 -7
- package/dist/typescript/module/features/openEnded/components/OpenEndedAttemptsLimit.d.ts.map +0 -1
- package/dist/typescript/module/features/openEnded/components/OpenEndedScoreLabel.d.ts +0 -12
- package/dist/typescript/module/features/openEnded/components/OpenEndedScoreLabel.d.ts.map +0 -1
- package/dist/typescript/module/features/openEnded/index.d.ts +0 -5
- package/dist/typescript/module/features/openEnded/index.d.ts.map +0 -1
- package/dist/typescript/module/features/openEnded/oe.helpers.d.ts +0 -13
- package/dist/typescript/module/features/openEnded/oe.helpers.d.ts.map +0 -1
- package/dist/typescript/module/features/openEnded/oe.types.d.ts +0 -7
- package/dist/typescript/module/features/openEnded/oe.types.d.ts.map +0 -1
- package/dist/typescript/module/shared/common.constants.d.ts +0 -2
- package/dist/typescript/module/shared/common.constants.d.ts.map +0 -1
- package/src/features/openEnded/components/OpenEndedAttemptsLimit.tsx +0 -26
- package/src/features/openEnded/components/OpenEndedScoreLabel.tsx +0 -68
- package/src/features/openEnded/index.ts +0 -4
- package/src/features/openEnded/oe.helpers.ts +0 -31
- package/src/features/openEnded/oe.types.ts +0 -6
- 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
|
-
|
|
70
|
-
this.
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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","
|
|
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":";;;;;;
|
|
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":[]}
|
package/dist/commonjs/index.js
CHANGED
|
@@ -143,7 +143,7 @@ Object.keys(_index10).forEach(function (key) {
|
|
|
143
143
|
}
|
|
144
144
|
});
|
|
145
145
|
});
|
|
146
|
-
var _index11 = require("./
|
|
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"
|
|
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":[]}
|
|
@@ -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(
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
})
|
|
77
|
-
}
|
|
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","
|
|
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;
|
|
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: [
|
|
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: [
|
|
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;
|
|
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
|
});
|