// LLM Prompts Plugin for SnappyMail
// Provides UI and API interaction for AI-driven email writing prompts
(function () {
'use strict';
// Initialize plugin when DOM is ready
document.addEventListener('DOMContentLoaded', function () {
if (typeof rl !== 'undefined') {
rl.addSettingsViewModel(
'LLMPromptsSettings',
'LLMPromptsSettings',
'LLM Prompts',
'Settings for AI-driven email writing prompts powered by Grok 3',
true
);
// Add UI for Smart Prompts in compose window
rl.addHook('view-model', function (vm) {
if (vm.viewModelName === 'ComposeViewModel') {
initComposeUI(vm);
}
});
}
});
function initComposeUI(composeVM) {
// Add Smart Prompts button or sidebar to compose window
const toolbar = document.querySelector('.compose-toolbar');
if (toolbar) {
const smartPromptsButton = document.createElement('button');
smartPromptsButton.className = 'button smart-prompts';
smartPromptsButton.innerHTML = 'Smart Prompts';
smartPromptsButton.onclick = function () {
toggleSmartPromptsSidebar(composeVM);
};
toolbar.appendChild(smartPromptsButton);
}
}
function toggleSmartPromptsSidebar(composeVM) {
// Toggle visibility of prompts sidebar
let sidebar = document.querySelector('.smart-prompts-sidebar');
if (!sidebar) {
sidebar = document.createElement('div');
sidebar.className = 'smart-prompts-sidebar';
sidebar.innerHTML = getPromptsHTML();
document.querySelector('.compose-box').appendChild(sidebar);
// Add event listeners for prompt selection
setupPrompts(sidebar, composeVM);
} else {
sidebar.style.display = sidebar.style.display === 'none' ? 'block' : 'none';
}
}
function getPromptsHTML() {
// HTML for prompt categories and suggestions
return `
Smart Prompts (Grok 3)
Professional
- Follow-up Email
- Proposal Email
`;
}
function setupPrompts(sidebar, composeVM) {
const prompts = sidebar.querySelectorAll('.prompt-category li');
prompts.forEach(prompt => {
prompt.onclick = function () {
const promptText = this.getAttribute('data-prompt');
sidebar.querySelector('.context-input textarea').value = promptText;
// Highlight selected prompt
prompts.forEach(p => p.classList.remove('selected'));
this.classList.add('selected');
};
});
}
function generateDraft(button) {
const sidebar = button.closest('.smart-prompts-sidebar');
const prompt = sidebar.querySelector('.context-input textarea').value;
const subject = document.querySelector('.compose-subject input').value;
const body = document.querySelector('.compose-body .editor').innerText;
// Make API call to Grok 3 or configured LLM
fetchLLMDraft(prompt, subject, body).then(draft => {
if (draft) {
// Insert draft into compose body
const editor = document.querySelector('.compose-body .editor');
editor.innerHTML = draft.replace(/\n/g, '
');
}
}).catch(error => {
console.error('Error generating draft:', error);
alert('Failed to generate draft. Please check settings.');
});
}
async function fetchLLMDraft(prompt, subject, body) {
// This would make an API call to the backend which handles Grok 3 API interaction
// For now, simulate an API call
const response = await fetch('/?/Api/LLMPrompts/GenerateDraft', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
prompt: prompt,
subject: subject,
body: body,
enableContextAnalysis: rl.settingsGet('LLMPromptsSettings.enable_context_analysis')
})
});
if (!response.ok) {
throw new Error('Network response was not ok');
}
const data = await response.json();
return data.result;
}
})();