diff --git a/src/sidebar/snippets-panel.js b/src/sidebar/snippets-panel.js new file mode 100644 index 0000000..8232527 --- /dev/null +++ b/src/sidebar/snippets-panel.js @@ -0,0 +1,71 @@ +function renderSnippetsPanel(container, { getSnippets, saveSnippet, deleteSnippet, onInsert }) { + container.innerHTML = ` +
+
+ + +
+
+
+ `; + + let snippets = []; + + async function loadSnippets() { + snippets = await getSnippets() || []; + renderList(document.getElementById('snippets-search')?.value || ''); + } + + function renderList(query) { + const list = document.getElementById('snippets-list'); + if (!list) return; + + const filtered = query + ? snippets.filter(s => s.name.toLowerCase().includes(query.toLowerCase()) || (s.language || '').toLowerCase().includes(query.toLowerCase())) + : snippets; + + list.innerHTML = filtered.length ? filtered.map(s => ` +
+
+ ${s.name} + ${s.language || 'text'} +
+
${(s.code || '').substring(0, 100)}${(s.code || '').length > 100 ? '...' : ''}
+
+ + +
+
+ `).join('') : '

No snippets yet. Click + to add one.

'; + + list.querySelectorAll('.snippet-insert').forEach(btn => { + btn.addEventListener('click', () => { + const s = snippets.find(sn => sn.id === btn.dataset.id); + if (s) onInsert(s.code); + }); + }); + + list.querySelectorAll('.snippet-delete').forEach(btn => { + btn.addEventListener('click', async () => { + await deleteSnippet(btn.dataset.id); + loadSnippets(); + }); + }); + } + + document.getElementById('snippets-search')?.addEventListener('input', (e) => renderList(e.target.value)); + + document.getElementById('snippets-add')?.addEventListener('click', () => { + const name = prompt('Snippet name:'); + if (!name) return; + const language = prompt('Language (e.g., javascript, python, html):') || 'text'; + const code = prompt('Paste your code snippet:'); + if (!code) return; + + saveSnippet({ id: Date.now().toString(), name, language, code }).then(() => loadSnippets()); + }); + + loadSnippets(); +} + +module.exports = { renderSnippetsPanel };