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 { membersMock } from '../../mocks/mock-signature/membersMocks';
|
||||||
import { ApiReturn, Device, Member } from '../../../pkg/sdk_client';
|
import { ApiReturn, Device, Member } from '../../../pkg/sdk_client';
|
||||||
import {
|
import {
|
||||||
|
Message,
|
||||||
DocumentSignature,
|
DocumentSignature,
|
||||||
} from '../../models/signature.models';
|
} from '../../models/signature.models';
|
||||||
import { messageStore } from '../../utils/messageMock';
|
import { messageStore } from '../../utils/messageMock';
|
||||||
@ -29,15 +29,11 @@ interface LocalNotification {
|
|||||||
time: string;
|
time: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Message {
|
interface ChatMessage {
|
||||||
content: string;
|
text: string;
|
||||||
content_type: "text" | "file";
|
timestamp: number;
|
||||||
created_at: number;
|
|
||||||
sender: string [];
|
|
||||||
recipient: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function initChat() {
|
export function initChat() {
|
||||||
const chatElement = document.createElement('chat-element');
|
const chatElement = document.createElement('chat-element');
|
||||||
const container = document.querySelector('.container');
|
const container = document.querySelector('.container');
|
||||||
@ -282,6 +278,14 @@ class ChatElement extends HTMLElement {
|
|||||||
allMembers.push({ sp_addresses: me });
|
allMembers.push({ sp_addresses: me });
|
||||||
const meAndOne = [{ sp_addresses: me }, otherMembers.pop()!];
|
const meAndOne = [{ sp_addresses: me }, otherMembers.pop()!];
|
||||||
const everyOneElse = otherMembers;
|
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 = {
|
const messagingTemplate = {
|
||||||
process_id: crypto.randomUUID(),
|
process_id: crypto.randomUUID(),
|
||||||
parent_id: null,
|
parent_id: null,
|
||||||
@ -290,7 +294,13 @@ class ChatElement extends HTMLElement {
|
|||||||
state: 'initial',
|
state: 'initial',
|
||||||
object: {
|
object: {
|
||||||
type: 'message_list',
|
type: 'message_list',
|
||||||
content: [],
|
content: [
|
||||||
|
{
|
||||||
|
text: messageContent.text,
|
||||||
|
timestamp: Date.now(),
|
||||||
|
sender: myAddresses[0]
|
||||||
|
}
|
||||||
|
],
|
||||||
content_type: {
|
content_type: {
|
||||||
allowed: ['text', 'file'],
|
allowed: ['text', 'file'],
|
||||||
default: 'text'
|
default: 'text'
|
||||||
@ -378,126 +388,47 @@ class ChatElement extends HTMLElement {
|
|||||||
|
|
||||||
// Send a messsage
|
// Send a messsage
|
||||||
private async sendMessage() {
|
private async sendMessage() {
|
||||||
|
console.log('🚀 Début sendMessage');
|
||||||
|
|
||||||
const messageInput = this.shadowRoot?.querySelector('#message-input') as HTMLInputElement;
|
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();
|
const messageText = messageInput.value.trim();
|
||||||
if (messageText === '') return;
|
if (messageText === '') {
|
||||||
|
console.log('❌ Message vide');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const myAddresses = await this.getMemberFromDevice();
|
const myAddresses = await this.getMemberFromDevice();
|
||||||
if (!myAddresses) {
|
console.log('👤 Adresses de l\'expéditeur:', myAddresses);
|
||||||
throw new Error('No paired member found');
|
|
||||||
}
|
|
||||||
|
|
||||||
const now = new Date();
|
// Vérifier si un processus de conversation existe déjà
|
||||||
const formattedTime = now.toLocaleString('fr-FR', {
|
const existingProcess = await this.getExistingConversationProcess(this.selectedMemberId!);
|
||||||
day: '2-digit',
|
console.log('🔍 Processus existant:', existingProcess);
|
||||||
month: '2-digit',
|
|
||||||
year: 'numeric',
|
|
||||||
hour: '2-digit',
|
|
||||||
minute: '2-digit'
|
|
||||||
});
|
|
||||||
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
});
|
|
||||||
|
|
||||||
|
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(
|
const result = await this.createMessagingProcess(
|
||||||
[{ sp_addresses: [this.selectedMemberId] }],
|
[{ sp_addresses: [this.selectedMemberId] }],
|
||||||
'relay_address',
|
'relay_address',
|
||||||
1
|
1
|
||||||
);
|
);
|
||||||
|
console.log('✅ Nouveau processus créé:', result);
|
||||||
|
await this.saveConversationProcessRef(this.selectedMemberId!, (result as any).id);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('✅ Message envoyé avec succès');
|
||||||
console.log('Final message process:', {
|
|
||||||
template: messageTemplate,
|
|
||||||
result: result,
|
|
||||||
timestamp: new Date().toISOString()
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
messageInput.value = '';
|
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) {
|
} 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');
|
const messageElement = document.createElement('div');
|
||||||
messageElement.className = 'message-container';
|
messageElement.className = 'message-container';
|
||||||
|
|
||||||
// Ajouter le style pour aligner les messages
|
|
||||||
if (message.sender === myAddresses[0]) {
|
if (message.sender === myAddresses[0]) {
|
||||||
messageElement.style.justifyContent = 'flex-end';
|
messageElement.style.justifyContent = 'flex-end';
|
||||||
} else {
|
} else {
|
||||||
@ -553,7 +483,6 @@ class ChatElement extends HTMLElement {
|
|||||||
<div class="message-time">${message.time}</div>
|
<div class="message-time">${message.time}</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
// Ajouter le gestionnaire de clic pour le téléchargement
|
|
||||||
const fileSpan = messageContent.querySelector('.file-message');
|
const fileSpan = messageContent.querySelector('.file-message');
|
||||||
fileSpan?.addEventListener('click', () => {
|
fileSpan?.addEventListener('click', () => {
|
||||||
const fileKey = `file_${message.id}`;
|
const fileKey = `file_${message.id}`;
|
||||||
@ -617,7 +546,6 @@ class ChatElement extends HTMLElement {
|
|||||||
memberItem.onclick = async (event) => {
|
memberItem.onclick = async (event) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
try {
|
try {
|
||||||
// S'assurer que le SDK est initialisé
|
|
||||||
if (!this.sdkClient) {
|
if (!this.sdkClient) {
|
||||||
await this.initSDKClient();
|
await this.initSDKClient();
|
||||||
}
|
}
|
||||||
@ -918,26 +846,49 @@ class ChatElement extends HTMLElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const messageTemplate = {
|
const messageTemplate = {
|
||||||
parent_id: parentProcessId,
|
process_id: parentProcessId,
|
||||||
|
parent_id: null,
|
||||||
description: 'file_message',
|
description: 'file_message',
|
||||||
message:{
|
messages: {
|
||||||
|
state: 'initial',
|
||||||
|
object: {
|
||||||
|
type: 'file',
|
||||||
content: fileData,
|
content: fileData,
|
||||||
content_type: 'file',
|
metadata: {
|
||||||
created_at: Date.now(),
|
created_at: newMessage.time,
|
||||||
sender: myAddresses,
|
last_updated: newMessage.time,
|
||||||
recipient: this.selectedMemberId
|
sender: myAddresses[0],
|
||||||
} as Message,
|
recipient: this.selectedMemberId,
|
||||||
|
fileName: file.name,
|
||||||
|
fileType: file.type
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
roles: {
|
roles: {
|
||||||
dm: {
|
public: {
|
||||||
members: [
|
members: [
|
||||||
{ sp_addresses: myAddresses },
|
{ sp_addresses: myAddresses },
|
||||||
{ sp_addresses: [this.selectedMemberId] }
|
{ sp_addresses: [this.selectedMemberId] }
|
||||||
],
|
],
|
||||||
validation_rules: [
|
validation_rules: [
|
||||||
{
|
{
|
||||||
quorum: 0.01,
|
quorum: 0.0,
|
||||||
fields: ['message'],
|
fields: ['description', 'messages'],
|
||||||
min_sig_member: 0.01,
|
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]
|
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);
|
customElements.define('chat-element', ChatElement);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user