93 lines
4.1 KiB
JavaScript
93 lines
4.1 KiB
JavaScript
document.addEventListener('DOMContentLoaded', () => {
|
|
const main = document.getElementById('main');
|
|
const syncStatus = document.getElementById('syncStatus');
|
|
const countBadge = document.getElementById('countBadge');
|
|
async function load() {
|
|
try {
|
|
const res = await chrome.runtime.sendMessage({ type: 'getReviewTasks' });
|
|
if (res.error) {
|
|
syncStatus.textContent = '';
|
|
renderError(res.error);
|
|
return;
|
|
}
|
|
const review = res.review || [];
|
|
const total = res.total || 0;
|
|
const autoArchiveCount = res.autoArchiveCount || 0;
|
|
syncStatus.textContent = `${total} total tasks synced`;
|
|
if (review.length === 0) {
|
|
countBadge.style.display = 'none';
|
|
renderEmpty();
|
|
}
|
|
else {
|
|
countBadge.textContent = String(review.length);
|
|
countBadge.style.display = 'inline-block';
|
|
renderStats(review, autoArchiveCount);
|
|
}
|
|
}
|
|
catch (e) {
|
|
syncStatus.textContent = '';
|
|
renderError(e.message);
|
|
}
|
|
}
|
|
function renderEmpty() {
|
|
main.innerHTML = `
|
|
<div class="empty">No decayed tasks found. Great job keeping up!</div>
|
|
<button class="btn btn-secondary" id="syncBtn">Sync Now</button>
|
|
<a href="options.html" target="_blank" class="settings">Open Settings</a>
|
|
`;
|
|
document.getElementById('syncBtn')?.addEventListener('click', doSync);
|
|
}
|
|
function renderError(msg) {
|
|
main.innerHTML = `
|
|
<div class="error">${escapeHtml(msg)}</div>
|
|
<button class="btn btn-secondary" id="syncBtn">Retry Sync</button>
|
|
<a href="options.html" target="_blank" class="settings">Open Settings</a>
|
|
`;
|
|
document.getElementById('syncBtn')?.addEventListener('click', doSync);
|
|
}
|
|
function renderStats(review, autoArchiveCount) {
|
|
const hot = review.filter((r) => r.score.score >= 70).length;
|
|
const warm = review.filter((r) => r.score.score >= 40 && r.score.score < 70).length;
|
|
const cold = review.filter((r) => r.score.score < 40).length;
|
|
const oldest = review.reduce((a, b) => a.score.ageDays > b.score.ageDays ? a : b);
|
|
main.innerHTML = `
|
|
<div class="stat-row"><span class="stat-label">Hot (≥70)</span><span class="stat-value hot">${hot}</span></div>
|
|
<div class="stat-row"><span class="stat-label">Warm (40-69)</span><span class="stat-value warm">${warm}</span></div>
|
|
<div class="stat-row"><span class="stat-label">Cold (<40)</span><span class="stat-value">${cold}</span></div>
|
|
<div class="stat-row"><span class="stat-label">Oldest task</span><span class="stat-value">${Math.round(oldest.score.ageDays)} days</span></div>
|
|
${autoArchiveCount > 0 ? `<div class="stat-row"><span class="stat-label">Auto-archive ready</span><span class="stat-value hot">${autoArchiveCount}</span></div>` : ''}
|
|
<button class="btn btn-primary" id="reviewBtn">Start Review Session</button>
|
|
<button class="btn btn-secondary" id="syncBtn">Sync Now</button>
|
|
<a href="options.html" target="_blank" class="settings">Open Settings</a>
|
|
`;
|
|
document.getElementById('reviewBtn')?.addEventListener('click', () => {
|
|
chrome.runtime.sendMessage({ type: 'openReview' });
|
|
window.close();
|
|
});
|
|
document.getElementById('syncBtn')?.addEventListener('click', doSync);
|
|
}
|
|
async function doSync() {
|
|
const btn = document.getElementById('syncBtn');
|
|
if (btn)
|
|
btn.textContent = 'Syncing...';
|
|
try {
|
|
const res = await chrome.runtime.sendMessage({ type: 'sync' });
|
|
if (res.error) {
|
|
renderError(res.error);
|
|
return;
|
|
}
|
|
await load();
|
|
}
|
|
catch (e) {
|
|
renderError(e.message);
|
|
}
|
|
}
|
|
function escapeHtml(text) {
|
|
const div = document.createElement('div');
|
|
div.textContent = text;
|
|
return div.innerHTML;
|
|
}
|
|
load();
|
|
});
|
|
export {};
|