Angular Chat (チャット) の概要
Chat コンポーネントは、アプリケーションで会話型インターフェースを構築するための完全なソリューションを提供します。カスタマー サポート ツール、コラボレーション ワークスペース、チャットボット アシスタントなどを作成する場合でも、チャット コンポーネントは必要な機能を提供します: テキスト メッセージの送受信、ファイル添付のアップロード、クイック リプライサジェストの表示、他の参加者が入力中であることを示す入力中インジケーター。
Chat コンポーネントは静的なメッセージ リストではなく、リアルタイム通信を想定したインタラクティブな設計です。入力やレンダリング、ユーザー操作を管理しつつ、メッセージや添付の表示方法は完全にカスタマイズ可能です。また、レイアウトやビジュアルの任意部分をオーバーライドできる広範なレンダリング API も提供されています。
インストール
はじめに、Ignite UI for Angular パッケージと、UI を提供する Ignite UI for Web Components パッケージをインストールします。
npm install igniteui-angular igniteui-webcomponents
IgxChatComponent は Angular のバインディング (イベント、テンプレート、DI、変更検出、パイプ) を提供し、視覚的なチャット UI は Web Components によってレンダリングされます。両方をインストールすることで、Angular でネイティブに動作するチャットを実現しつつ、Web Components の完全な UI を活用できます。
Ignite UI for Angular については、「はじめに」トピックををご覧ください。
インストールが完了したら、プロジェクトにコンポーネントをインポートできます。
import { Component } from '@angular/core';
import { IgxChatComponent } from "igniteui-angular/chat";
@Component({
...
})
export class AppComponent { ... }
使用方法
チャット オプションを定義し、テンプレートにバインドします。
import { IgxChatComponent, IgxChatOptions } from "igniteui-angular/chat";
public options: IgxChatOptions = {
currentUserId: 'me',
headerText: 'Support Chat',
};
<igx-chat
[options]="options"
[messages]="messages">
</igx-chat>
ここで、currentUserId プロパティは、どのメッセージが「送信済み」 (現在のユーザー) で、どれ「受信済み」 (他のユーザー) かをコンポーネントに判定します。headerText はチャット ウィンドウのタイトルを提供します。
レンダリングされたら、バインドされたメッセージ配列を更新することで、プログラムでメッセージを追加できます。
public addMessage() {
const newMessage = {
id: '1',
sender: 'me',
text: 'Hello! How can I help you?',
timestamp: Date.now().toString()
};
this.messages = [...this.messages, newMessage ];
}
この方法により、サーバー エンドポイント、チャットボット エンジン、コラボレーション アプリのバックエンドなど、任意のデータ ソースと簡単に統合できます。
入力
Chat コンポーネントは、その状態と構成を制御できるいくつかの重要なプロパティを公開します。
| 名前 | 説明 |
|---|---|
messages |
チャットに表示されるメッセージ (IgcChatMessage[]) の配列。表示するメッセージを制御するためにバインド可能。 |
draftMessage |
未送信メッセージ。text とオプションの attachments を含むオブジェクト。メッセージ下書きの保存や復元に便利。 |
options |
現在のユーザー ID、入力プレースホルダー、許可されるファイル タイプ、クイック リプライサジェスト、入力遅延、カスタム レンダラーなどのチャット設定 (IgxChatOptions)。 |
templates |
メッセージ コンテンツ、入力、添付ファイル、その他のチャット UI 部分に対して、カスタム Angular テンプレート(IgxChatTemplates)。 |
上記のプロパティを使用することで、Chat の UI をアプリケーションの状態やバックエンドと簡単に同期させることができます。
添付
モダンな会話ではテキストだけに限られません。Chat コンポーネントはファイル添付機能のサポートが組み込まれており、ユーザーは画像、ドキュメント、その他のファイルを共有できます。
デフォルトでは入力領域に添付ボタンが表示されます。acceptedFiles プロパティで許可されるファイル タイプを制御可能です。
public options: IgxChatOptions = {
acceptedFiles="image/*,.pdf",
};
この例では、ユーザーは画像と PDF ファイルのみをアップロードできます。 添付が不要なユースケースの場合は、簡単にオフにすることができます。
public options: IgxChatOptions = {
disableInputAttachments: true,
};
サジェスト
クイック リプライのサジェストは、ユーザーがすぐにタップして返信できる事前定義の応答を提供します。この機能は、チャットボットやカスタマー サービスのフロー、あるいはユーザーを構造化されたプロセスに案内する場合に特に有用です。
サジェストは、文字列の配列を suggestions プロパティにバインドすることで提供できます。suggestionsPosition プロパティを使用すると、表示位置を入力領域の下またはメッセージ リストの下に制御できます。
public options: IgxChatOptions = {
currentUserId: "me",
suggestions: ['Yes', 'No', 'Maybe later'],
suggestionsPosition: "below-input"
};
この方法により、繰り返し入力する必要が減り、ガイド付きの会話でユーザー体験を向上させることができます。
入力中インジケーター
相手が入力中であることが見えると、会話はより自然に感じられます。Chat コンポーネントでは、オプション オブジェクトの isTyping プロパティを通じてこの動作を提供します。
true に設定すると、メッセージ下にさりげない入力中インジケーターが表示されます。
public options: IgxChatOptions = {
isTyping: true
};
この機能は通常、バックエンド サービスからの入力イベントを受け取ったときなど、プログラムで切り替えます。
カスタム テンプレート
Chat コンポーネントはデフォルトの UI ですぐに使用できますが、多くのアプリケーションでは外観と操作性をカスタマイズする必要があります。たとえば、既読通知を追加したり、アバターを表示したり、入力領域を音声録音ボタンに置き換えたりする場合です。
Chat コンポーネントは、このニーズに対して Angular テンプレートを使用して対応します。テンプレートは templates 入力プロパティ経由で提供され、強く型付けされた Angular ディレクティブを使用します。
利用可能なテンプレート
Chat のカスタマイズ可能な部分は次の通りです:
- Message レベル: message、messageHeader、messageContent、messageAttachments、messageActions
- Attachment レベル: attachment、attachmentHeader、attachmentContent
- Input レベル: input、inputActions、inputActionsStart、inputActionsEnd、inputAttachments、fileUploadButton、sendButton
- Suggestion: suggestionPrefix
- その他: TypingIndicator
この粒度により、添付の表示方法など、特定の部分だけを変更してもチャット全体のレイアウトを書き換える必要はありません。
メッセージ内容のカスタマイズ
<igx-chat
[options]="options"
[messages]="messages"
[templates]="{ messageContent: messageContent }">
</igx-chat>
<ng-template #messageContent let-message igxChatMessageContext>
<div class="custom-message">
<strong>{{ message.sender }}:</strong> {{ message.text }}
</div>
</ng-template>
上記の例では:
let-messageはメッセージ オブジェクトを公開します。igxChatMessageContextディレクティブは、メッセージ テンプレートの適切な入力を保証します。
入力領域のカスタマイズ
デフォルトでは、チャット入力はテキスト領域です。音声入力ボタンなど、より適した体験を提供するためにオーバーライドできます。
<igx-chat
[options]="options"
[templates]="{ input: customInput }">
</igx-chat>
<ng-template #customInput let-input igxChatInputContext>
<div class="custom-input">
<textarea [(ngModel)]="input.value"></textarea>
<button (click)="speechToText()">🎤</button>
</div>
</ng-template>
入力アクションの拡張
Chat コンポーネントには、デフォルトのアクション (アップロードと送信) を保持しつつ追加のコントロールを拡張できるテンプレートがあります:
inputActionsStart- デフォルトのアップロード ボタンの後にカスタム コンテンツを挿入可能inputActionsEnd- デフォルトの送信ボタンの後にカスタム コンテンツを挿入可能
例えば、アップロード ボタンの横に音声録音ボタンを追加したり、送信ボタンの後に追加オプション メニューを追加したりできます。 次の例では、デフォルトのアップロード ボタンはそのままですが、その隣にマイク ボタンが追加されています。一方、デフォルトの送信ボタンを削除し、カスタムの「質問」ボタンと「その他」メニューに置き換えます。
<igx-chat
[options]="options"
[templates]="{
inputActionsStart: inputStart,
inputActionsEnd: inputEnd
}">
</igx-chat>
<ng-template #inputStart>
<button class="icon-btn">🎤</button>
</ng-template>
<ng-template #inputEnd>
<button (click)="ask()">Ask</button>
<button class="icon-btn">⋮</button>
</ng-template>
この設定では:
- アップロード ボタンはそのまま残ります。
- その後にマイク ボタンが追加されます (inputActionsStart)。
- デフォルトの送信ボタンが削除され、カスタムの「質問」ボタンと「その他」アイコン (inputActionsEnd) に置き換えられました。
この方法により、チャット入力バーの柔軟性が完全に向上し、入力領域を最初から再構築することなく、アクションを追加、削除、または並べ替えることができます。
Markdown のサポート
Chat コンポーネントには、fromMarkdown パイプによる Markdown コンテンツの組み込みサポートがあり、メッセージ テキストを安全な HTML に変換します。これにより、書式付きテキスト、リンク、リスト、シンタックス ハイライト付きコードブロックを表示しつつ、安全に HTML をサニタイズできます。
Markdown のレンダリングはパフォーマンス上の理由から非同期で実行されるため、fromMarkdown パイプは Angular の async パイプと組み合わせて使用する必要があります。
例 - テンプレート内で Markdown をレンダリングする場合:
<ng-template #messageContent let-message igxChatMessageContext>
<div [innerHTML]="message.text | fromMarkdown | async"></div>
</ng-template>
例:
- 各メッセージの text プロパティが marked ライブラリを使用して Markdown として解析されます。
- レンダラーは DOMPurify を使用して出力をサニタイズします。
- リンクは自動的に新しいタブで開き、安全な rel 属性が付与されます。
構文のハイライト表示
fromMarkdown パイプはコード ブロックのシンタックス ハイライトにも対応しています。メッセージにフェンス付きコード (js...) が含まれている場合、VS Code でも使用されている高精度ハイライター Shiki を使用してレンダリングされます。デフォルトでは JavaScript、TypeScript、HTML、CSS に対して github-light テーマでハイライト表示されます。
例 - メッセージに次の内容が含まれている場合:
Here is a JavaScript example:
\`\`\`ts
function greet(name: string) {
return `Hello, ${name}!`;
}
\`\`\`
チャット メッセージ内の出力は次のように表示されます。
- 自動的な構文のハイライト
- テーマ対応のスタイル (github-light / github-dark)
- 適切なインデントと等幅フォント
- 追加の設定は不要で、既定のテーマは自動的に読み込まれます。
出力 (イベント)
アプリケーション ロジックと統合するために、Chat コンポーネントは一連のイベントを発行します。
- messageCreated - 新しいメッセージ作成時
- messageReact - メッセージにリアクションした時
- attachmentClick - 添付クリック時
- attachmentAdded - 添付が追加された時
- attachmentRemoved - 添付が削除された時
- attachmentDrag - 添付ドラッグ中
- attachmentDrop - 添付ドロップ時
- typingChange - 入力状態変更時
- inputFocus / inputBlur - 入力フォーカス イベント
- inputChange - 入力値変更時
これらのイベントをリッスンし、バックエンドと同期することができます。
<igx-chat
[options]="options"
[messages]="messages"
(messageCreated)="onMessageCreated($event)">
</igx-chat>
スタイル設定
Chat コンポーネントは、外観や構造を詳細にカスタマイズできる CSS パーツとスロットを提供します。
CSS パーツ
| パーツ名 | 説明 |
|---|---|
chat-container |
メイン チャット コンテナーのスタイルを設定します。 |
header |
チャット ヘッダー コンテナーのスタイルを設定します。 |
prefix |
チャット タイトルの前の要素 (アバターなど) のスタイルを設定します。 |
title |
チャット ヘッダー タイトルのスタイルを設定します。 |
message-area-container |
メッセージと (オプションの) サジェストを保持するコンテナーのスタイルを設定します。 |
message-list |
メッセージ リスト コンテナーのスタイルを設定します。 |
message-item |
各メッセージ ラッパーのスタイルを設定します。 |
typing-indicator |
入力インジケーター コンテナーのスタイルを設定します。 |
typing-dot |
個々の入力中インジケーターのドットをスタイルします。 |
suggestions-container |
すべてのサジェストを保持するコンテナーのスタイルを設定します。 |
suggestions-header |
サジェスト ヘッダーのスタイルを設定します。 |
suggestion |
各サジェスト項目にスタイルを設定します。 |
suggestion-prefix |
サジェスト内のアイコンまたはプレフィックスのスタイルを設定します。 |
suggestion-title |
サジェストのテキスト/タイトルのスタイルを設定します。 |
empty-state |
メッセージがない場合の空の状態のコンテナーのスタイルを設定します。 |
input-area-container |
チャット入力領域のラッパーのスタイルを設定します。 |
input-container |
メイン入力コンテナーのスタイルを設定します。 |
input-attachments-container |
入力内の添付のコンテナーのスタイルを設定します。 |
input-attachment-container |
入力領域内の単一の添付にスタイルを設定します。 |
input-attachment-name |
添付のファイル名のスタイルを設定します。 |
input-attachment-icon |
添付のアイコンのスタイルを設定します。 |
text-input |
メッセージを入力するためのテキスト入力フィールドのスタイルを設定します。 |
input-actions-container |
入力アクション用のコンテナーのスタイルを設定します。 |
input-actions-start |
デフォルトのファイル アップロード後、入力の先頭にあるアクション グループをスタイル設定します。 |
input-actions-end |
入力の末尾にあるアクション グループをスタイル設定します。 |
file-upload-container |
ファイル アップロード入力用のコンテナーのスタイルを設定します。 |
file-upload |
ファイル アップロード入力自体のスタイルを設定します。 |
send-button-container |
送信ボタンの周囲のコンテナーのスタイルを設定します。 |
send-button |
送信ボタンのスタイルを設定します。 |
message-container |
単一メッセージのコンテナーをスタイルします。 |
message-list (forwarded) |
メッセージの内部リストのスタイルを設定します。 |
message-header |
メッセージのヘッダー (送信者、タイムスタンプなど) のスタイルを設定します。 |
message-content |
メッセージのテキスト コンテンツのスタイルを設定します。 |
message-attachments-container |
メッセージ添付のコンテナーのスタイルを設定します。 |
message-attachment |
単一のメッセージ添付にスタイルを設定します。 |
message-actions-container |
メッセージ アクションを保持するコンテナーのスタイルを設定します。 |
message-sent |
現在のユーザーによって送信済みとしてマークされたメッセージにスタイルを設定します。 |
attachment-header |
添付ブロックのヘッダーにスタイルを設定します。 |
attachment-content |
添付ブロックのコンテンツにスタイルを設定します。 |
attachment-icon |
添付のアイコンのスタイルを設定します。 |
file-name |
添付に表示されるファイル名のスタイルを指定します。 |
例
igc-chat::part(header) {
background: var(--ig-primary-100);
}
igc-chat::part(message-container) {
border-radius: 12px;
padding: 0.5rem;
}
igc-chat::part(empty-state) {
font-style: italic;
color: var(--ig-gray-500);
}
これにより、Chat の機能を置き換えることなく、ブランドに合わせたスタイルを適用できます。
スロット
| スロット名 | 説明 |
|---|---|
prefix |
チャット タイトルの前にコンテンツ (アバターやアイコンなど) を挿入するためのスロット。 |
title |
チャット タイトルの内容をオーバーライドするためのスロット。 |
actions |
ヘッダー アクション (ボタン、メニューなど) を挿入するためのスロット。 |
suggestions-header |
サジェスト リストのカスタム ヘッダーをレンダリングするためのスロット。 |
suggestions |
クイック リプライのサジェストのカスタム リストをレンダリングするためのスロット。 |
suggestions-actions |
追加のアクションをレンダリングするためのスロット。 |
suggestion |
単一のサジェスト項目をレンダリングするためのスロット。 |
empty-state |
メッセージがない場合に表示されるスロット。 |
これらのスロットを使用すると、ヘッダーまたは提案領域にカスタム UI を挿入できます。
<igx-chat>
<span slot="actions">
<button class="icon">⚙️</button>
</span>
</igx-chat>
ルート スタイルの採用 (adoptRootStyles)
Chat コンポーネントのオプションには、高度なスタイル設定シナリオ用の特別なフラグが含まれています。
| オプション | タイプ | デフォルト | 説明 |
|---|---|---|---|
adoptRootStyles |
boolean |
false | true の場合、コンポーネントは、Shadow DOM 内でレンダリングされるコンテンツ (カスタム レンダラーなど) がドキュメントのルートからスタイルを継承することを許可します。これは、スタイル設定のための簡単な回避策を提供しますが、本番環境での使用は推奨されません。 |
このプロパティは、カスタム レンダリングされたテンプレートにグローバル CSS を適用するときに Shadow DOM カプセル化を処理したくない場合に役立ちます。 ただし、以下のトレードオフがあります:
- ✅ 利便性: ドキュメントのグローバル スタイルがカスタム メッセージ レンダラーに適用されます。
- ⚠️ 危険: カプセル化が破られ、グローバル CSS によって内部の表示が意図せず変更される可能性があります。
- 🔒 1 回限りの設定: このオプションは初期化時にのみ設定できます。実行時に変更しても反映されません。
このプロパティに使用する前に、標準の Web Component スタイル設定アプローチを使用することを強くお勧めします。
- CSS 変数と ::part API - 公開されたパーツと変数を使用したカスタマイズを優先します。
<link>要素 – 大きなスタイルシートの場合は、Shadow DOM 内に挿入します。- インライン
<style>タグ – 小さなスコープのスタイル オーバーライド用。
API リファレンス
IgxChatComponentIgxChatOptionsIgxChatTemplatesIgxChatMessageContextDirectiveIgxChatInputContextDirectiveIgxChatAttachmentContextDirective- スタイル設定およびテーマ
その他のリソース
コミュニティに参加して新しいアイデアをご提案ください。