const { secure, toast } = require("./api"); const { localDate } = require("./date"); function apply(page, ids) { const tasks = page.data.tasks.map((task) => ids.includes(task.id) ? { ...task, completed: true } : task, ); page.setData({ tasks, done: tasks.filter((t) => t.completed).length, undoneCount: tasks.filter((t) => !t.completed).length, }); if (wx.vibrateShort) wx.vibrateShort({ type: "light", fail() {} }); } async function complete(page, task) { if ( !task || task.completed || page.data.completingAll || page.data.taskBusyIds.length ) return; const date = page.data.date || localDate(); page.setData({ taskBusyIds: [task.id] }); try { await secure("/tasks/" + task.id + "/completion", "PUT", { date, completed: true, }); if (page.data.date && page.data.date !== date) return; apply(page, [task.id]); wx.showToast({ title: "照顾好了,记下一份陪伴", icon: "success" }); } catch (error) { toast(error); } finally { page.setData({ taskBusyIds: [] }); } } async function completeAll(page) { if (page.data.completingAll || page.data.taskBusyIds.length) return; const tasks = page.data.tasks.filter((t) => !t.completed); if (!tasks.length) return; const date = page.data.date || localDate(); page.setData({ completingAll: true }); try { const confirmation = await wx.showModal({ title: "都照顾好了吗?", content: `将 ${date} 的 ${tasks.length} 项待办记为完成,完成后不能撤销。`, confirmText: "全部完成", confirmColor: "#b95738", }); if (!confirmation.confirm) return; // The API accepts bounded batches; avoid partial completion of larger lists. if (tasks.length > 200) throw new Error("任务较多,请分项完成后再试"); await secure("/tasks/completions", "PUT", { date, task_ids: tasks.map((t) => t.id), }); if (page.data.date && page.data.date !== date) return; apply( page, tasks.map((t) => t.id), ); wx.showToast({ title: "日常照顾全部完成", icon: "success" }); } catch (error) { toast(error); } finally { page.setData({ completingAll: false }); } } module.exports = { complete, completeAll };