import { TextNote, Notes } from '../interfaces'; import axios from 'axios'; import { api } from './api'; import { config, writeNote, readNotes } from '../disk'; export const fetchItems = async (notes: Notes) => { const { token, projectId } = config(); const apiNotes = await api< [ { project_id: number | string; id: number | string; content: string; created: string; completed: boolean; } ] >({ url: `https://beta.todoist.com/API/v8/tasks`, method: 'GET', token, }); // only return notes that are active with the current project id const remoteNotes = apiNotes.filter( note => note.project_id === projectId && !note.completed ); // remote is the source of truth and overrides changes remoteNotes.map(note => { const title = (Object.values(notes).find(local => local.id === note.id) && Object.values(notes).find(local => local.id === note.id)!.title) || `Todoist > ${new Date(note.created).toLocaleString()}`; if (notes[title]) { // remote and local note exist if (notes[title].body.message === note.content) { // content has not changed return null; } } writeNote( { id: note.id, body: { message: note.content }, title, }, true ); }); return readNotes(); }; export const createItem = async (note: TextNote) => { const { token, projectId } = config(); const createdNote = await api<{ id: string }>({ url: `https://beta.todoist.com/API/v8/tasks`, method: 'POST', token, payload: { content: `${note.body.message}`, project_id: projectId }, }); return { id: createdNote.id }; }; export const updateItem = (note: TextNote) => { const { token } = config(); return api({ url: `https://beta.todoist.com/API/v8/tasks/${note.id}`, method: 'POST', token, payload: { content: note.body.message }, }); }; export const deleteItem = (note: TextNote) => { const { token } = config(); return axios.delete(`https://beta.todoist.com/API/v8/tasks/${note.id}`, { headers: { Authorization: `Bearer ${token}`, }, }); };