前回の続き → 🔰JS初心者が作るGoogle extension V3 ⑧ -start/stop/reset押した時の挙動-
完成した作品は → こちら🐕
ポモドーロタイマーの処理
前回の記事でstopId = setInterval(pomodoro_timer, 1000);と出てきました。ようやくメインのpomodoro_timer()を見ていきます。
pomodoro_timer()は
ポモドーロタイマー = 集中時間用カウント + 休憩用カウント
pomodoro_timer() = count_down() + interval_count_down()
count_down()
まずは集中時間用カウント、count_down()から。
①タイマー作成時にローカルストレージに保存した値を取ってくる
②画面にスタートの通知やポメを出す指示を出す(content.jsにて後ほど)
③集中時間を毎秒減らしていき、その度値を保存する。
function count_down() {
  //①
  chrome.storage.local.get(['work_second','constant_work_second'],function(v){
        //②
        //集中時間がMAXの時(25分なら1500秒)
        if(v.work_second == v.constant_work_second){
            chrome.tabs.query( {active:true, currentWindow:true}, function(tabs){
                chrome.tabs.sendMessage(tabs[0].id, {msg: "start"})
            })
        }
        //③
        v.work_second--;
        chrome.storage.local.set({work_second: v.work_second});
    })
};
interval_count_down()
次は休憩用カウント、interval_count_down()。
count_down()と構成はほぼ一緒である。
①タイマー作成時にローカルストレージに保存した値を取ってくる
②画面に休憩の通知や違うポメを出す指示を出す(content.jsにて後ほど)
③休憩時間を毎秒減らしていき、その度値を保存する。
function interval_count_down() {
    //①
 chrome.storage.local.get(['interval_second','constant_interval_second'],function(v){
        //②
        //休憩時間がMAXの時(5分なら300秒)
        if(v.interval_second == v.constant_interval_second){
            chrome.tabs.query( {active:true, currentWindow:true}, function(tabs){
                chrome.tabs.sendMessage(tabs[0].id, {msg: "interval"})
            })
        }
        //③
        v.interval_second--;
        chrome.storage.local.set({interval_second: v.interval_second});
    })
};
pomodoro_timer()
①タイマー作成時にローカルストレージに保存した値を取ってくる
②集中時間が0秒以上の場合、count_down()を実行
③休憩時間が0秒より上(0は含まない)の場合、interval_count_down()を実行
④休憩時間が0秒になった時、1ループの秒数を経過時間に追加し保存
⑤経過時間が総秒数に満たなかった場合、0になった集中時間と休憩時間を再度保存し直す
⑥ループが終わればポモドーロタイマーを止め、タイマーステータスをfalseにし、タイマー終了の合図をcontent.jsに送る
⑦popup.jsに毎秒減っているカウントを送っている
function pomodoro_timer() {
    //①
    chrome.storage.local.get([
        'work_time',
        'work_second',
        'interval',
        'interval_second',
        'elapsed_time',
        'one_roop_second',
        'total_second'
    ],function(v){
        //②
        if (v.work_second >= 0) {
            count_down()
        //③
        }else if(v.interval_second > 0){
            interval_count_down()
        //④
        }else if(v.interval_second == 0){
            v.elapsed_time += v.one_roop_second;
            chrome.storage.local.set({elapsed_time: v.elapsed_time});
            //⑤
            if(v.elapsed_time < v.total_second){
                v.work_second = v.work_time * 60;
                v.interval_second = v.interval * 60;
                chrome.storage.local.set({work_second: v.work_second});
                chrome.storage.local.set({interval_second: v.interval_second});
            }else{
                //⑥
                clearInterval(stopId);
                timerStatus = false          
                chrome.storage.local.set({timerStatus: timerStatus});
                
                chrome.tabs.query( {active:true, currentWindow:true}, function(tabs){
                    chrome.tabs.sendMessage(tabs[0].id, {msg: "finish"})
                })
            };
        };
        //⑦
        chrome.runtime.sendMessage({
            work_time: `${v.work_time}`,
            work_second: `${v.work_second}`,
            interval: `${v.interval}`,
            interval_second: `${v.interval_second}`,
            elapsed_time: `${v.elapsed_time}`,
            total_second: `${v.total_second}`
        });
    });
};
⑦でpopupに値を渡しているので、これでタイマーのviewを処理できる。
今のbackground.jsはこうなっている。
let lifeline
let stopId
//初インストール時のフォームの初期値設定
chrome.runtime.onInstalled.addListener(() => {省略})
//start・stop・resetボタン押された時の処理
chrome.runtime.onMessage.addListener(async function(request, sender, sendResponse){省略})
//5分間の再接続処理
chrome.runtime.onConnect.addListener(port => {省略});
function keepAliveForced() {省略}
async function keepAlive() {省略}
//ポモドーロタイマー
function pomodoro_timer() {省略};
// 集中時間用カウントダウン
function count_down() {省略};
// インターバル用カウントダウン
function interval_count_down() {省略};
拡張機能の記事リンク
🔰JS初心者が作るGoogle extension V3 ①
🔰JS初心者が作るGoogle extension V3 ② -popup.htmlの作成-
🔰JS初心者が作るGoogle extension V3 ③ -タブの切り替えの処理-
🔰JS初心者が作るGoogle extension V3 ④ -タイマーを表示させる-
🔰JS初心者が作るGoogle extension V3 ⑤ -スタート/ストップ/リセットの各ボタン機能-
🔰JS初心者が作るGoogle extension V3 ⑥ -タイマー作動中の有無で表示する画面の処理-
🔰JS初心者が作るGoogle extension V3 ⑦ -初インストール時の処理/5分間の再接続処理-
🔰JS初心者が作るGoogle extension V3 ⑧ -start/stop/reset押した時の挙動-
🔰JS初心者が作るGoogle extension V3 ⑨ -ポモドーロタイマーの処理-
🔰JS初心者が作るGoogle extension V3 ⑩ -popupのポモドーロタイマーの処理-
🔰JS初心者が作るGoogle extension V3 ⑪ -content.jsの処理-