// Import benodigde componenten import { DynamicForm } from './DynamicForm.js'; import { ProgressTracker } from './ProgressTracker.js'; // CSS en Material Icons worden nu geladen via de hoofdbundel en scripts.html // We hoeven hier niets dynamisch te laden export const ChatMessage = { name: 'ChatMessage', components: { 'dynamic-form': DynamicForm, 'progress-tracker': ProgressTracker }, props: { message: { type: Object, required: true, validator: (message) => { return message.id && message.content !== undefined && message.sender && message.type; } }, isSubmittingForm: { type: Boolean, default: false }, apiPrefix: { type: String, default: '' } }, created() { // Zorg ervoor dat het icoon geladen wordt als iconManager beschikbaar is if (window.iconManager && this.message.formData && this.message.formData.icon) { window.iconManager.loadIcon(this.message.formData.icon); } // Sla de originele inhoud op voor het eerste bericht als we in een conversatie zitten met slechts één bericht if (this.message.sender === 'ai' && !this.message.originalContent) { this.message.originalContent = this.message.content; } }, watch: { 'message.formData.icon': { handler(newIcon) { if (newIcon && window.iconManager) { window.iconManager.loadIcon(newIcon); } }, immediate: true } }, emits: ['image-loaded', 'retry-message', 'specialist-complete', 'specialist-error'], data() { return { formVisible: true }; }, mounted() { // Luister naar taalwijzigingen document.addEventListener('language-changed', this.handleLanguageChange); }, beforeUnmount() { // Verwijder event listener bij verwijderen component document.removeEventListener('language-changed', this.handleLanguageChange); }, computed: { hasFormData() { return this.message.formData && ((Array.isArray(this.message.formData.fields) && this.message.formData.fields.length > 0) || (typeof this.message.formData.fields === 'object' && Object.keys(this.message.formData.fields).length > 0)); }, hasFormValues() { return this.message.formValues && Object.keys(this.message.formValues).length > 0; } }, methods: { async handleLanguageChange(event) { // Controleer of dit het eerste bericht is in een gesprek met maar één bericht // Dit wordt al afgehandeld door MessageHistory component, dus we hoeven hier niets te doen // De implementatie hiervan blijft in MessageHistory om dubbele vertaling te voorkomen }, handleSpecialistError(eventData) { console.log('ChatMessage received specialist-error event:', eventData); // Creëer een error message met correcte styling this.message.type = 'error'; this.message.content = eventData.message || 'Er is een fout opgetreden bij het verwerken van uw verzoek.'; this.message.retryable = true; this.message.error = true; // Voeg error flag toe voor styling // Bubble up naar parent component voor verdere afhandeling this.$emit('specialist-error', { messageId: this.message.id, ...eventData }); }, handleSpecialistComplete(eventData) { console.log('ChatMessage received specialist-complete event:', eventData); // Update de inhoud van het bericht met het antwoord if (eventData.answer) { console.log('Updating message content with answer:', eventData.answer); this.message.content = eventData.answer; } else { console.error('No answer in specialist-complete event data'); } // Bubble up naar parent component voor eventuele verdere afhandeling this.$emit('specialist-complete', { messageId: this.message.id, answer: eventData.answer, form_request: eventData.form_request, // Wordt nu door ChatApp verwerkt result: eventData.result, interactionId: eventData.interactionId, taskId: eventData.taskId }); }, formatMessage(content) { if (!content) return ''; // Enhanced markdown-like formatting return content .replace(/\*\*(.*?)\*\*/g, '$1') .replace(/\*(.*?)\*/g, '$1') .replace(/`(.*?)`/g, '$1') .replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1') .replace(/\n/g, '
'); }, removeMessage() { // Dit zou een event moeten triggeren naar de parent component }, reactToMessage(emoji) { // Implementatie van reacties zou hier komen }, getMessageClass() { return `message ${this.message.sender}`; } }, template: `
{{ reaction.emoji }} {{ reaction.count }}
` };