/** * 家书 FamilyBook · 任务的**写操作**(鸿蒙端) * * 对应服务端 `app/ApiHandler.php` 的 `tasks()`: * POST /api/v1/tasks 新建(title / note / due_at / board_id / status) * PATCH /api/v1/tasks/ 改(标题/备注/截止/看板/负责人/分类) * POST /api/v1/tasks//status 改状态(todo / doing / done) * DELETE /api/v1/tasks/ 删 * * 🔴 用户 2026-10-20:「任务也是一样啊,任务也点不进去,也没法那个完成, * 新建任务、设置这些东西都这都没有。」 * ⇒ 端上原来这三件事**一件都没接**(按钮没 onTap、列表项没 onClick)。 * * ⚠️ **状态只走 `/status` 子动作**:服务端 `PATCH /tasks/` 里 * `'status' => (string)$t['status']` 是**原样回填**,显式忽略请求里的 status * (见 ApiHandler 那行注释「状态只走 /status 子动作」)。 * 所以端上 toggle 完成必须打 `/status`,打 PATCH 会"看起来成功但状态没变"。 */ import { fbApi, FbApiResult, FbApiOptions } from './FbHttp'; /** 新建/编辑任务提交的字段 */ export interface FbTaskDraft { title: string; note: string; /** `YYYY-MM-DD HH:MM`;空串 = 没有期限 */ dueAt: string; /** 看板 id(0 = 不归指定看板 → 服务端落到「其他」那一列) */ boardId: number; /** todo / doing / done(只在**新建**时生效;改状态走 `setTaskStatus`) */ status: string; } /** 新建任务 */ export async function createTask(token: string, d: FbTaskDraft): Promise { /* ⚠️ ArkTS 的 `arkts-no-untyped-obj-literals`:请求体必须 `Record = {}` 逐键赋值(见 FbTripRepo 同一说明)。 */ const body: Record = {}; body['title'] = d.title; body['note'] = d.note; body['due_at'] = d.dueAt; body['board_id'] = d.boardId; body['status'] = d.status; const opts: FbApiOptions = { method: 'POST', token: token, body: body }; return await fbApi('/api/v1/tasks', opts); } /** * 改任务(标题 / 备注 / 截止 / 看板)。 * * ⚠️ **不带 status**:服务端 PATCH 会忽略它(见文件头说明), * 带上只会让人以为"改成功了",实际状态没动。 */ export async function updateTask(token: string, id: number, d: FbTaskDraft): Promise { const body: Record = {}; body['title'] = d.title; body['note'] = d.note; body['due_at'] = d.dueAt; body['board_id'] = d.boardId; const opts: FbApiOptions = { method: 'PATCH', token: token, body: body }; return await fbApi('/api/v1/tasks/' + id.toString(), opts); } /** 改状态(勾完成 / 取消完成 / 标记进行中) */ export async function setTaskStatus(token: string, id: number, status: string): Promise { const body: Record = {}; body['status'] = status; const opts: FbApiOptions = { method: 'POST', token: token, body: body }; return await fbApi('/api/v1/tasks/' + id.toString() + '/status', opts); } /** 删任务 */ export async function deleteTask(token: string, id: number): Promise { const opts: FbApiOptions = { method: 'DELETE', token: token }; return await fbApi('/api/v1/tasks/' + id.toString(), opts); }