import { renderHeader } from '../components/header.js';
import { directMessages } from '../mock-data.js';
import { addAppLogEntry, addChatMessage, getChatMessages, authService, state } from '../state.js';
import { startOutgoingCall, hangupActiveCall } from '../services/call-service.js';
export const pageMeta = { id: 'chat-view', title: 'Чат' };
function renderLog(list, chatId) {
list.innerHTML = '';
const messages = getChatMessages(chatId);
messages.forEach((msg) => {
const bubble = document.createElement('div');
bubble.className = `bubble ${msg.from}`;
bubble.textContent = msg.text;
list.append(bubble);
});
list.scrollTop = list.scrollHeight;
}
export function render({ navigate, route }) {
const chatId = route.params.chatId || 'u1';
const contact = directMessages.find((d) => d.id === chatId) || {
id: chatId,
name: chatId,
initials: (chatId[0] || '?').toUpperCase(),
};
const screen = document.createElement('section');
screen.className = 'stack';
screen.append(
renderHeader({
title: `Чат: ${contact.name}`,
leftAction: { label: '←', onClick: () => navigate('messages-list') },
rightActions: [{
label: 'Позвонить',
onClick: async () => {
const confirmed = window.confirm('Позвонить этому пользователю?');
if (!confirmed) return;
try {
await startOutgoingCall(chatId);
renderLog(log, chatId);
} catch (e) {
addChatMessage(chatId, `[call] Ошибка звонка: ${e.message || 'unknown'}`);
renderLog(log, chatId);
}
},
}, {
label: 'Сброс',
onClick: async () => {
try {
await hangupActiveCall();
renderLog(log, chatId);
} catch (e) {
addChatMessage(chatId, `[call] Ошибка сброса: ${e.message || 'unknown'}`);
renderLog(log, chatId);
}
},
}],
})
);
const wrap = document.createElement('div');
wrap.className = 'chat-wrap';
const log = document.createElement('div');
log.className = 'messages-log';
const form = document.createElement('form');
form.className = 'chat-input';
form.innerHTML = `
`;
form.addEventListener('submit', async (event) => {
event.preventDefault();
const input = form.elements.message;
const text = input.value.trim();
if (!text) return;
addChatMessage(chatId, text);
input.value = '';
renderLog(log, chatId);
try {
const result = await authService.sendDirectMessage({
login: state.session.login,
toLogin: chatId,
text,
storagePwd: state.session.storagePwdInMemory,
});
addAppLogEntry({
level: 'info',
source: 'outgoing-dm',
message: `Сообщение отправлено для ${chatId}`,
details: {
toLogin: chatId,
messageId: result?.messageId || '',
deliveredWsSessions: Number(result?.deliveredWsSessions || 0),
deliveredWebPushSessions: Number(result?.deliveredWebPushSessions || 0),
sessionNotFound: Boolean(result?.sessionNotFound),
},
});
} catch (e) {
addChatMessage(chatId, `Ошибка отправки: ${e.message || 'unknown'}`);
addAppLogEntry({
level: 'warn',
source: 'outgoing-dm',
message: 'Ошибка отправки личного сообщения',
details: {
toLogin: chatId,
error: e?.message || 'unknown',
},
});
renderLog(log, chatId);
}
});
renderLog(log, chatId);
wrap.append(log, form);
screen.append(wrap);
return screen;
}