Skip to content

Commit 6e4d20b

Browse files
committed
完善Markdown输入字段和发送按钮组件,添加详细的属性注释和功能描述
1 parent d7a55e3 commit 6e4d20b

File tree

2 files changed

+157
-1
lines changed

2 files changed

+157
-1
lines changed

src/MarkdownInputField/MarkdownInputField.tsx

+105-1
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,108 @@ import { BaseMarkdownEditor, MarkdownEditorInstance } from '../MarkdownEditor';
77
import { SendButton } from './SendButton';
88
import { useStyle } from './style';
99

10+
/**
11+
* Markdown 输入字段的属性接口
12+
*
13+
* @interface MarkdownInputFieldProps
14+
* @property {string} [value] - 输入字段的当前文本值
15+
* @property {function} [onChange] - 当输入值改变时触发的回调函数
16+
* @property {string} [placeholder] - 输入字段的占位文本
17+
* @property {React.CSSProperties} [style] - 应用于输入字段的内联样式
18+
* @property {string} [className] - 应用于输入字段的 CSS 类名
19+
* @property {boolean} [disabled] - 是否禁用输入字段
20+
* @property {boolean} [typing] - 用户是否正在输入的状态标志
21+
* @property {'Enter' | 'Mod+Enter'} [triggerSendKey] - 触发发送操作的键盘快捷键
22+
* @property {function} [onSend] - 当内容发送时触发的异步回调函数
23+
*/
24+
1025
export type MarkdownInputFieldProps = {
26+
/**
27+
* 当前的 markdown 文本值。
28+
* @example value="# Hello World"
29+
*/
1130
value?: string;
31+
32+
/**
33+
* 当输入值改变时触发的回调函数。
34+
* @param value The new markdown text value
35+
* @example onChange={(newValue) => setMarkdown(newValue)}
36+
*/
1237
onChange?: (value: string) => void;
38+
39+
/**
40+
* 输入字段的占位文本。
41+
* @example placeholder="Type markdown here..."
42+
*/
1343
placeholder?: string;
44+
45+
/**
46+
* 应用于输入字段的内联样式。
47+
* @example style={{ minHeight: '200px' }}
48+
*/
1449
style?: React.CSSProperties;
50+
51+
/**
52+
* 应用于输入字段的 CSS 类名。
53+
* @example className="custom-markdown-input"
54+
*/
1555
className?: string;
56+
57+
/**
58+
* 是否禁用输入字段。
59+
* @example disabled={isSubmitting}
60+
*/
1661
disabled?: boolean;
62+
63+
/**
64+
* 用户是否正在输入的状态标志。
65+
* @example typing={isComposing}
66+
*/
1767
typing?: boolean;
68+
69+
/**
70+
* 触发发送操作的键盘快捷键。
71+
* - 'Enter': 回车键触发发送
72+
* - 'Mod+Enter': 按下 Ctrl/Command + Enter 触发发送
73+
* @example triggerSendKey="Mod+Enter"
74+
*/
75+
triggerSendKey?: 'Enter' | 'Mod+Enter';
76+
77+
/**
78+
* 当内容发送时触发的异步回调函数。
79+
* 返回一个 Promise 对象,当发送成功后 resolve。
80+
* @param value The current markdown text value
81+
* @example onSend={async (text) => await submitMessage(text)}
82+
*/
1883
onSend?: (value: string) => Promise<void>;
1984
};
2085

