age; html += ''; html += '

✏️ Editar Mensagem Agendada

'; html += '
'; var dateValue = new Date(msg.scheduledAt).toISOString().slice(0, 16); html += '
'; var hasAttachment = false; if (msg.attachments) { try { var attachments = JSON.parse(msg.attachments); if (attachments.length > 0) { hasAttachment = true; html += '
📎 ' + attachments[0].originalName + '
'; } } catch (e) {} } html += '
'; html += ''; } body.innerHTML = html; } window.showMainView = function() { widgetModalState.view = 'main'; renderWidgetModalContent(); }; window.showFunnelsView = function() { widgetModalState.view = 'funnels'; renderWidgetModalContent(); }; window.showSchedulingView = function() { widgetModalState.view = 'scheduling'; renderWidgetModalContent(); }; window.selectKanbanWidgetFunnel = function(funnelId) { widgetModalState.selectedFunnel = widgetModalState.funnels.find(function(f) { return f.id === funnelId; }); widgetModalState.view = 'funnelStages'; renderWidgetModalContent(); }; window.selectKanbanWidgetStage = async function(stageId) { var authHeaders = getAuthHeaders(); if (!authHeaders || !currentConversationId) return; var body = document.getElementById('cw-kanban-modal-body'); body.innerHTML = '
Salvando...
'; try { var res = await fetch(WIDGET_CONFIG.apiUrl + '/kanban/' + currentConversationId + '/move-to-stage', { method: 'PATCH', headers: Object.assign({ 'Content-Type': 'application/json' }, authHeaders), body: JSON.stringify({ stageId: stageId }) }); if (!res.ok) throw new Error('Erro ao salvar'); var stage = widgetModalState.selectedFunnel.stages.find(function(s) { return s.id === stageId; }); widgetModalState.currentStage = { stageId: stageId, stageName: stage.name, stageColor: stage.color, funnelId: widgetModalState.selectedFunnel.id, funnelName: widgetModalState.selectedFunnel.name }; updateHeaderButton(); body.innerHTML = '
✓ Conversa associada com sucesso!
'; setTimeout(function() { widgetModalState.view = 'main'; renderWidgetModalContent(); }, 1500); } catch (err) { body.innerHTML = '
' + err.message + '
'; } }; window.removeFromKanbanWidget = async function() { var authHeaders = getAuthHeaders(); if (!authHeaders || !currentConversationId) return; var body = document.getElementById('cw-kanban-modal-body'); body.innerHTML = '
Removendo...
'; try { var res = await fetch(WIDGET_CONFIG.apiUrl + '/kanban/' + currentConversationId + '/remove', { method: 'DELETE', headers: Object.assign({ 'Content-Type': 'application/json' }, authHeaders) }); if (!res.ok) throw new Error('Erro ao remover'); widgetModalState.currentStage = null; updateHeaderButton(); body.innerHTML = '
✓ Conversa removida do kanban!
'; setTimeout(function() { widgetModalState.view = 'main'; renderWidgetModalContent(); }, 1500); } catch (err) { body.innerHTML = '
' + err.message + '
'; } }; window.createScheduledMessage = async function() { var messageEl = document.getElementById('schedule-message-text'); var dateEl = document.getElementById('schedule-message-date'); var attachmentEl = document.getElementById('schedule-attachment'); if (!messageEl || !dateEl) return; var message = messageEl.value.trim(); var scheduledAt = dateEl.value; var hasAttachment = attachmentEl && attachmentEl.files && attachmentEl.files[0]; if (!message && !hasAttachment) { alert('Por favor, digite uma mensagem ou anexe um arquivo'); return; } if (!scheduledAt) { alert('Por favor, selecione data e hora'); return; } var authHeaders = getAuthHeaders(); if (!authHeaders || !currentConversationId) return; var body = document.getElementById('cw-kanban-modal-body'); body.innerHTML = '
Agendando...
'; try { var formData = new FormData(); formData.append('message', message); formData.append('scheduledAt', new Date(scheduledAt).toISOString()); if (attachmentEl && attachmentEl.files && attachmentEl.files[0]) { formData.append('attachment', attachmentEl.files[0]); } var res = await fetch(WIDGET_CONFIG.apiUrl + '/conversations/' + currentConversationId + '/scheduled-messages', { method: 'POST', headers: authHeaders, body: formData }); if (!res.ok) { var errorData = await res.json(); throw new Error(errorData.error || 'Erro ao agendar mensagem'); } var result = await res.json(); widgetModalState.scheduledMessages.push(result.data); body.innerHTML = '
✓ Mensagem agendada com sucesso!
'; setTimeout(function() { renderWidgetModalContent(); }, 1500); } catch (err) { body.innerHTML = '
' + err.message + '
'; } }; window.cancelScheduledMessage = async function(msgId) { if (!confirm('Deseja realmente cancelar esta mensagem agendada?')) return; var authHeaders = getAuthHeaders(); if (!authHeaders || !currentConversationId) return; var body = document.getElementById('cw-kanban-modal-body'); body.innerHTML = '
Cancelando...
'; try { var res = await fetch(WIDGET_CONFIG.apiUrl + '/conversations/' + currentConversationId + '/scheduled-messages/' + msgId, { method: 'DELETE', headers: Object.assign({ 'Content-Type': 'application/json' }, authHeaders) }); if (!res.ok) throw new Error('Erro ao cancelar mensagem'); widgetModalState.scheduledMessages = widgetModalState.scheduledMessages.filter(function(m) { return m.id !== msgId; }); body.innerHTML = '
✓ Mensagem cancelada!
'; setTimeout(function() { renderWidgetModalContent(); }, 1500); } catch (err) { body.innerHTML = '
' + err.message + '
'; } }; window.editScheduledMessage = function(msgId) { var msg = widgetModalState.scheduledMessages.find(function(m) { return m.id === msgId; }); if (!msg) return; widgetModalState.editingMessage = msg; widgetModalState.removeAttachmentFlag = false; widgetModalState.view = 'edit-schedule'; renderWidgetModalContent(); }; window.saveEditedMessage = async function() { var messageEl = document.getElementById('edit-message-text'); var dateEl = document.getElementById('edit-message-date'); var attachmentEl = document.getElementById('edit-attachment'); if (!messageEl || !dateEl || !widgetModalState.editingMessage) return; var message = messageEl.value.trim(); var scheduledAt = dateEl.value; var hasAttachment = (attachmentEl && attachmentEl.files && attachmentEl.files[0]) || (widgetModalState.editingMessage.attachments && !widgetModalState.removeAttachmentFlag); if (!message && !hasAttachment) { alert('Por favor, digite uma mensagem ou anexe um arquivo'); return; } if (!scheduledAt) { alert('Por favor, selecione data e hora'); return; } var authHeaders = getAuthHeaders(); if (!authHeaders || !currentConversationId) return; var body = document.getElementById('cw-kanban-modal-body'); body.innerHTML = '
Salvando...
'; try { var formData = new FormData(); formData.append('message', message); formData.append('scheduledAt', new Date(scheduledAt).toISOString()); if (attachmentEl && attachmentEl.files && attachmentEl.files[0]) { formData.append('attachment', attachmentEl.files[0]); } if (widgetModalState.removeAttachmentFlag) { formData.append('removeAttachment', 'true'); } var res = await fetch(WIDGET_CONFIG.apiUrl + '/conversations/' + currentConversationId + '/scheduled-messages/' + widgetModalState.editingMessage.id, { method: 'PATCH', headers: authHeaders, body: formData }); if (!res.ok) { var errorData = await res.json(); throw new Error(errorData.error || 'Erro ao atualizar mensagem'); } var result = await res.json(); var index = widgetModalState.scheduledMessages.findIndex(function(m) { return m.id === result.data.id; }); if (index !== -1) { widgetModalState.scheduledMessages[index] = result.data; } widgetModalState.editingMessage = null; body.innerHTML = '
✓ Mensagem atualizada com sucesso!
'; setTimeout(function() { widgetModalState.view = 'scheduling'; renderWidgetModalContent(); }, 1500); } catch (err) { body.innerHTML = '
' + err.message + '
'; } }; window.removeAttachment = function() { if (!confirm('Deseja realmente remover o anexo?')) return; widgetModalState.removeAttachmentFlag = true; widgetModalState.editingMessage.attachments = null; renderWidgetModalContent(); }; function updateHeaderButton() { var btn = document.getElementById('cw-kanban-header-btn'); if (!btn) return; if (widgetModalState.currentStage) { btn.classList.add('has-stage'); btn.title = 'Kanban: ' + widgetModalState.currentStage.stageName; } else { btn.classList.remove('has-stage'); btn.title = 'Configurações do Kanban'; } } async function checkCurrentStageWidget() { var authHeaders = getAuthHeaders(); if (!authHeaders || !currentConversationId) return; try { var res = await fetch(WIDGET_CONFIG.apiUrl + '/kanban/conversation/' + currentConversationId + '/stage', { headers: Object.assign({ 'Content-Type': 'application/json' }, authHeaders) }); if (res.ok) { var data = await res.json(); widgetModalState.currentStage = data.data; updateHeaderButton(); } } catch (err) { // Ignore } } function checkConversationPageWidget() { var convId = getConversationIdFromUrl(); if (convId) { currentConversationId = convId; var attempts = 0; var maxAttempts = 30; function tryAddButton() { if (createHeaderButton()) { checkCurrentStageWidget(); } else { attempts++; if (attempts < maxAttempts) { setTimeout(tryAddButton, 500); } } } setTimeout(tryAddButton, 500); } else { currentConversationId = null; widgetModalState.currentStage = null; var btn = document.getElementById('cw-kanban-header-btn'); if (btn) btn.remove(); } } function setupWidgetNavigationDetection() { var widgetLastUrl = location.href; function onWidgetUrlChange() { if (location.href !== widgetLastUrl) { widgetLastUrl = location.href; checkConversationPageWidget(); } } window.addEventListener('popstate', onWidgetUrlChange); setInterval(function() { if (location.href !== widgetLastUrl) { onWidgetUrlChange(); } }, 500); } function initWidget() { injectWidgetCSS(); createWidgetModal(); setupWidgetNavigationDetection(); checkConversationPageWidget(); console.log('[Kanban Widget] Inicializado'); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initWidget); } else { setTimeout(initWidget, 100); } })();