Chat Composer
ChatComposer là ô soạn tin tự giãn theo nội dung: Enter để gửi, Shift+Enter để xuống dòng, nút gửi chỉ bật khi có nội dung.
Import
Cài từ npm, chép mã nguồn vào dự án bằng @yugen-ui/cli hoặc shadcn CLI, hoặc import thẳng khi làm việc trong repo này.
// npm install yugen-uiimport { ChatComposer } from "yugen-ui";Biến thể
Mỗi ô là một mẫu độc lập: hover để Copy, hoặc bấm Code để xem mã nguồn.
Đang trả lời & nút Dừng
busy chặn gửi; có onStop thì nút gửi thành nút Dừng.
Gợi ý phím
showHint hiện “Enter để gửi · Shift+Enter xuống dòng” (ẩn trên màn hẹp).
Disabled
Giải thích lý do ngay trong placeholder hoặc bên cạnh.
Cách dùng
- Đưa focus lại ô soạn sau khi gửi (component tự làm) để gõ tiếp liền mạch.
- Dùng busy + onStop khi chờ AI để người dùng chủ động dừng câu trả lời dài.
- Không bắt Ctrl+Enter mới gửi trong chat thông thường — Enter là kỳ vọng mặc định.
- Không bỏ tin gửi thất bại: ChatComposer xoá ô sau onSend, nên giữ tin trong danh sách với trạng thái lỗi và nút Thử lại.
Props
| Prop · Kiểu | Mặc định | Mô tả |
|---|---|---|
| onSend(text: string) => void | Mặc định: — | Nhận nội dung đã trim; ô soạn tự xoá. |
| value / defaultValue / onValueChangestring | Mặc định: — | Controlled hoặc uncontrolled. |
| placeholder / labelstring | Mặc định: "Type a message…" / "Message" | Placeholder và tên truy cập của textarea. |
| maxLength / showCountnumber / boolean | Mặc định: — | Giới hạn ký tự và bộ đếm (đổi màu khi gần hết). |
| maxRowsnumber | Mặc định: 6 | Số dòng tối đa trước khi cuộn. |
| actionsReactNode | Mặc định: — | Nút ở đầu thanh công cụ. |
| busy / onStopboolean / () => void | Mặc định: — | Chặn gửi khi đang chờ; nút Dừng. |
| showHint / sendLabel / disabledboolean / string / boolean | Mặc định: false / "Send" / false | Gợi ý phím, nhãn nút gửi, vô hiệu hoá. |
| textareaPropsTextareaHTMLAttributes | Mặc định: — | Thuộc tính thêm cho textarea. |
Messages
Chữ có sẵn của component: nhãn, aria-label, thông báo cho trình đọc màn hình.
Mặc định là tiếng Anh. Đổi qua prop messages của YugenProvider, theo namespace bên dưới; messagesVi chứa bản tiếng Việt. Xem Ngôn ngữ giao diện.
messages.messageBubble
| Khoá · Kiểu | Mặc định (tiếng Anh) | messagesVi |
|---|---|---|
| sendingstring Nhãn trạng thái gửi — cùng tên với | Mặc định (tiếng Anh)"Sending" | messagesVi"Đang gửi" |
| sentstring | Mặc định (tiếng Anh)"Sent" | messagesVi"Đã gửi" |
| deliveredstring | Mặc định (tiếng Anh)"Delivered" | messagesVi"Đã nhận" |
| readstring | Mặc định (tiếng Anh)"Seen" | messagesVi"Đã xem" |
| errorstring Lỗi gửi (khi không truyền | Mặc định (tiếng Anh)"Couldn't send." | messagesVi"Không gửi được." |
| retrystring | Mặc định (tiếng Anh)"Retry" | messagesVi"Thử lại" |
messages.typingIndicator
| Khoá · Kiểu | Mặc định (tiếng Anh) | messagesVi |
|---|---|---|
| label(author?: string) => string Câu đọc cho trình đọc màn hình (khi không truyền | Mặc định (tiếng Anh)(author) => `${author ?? "Someone"} is typing…` | messagesVi(author) => `${author ?? "Đối phương"} đang soạn tin…` |
messages.chatComposer
| Khoá · Kiểu | Mặc định (tiếng Anh) | messagesVi |
|---|---|---|
| placeholderstring | Mặc định (tiếng Anh)"Type a message…" | messagesVi"Nhập tin nhắn…" |
| labelstring Nhãn truy cập cho ô soạn. | Mặc định (tiếng Anh)"Message" | messagesVi"Tin nhắn" |
| sendstring Tên nút gửi. | Mặc định (tiếng Anh)"Send" | messagesVi"Gửi" |
| stopstring Tên nút dừng (khi busy + onStop). | Mặc định (tiếng Anh)"Stop responding" | messagesVi"Dừng phản hồi" |
| hintstring Gợi ý phím (showHint). | Mặc định (tiếng Anh)"Enter to send · Shift+Enter for a new line" | messagesVi"Enter để gửi · Shift+Enter xuống dòng" |
| countPrefixstring Chữ ẩn trước / sau bộ đếm "12/100", cho trình đọc màn hình. | Mặc định (tiếng Anh)"Typed" | messagesVi"Đã nhập" |
| countSuffixstring | Mặc định (tiếng Anh)"characters" | messagesVi"ký tự" |