Status: Ready Depends on: #277 ## 概要 Mobile のタスク作成・更新・削除を、API 応答前にカレンダー範囲と未スケジュール一覧へ楽観的に反映する。 ## 背景 / モチベーション - 現在の `apps/mobile/hooks/use-tasks.ts` は各 mutation の成功後に task query を invalidate するだけで、API 応答まで表示が変わらない - ステータストグル、フォームでの編集、日付あり・未スケジュール間の移動、作成・削除で操作結果を即座に表示したい - Web の #277 で扱った両 cache の所属判定、並行 mutation、rollback、再取得競合の知見を Mobile にも適用したい ## 受け入れ条件 - [ ] 日付あり・未スケジュールのタスク作成が API 応答前に正しい query cache へ表示され、成功後の再取得で一意なサーバー確定値になる - [ ] タイトル・説明・ステータス・カテゴリなど所属先が変わらない更新が API 応答前に対象 task へ反映される - [ ] 日付ありから未スケジュール、未スケジュールから表示範囲内、表示範囲内外への日付変更が API 応答前に正しい cache 所属へ反映される - [ ] タスク削除が API 応答前に、そのタスクを保持する cache から反映される - [ ] mutation 失敗時は対象 mutation の変更だけが操作前へ戻り、別 task の並行更新を失わない - [ ] 同一 task の連続更新は成功・失敗の順序にかかわらず最終 cache がサーバー状態と整合し、異なる task の更新は不要に直列化されない - [ ] 進行中の楽観的更新が別 mutation の invalidate・再取得で上書きされず、全 mutation 完了後にサーバー確定状態へ同期される - [ ] 未取得だった query cache は失敗時に未取得状態へ戻り、空配列へ固定されない - [ ] API 応答保留・失敗・並行更新・成功後再取得を含む hook テストで、作成・更新・削除と両 cache の整合性を確認できる - [ ] lint、format-check、typecheck、test が成功する ## 実装方針 - `apps/mobile/hooks/use-tasks.ts` の create / update / delete mutation に `onMutate` と rollback context を追加する - 表示中 range の開始日・終了日と更新後の `date` から cache 所属を判定する - task ID 単位の競合制御と mutation 全体の再取得タイミングは #277 / PR #279 の設計を踏まえる - 一時 ID を使う作成は成功後の再取得でサーバー確定 task に置換し、重複を残さない ## スコープ外 - API・DB・CLI・Web の変更 - 表示していない別月の range cache への先行追加 - query key 全体の再設計 - Undo UI や新しいエラー UI の追加 - 画面レイアウトやビジュアルデザインの変更 ## 参考 - #277 - PR #279 - `apps/mobile/hooks/use-tasks.ts` - `apps/mobile/hooks/use-tasks.test.tsx` - `apps/web/src/hooks/useTasks.ts`
Status: Ready
Depends on: #277
概要
Mobile のタスク作成・更新・削除を、API 応答前にカレンダー範囲と未スケジュール一覧へ楽観的に反映する。
背景 / モチベーション
apps/mobile/hooks/use-tasks.tsは各 mutation の成功後に task query を invalidate するだけで、API 応答まで表示が変わらない受け入れ条件
実装方針
apps/mobile/hooks/use-tasks.tsの create / update / delete mutation にonMutateと rollback context を追加するdateから cache 所属を判定するスコープ外
参考
apps/mobile/hooks/use-tasks.tsapps/mobile/hooks/use-tasks.test.tsxapps/web/src/hooks/useTasks.ts