This app works best with JavaScript enabled.
age;
html += '← Voltar ';
html += '✏️ Editar Mensagem Agendada
';
html += 'Mensagem
';
var dateValue = new Date(msg.scheduledAt).toISOString().slice(0, 16);
html += 'Data e Hora
';
var hasAttachment = false;
if (msg.attachments) {
try {
var attachments = JSON.parse(msg.attachments);
if (attachments.length > 0) {
hasAttachment = true;
html += '';
}
} catch (e) {}
}
html += '' + (hasAttachment ? 'Substituir Anexo' : 'Adicionar Anexo') + ' (opcional)
';
html += 'Salvar Alterações ';
}
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 = '';
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 = '';
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 = '';
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 + '
Voltar ';
}
};
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 = '';
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 + '
Voltar ';
}
};
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 = '';
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 + '
Voltar ';
}
};
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);
}
})();