thread-master/docs/product/demand-radar/tasks/T516-fe-radar-watches-page.md

3.3 KiB
Raw Permalink Blame History

T516 — fe-radar-watches-page

Status: done
Milestone: M1
Kind: feat
Est. change: ~200 lines

Goal

完成後系統應:/app/radar/watches 可建立/編修/暫停/恢復/封存雷達訂閱,並可採用 AI 關鍵字建議。

Depends on

  • T502、T503、T513、T514

Inputs

  • Spec../spec.md §4.2、§5.3、§9.1
  • 既有頁面骨架:apps/web/src/pages/ScoutPage.tsx、路由設定 src/App.tsx

Outputs

程式變更(預期路徑)

路徑 動作 說明
apps/web/src/pages/RadarWatchesPage.tsx add 列表+新增/編輯抽屜+狀態動作
apps/web/src/components/radar/WatchSuggestPanel.tsx add 建議清單,逐條採用/全採用
apps/web/src/App.tsx edit 註冊 /app/radar/watches 路由
apps/web/src/data/live/radarRepos.ts edit watches CRUDpauseresumesuggest 實作
apps/web/src/styles/radar.css edit 列表與抽屜樣式

行為變更

  • 未建服務檔案時,頁面顯示引導並停用「新增」,附連結到 /app/brands 服務檔案分頁。
  • 觸到 max_active_watches 時直接顯示後端 message含上限與升級提示不用前端自行推測文案。
  • 每列顯示 terms、地區、狀態、last_swept_at

Out of scope

  • 手動觸發即時巡的 UIT533 提供 APIUI 併入 T552 或此頁後續)
  • 今日商機頁T551

Acceptance

  • 無服務檔案時「新增」被停用並有引導
  • 建立→暫停→恢復→封存的狀態變化正確反映
  • 指令:
cd apps/web && npm run build && npm run check:tokens && npm run test && npm run lint

Notes

實作落點

  • apps/web/src/pages/RadarWatchesPage.tsx:清單(關鍵字/排除詞 chip、狀態 badge、地區、last_swept_at)+狀態篩選+分頁+新增/編輯表單。
  • apps/web/src/components/radar/WatchSuggestPanel.tsx:按下才問 AI避免開頁就燒 credit逐條全部採用已在表單裡的詞顯示「已採用」並停用按鈕。
  • apps/web/src/App.tsx/app/radar/watches lazy 路由。側欄項在 T553。
  • apps/web/src/styles/radar.css.hb-radar-form.hb-radar-suggest*

決策

  • 採用建議不等於建立訂閱:建議只往表單塞字,仍要按儲存才會打 API。使用者可以先刪掉不要的再送。
  • 關鍵字用換行/逗號/頓號都能分隔:使用者常直接從別處貼一整串過來。
  • 每個動作後重讀清單:暫停/恢復會連動 active_count 與配額提示,局部改 state 很容易和後端對不起來。
  • 配額與缺服務檔案的文案來自後端403003含「1 of 1 on your plan」與升級提示400100 都直接顯示後端 message前端不自行推測上限。
  • 建立失敗時表單不關:使用者可以改成「不立刻啟用」或先去暫停別的再送。
  • 封存列不再顯示任何動作按鈕(狀態機的終點),避免點了才發現不能恢復。

測試

src/pages/RadarWatchesPage.test.tsx5 案):無服務檔案停用新增+指路、建立→暫停→恢復→封存的狀態與配額連動、配額滿顯示後端原句且表單留著、建議逐條採用分流到關鍵字/排除詞、建議失敗說原因。