send_message_child-ok_template-ko

This commit is contained in:
Pascal 2025-01-13 10:02:24 +01:00
parent 507265dc8f
commit 93595e7fc2

View File

@ -11,7 +11,7 @@ import { messagesMock as initialMessagesMock, messagesMock } from '../../mocks/m
import { membersMock } from '../../mocks/mock-signature/membersMocks';
import { ApiReturn, Device, Member } from '../../../pkg/sdk_client';
import {
Message,
DocumentSignature,
} from '../../models/signature.models';
import { messageStore } from '../../utils/messageMock';
@ -29,15 +29,11 @@ interface LocalNotification {
time: string;
}
interface Message {
content: string;
content_type: "text" | "file";
created_at: number;
sender: string [];
recipient: string;
interface ChatMessage {
text: string;
timestamp: number;
}
export function initChat() {
const chatElement = document.createElement('chat-element');
const container = document.querySelector('.container');
@ -282,6 +278,14 @@ class ChatElement extends HTMLElement {
allMembers.push({ sp_addresses: me });
const meAndOne = [{ sp_addresses: me }, otherMembers.pop()!];
const everyOneElse = otherMembers;
const myAddresses = await this.getMemberFromDevice();
if (!myAddresses) {
throw new Error('No paired member found');
}
const messageContent = {
text: '',
timestamp: Date.now()
};
const messagingTemplate = {
process_id: crypto.randomUUID(),
parent_id: null,
@ -290,7 +294,13 @@ class ChatElement extends HTMLElement {
state: 'initial',
object: {
type: 'message_list',
content: [],
content: [
{
text: messageContent.text,
timestamp: Date.now(),
sender: myAddresses[0]
}
],
content_type: {
allowed: ['text', 'file'],
default: 'text'
@ -378,126 +388,47 @@ class ChatElement extends HTMLElement {
// Send a messsage
private async sendMessage() {
console.log('🚀 Début sendMessage');
const messageInput = this.shadowRoot?.querySelector('#message-input') as HTMLInputElement;
if (!messageInput || !this.selectedMemberId) return;
if (!messageInput || !this.selectedMemberId) {
console.log('❌ Message input ou selectedMemberId manquant');
return;
}
const messageText = messageInput.value.trim();
if (messageText === '') return;
if (messageText === '') {
console.log('❌ Message vide');
return;
}
try {
const myAddresses = await this.getMemberFromDevice();
if (!myAddresses) {
throw new Error('No paired member found');
}
console.log('👤 Adresses de l\'expéditeur:', myAddresses);
const now = new Date();
const formattedTime = now.toLocaleString('fr-FR', {
day: '2-digit',
month: '2-digit',
year: 'numeric',
hour: '2-digit',
minute: '2-digit'
});
// Vérifier si un processus de conversation existe déjà
const existingProcess = await this.getExistingConversationProcess(this.selectedMemberId!);
console.log('🔍 Processus existant:', existingProcess);
const newMessage = {
id: Date.now(),
sender: myAddresses[0],
text: messageText,
time: formattedTime,
type: 'text',
class: 'message user'
};
if (this.selectedMemberId) {
messageStore.addMessage(this.selectedMemberId!, newMessage);
this.messagesMock = messageStore.getMessages();
if (existingProcess) {
console.log('📝 Mise à jour du processus existant');
await this.updateProcessWithNewMessage(existingProcess.process_id, messageText);
} else {
console.log('🆕 Création d\'un nouveau processus');
const result = await this.createMessagingProcess(
[{ sp_addresses: [this.selectedMemberId] }],
'relay_address',
1
);
console.log('✅ Nouveau processus créé:', result);
await this.saveConversationProcessRef(this.selectedMemberId!, (result as any).id);
}
// Récupérer le process_id du parent (conversation)
const groupItem = this.shadowRoot?.querySelector('[data-process-id]');
const parentProcessId = groupItem?.getAttribute('data-process-id');
if (!parentProcessId) {
throw new Error('Parent process ID not found');
}
const messageTemplate = {
process_id: parentProcessId,
description: 'message',
message:{
content: "Hello",
content_type: 'file',
created_at: Date.now(),
sender: myAddresses,
recipient: this.selectedMemberId
} as Message,
roles: {
public: {
members: [
{ sp_addresses: myAddresses },
{ sp_addresses: [this.selectedMemberId] }
],
validation_rules: [
{
quorum: 0.0,
fields: ['description', 'messages'],
min_sig_member: 0.0,
},
],
storages: [storageUrl]
},
owner: {
members: [
{ sp_addresses: myAddresses },
{ sp_addresses: [this.selectedMemberId] }
],
validation_rules: [
{
quorum: 1.0,
fields: ['description', 'messages'],
min_sig_member: 1.0,
},
],
storages: [storageUrl]
}
}
};
console.log('Message template:', {
timestamp: formattedTime,
template: messageTemplate
});
const result = await this.createMessagingProcess(
[{ sp_addresses: [this.selectedMemberId] }],
'relay_address',
1
);
console.log('Final message process:', {
template: messageTemplate,
result: result,
timestamp: new Date().toISOString()
});
console.log('✅ Message envoyé avec succès');
messageInput.value = '';
this.loadMemberChat(this.selectedMemberId);
setTimeout(() => {
const autoReply = this.generateAutoReply(this.selectedMemberId!);
messageStore.addMessage(this.selectedMemberId!, autoReply);
this.messagesMock = messageStore.getMessages();
this.loadMemberChat(this.selectedMemberId!);
this.addNotification(this.selectedMemberId!, autoReply);
}, 1000);
} catch (error) {
console.error('Error sending message:', error);
console.error('❌ Erreur lors de l\'envoi du message:', error);
}
}
@ -532,7 +463,6 @@ class ChatElement extends HTMLElement {
const messageElement = document.createElement('div');
messageElement.className = 'message-container';
// Ajouter le style pour aligner les messages
if (message.sender === myAddresses[0]) {
messageElement.style.justifyContent = 'flex-end';
} else {
@ -553,7 +483,6 @@ class ChatElement extends HTMLElement {
<div class="message-time">${message.time}</div>
`;
// Ajouter le gestionnaire de clic pour le téléchargement
const fileSpan = messageContent.querySelector('.file-message');
fileSpan?.addEventListener('click', () => {
const fileKey = `file_${message.id}`;
@ -617,7 +546,6 @@ class ChatElement extends HTMLElement {
memberItem.onclick = async (event) => {
event.stopPropagation();
try {
// S'assurer que le SDK est initialisé
if (!this.sdkClient) {
await this.initSDKClient();
}
@ -918,26 +846,49 @@ class ChatElement extends HTMLElement {
}
const messageTemplate = {
parent_id: parentProcessId,
process_id: parentProcessId,
parent_id: null,
description: 'file_message',
message:{
messages: {
state: 'initial',
object: {
type: 'file',
content: fileData,
content_type: 'file',
created_at: Date.now(),
sender: myAddresses,
recipient: this.selectedMemberId
} as Message,
metadata: {
created_at: newMessage.time,
last_updated: newMessage.time,
sender: myAddresses[0],
recipient: this.selectedMemberId,
fileName: file.name,
fileType: file.type
}
}
},
roles: {
dm: {
public: {
members: [
{ sp_addresses: myAddresses },
{ sp_addresses: [this.selectedMemberId] }
],
validation_rules: [
{
quorum: 0.01,
fields: ['message'],
min_sig_member: 0.01,
quorum: 0.0,
fields: ['description', 'messages'],
min_sig_member: 0.0,
},
],
storages: [storageUrl]
},
owner: {
members: [
{ sp_addresses: myAddresses },
{ sp_addresses: [this.selectedMemberId] }
],
validation_rules: [
{
quorum: 1.0,
fields: ['description', 'messages'],
min_sig_member: 1.0,
},
],
storages: [storageUrl]
@ -1122,6 +1073,74 @@ class ChatElement extends HTMLElement {
});
});
}
private async getExistingConversationProcess(memberId: string) {
const db = await Database.getInstance();
try {
const processStore = 'processes';
const conversations = [];
let i = 0;
let process;
do {
process = await db.getObject(processStore, i.toString());
if (process) {
conversations.push(process);
}
i++;
} while (process);
return conversations.find(process =>
process.description === 'messaging' &&
process.roles.owner.members.some((m: any) =>
m.sp_addresses.includes(memberId)
)
);
} catch (error) {
console.error('Error getting conversation process:', error);
return null;
}
}
private async updateProcessWithNewMessage(processId: string, messageText: string) {
const db = await Database.getInstance();
try {
const process = await db.getObject('processes', processId);
if (process) {
const myAddresses = await this.getMemberFromDevice();
process.messages.object.content.push({
text: messageText,
timestamp: Date.now(),
sender: myAddresses?.[0]
});
await db.addObject({
storeName: 'processes',
key: processId,
object: process
});
}
} catch (error) {
console.error('Error updating process with new message:', error);
}
}
private async saveConversationProcessRef(memberId: string, processId: string) {
const db = await Database.getInstance();
try {
await db.addObject({
storeName: 'conversation_refs',
key: memberId,
object: {
memberId,
processId,
timestamp: Date.now()
}
});
} catch (error) {
console.error('Error saving conversation reference:', error);
}
}
}
customElements.define('chat-element', ChatElement);