ds-markdown 0.1.2-beta.1 → 0.1.2-beta.3

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.
@@ -9,10 +9,6 @@ export type Theme = 'light' | 'dark';
9
9
  export interface IChar {
10
10
  content: string;
11
11
  answerType: AnswerType;
12
- /**
13
- * split_segment 两个连续的段落,需要做分割
14
- */
15
- contentType: 'space' | 'segment' | 'split_segment';
16
12
  tokenId: number;
17
13
  /** 字符索引 */
18
14
  index: number;
@@ -46,6 +42,10 @@ export interface IOnTypedCharData {
46
42
  }
47
43
  export interface ITypedChar extends IOnTypedCharData {
48
44
  percent: number;
45
+ currentStr: string;
46
+ }
47
+ export interface IBeforeTypedChar extends IOnTypedCharData {
48
+ percent: number;
49
49
  }
50
50
  export interface MarkdownBaseProps {
51
51
  /** 计时类型: 支持setTimeout和requestAnimationFrame */
@@ -57,12 +57,11 @@ export interface MarkdownBaseProps {
57
57
  /** 是否关闭打字机效果 */
58
58
  disableTyping?: boolean;
59
59
  /** 打字完成后回调, */
60
- onEnd?: (data?: {
61
- str?: string;
62
- answerType?: AnswerType;
63
- }) => void;
60
+ onEnd?: (data?: IEndData) => void;
64
61
  /** 开始打字回调 */
65
62
  onStart?: (data?: IOnTypedCharData) => void;
63
+ /** 打字前回调 */
64
+ onBeforeTypedChar?: (data?: IBeforeTypedChar) => Promise<void>;
66
65
  /**
67
66
  * 打字机打完一个字符回调
68
67
  * @param char 字符
@@ -75,6 +74,8 @@ export interface MarkdownBaseProps {
75
74
  math?: IMarkdownMath;
76
75
  /** 插件配置 */
77
76
  plugins?: IMarkdownPlugin[];
77
+ /** 是否自动开启打字动画 */
78
+ autoStartTyping?: boolean;
78
79
  }
79
80
  export interface MarkdownProps extends MarkdownBaseProps {
80
81
  children: string | undefined;
@@ -97,16 +98,20 @@ export interface IWholeContent {
97
98
  thinking: {
98
99
  content: string;
99
100
  length: number;
101
+ prevLength: number;
100
102
  };
101
103
  answer: {
102
104
  content: string;
103
105
  length: number;
106
+ prevLength: number;
104
107
  };
105
108
  allLength: number;
106
109
  }
107
110
  export interface MarkdownBaseRef {
108
111
  stop: () => void;
109
112
  resume: () => void;
113
+ start: () => void;
114
+ restart: () => void;
110
115
  }
111
116
  /** Markdown 组件的ref 类型 */
112
117
  export type MarkdownRef = MarkdownBaseRef;
@@ -116,3 +121,12 @@ export interface MarkdownCMDRef extends MarkdownBaseRef {
116
121
  clear: () => void;
117
122
  triggerWholeEnd: () => void;
118
123
  }
124
+ export interface IEndData {
125
+ manual: boolean;
126
+ /** 回答字符串 */
127
+ answerStr: string;
128
+ /** 思考字符串 */
129
+ thinkingStr: string;
130
+ /** 打字机打过的字符串, 和answerStr 相同 */
131
+ str: string;
132
+ }
@@ -1,24 +1,22 @@
1
- import { AnswerType, IChar, ITypedChar, IWholeContent, MarkdownProps } from '../defined.js';
1
+ import { AnswerType, IChar, ITypedChar, IWholeContent, MarkdownProps, IEndData, IBeforeTypedChar } from '../defined.js';
2
2
  interface UseTypingTaskOptions {
3
3
  timerType: MarkdownProps['timerType'];
4
4
  interval: number;
5
5
  charsRef: React.RefObject<IChar[]>;
6
- onEnd?: (data?: {
7
- str?: string;
8
- answerType?: AnswerType;
9
- manual: boolean;
10
- }) => void;
6
+ onEnd?: (data?: IEndData) => void;
11
7
  onStart?: (data?: {
12
8
  currentIndex: number;
13
9
  currentChar: string;
14
10
  answerType: AnswerType;
15
11
  prevStr: string;
16
12
  }) => void;
13
+ onBeforeTypedChar?: (data?: IBeforeTypedChar) => Promise<void>;
17
14
  onTypedChar?: (data?: ITypedChar) => void;
18
15
  processCharDisplay: (char: IChar) => void;
19
16
  wholeContentRef: React.RefObject<IWholeContent>;
20
17
  disableTyping: boolean;
21
18
  triggerUpdate: () => void;
19
+ resetWholeContent: () => void;
22
20
  }
23
21
  export interface TypingTaskController {
24
22
  start: () => void;
@@ -28,6 +26,7 @@ export interface TypingTaskController {
28
26
  /** 是否主动调用 stop 方法 */
29
27
  typedIsManualStopRef: React.RefObject<boolean>;
30
28
  resume: () => void;
29
+ restart: () => void;
31
30
  }
32
31
  export declare const useTypingTask: (options: UseTypingTaskOptions) => TypingTaskController;
33
32
  export {};
@@ -3,11 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useTypingTask = void 0;
4
4
  const react_1 = require("react");
5
5
  const useTypingTask = (options) => {
6
- const { timerType = 'setTimeout', interval, charsRef, onEnd, onStart, onTypedChar, processCharDisplay, wholeContentRef, disableTyping, triggerUpdate } = options;
6
+ const { timerType = 'setTimeout', interval, charsRef, onEnd, onStart, onBeforeTypedChar, onTypedChar, processCharDisplay, wholeContentRef, disableTyping, triggerUpdate, resetWholeContent, } = options;
7
7
  /** 是否卸载 */
8
8
  const isUnmountRef = (0, react_1.useRef)(false);
9
9
  /** 是否正在打字 */
10
- const isTypedRef = (0, react_1.useRef)(false);
10
+ const isTypingRef = (0, react_1.useRef)(false);
11
11
  /** 动画帧ID */
12
12
  const animationFrameRef = (0, react_1.useRef)(null);
13
13
  /** 传统定时器(兼容模式) */
@@ -27,30 +27,6 @@ const useTypingTask = (options) => {
27
27
  isUnmountRef.current = true;
28
28
  };
29
29
  }, []);
30
- /**
31
- * 记录打过的字
32
- * @param char 当前字符
33
- * @returns
34
- */
35
- const recordTypedChars = (char) => {
36
- let prevStr = '';
37
- if (!typedCharsRef.current || typedCharsRef.current.answerType !== char.answerType) {
38
- typedCharsRef.current = {
39
- typedContent: char.content,
40
- answerType: char.answerType,
41
- prevStr: '',
42
- };
43
- }
44
- else {
45
- prevStr = typedCharsRef.current.typedContent;
46
- typedCharsRef.current.typedContent += char.content;
47
- typedCharsRef.current.prevStr = prevStr;
48
- }
49
- return {
50
- prevStr,
51
- nextStr: typedCharsRef.current?.typedContent || '',
52
- };
53
- };
54
30
  /**
55
31
  * 触发打字开始回调
56
32
  * @param char 当前字符
@@ -59,7 +35,7 @@ const useTypingTask = (options) => {
59
35
  if (!onStart) {
60
36
  return;
61
37
  }
62
- const { prevStr } = recordTypedChars(char);
38
+ const prevStr = wholeContentRef.current[char.answerType].content;
63
39
  onStart({
64
40
  currentIndex: prevStr.length,
65
41
  currentChar: char.content,
@@ -75,20 +51,34 @@ const useTypingTask = (options) => {
75
51
  return;
76
52
  }
77
53
  onEnd({
78
- str: typedCharsRef.current?.typedContent,
79
- answerType: typedCharsRef.current?.answerType || 'answer',
54
+ str: wholeContentRef.current.answer.content,
55
+ answerStr: wholeContentRef.current.answer.content,
56
+ thinkingStr: wholeContentRef.current.thinking.content,
80
57
  manual: data?.manual ?? false,
81
58
  });
82
59
  };
83
60
  /**
84
61
  * 触发打字过程中回调
85
62
  * @param char 当前字符
86
- * @param isStartPoint 是否是开始打字(第一个字)
87
63
  */
88
- const triggerOnTypedChar = (char, isStartPoint = false) => {
89
- if (!isStartPoint) {
90
- recordTypedChars(char);
64
+ const triggerOnBeforeTypedChar = async (char) => {
65
+ if (!onBeforeTypedChar) {
66
+ return;
91
67
  }
68
+ const { answerType, content, index } = char;
69
+ const allLength = wholeContentRef.current.allLength;
70
+ // 计算之前字符的百分比
71
+ const percent = (char.index / allLength) * 100;
72
+ await onBeforeTypedChar({
73
+ currentIndex: index,
74
+ currentChar: content,
75
+ answerType: answerType,
76
+ prevStr: wholeContentRef.current[answerType].content,
77
+ percent,
78
+ });
79
+ };
80
+ /** 打字完成回调 */
81
+ const triggerOnTypedChar = async (char) => {
92
82
  if (!onTypedChar) {
93
83
  return;
94
84
  }
@@ -99,7 +89,8 @@ const useTypingTask = (options) => {
99
89
  currentIndex: index,
100
90
  currentChar: content,
101
91
  answerType: answerType,
102
- prevStr: typedCharsRef.current?.prevStr || '',
92
+ prevStr: wholeContentRef.current[answerType].content.slice(0, index),
93
+ currentStr: wholeContentRef.current[answerType].content,
103
94
  percent,
104
95
  });
105
96
  };
@@ -115,7 +106,7 @@ const useTypingTask = (options) => {
115
106
  clearTimeout(timerRef.current);
116
107
  timerRef.current = null;
117
108
  }
118
- isTypedRef.current = false;
109
+ isTypingRef.current = false;
119
110
  typedCharsRef.current = undefined;
120
111
  };
121
112
  /** 开始打字任务 */
@@ -124,7 +115,7 @@ const useTypingTask = (options) => {
124
115
  if (typedIsManualStopRef.current) {
125
116
  return;
126
117
  }
127
- if (isTypedRef.current) {
118
+ if (isTypingRef.current) {
128
119
  return;
129
120
  }
130
121
  if (timerType === 'requestAnimationFrame') {
@@ -135,7 +126,7 @@ const useTypingTask = (options) => {
135
126
  }
136
127
  };
137
128
  /** 打字机打完所有字符 */
138
- function typingRemainAll() {
129
+ async function typingRemainAll() {
139
130
  const chars = getChars();
140
131
  const thinkingCharsStr = chars
141
132
  .filter((char) => char.answerType === 'thinking')
@@ -146,20 +137,20 @@ const useTypingTask = (options) => {
146
137
  .map((char) => char.content)
147
138
  .join('');
148
139
  if (thinkingCharsStr) {
149
- onTypedChar?.({
140
+ await onBeforeTypedChar?.({
150
141
  currentIndex: wholeContentRef.current.thinking.length,
151
142
  currentChar: thinkingCharsStr,
152
143
  answerType: 'thinking',
153
- prevStr: typedCharsRef.current?.prevStr || '',
144
+ prevStr: wholeContentRef.current.thinking.content,
154
145
  percent: 100,
155
146
  });
156
147
  }
157
148
  if (answerCharsStr) {
158
- onTypedChar?.({
149
+ await onBeforeTypedChar?.({
159
150
  currentIndex: wholeContentRef.current.answer.length,
160
151
  currentChar: answerCharsStr,
161
152
  answerType: 'answer',
162
- prevStr: typedCharsRef.current?.prevStr || '',
153
+ prevStr: wholeContentRef.current.answer.content,
163
154
  percent: 100,
164
155
  });
165
156
  }
@@ -169,17 +160,17 @@ const useTypingTask = (options) => {
169
160
  wholeContentRef.current.answer.length += answerCharsStr.length;
170
161
  wholeContentRef.current.allLength += thinkingCharsStr.length + answerCharsStr.length;
171
162
  charsRef.current = [];
172
- isTypedRef.current = false;
163
+ isTypingRef.current = false;
173
164
  triggerOnEnd();
174
165
  triggerUpdate();
175
166
  }
176
167
  /** requestAnimationFrame 模式 */
177
168
  const startAnimationFrameMode = () => {
178
169
  let lastFrameTime = 0;
179
- const frameLoop = (currentTime) => {
170
+ const frameLoop = async (currentTime) => {
180
171
  // 如果关闭打字机效果,则打完所有字符
181
172
  if (disableTypingRef.current) {
182
- typingRemainAll();
173
+ await typingRemainAll();
183
174
  return;
184
175
  }
185
176
  const chars = getChars();
@@ -201,23 +192,23 @@ const useTypingTask = (options) => {
201
192
  const char = chars.shift();
202
193
  if (char === undefined)
203
194
  break;
204
- if (!isTypedRef.current) {
205
- isTypedRef.current = true;
195
+ if (!isTypingRef.current) {
196
+ isTypingRef.current = true;
206
197
  triggerOnStart(char);
207
- triggerOnTypedChar(char, true);
208
- }
209
- else {
210
- triggerOnTypedChar(char);
211
198
  }
199
+ /** 打字前回调 */
200
+ await triggerOnBeforeTypedChar(char);
212
201
  processCharDisplay(char);
202
+ /** 打字完成回调 */
203
+ triggerOnTypedChar(char);
213
204
  }
214
- lastFrameTime = currentTime;
205
+ lastFrameTime = performance.now();
215
206
  // 继续下一帧
216
207
  if (chars.length > 0) {
217
208
  animationFrameRef.current = requestAnimationFrame(frameLoop);
218
209
  }
219
210
  else {
220
- isTypedRef.current = false;
211
+ isTypingRef.current = false;
221
212
  triggerOnEnd();
222
213
  }
223
214
  };
@@ -225,7 +216,7 @@ const useTypingTask = (options) => {
225
216
  };
226
217
  /** 停止动画帧模式 */
227
218
  const stopAnimationFrame = (manual = false) => {
228
- isTypedRef.current = false;
219
+ isTypingRef.current = false;
229
220
  if (animationFrameRef.current) {
230
221
  cancelAnimationFrame(animationFrameRef.current);
231
222
  animationFrameRef.current = null;
@@ -244,7 +235,7 @@ const useTypingTask = (options) => {
244
235
  }
245
236
  timerRef.current = setTimeout(startTyped, interval);
246
237
  };
247
- const startTyped = (isStartPoint = false) => {
238
+ const startTyped = async (isStartPoint = false) => {
248
239
  // 如果关闭打字机效果,则打完所有字符
249
240
  if (disableTypingRef.current) {
250
241
  typingRemainAll();
@@ -253,7 +244,7 @@ const useTypingTask = (options) => {
253
244
  const chars = getChars();
254
245
  if (isUnmountRef.current)
255
246
  return;
256
- isTypedRef.current = true;
247
+ isTypingRef.current = true;
257
248
  const char = chars.shift();
258
249
  if (char === undefined) {
259
250
  stopTimeout();
@@ -261,27 +252,26 @@ const useTypingTask = (options) => {
261
252
  }
262
253
  if (isStartPoint) {
263
254
  triggerOnStart(char);
264
- triggerOnTypedChar(char, isStartPoint);
265
- }
266
- else {
267
- triggerOnTypedChar(char);
268
255
  }
256
+ /** 打字前回调 */
257
+ await triggerOnBeforeTypedChar(char);
269
258
  processCharDisplay(char);
259
+ /** 打字完成回调 */
260
+ triggerOnTypedChar(char);
270
261
  nextTyped();
271
262
  };
272
263
  startTyped(true);
273
264
  };
274
265
  /** 停止超时模式 */
275
266
  const stopTimeout = () => {
276
- isTypedRef.current = false;
267
+ isTypingRef.current = false;
277
268
  if (timerRef.current) {
278
269
  clearTimeout(timerRef.current);
279
270
  timerRef.current = null;
280
271
  }
281
272
  triggerOnEnd();
282
273
  };
283
- const stopTask = () => {
284
- typedIsManualStopRef.current = true;
274
+ const cancelTask = () => {
285
275
  if (timerType === 'requestAnimationFrame') {
286
276
  stopAnimationFrame();
287
277
  }
@@ -289,19 +279,54 @@ const useTypingTask = (options) => {
289
279
  stopTimeout();
290
280
  }
291
281
  };
282
+ /** 暂时停止 */
283
+ const stopTask = () => {
284
+ typedIsManualStopRef.current = true;
285
+ cancelTask();
286
+ };
287
+ /** 停止打字任务 */
288
+ const endTask = () => {
289
+ cancelTask();
290
+ };
292
291
  function restartTypedTask() {
292
+ endTask();
293
+ // 将wholeContentRef的内容放到charsRef中
294
+ charsRef.current.unshift(...wholeContentRef.current.thinking.content.split('').map((charUnit) => {
295
+ const char = {
296
+ content: charUnit,
297
+ answerType: 'thinking',
298
+ tokenId: 0,
299
+ index: 0,
300
+ };
301
+ return char;
302
+ }));
303
+ charsRef.current.unshift(...wholeContentRef.current.answer.content.split('').map((charUnit) => {
304
+ const char = {
305
+ content: charUnit,
306
+ answerType: 'answer',
307
+ tokenId: 0,
308
+ index: 0,
309
+ };
310
+ return char;
311
+ }));
312
+ resetWholeContent();
313
+ triggerUpdate();
314
+ startTypedTask();
315
+ }
316
+ function clear() {
317
+ clearTimer();
318
+ }
319
+ function resume() {
293
320
  typedIsManualStopRef.current = false;
294
321
  startTypedTask();
295
322
  }
296
323
  return {
297
324
  start: startTypedTask,
325
+ restart: restartTypedTask,
298
326
  stop: stopTask,
299
- resume: restartTypedTask,
300
- clear: () => {
301
- clearTimer();
302
- typedCharsRef.current = undefined;
303
- },
304
- isTyping: () => isTypedRef.current,
327
+ resume: resume,
328
+ clear: clear,
329
+ isTyping: () => isTypingRef.current,
305
330
  typedIsManualStopRef,
306
331
  };
307
332
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useTypingTask.js","sourceRoot":"","sources":["../../../src/hooks/useTypingTask.ts"],"names":[],"mappings":";;;AAAA,iCAA0C;AA0BnC,MAAM,aAAa,GAAG,CAAC,OAA6B,EAAwB,EAAE;IACnF,MAAM,EAAE,SAAS,GAAG,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IACjK,WAAW;IACX,MAAM,YAAY,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IACnC,aAAa;IACb,MAAM,UAAU,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IACjC,YAAY;IACZ,MAAM,iBAAiB,GAAG,IAAA,cAAM,EAAgB,IAAI,CAAC,CAAC;IACtD,kBAAkB;IAClB,MAAM,QAAQ,GAAG,IAAA,cAAM,EAAwB,IAAI,CAAC,CAAC;IACrD,WAAW;IACX,MAAM,aAAa,GAAG,IAAA,cAAM,EAAgF,SAAS,CAAC,CAAC;IACvH,iBAAiB;IACjB,MAAM,oBAAoB,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IAE3C,MAAM,gBAAgB,GAAG,IAAA,cAAM,EAAC,aAAa,CAAC,CAAC;IAC/C,gBAAgB,CAAC,OAAO,GAAG,aAAa,CAAC;IAEzC,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC,CAAC;IAEF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC;QAE7B,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;;;OAIG;IACH,MAAM,gBAAgB,GAAG,CAAC,IAAW,EAAE,EAAE;QACvC,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,aAAa,CAAC,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;YACnF,aAAa,CAAC,OAAO,GAAG;gBACtB,YAAY,EAAE,IAAI,CAAC,OAAO;gBAC1B,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC;YAC7C,aAAa,CAAC,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC;YACnD,aAAa,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAC1C,CAAC;QAED,OAAO;YACL,OAAO;YACP,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,YAAY,IAAI,EAAE;SACnD,CAAC;IACJ,CAAC,CAAC;IAEF;;;OAGG;IACH,MAAM,cAAc,GAAG,CAAC,IAAW,EAAE,EAAE;QACrC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,CAAC;YACN,YAAY,EAAE,OAAO,CAAC,MAAM;YAC5B,WAAW,EAAE,IAAI,CAAC,OAAO;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO;SACR,CAAC,CAAC;IACL,CAAC,CAAC;IAEF;;OAEG;IACH,MAAM,YAAY,GAAG,CAAC,IAA2B,EAAE,EAAE;QACnD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,KAAK,CAAC;YACJ,GAAG,EAAE,aAAa,CAAC,OAAO,EAAE,YAAY;YACxC,UAAU,EAAE,aAAa,CAAC,OAAO,EAAE,UAAU,IAAI,QAAQ;YACzD,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC;IAEF;;;;OAIG;IACH,MAAM,kBAAkB,GAAG,CAAC,IAAW,EAAE,YAAY,GAAG,KAAK,EAAE,EAAE;QAC/D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAE5C,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC;QAEpD,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC;QAErD,WAAW,CAAC;YACV,YAAY,EAAE,KAAK;YACnB,WAAW,EAAE,OAAO;YACpB,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE;YAC7C,OAAO;SACR,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,YAAY;IACZ,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,2BAA2B;QAC3B,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;YAC9B,oBAAoB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAChD,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;QACnC,CAAC;QAED,qCAAqC;QACrC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/B,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;QAC3B,aAAa,CAAC,OAAO,GAAG,SAAS,CAAC;IACpC,CAAC,CAAC;IAEF,aAAa;IACb,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,8BAA8B;QAC9B,IAAI,oBAAoB,CAAC,OAAO,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QAED,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,SAAS,KAAK,uBAAuB,EAAE,CAAC;YAC1C,uBAAuB,EAAE,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,gBAAgB,EAAE,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,gBAAgB;IAChB,SAAS,eAAe;QACtB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,gBAAgB,GAAG,KAAK;aAC3B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,UAAU,CAAC;aAChD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;aAC3B,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,MAAM,cAAc,GAAG,KAAK;aACzB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC;aAC9C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;aAC3B,IAAI,CAAC,EAAE,CAAC,CAAC;QAEZ,IAAI,gBAAgB,EAAE,CAAC;YACrB,WAAW,EAAE,CAAC;gBACZ,YAAY,EAAE,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBACrD,WAAW,EAAE,gBAAgB;gBAC7B,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE;gBAC7C,OAAO,EAAE,GAAG;aACb,CAAC,CAAC;QACL,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,WAAW,EAAE,CAAC;gBACZ,YAAY,EAAE,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;gBACnD,WAAW,EAAE,cAAc;gBAC3B,UAAU,EAAE,QAAQ;gBACpB,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE;gBAC7C,OAAO,EAAE,GAAG;aACb,CAAC,CAAC;QACL,CAAC;QAED,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,IAAI,gBAAgB,CAAC;QAC7D,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC;QACnE,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,cAAc,CAAC;QACzD,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC;QAC/D,eAAe,CAAC,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;QACrF,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAC;QACtB,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;QAE3B,YAAY,EAAE,CAAC;QACf,aAAa,EAAE,CAAC;IAClB,CAAC;IAED,+BAA+B;IAC/B,MAAM,uBAAuB,GAAG,GAAG,EAAE;QACnC,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,MAAM,SAAS,GAAG,CAAC,WAAmB,EAAE,EAAE;YACxC,oBAAoB;YACpB,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAC7B,eAAe,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;YACD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;YAEzB,IAAI,YAAY,CAAC,OAAO;gBAAE,OAAO;YAEjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,kBAAkB,EAAE,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,gBAAgB;YAChB,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;gBACxB,aAAa,GAAG,WAAW,CAAC;YAC9B,CAAC;YAED,MAAM,SAAS,GAAG,WAAW,GAAG,aAAa,CAAC;YAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC;YAClE,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAE9D,OAAO;YACP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC3B,IAAI,IAAI,KAAK,SAAS;oBAAE,MAAM;gBAE9B,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;oBACxB,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;oBAC1B,cAAc,CAAC,IAAI,CAAC,CAAC;oBACrB,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACN,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC;gBACD,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YAED,aAAa,GAAG,WAAW,CAAC;YAE5B,QAAQ;YACR,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,iBAAiB,CAAC,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;gBAC3B,YAAY,EAAE,CAAC;YACjB,CAAC;QACH,CAAC,CAAC;QAEF,iBAAiB,CAAC,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC,CAAC;IAEF,cAAc;IACd,MAAM,kBAAkB,GAAG,CAAC,MAAM,GAAG,KAAK,EAAE,EAAE;QAC5C,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;QAC3B,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;YAC9B,oBAAoB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAChD,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC;IAEF,oBAAoB;IACpB,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,MAAM,SAAS,GAAG,GAAG,EAAE;YACrB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;YACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,WAAW,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YACD,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACtD,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,CAAC,YAAY,GAAG,KAAK,EAAE,EAAE;YAC1C,oBAAoB;YACpB,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAC7B,eAAe,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;YACzB,IAAI,YAAY,CAAC,OAAO;gBAAE,OAAO;YAEjC,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;YAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAE3B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,WAAW,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,IAAI,YAAY,EAAE,CAAC;gBACjB,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YAED,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACzB,SAAS,EAAE,CAAC;QACd,CAAC,CAAC;QAEF,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,aAAa;IACb,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;QAC3B,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/B,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,CAAC;QACD,YAAY,EAAE,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,oBAAoB,CAAC,OAAO,GAAG,IAAI,CAAC;QACpC,IAAI,SAAS,KAAK,uBAAuB,EAAE,CAAC;YAC1C,kBAAkB,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,gBAAgB;QACvB,oBAAoB,CAAC,OAAO,GAAG,KAAK,CAAC;QACrC,cAAc,EAAE,CAAC;IACnB,CAAC;IAED,OAAO;QACL,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,GAAG,EAAE;YACV,UAAU,EAAE,CAAC;YACb,aAAa,CAAC,OAAO,GAAG,SAAS,CAAC;QACpC,CAAC;QACD,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO;QAClC,oBAAoB;KACrB,CAAC;AACJ,CAAC,CAAC;AAtVW,QAAA,aAAa,iBAsVxB"}
1
+ {"version":3,"file":"useTypingTask.js","sourceRoot":"","sources":["../../../src/hooks/useTypingTask.ts"],"names":[],"mappings":"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"}
@@ -40,6 +40,12 @@ const MarkdownInner = ({ children: _children = '', answerType, markdownRef, ...r
40
40
  resume: () => {
41
41
  cmdRef.current.resume();
42
42
  },
43
+ start: () => {
44
+ cmdRef.current.start();
45
+ },
46
+ restart: () => {
47
+ cmdRef.current.restart();
48
+ },
43
49
  }));
44
50
  return _jsx(MarkdownCMD, { ref: cmdRef, ...rest });
45
51
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Markdown/index.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAMlD,MAAM,aAAa,GAAiC,CAAC,EAAE,QAAQ,EAAE,SAAS,GAAG,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;IACrH,MAAM,MAAM,GAAG,MAAM,CAAiB,IAAK,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;QAC3B,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAClC,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,IAAI,SAAS,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;gBAC7B,UAAU,GAAG,OAAO,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC1C,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACvD,CAAC;qBAAM,CAAC;oBACN,UAAU,GAAG,OAAO,CAAC;oBACrB,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACzB,CAAC;YACH,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC5C,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAE1B,mBAAmB,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;QACtC,IAAI,EAAE,GAAG,EAAE;YACT,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;QACD,MAAM,EAAE,GAAG,EAAE;YACX,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,CAAC;KACF,CAAC,CAAC,CAAC;IAEJ,OAAO,KAAC,WAAW,IAAC,GAAG,EAAE,MAAM,KAAM,IAAI,GAAI,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,UAAU,CAA6B,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACrE,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,UAAU,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC;IAEvD,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,KAAC,aAAa,OAAK,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,GAAI,CAAC;AAChF,CAAC,CAAC,CAAC;AAEH,eAAe,IAAI,CAAC,QAAQ,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Markdown/index.tsx"],"names":[],"mappings":"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"}
@@ -4,7 +4,11 @@ import HighReactMarkdown from '../components/HighReactMarkdown/index.js';
4
4
  import classNames from 'classnames';
5
5
  import { __DEV__ } from '../constant.js';
6
6
  import { useTypingTask } from '../hooks/useTypingTask.js';
7
- const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, timerType = 'setTimeout', theme = 'light', math, plugins, disableTyping = false }, ref) => {
7
+ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, onBeforeTypedChar, timerType = 'setTimeout', theme = 'light', math, plugins, disableTyping = false, autoStartTyping = true }, ref) => {
8
+ /** 是否自动开启打字动画, 后面发生变化将不会生效 */
9
+ const autoStartTypingRef = useRef(autoStartTyping);
10
+ /** 是否打过字 */
11
+ const isStartedTypingRef = useRef(false);
8
12
  /** 当前需要打字的内容 */
9
13
  const charsRef = useRef([]);
10
14
  /**
@@ -18,10 +22,12 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
18
22
  thinking: {
19
23
  content: '',
20
24
  length: 0,
25
+ prevLength: 0,
21
26
  },
22
27
  answer: {
23
28
  content: '',
24
29
  length: 0,
30
+ prevLength: 0,
25
31
  },
26
32
  allLength: 0,
27
33
  });
@@ -33,6 +39,9 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
33
39
  * 处理字符显示逻辑
34
40
  */
35
41
  const processCharDisplay = (char) => {
42
+ if (!isStartedTypingRef.current) {
43
+ isStartedTypingRef.current = true;
44
+ }
36
45
  if (char.answerType === 'thinking') {
37
46
  wholeContentRef.current.thinking.content += char.content;
38
47
  wholeContentRef.current.thinking.length += 1;
@@ -43,6 +52,15 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
43
52
  }
44
53
  triggerUpdate();
45
54
  };
55
+ const resetWholeContent = () => {
56
+ wholeContentRef.current.thinking.content = '';
57
+ wholeContentRef.current.thinking.length = 0;
58
+ wholeContentRef.current.thinking.prevLength = 0;
59
+ wholeContentRef.current.answer.content = '';
60
+ wholeContentRef.current.answer.length = 0;
61
+ wholeContentRef.current.answer.prevLength = 0;
62
+ wholeContentRef.current.allLength = 0;
63
+ };
46
64
  // 使用新的打字任务 hook
47
65
  const typingTask = useTypingTask({
48
66
  timerType,
@@ -51,10 +69,12 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
51
69
  onEnd,
52
70
  onStart,
53
71
  onTypedChar,
72
+ onBeforeTypedChar,
54
73
  processCharDisplay,
55
74
  wholeContentRef,
56
75
  disableTyping,
57
76
  triggerUpdate,
77
+ resetWholeContent,
58
78
  });
59
79
  /**
60
80
  * 内部推送处理逻辑
@@ -68,21 +88,32 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
68
88
  const charObj = {
69
89
  content: chatStr,
70
90
  answerType,
71
- contentType: 'segment',
72
91
  tokenId: 0,
73
92
  index,
74
93
  };
75
94
  return charObj;
76
95
  }));
77
96
  wholeContentRef.current.allLength += content.length;
97
+ // 如果关闭了自动打字, 并且没有打过字, 则不开启打字动画
98
+ if (!autoStartTypingRef.current && !isStartedTypingRef.current) {
99
+ return;
100
+ }
78
101
  if (!typingTask.isTyping()) {
79
102
  typingTask.start();
80
103
  }
81
104
  };
82
105
  const processNoTypingPush = (content, answerType) => {
83
106
  wholeContentRef.current[answerType].content += content;
107
+ // 记录打字前的长度
108
+ wholeContentRef.current[answerType].prevLength = wholeContentRef.current[answerType].length;
84
109
  wholeContentRef.current[answerType].length += content.length;
85
110
  triggerUpdate();
111
+ onEnd?.({
112
+ str: content,
113
+ answerStr: wholeContentRef.current.answer.content,
114
+ thinkingStr: wholeContentRef.current.thinking.content,
115
+ manual: false,
116
+ });
86
117
  };
87
118
  useImperativeHandle(ref, () => ({
88
119
  /**
@@ -104,15 +135,18 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
104
135
  typingTask.stop();
105
136
  typingTask.typedIsManualStopRef.current = false;
106
137
  charsRef.current = [];
107
- wholeContentRef.current.thinking.content = '';
108
- wholeContentRef.current.thinking.length = 0;
109
- wholeContentRef.current.answer.content = '';
110
- wholeContentRef.current.answer.length = 0;
111
- wholeContentRef.current.allLength = 0;
138
+ resetWholeContent();
112
139
  isWholeTypedEndRef.current = false;
113
140
  charIndexRef.current = 0;
141
+ isStartedTypingRef.current = false;
114
142
  triggerUpdate();
115
143
  },
144
+ /** 开启打字,只有在关闭了自动打字才生效 */
145
+ start: () => {
146
+ if (!autoStartTypingRef.current) {
147
+ typingTask.start();
148
+ }
149
+ },
116
150
  /** 停止打字任务 */
117
151
  stop: () => {
118
152
  typingTask.stop();
@@ -129,14 +163,17 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
129
163
  if (!typingTask.isTyping()) {
130
164
  // 这里需要手动触发结束回调,因为 hook 中的 triggerOnEnd 不能直接调用
131
165
  onEnd?.({
132
- str: undefined,
133
- answerType: undefined,
166
+ str: wholeContentRef.current.answer.content,
167
+ answerStr: wholeContentRef.current.answer.content,
168
+ thinkingStr: wholeContentRef.current.thinking.content,
169
+ manual: true,
134
170
  });
135
171
  }
136
172
  },
137
- /**
138
- * 刷新缓冲区 (新增方法)
139
- */
173
+ /** 重新开始打字任务 */
174
+ restart: () => {
175
+ typingTask.restart();
176
+ },
140
177
  }));
141
178
  const getParagraphs = (answerType) => {
142
179
  const content = wholeContentRef.current[answerType].content || '';