チャットパネルChatPanelExperimental

チャットメッセージとチャット入力を組み合わせ、サポートやアシスタントの会話面を構成するパネルです。

プレビュー

状態とバリエーション

標準表示

メッセージ履歴、処理中状態、入力欄を 1 つのパネルにまとめます。

サポートチャット

メッセージ、入力欄、処理中状態をまとめて確認します。

会話を開始しました。
Assistant10:01
ドキュメントの改善点を確認できます。質問を入力してください。

空状態

会話開始前の簡素な空状態です。emptyState slot で差し替えられます。

サポートチャット

会話開始前も入力欄は使えます。

まだメッセージはありません。

質問や確認したい内容を入力すると会話を開始できます。

初期画面

welcome slot は、初回起動時の案内や開始候補を表示するための領域です。

新しいチャット

どの作業から始めますか?

文章作成、整理、分析などをこのチャットから始められます。

コンパクト

狭いパネルでは高さを下げ、同じ構成を保ちます。

サポートチャット

サポート10:01
短い確認に使います。

プロパティ

表は横にスクロールできます
プロパティ初期値説明
messagesChatPanelMessage[]-表示する会話履歴です。
onSend(message: string, files?: File[]) => void-入力欄の送信時に呼び出します。
isProcessingbooleanfalse応答生成中などの処理中状態です。
emptyStateReactNode-メッセージが空で welcome がない場合に表示する空状態です。
welcomeReactNode-メッセージが空の場合に優先表示する初期画面です。
onMessageAction(message, actionKey, event) => void-パネル内メッセージのコピー、分岐、Raw、編集などの操作を受け取ります。
onClose() => void-閉じるボタンを表示し、押下時に呼び出します。
inputLabelsChatInputLabels-入力欄のラベルや無効化理由を指定します。

使い方

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 の記事で解説しています。