61 lines
2.5 KiB
JavaScript
61 lines
2.5 KiB
JavaScript
// TickTick API v2 — uses login token or OAuth access token
|
|
export async function fetchTickTickTasks(config) {
|
|
if (!config.token)
|
|
throw new Error('TickTick token not configured');
|
|
const headers = {
|
|
'Authorization': `Bearer ${config.token}`,
|
|
'Content-Type': 'application/json',
|
|
};
|
|
// Get all projects first
|
|
const projectsRes = await fetch('https://api.ticktick.com/open/v1/project', { headers });
|
|
const projects = projectsRes.ok ? await projectsRes.json() : [];
|
|
const projectList = Array.isArray(projects) ? projects : (projects || []);
|
|
const allTasks = [];
|
|
for (const proj of projectList) {
|
|
const pid = proj.id;
|
|
const tasksRes = await fetch(`https://api.ticktick.com/open/v1/project/${pid}/task`, { headers });
|
|
if (!tasksRes.ok)
|
|
continue;
|
|
const tasks = await tasksRes.json();
|
|
const taskList = Array.isArray(tasks) ? tasks : (tasks || []);
|
|
for (const t of taskList) {
|
|
if (t.status === 2)
|
|
continue; // completed
|
|
allTasks.push({
|
|
id: `ticktick-${t.id}`,
|
|
title: t.title,
|
|
priority: (t.priority || 0) + 1,
|
|
createdAt: new Date(t.createdTime || Date.now()),
|
|
updatedAt: new Date(t.modifiedTime || t.createdTime || Date.now()),
|
|
completedAt: null,
|
|
dueDate: t.dueDate ? new Date(t.dueDate) : null,
|
|
projectId: `ticktick-${pid}`,
|
|
projectName: proj.name || null,
|
|
labels: t.tags || [],
|
|
url: `https://ticktick.com/webapp/#p/${pid}/task/${t.id}`,
|
|
source: 'ticktick',
|
|
raw: t,
|
|
});
|
|
}
|
|
}
|
|
return allTasks;
|
|
}
|
|
export async function closeTickTickTask(taskId, token) {
|
|
const realId = taskId.replace('ticktick-', '');
|
|
const res = await fetch(`https://api.ticktick.com/open/v1/task/${realId}/complete`, {
|
|
method: 'POST',
|
|
headers: { 'Authorization': `Bearer ${token}` },
|
|
});
|
|
if (!res.ok)
|
|
throw new Error(`Failed to close TickTick task: ${res.status}`);
|
|
}
|
|
export async function deleteTickTickTask(taskId, token) {
|
|
const realId = taskId.replace('ticktick-', '');
|
|
const res = await fetch(`https://api.ticktick.com/open/v1/task/${realId}`, {
|
|
method: 'DELETE',
|
|
headers: { 'Authorization': `Bearer ${token}` },
|
|
});
|
|
if (!res.ok)
|
|
throw new Error(`Failed to delete TickTick task: ${res.status}`);
|
|
}
|