diff --git a/src/pages/chat/chat.ts b/src/pages/chat/chat.ts index ec61ac9..f57483a 100755 --- a/src/pages/chat/chat.ts +++ b/src/pages/chat/chat.ts @@ -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 {
`; - // 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);