88 lines
3.8 KiB
TypeScript
88 lines
3.8 KiB
TypeScript
import { getSettings, setSettings, clearAllTasks } from './storage.js';
|
|
import { fetchAllTasks } from './apis/index.js';
|
|
|
|
document.addEventListener('DOMContentLoaded', async () => {
|
|
const el = (id: string) => document.getElementById(id) as HTMLInputElement;
|
|
|
|
const settings = await getSettings();
|
|
el('todoistEnabled').checked = settings.providers.todoist.enabled;
|
|
el('todoistToken').value = settings.providers.todoist.token;
|
|
el('ticktickEnabled').checked = settings.providers.ticktick.enabled;
|
|
el('ticktickToken').value = settings.providers.ticktick.token;
|
|
el('notionEnabled').checked = settings.providers.notion.enabled;
|
|
el('notionToken').value = settings.providers.notion.token;
|
|
el('notionDbs').value = (settings.providers.notion.projectIds || []).join(', ');
|
|
el('decayThreshold').value = String(settings.decayThresholdDays);
|
|
el('reviewInterval').value = String(settings.reviewIntervalDays);
|
|
el('maxTasks').value = String(settings.maxTasksPerReview);
|
|
el('autoArchive').value = String(settings.autoArchiveDays);
|
|
|
|
document.getElementById('saveBtn')?.addEventListener('click', async () => {
|
|
const status = document.getElementById('status')!;
|
|
status.textContent = '';
|
|
status.className = 'status';
|
|
|
|
const newSettings = {
|
|
...settings,
|
|
providers: {
|
|
todoist: {
|
|
enabled: el('todoistEnabled').checked,
|
|
token: el('todoistToken').value.trim(),
|
|
lastSync: settings.providers.todoist.lastSync,
|
|
projectIds: null,
|
|
},
|
|
ticktick: {
|
|
enabled: el('ticktickEnabled').checked,
|
|
token: el('ticktickToken').value.trim(),
|
|
lastSync: settings.providers.ticktick.lastSync,
|
|
projectIds: null,
|
|
},
|
|
notion: {
|
|
enabled: el('notionEnabled').checked,
|
|
token: el('notionToken').value.trim(),
|
|
lastSync: settings.providers.notion.lastSync,
|
|
projectIds: el('notionDbs').value.split(',').map(s => s.trim()).filter(Boolean),
|
|
},
|
|
},
|
|
decayThresholdDays: parseInt(el('decayThreshold').value) || 14,
|
|
reviewIntervalDays: parseInt(el('reviewInterval').value) || 7,
|
|
maxTasksPerReview: parseInt(el('maxTasks').value) || 20,
|
|
autoArchiveDays: parseInt(el('autoArchive').value) || 90,
|
|
};
|
|
|
|
await setSettings(newSettings);
|
|
status.textContent = 'Settings saved.';
|
|
status.classList.add('success');
|
|
});
|
|
|
|
document.getElementById('testBtn')?.addEventListener('click', async () => {
|
|
const status = document.getElementById('status')!;
|
|
status.textContent = 'Testing...';
|
|
status.className = 'status';
|
|
try {
|
|
const testSettings = {
|
|
...settings,
|
|
providers: {
|
|
todoist: { enabled: el('todoistEnabled').checked, token: el('todoistToken').value.trim(), lastSync: null, projectIds: null },
|
|
ticktick: { enabled: el('ticktickEnabled').checked, token: el('ticktickToken').value.trim(), lastSync: null, projectIds: null },
|
|
notion: { enabled: el('notionEnabled').checked, token: el('notionToken').value.trim(), lastSync: null, projectIds: el('notionDbs').value.split(',').map(s => s.trim()).filter(Boolean) },
|
|
},
|
|
};
|
|
const tasks = await fetchAllTasks(testSettings.providers);
|
|
status.textContent = `Connection OK! Found ${tasks.length} tasks across enabled providers.`;
|
|
status.classList.add('success');
|
|
} catch (e) {
|
|
status.textContent = `Error: ${(e as Error).message}`;
|
|
status.classList.add('error');
|
|
}
|
|
});
|
|
|
|
document.getElementById('clearBtn')?.addEventListener('click', async () => {
|
|
if (!confirm('Clear all stored tasks and sync data?')) return;
|
|
await clearAllTasks();
|
|
const status = document.getElementById('status')!;
|
|
status.textContent = 'All data cleared.';
|
|
status.className = 'status success';
|
|
});
|
|
});
|