86+
/**
87+
* @component MarkdownInputField
88+
* @description 带发送功能的Markdown输入字段组件。允许用户编辑Markdown内容并通过按钮或快捷键发送。
89+
*
90+
* @param {MarkdownInputFieldProps} props - 组件属性
91+
* @param {string} [props.value] - 输入字段的Markdown内容值
92+
* @param {function} [props.onChange] - 当输入内容改变时的回调函数
93+
* @param {function} [props.onSend] - 当内容发送时的回调函数,应返回Promise
94+
* @param {boolean} [props.disabled] - 是否禁用输入字段
95+
* @param {string} [props.className] - 自定义CSS类名
96+
* @param {React.CSSProperties} [props.style] - 自定义样式
97+
* @param {string} [props.placeholder] - 输入字段的占位文本
98+
* @param {string} [props.triggerSendKey='Enter'] - 触发发送的键盘快捷键,可以是'Enter'或'Mod+Enter'
99+
* @param {boolean} [props.typing] - 是否显示正在输入状态
100+
*
101+
* @returns {JSX.Element} 带样式和功能的Markdown输入字段组件
102+
*
103+
* @example
104+
* <MarkdownInputField
105+
* value="# 标题"
106+
* onChange={(value) => console.log(value)}
107+
* onSend={(value) => Promise.resolve()}
108+
* placeholder="请输入Markdown文本..."
109+
* triggerSendKey="Mod+Enter"
110+
* />
111+
*/
21112
export const MarkdownInputField: React.FC<MarkdownInputFieldProps> = (
22113
props,
23114
) => {
@@ -60,7 +151,20 @@ export const MarkdownInputField: React.FC<MarkdownInputFieldProps> = (
60151
onMouseEnter={() => setHover(true)}
61152
onMouseLeave={() => setHover(false)}
62153
onKeyDown={(e) => {
63-
if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) {
154+
const { triggerSendKey = 'Enter' } = props;
155+
if (triggerSendKey === 'Enter' && e.key === 'Enter') {
156+
e.stopPropagation();
157+
e.preventDefault();
158+
if (props.onSend) {
159+
sendMessage();
160+
}
161+
return;
162+
}
163+
if (
164+
triggerSendKey === 'Mod+Enter' &&
165+
(e.ctrlKey || e.metaKey) &&
166+
e.key === 'Enter'
167+
) {
64168
e.stopPropagation();
65169
e.preventDefault();
66170
if (props.onSend) {

src/MarkdownInputField/SendButton/index.tsx

+52
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,68 @@ import React, { useContext, useEffect } from 'react';
44
import { SendIcon } from './SendIcon';
55
import { useStyle } from './style';
66

7+
/**
8+
* Props for the SendButton component.
9+
*/
710
type SendButtonProps = {
11+
/**
12+
* 指示按钮是否处于悬停状态
13+
* Indicates whether the button is in a hover state.
14+
*/
815
isHover: boolean;
16+
17+
/**
18+
* 指示用户是否正在输入
19+
* Indicates whether the user is currently typing.
20+
*/
921
typing: boolean;
22+
23+
/**
24+
* 点击按钮时触发的回调函数
25+
* Callback function triggered when the button is clicked.
26+
*/
1027
onClick: () => void;
28+
29+
/**
30+
* 应用于按钮的CSS样式
31+
* CSS styles to be applied to the button.
32+
*/
1133
style: React.CSSProperties;
34+
35+
/**
36+
* 按钮初始化时触发的回调函数
37+
* Callback function triggered when the button is initialized.
38+
*/
1239
onInit?: () => void;
40+
41+
/**
42+
* 是否使用紧凑模式显示按钮
43+
* Whether to display the button in compact mode.
44+
*/
1345
compact?: boolean;
46+
47+
/**
48+
* 按钮是否禁用
49+
* Whether the button is disabled.
50+
*/
1451
disabled?: boolean;
1552
};
1653

54+
/**
55+
* 发送按钮组件
56+
*
57+
* 一个可点击的发送按钮,根据不同状态(悬停、禁用、输入中)呈现不同的视觉效果
58+
*
59+
* @param props - 按钮组件的属性
60+
* @param props.isHover - 指示鼠标是否悬停在按钮上
61+
* @param props.disabled - 指示按钮是否禁用
62+
* @param props.typing - 指示是否处于输入状态
63+
* @param props.onClick - 点击按钮时的回调函数
64+
* @param props.style - 应用于按钮容器的自定义样式
65+
* @param props.onInit - 组件初始化时调用的可选回调函数
66+
* @param props.compact - 是否使用紧凑模式样式
67+
* @returns 发送按钮组件
68+
*/
1769
export const SendButton: React.FC<SendButtonProps> = (props) => {
1870
const { isHover, disabled, typing, onClick, style } = props;
1971
useEffect(() => {

0 commit comments

Comments
 (0)