Save, organize, and quickly access your frequently used text snippets
No snippets found. Add your first snippet using the form!
No snippets found. Add your first snippet to get started!
Error loading snippets. Please try again later.
${error.message || 'An unknown error occurred'}
`; const container = document.querySelector('.container'); if (container) { container.prepend(errorContainer); } } }); }; // Initialize the app when DOM is loaded document.addEventListener('DOMContentLoaded', () => { try { // Initialize Firebase and app initializeApp(); // Initialize tooltips const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); tooltipTriggerList.map(function (tooltipTriggerEl) { return new bootstrap.Tooltip(tooltipTriggerEl); }); // Initialize Clipboard.js for copy buttons new ClipboardJS('.copy-btn', { text: function(trigger) { return trigger.getAttribute('data-clipboard-text'); } }).on('success', function(e) { // Show feedback const feedback = document.createElement('div'); feedback.className = 'copy-feedback'; feedback.textContent = 'Copied!'; e.trigger.appendChild(feedback); // Remove feedback after 2 seconds setTimeout(() => { feedback.remove(); }, 2000); e.clearSelection(); }); // Handle tag filter clicks const tagFilter = document.getElementById('tagFilter'); if (tagFilter) { tagFilter.addEventListener('click', (e) => { if (e.target.classList.contains('tag-badge')) { const tag = e.target.textContent; const searchInput = document.getElementById('searchInput'); if (searchInput) { searchInput.value = `#${tag}`; filterSnippets(); } } }); } // Handle search input with debounce const searchInput = document.getElementById('searchInput'); if (searchInput) { const debouncedFilter = debounce(() => { filterSnippets(); }, 300); searchInput.addEventListener('input', debouncedFilter); } console.log('Clipboard Save tool initialized successfully!'); } catch (error) { console.error('Error initializing Clipboard Save tool:', error); const errorContainer = document.createElement('div'); errorContainer.className = 'alert alert-danger'; errorContainer.innerHTML = `${error.message || 'An unknown error occurred'}
`; const container = document.querySelector('.container'); if (container) { container.prepend(errorContainer); } } }); // Load snippets from Firestore async function loadSnippets() { if (!currentUser) return; try { const querySnapshot = await db.collection('snippets') .where('userId', '==', currentUser.uid) .orderBy('updatedAt', 'desc') .get(); snippets = []; const tags = new Set(); querySnapshot.forEach(doc => { const snippet = { id: doc.id, ...doc.data() }; snippets.push(snippet); // Add tag to set if it exists if (snippet.tag) { tags.add(snippet.tag); } }); // Update tag filter updateTagFilter(Array.from(tags)); // Render snippets filterSnippets(); } catch (error) { console.error('Error loading snippets:', error); showToast('Error loading snippets. Please refresh the page.', 'error'); } } // Update snippets count function updateSnippetsCount(count) { snippetsCount.textContent = `${count} ${count === 1 ? 'snippet' : 'snippets'}`; } // Update tag filter UI function updateTagFilter(tags) { // Clear existing tags except 'All' tagFilter.innerHTML = 'No snippets found. Try adjusting your search or add a new snippet.
Last updated: ${formatDate(snippet.updatedAt?.toDate() || new Date())}