チャットパネルChatPanelExperimental
チャットメッセージとチャット入力を組み合わせ、サポートやアシスタントの会話面を構成するパネルです。
プレビュー
状態とバリエーション
標準表示
メッセージ履歴、処理中状態、入力欄を 1 つのパネルにまとめます。
空状態
会話開始前の簡素な空状態です。emptyState slot で差し替えられます。
初期画面
welcome slot は、初回起動時の案内や開始候補を表示するための領域です。
コンパクト
狭いパネルでは高さを下げ、同じ構成を保ちます。
プロパティ
表は横にスクロールできます
| プロパティ | 型 | 初期値 | 説明 |
|---|---|---|---|
| messages | ChatPanelMessage[] | - | 表示する会話履歴です。 |
| onSend | (message: string, files?: File[]) => void | - | 入力欄の送信時に呼び出します。 |
| isProcessing | boolean | false | 応答生成中などの処理中状態です。 |
| emptyState | ReactNode | - | メッセージが空で welcome がない場合に表示する空状態です。 |
| welcome | ReactNode | - | メッセージが空の場合に優先表示する初期画面です。 |
| onMessageAction | (message, actionKey, event) => void | - | パネル内メッセージのコピー、分岐、Raw、編集などの操作を受け取ります。 |
| onClose | () => void | - | 閉じるボタンを表示し、押下時に呼び出します。 |
| inputLabels | ChatInputLabels | - | 入力欄のラベルや無効化理由を指定します。 |
使い方
import * as React from "react";
import { ChatPanel, ToastProvider, useToast, type ChatPanelMessage } from "@gunjo/ui";
const actionMessages = {
copy: "メッセージをコピーしました。",
branch: "この回答から分岐します。",
raw: "Raw 表示を開きます。",
edit: "メッセージを編集します。",
};
function SupportChatPanelBody() {
const [messages, setMessages] = React.useState<ChatPanelMessage[]>([
{ id: "system", role: "system", content: "会話を開始しました。" },
{
id: "assistant",
role: "assistant",
userName: "サポート",
content: "確認したい内容を送ってください。",
timestamp: "10:01",
},
]);
const [isProcessing, setIsProcessing] = React.useState(false);
const { showToast } = useToast();
return (
<ChatPanel
title="サポートチャット"
description="会話履歴と入力欄を同じパネルで扱います。"
messages={messages}
onSend={(message) => {
setMessages((current) => [
...current,
{ id: `user-${Date.now()}`, role: "user", userName: "あなた", content: message, timestamp: "10:02" },
]);
setIsProcessing(true);
}}
onStop={() => setIsProcessing(false)}
onMessageAction={(_, action) => {
showToast(actionMessages[action] ?? "操作を実行しました。", "success", 1800);
}}
isProcessing={isProcessing}
placeholder="確認したい内容を入力..."
/>
);
}
export function SupportChatPanel() {
return (
<ToastProvider labels={{ close: "閉じる" }}>
<SupportChatPanelBody />
</ToastProvider>
);
}使用コンポーネント
関連コンポーネント
設計の判断(UIXHERO)
「いつ・なぜ使うか」の判断は、姉妹サイト UIXHERO の記事で解説しています。