昨天把時間紀錄功能的入口和頁面骨架建立起來,不過「時間紀錄」裡還沒有任何真正的資料。
所以今天先不急著處理時間紀錄頁要怎麼顯示,而是回到番茄鐘本身,處理一個更前面的問題:
一段專注時間,到底要怎麼被記下來?
這次沒有直接開始新增時間紀錄,而是先讓 Cline 分析目前 pomodoro.js 的計時方式。
目前一輪番茄鐘的時間設定是:
const DEFAULT_FOCUS_SECONDS = 25 * 60;
也就是 25 分鐘,而倒數過程中的剩餘時間則會保存在 remaining。
原本我還在想,要不要另外計算開始和結束的時間,再扣掉中間暫停的部分。
確認完目前的程式後發現,番茄鐘暫停時,remaining 本身就不會繼續減少。
所以這次可以直接利用:
const focusedSeconds = DEFAULT_FOCUS_SECONDS - remaining;
用原本的 25 分鐘減掉目前剩餘時間,就可以知道這一次實際倒數了多少秒。
這樣中間即使暫停了一段時間,也不會被算進真正的專注時間。
知道怎麼計算時間之後,接下來要先決定什麼情況才需要留下紀錄。
目前分成三種:
完整完成
→ 一定建立紀錄
→ completed = true
中途放棄
→ 實際專注 ≥ 60 秒才建立紀錄
→ completed = false
→ 不完成任務
→ 不增加 10%
暫停
→ 不建立紀錄
→ 暫停時間不算進專注時間
→ 繼續後還是同一次專注
完成整個番茄鐘一定會被留下來。
如果中途選擇放棄,則至少實際專注 60 秒才會建立紀錄,太短的時間就先不保存。
暫停則不代表這次專注已經結束,所以不會建立新的紀錄,按下繼續後還是接著原本剩餘的時間倒數。
另外也一起調整了原本「放棄」按鈕的行為。
之前按下放棄後,番茄鐘只會重新回到 25:00,但人還是停留在番茄鐘頁面。
現在則改成:
按下放棄
↓
計算這次實際專注時間
↓
符合 60 秒門檻就留下紀錄
↓
不完成任務、不增加 10%
↓
返回首頁
紀錄規則確定之後,接著在 localStorage 裡新增 timeRecords,專門用來保存時間紀錄。
每一筆紀錄目前先保存四項資料:
{
taskName: "...",
focusedSeconds: 0,
recordedAt: "...",
completed: false
}
分別記錄這次進行的任務、實際專注秒數、紀錄時間,以及有沒有完整完成這次番茄鐘。
另外也新增了 saveTimeRecord(),負責把新的時間資料加入原本的紀錄:
讀取原本的 timeRecords
↓
建立這次紀錄
↓
加入陣列
↓
重新寫回 localStorage
功能接好之後,最後分別測試了「中途放棄」和「完整完成」兩種情況。
第一次先測試中途放棄,最後在 timeRecords 裡得到:

代表這次實際專注了 114 秒後放棄,時間有成功被記錄下來,同時任務沒有被標記為完成,進度也沒有增加。
接著再測試完整完成,為了不用真的坐在電腦前等 25 分鐘,測試時先暫時把番茄鐘改成 10 秒。
完整倒數結束後得到:

同時也確認原本的資料仍然正常:
任務 completed = true
pomodoroProgress = 10
代表加入時間紀錄後,原本「完成任務 → 進度 +10%」的流程沒有受到影響。
昨天建立的時間頁目前還是空的,今天也還沒有把 timeRecords 顯示到頁面上。
不過現在番茄鐘已經不只知道一個任務「有沒有完成」,也開始能把實際投入的專注時間留下來。
今天完成的流程變成:
計算實際專注時間 → 定義紀錄規則 → 建立 timeRecords → 串接完成/放棄 → 實際測試資料
接下來才要把今天存下來的這些時間紀錄,真正放進昨天建立的時間頁裡。