diff --git a/static/app.js b/static/app.js deleted file mode 100644 index 835bc78..0000000 --- a/static/app.js +++ /dev/null @@ -1,138 +0,0 @@ -let currentQuery = 'tag:inbox'; -let isLoading = false; - -async function api(endpoint) { - console.log('API call:', endpoint); - const res = await fetch(`/api/${endpoint}`); - console.log('Response status:', res.status); - if (!res.ok) { - const text = await res.text(); - console.error('API error response:', text); - throw new Error(`API error: ${res.status}`); - } - const data = await res.json(); - console.log('API response:', data); - return data; -} - -function setStatus(state) { - const status = document.getElementById('status'); - status.className = state === 'loading' ? 'status-loading' : state === 'ok' ? 'status-ok' : 'status-error'; -} - -function setLoading(loading) { - isLoading = loading; - const btn = document.querySelector('.search-bar button'); - btn.disabled = loading; - btn.textContent = loading ? 'Loading...' : 'Search'; -} - -async function search() { - if (isLoading) return; - const query = document.getElementById('search').value; - currentQuery = query; - history.pushState({ query }, '', `/?q=${encodeURIComponent(query)}`); - await loadThreads(query); -} - -async function loadThreads(query) { - setLoading(true); - setStatus('loading'); - const list = document.getElementById('thread-list'); - - try { - const threads = await api(`query/${encodeURIComponent(query)}`); - if (!threads || threads.length === 0) { - list.innerHTML = '
No threads found
'; - } else { - list.innerHTML = threads.map(t => ` -
-
${escapeHtml(t.subject)}
-
${escapeHtml(t.authors)}
-
${new Date(t.newest_date * 1000).toLocaleString()}
-
- `).join(''); - } - setStatus('ok'); - } catch (e) { - console.error('Error in loadThreads:', e); - list.innerHTML = `
Error loading threads: ${escapeHtml(e.message)}
`; - setStatus('error'); - } finally { - setLoading(false); - } -} - -async function loadThread(threadId) { - setStatus('loading'); - const view = document.getElementById('message-view'); - view.innerHTML = '
Loading messages...
'; - - try { - const messages = await api(`thread/${threadId}`); - view.innerHTML = messages.map(m => ` -
-
- From: ${escapeHtml(m.from || '')}
- To: ${escapeHtml(m.to || '')}
- Date: ${escapeHtml(m.date || '')}
- Subject: ${escapeHtml(m.subject || '')} -
- -
-
- `).join(''); - setStatus('ok'); - } catch (e) { - console.error('Error in loadThread:', e); - view.innerHTML = `
Error loading thread: ${escapeHtml(e.message)}
`; - setStatus('error'); - } -} - -async function loadMessageContent(messageId) { - setStatus('loading'); - const div = document.getElementById(`msg-${messageId}`); - div.innerHTML = '
Loading content...
'; - - try { - const msg = await api(`message/${messageId}`); - div.innerHTML = ` -
${escapeHtml(msg.content_type)}
-
${msg.content_type === 'text/html' ? msg.content : `
${escapeHtml(msg.content)}
`}
- ${msg.attachments.length ? `
Attachments: ${msg.attachments.map(a => escapeHtml(a.filename)).join(', ')}
` : ''} - `; - setStatus('ok'); - } catch (e) { - console.error('Error in loadMessageContent:', e); - div.innerHTML = `
Error loading message: ${escapeHtml(e.message)}
`; - setStatus('error'); - } -} - -function escapeHtml(text) { - const div = document.createElement('div'); - div.textContent = text; - return div.innerHTML; -} - -// Initialize -window.addEventListener('DOMContentLoaded', () => { - console.log('App initialized'); - const params = new URLSearchParams(location.search); - const query = params.get('q') || 'tag:inbox'; - document.getElementById('search').value = query; - loadThreads(query); - - // Allow Enter key to search - document.getElementById('search').addEventListener('keypress', (e) => { - if (e.key === 'Enter') search(); - }); -}); - -window.addEventListener('popstate', (e) => { - if (e.state?.query) { - document.getElementById('search').value = e.state.query; - loadThreads(e.state.query); - } -}); diff --git a/static/style.css b/static/style.css deleted file mode 100644 index 509cc31..0000000 --- a/static/style.css +++ /dev/null @@ -1,154 +0,0 @@ -* { - box-sizing: border-box; - margin: 0; - padding: 0; -} - -body { - font-family: system-ui, -apple-system, sans-serif; - line-height: 1.5; - background: #1e1e1e; - color: #e0e0e0; -} - -header { - display: flex; - justify-content: space-between; - align-items: center; - padding: 1rem; - border-bottom: 1px solid #333; - background: #252525; -} - -h1 { - font-size: 1.5rem; -} - -.status-ok { color: #0f0; } -.status-error { color: #f00; } -.status-loading { color: #ff0; } - -.search-bar { - padding: 1rem; - border-bottom: 1px solid #333; - background: #252525; -} - -#search { - width: 70%; - padding: 0.5rem; - border: 1px solid #444; - border-radius: 4px; - background: #2a2a2a; - color: #e0e0e0; -} - -button { - padding: 0.5rem 1rem; - background: #0066cc; - color: white; - border: none; - border-radius: 4px; - cursor: pointer; -} - -button:hover { - background: #0052a3; -} - -button:disabled { - background: #444; - cursor: not-allowed; -} - -.container { - display: flex; - height: calc(100vh - 140px); -} - -.thread-list { - width: 40%; - overflow-y: auto; - border-right: 1px solid #333; -} - -.thread { - padding: 1rem; - border-bottom: 1px solid #2a2a2a; - cursor: pointer; -} - -.thread:hover { - background: #2a2a2a; -} - -.thread-subject { - font-weight: bold; - margin-bottom: 0.25rem; -} - -.thread-authors { - color: #999; - font-size: 0.9rem; -} - -.thread-date { - color: #666; - font-size: 0.85rem; -} - -.message-view { - width: 60%; - overflow-y: auto; - padding: 1rem; -} - -.message { - margin-bottom: 2rem; - padding: 1rem; - border: 1px solid #333; - border-radius: 4px; - background: #252525; -} - -.message-header { - margin-bottom: 1rem; - padding-bottom: 1rem; - border-bottom: 1px solid #333; -} - -.message-content { - margin-top: 1rem; -} - -.content { - padding: 1rem; - background: #2a2a2a; - border-radius: 4px; -} - -.content pre { - white-space: pre-wrap; - word-wrap: break-word; -} - -.attachments { - margin-top: 1rem; - padding: 0.5rem; - background: #3a3a00; - border-radius: 4px; -} - -.loading { - padding: 1rem; - text-align: center; - color: #999; -} - -.error { - padding: 1rem; - background: #3a0000; - border: 1px solid #600; - border-radius: 4px; - margin: 1rem; -}