imaginar/views/chatPartial.ejs
2024-10-19 20:24:54 +09:00

100 lines
3.7 KiB
Plaintext

<head>
<link rel="stylesheet" href="/styles/chat.css">
</head>
<div class="chat-container">
<div id="chat-window" class="chat-window">
<% messages.forEach(function(message) { %>
<div class="message <%= message.role === 'user' ? 'user-message' : 'isotope-message' %>">
<div class="message-author">
<% if (message.role === 'user') { %>
<span class="message-timestamp"><%= formatTimestamp(message.createdAt) %></span>
<strong>あなた</strong>
<% } else { %>
<strong><%= isotope.name %></strong>
<span class="message-timestamp"><%= formatTimestamp(message.createdAt) %></span>
<% } %>
</div>
<div class="message-content">
<p><%= message.message %></p>
</div>
</div>
<% }); %>
</div>
<div class="chat-input-container">
<form id="chat-form" class="chat-form">
<input type="text" id="message-input" class="chat-input" placeholder="メッセージを入力" required>
<button type="submit" class="chat-submit-btn">送信</button>
</form>
</div>
</div>
<script>
const chatWindow = document.getElementById('chat-window');
const chatForm = document.getElementById('chat-form');
const messageInput = document.getElementById('message-input');
// ページ初期化完了時にチャットウィンドウを最下部にスクロール
window.onload = function() {
chatWindow.scrollTop = chatWindow.scrollHeight;
};
// サーバーから渡されたJWTトークン
const token = '<%= token %>';
// WebSocketサーバーのURL
const wsServerUrl = '<%= process.env.WS_SERVER_URL %>';
// WebSocket接続時にトークンをクエリパラメータに含める
const ws = new WebSocket(`${wsServerUrl}?token=${token}`);
ws.onopen = function() {
console.log('WebSocket connection established');
};
ws.onmessage = function(event) {
const data = JSON.parse(event.data);
// BOTのメッセージを表示
if (data.isotopeReply) {
const isotopeMessage = document.createElement('div');
const isotopeName = '<%= isotope.name %>';
isotopeMessage.classList.add('message', 'isotope-message');
isotopeMessage.innerHTML = `
<div class="message-author">
<strong>${isotopeName}</strong>
<span class="message-timestamp">${new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}</span>
</div>
<div class="message-content"><p>${data.isotopeReply}</p></div>`;
chatWindow.appendChild(isotopeMessage);
chatWindow.scrollTop = chatWindow.scrollHeight; // スクロールを最下部に
}
};
// フォーム送信イベントのリスナーを追加
chatForm.addEventListener('submit', function(event) {
event.preventDefault();
const message = messageInput.value;
// メッセージを即時にチャットウィンドウに追加
const userMessage = document.createElement('div');
userMessage.classList.add('message', 'user-message');
userMessage.innerHTML = `
<div class="message-author">
<span class="message-timestamp">${new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}</span>
<strong>あなた</strong>
</div>
<div class="message-content"><p>${message}</p></div>`;
chatWindow.appendChild(userMessage);
chatWindow.scrollTop = chatWindow.scrollHeight; // スクロールを最下部に
// WebSocketを通じてメッセージを送信
const isotopeId = '<%= isotope.id %>';
ws.send(JSON.stringify({ userMessage: message, isotopeId: isotopeId }));
// 入力フィールドをクリア
messageInput.value = '';
});
</script>