send_message_child-ok_template-ko
This commit is contained in:
parent
507265dc8f
commit
93595e7fc2
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user