From 104bc75b0720034080c08db8afa3ad610b96abeb Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Sun, 29 Mar 2026 18:27:22 +0200 Subject: [PATCH 01/18] Rename app title --- Sprint-3/alarmclock/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sprint-3/alarmclock/index.html b/Sprint-3/alarmclock/index.html index 48e2e80d9..66748001e 100644 --- a/Sprint-3/alarmclock/index.html +++ b/Sprint-3/alarmclock/index.html @@ -1,10 +1,10 @@ - + - Title here + Alarm clock app
From bc9db0d0dd76e80bf27dff31978cecd33700fba6 Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Sun, 5 Apr 2026 16:45:55 +0200 Subject: [PATCH 02/18] Implement set Alarm --- Sprint-3/alarmclock/alarmclock.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 6ca81cd3b..1c37a21c3 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -1,6 +1,20 @@ -function setAlarm() {} +const timeRemaining = document.getElementById("timeRemaining"); +const setButton = document.getElementById("set"); +const stopButton = document.getElementById("stop"); -// DO NOT EDIT BELOW HERE +function formatTime(time) { + const minutes = Math.floor(time / 60); + const seconds = time % 60; + return `${minutes}:${seconds < 10 ? "0" : ""}${seconds}`; +} + +function setAlarm() { + const alarmSet = document.getElementById("alarmSet"); + const setTime = alarmSet.value; + timeRemaining.textContent = `Time Remaining: ${formatTime(setTime)}`; +} + +setButton.addEventListener("click", setAlarm); var audio = new Audio("alarmsound.mp3"); From 2e9abac78cc65fb4d7a27cad137851416985056f Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Mon, 6 Apr 2026 01:51:34 +0200 Subject: [PATCH 03/18] Refactor: remove duplicate setAlarm button event listener --- Sprint-3/alarmclock/alarmclock.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 1c37a21c3..6e665117c 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -1,5 +1,4 @@ const timeRemaining = document.getElementById("timeRemaining"); -const setButton = document.getElementById("set"); const stopButton = document.getElementById("stop"); function formatTime(time) { @@ -14,8 +13,6 @@ function setAlarm() { timeRemaining.textContent = `Time Remaining: ${formatTime(setTime)}`; } -setButton.addEventListener("click", setAlarm); - var audio = new Audio("alarmsound.mp3"); function setup() { From 15cd7d0c733855459c410853d7bacc99ea1296a1 Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Mon, 6 Apr 2026 01:53:16 +0200 Subject: [PATCH 04/18] Refactor: remove duplicate stopAlarm button event listener --- Sprint-3/alarmclock/alarmclock.js | 1 - 1 file changed, 1 deletion(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 6e665117c..60bbbfb24 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -1,5 +1,4 @@ const timeRemaining = document.getElementById("timeRemaining"); -const stopButton = document.getElementById("stop"); function formatTime(time) { const minutes = Math.floor(time / 60); From 01299b137c8e7f823eed674d10ca2d87f7f53d52 Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Mon, 6 Apr 2026 02:00:36 +0200 Subject: [PATCH 05/18] Refactor: separate time display into a function --- Sprint-3/alarmclock/alarmclock.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 60bbbfb24..85b5d30d5 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -6,12 +6,16 @@ function formatTime(time) { return `${minutes}:${seconds < 10 ? "0" : ""}${seconds}`; } -function setAlarm() { +function displayTime() { const alarmSet = document.getElementById("alarmSet"); const setTime = alarmSet.value; timeRemaining.textContent = `Time Remaining: ${formatTime(setTime)}`; } +function setAlarm() { + displayTime(); +} + var audio = new Audio("alarmsound.mp3"); function setup() { From 13a05e6e8dc300ec700894a044511056b5c4362b Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Mon, 6 Apr 2026 02:14:26 +0200 Subject: [PATCH 06/18] Refactor: improve readability --- Sprint-3/alarmclock/alarmclock.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 85b5d30d5..d797eb564 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -1,19 +1,17 @@ -const timeRemaining = document.getElementById("timeRemaining"); - function formatTime(time) { const minutes = Math.floor(time / 60); const seconds = time % 60; return `${minutes}:${seconds < 10 ? "0" : ""}${seconds}`; } -function displayTime() { - const alarmSet = document.getElementById("alarmSet"); - const setTime = alarmSet.value; - timeRemaining.textContent = `Time Remaining: ${formatTime(setTime)}`; +function displayAlarm(time) { + const alarmBox = document.getElementById("timeRemaining"); + alarmBox.textContent = `Time Remaining: ${formatTime(time)}`; } function setAlarm() { - displayTime(); + const setTime = document.getElementById("alarmSet").value; + displayAlarm(setTime); } var audio = new Audio("alarmsound.mp3"); From 7a55810c3c9b197c49c47c3e8fb6f3e7c0b2a69c Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Mon, 6 Apr 2026 02:30:18 +0200 Subject: [PATCH 07/18] Feat: allow alarm to countdown --- Sprint-3/alarmclock/alarmclock.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index d797eb564..b766472b3 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -1,3 +1,6 @@ +let timeRemaining; +let timerInterval; + function formatTime(time) { const minutes = Math.floor(time / 60); const seconds = time % 60; @@ -11,7 +14,17 @@ function displayAlarm(time) { function setAlarm() { const setTime = document.getElementById("alarmSet").value; - displayAlarm(setTime); + timeRemaining = parseInt(setTime, 10); + displayAlarm(timeRemaining); + + timerInterval = setInterval(() => { + timeRemaining--; + displayAlarm(timeRemaining); + + if (timeRemaining <= 0) { + clearInterval(timerInterval); + } + }, 1000); } var audio = new Audio("alarmsound.mp3"); From d0daf34d879431d167f83ad05e0eb870faede157 Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Mon, 6 Apr 2026 02:39:18 +0200 Subject: [PATCH 08/18] Refactor: move timer countdown into separate function --- Sprint-3/alarmclock/alarmclock.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index b766472b3..d07a0df25 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -12,19 +12,21 @@ function displayAlarm(time) { alarmBox.textContent = `Time Remaining: ${formatTime(time)}`; } +function decreaseAlarmTime() { + timeRemaining--; + displayAlarm(timeRemaining); + + if (timeRemaining <= 0) { + clearInterval(timerInterval); + } +} + function setAlarm() { const setTime = document.getElementById("alarmSet").value; timeRemaining = parseInt(setTime, 10); - displayAlarm(timeRemaining); - - timerInterval = setInterval(() => { - timeRemaining--; - displayAlarm(timeRemaining); - if (timeRemaining <= 0) { - clearInterval(timerInterval); - } - }, 1000); + displayAlarm(timeRemaining); + timerInterval = setInterval(decreaseAlarmTime, 1000); } var audio = new Audio("alarmsound.mp3"); From 47e2f223b2159fa741fd76fe1cc6a6ef93868428 Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Mon, 6 Apr 2026 07:29:54 +0200 Subject: [PATCH 09/18] Refactor alarm countdown --- Sprint-3/alarmclock/alarmclock.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index d07a0df25..fd6eb8419 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -18,6 +18,8 @@ function decreaseAlarmTime() { if (timeRemaining <= 0) { clearInterval(timerInterval); + timeRemaining = 0; + playAlarm(); } } @@ -25,7 +27,6 @@ function setAlarm() { const setTime = document.getElementById("alarmSet").value; timeRemaining = parseInt(setTime, 10); - displayAlarm(timeRemaining); timerInterval = setInterval(decreaseAlarmTime, 1000); } From 5fcb0b1560b9241fa69cb362937d9557e74905eb Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Mon, 6 Apr 2026 07:37:15 +0200 Subject: [PATCH 10/18] Fix: add 0 in front of minutes when single digit --- Sprint-3/alarmclock/alarmclock.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index fd6eb8419..ae3841015 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -2,9 +2,13 @@ let timeRemaining; let timerInterval; function formatTime(time) { - const minutes = Math.floor(time / 60); - const seconds = time % 60; - return `${minutes}:${seconds < 10 ? "0" : ""}${seconds}`; + const minutes = + Math.floor(time / 60) < 10 + ? "0" + Math.floor(time / 60) + : Math.floor(time / 60); + const seconds = time % 60 < 10 ? "0" + (time % 60) : time % 60; + + return `${minutes}:${seconds}`; } function displayAlarm(time) { From 98a0a647b49fbedb8b548b39a23e179710d06ac7 Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Mon, 6 Apr 2026 07:44:58 +0200 Subject: [PATCH 11/18] Fix: prevent multiple setInterval timers running at the same time --- Sprint-3/alarmclock/alarmclock.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index ae3841015..c408fc668 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -22,6 +22,7 @@ function decreaseAlarmTime() { if (timeRemaining <= 0) { clearInterval(timerInterval); + timerInterval = null; timeRemaining = 0; playAlarm(); } @@ -31,6 +32,10 @@ function setAlarm() { const setTime = document.getElementById("alarmSet").value; timeRemaining = parseInt(setTime, 10); + if (timerInterval) { + clearInterval(timerInterval); + } + timerInterval = setInterval(decreaseAlarmTime, 1000); } From dfa1f57d0c96a09821457afe2e593cb5df1668ab Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Mon, 6 Apr 2026 08:00:09 +0200 Subject: [PATCH 12/18] Fix: update timer value immediately after button is clicked --- Sprint-3/alarmclock/alarmclock.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index c408fc668..57bd25dde 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -17,15 +17,15 @@ function displayAlarm(time) { } function decreaseAlarmTime() { - timeRemaining--; - displayAlarm(timeRemaining); - if (timeRemaining <= 0) { clearInterval(timerInterval); timerInterval = null; timeRemaining = 0; playAlarm(); } + + timeRemaining--; + displayAlarm(timeRemaining); } function setAlarm() { @@ -36,6 +36,7 @@ function setAlarm() { clearInterval(timerInterval); } + displayAlarm(timeRemaining); timerInterval = setInterval(decreaseAlarmTime, 1000); } From cb65771de4c017251b883ed184d2a7b514a1fb8c Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Mon, 6 Apr 2026 08:19:23 +0200 Subject: [PATCH 13/18] Fix: ensure timer stops at 00:00 and doesn't go below --- Sprint-3/alarmclock/alarmclock.js | 1 + 1 file changed, 1 insertion(+) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 57bd25dde..bf03143d9 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -22,6 +22,7 @@ function decreaseAlarmTime() { timerInterval = null; timeRemaining = 0; playAlarm(); + return; } timeRemaining--; From eeb1c243fdca0f9a2afb293113fb6252bd086b97 Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Mon, 6 Apr 2026 08:21:47 +0200 Subject: [PATCH 14/18] Refactor: improve readability of formatTime() function --- Sprint-3/alarmclock/alarmclock.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index bf03143d9..4bc7a3ab5 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -2,11 +2,8 @@ let timeRemaining; let timerInterval; function formatTime(time) { - const minutes = - Math.floor(time / 60) < 10 - ? "0" + Math.floor(time / 60) - : Math.floor(time / 60); - const seconds = time % 60 < 10 ? "0" + (time % 60) : time % 60; + const minutes = String(Math.floor(time / 60)).padStart(2, "0"); + const seconds = String(time % 60).padStart(2, "0"); return `${minutes}:${seconds}`; } From f165cf534b93153242b340bd1a3cfedc388a8739 Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Fri, 10 Apr 2026 05:57:55 +0200 Subject: [PATCH 15/18] Validate and sanitize user's time input --- Sprint-3/alarmclock/alarmclock.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 4bc7a3ab5..027e4d880 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -28,12 +28,24 @@ function decreaseAlarmTime() { function setAlarm() { const setTime = document.getElementById("alarmSet").value; - timeRemaining = parseInt(setTime, 10); + + const numericTime = parseInt(setTime, 10); + if (isNaN(numericTime)) { + alert( + "Please enter your desired time in numbers, e.g., 120 for 2 minutes." + ); + return; + } + if (numericTime < 0) { + alert("Please enter a non-negative number."); + return; + } + + timeRemaining = numericTime; if (timerInterval) { clearInterval(timerInterval); } - displayAlarm(timeRemaining); timerInterval = setInterval(decreaseAlarmTime, 1000); } From e903b09b60ca4e0809a99a3f48d999c52814514f Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Sat, 11 Apr 2026 03:07:03 +0200 Subject: [PATCH 16/18] Fix: ensure previous timer is reset before starting a new one --- Sprint-3/alarmclock/alarmclock.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 027e4d880..ae98fbc27 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -1,5 +1,5 @@ let timeRemaining; -let timerInterval; +let timerInterval = null; function formatTime(time) { const minutes = String(Math.floor(time / 60)).padStart(2, "0"); @@ -17,7 +17,6 @@ function decreaseAlarmTime() { if (timeRemaining <= 0) { clearInterval(timerInterval); timerInterval = null; - timeRemaining = 0; playAlarm(); return; } @@ -26,6 +25,13 @@ function decreaseAlarmTime() { displayAlarm(timeRemaining); } +function resetAlarm() { + clearInterval(timerInterval); + timerInterval = null; + pauseAlarm(); + audio.currentTime = 0; +} + function setAlarm() { const setTime = document.getElementById("alarmSet").value; @@ -41,13 +47,11 @@ function setAlarm() { return; } + resetAlarm(); timeRemaining = numericTime; + timerInterval = setInterval(decreaseAlarmTime, 1000); - if (timerInterval) { - clearInterval(timerInterval); - } displayAlarm(timeRemaining); - timerInterval = setInterval(decreaseAlarmTime, 1000); } var audio = new Audio("alarmsound.mp3"); From 76e9b57a172a59cb90dd2df9c56c6989c67f38c8 Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Sat, 11 Apr 2026 03:42:24 +0200 Subject: [PATCH 17/18] Fix: remove 1 second delay to ensure alarm sounds at exact 00:00 --- Sprint-3/alarmclock/alarmclock.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index ae98fbc27..6d842f6fe 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -14,15 +14,15 @@ function displayAlarm(time) { } function decreaseAlarmTime() { + timeRemaining--; + displayAlarm(timeRemaining); + if (timeRemaining <= 0) { clearInterval(timerInterval); timerInterval = null; playAlarm(); return; } - - timeRemaining--; - displayAlarm(timeRemaining); } function resetAlarm() { From 5386aff6dac3b3fae6166c38f920c65692e7f91c Mon Sep 17 00:00:00 2001 From: Isaac Abodunrin Date: Sat, 11 Apr 2026 10:16:04 +0200 Subject: [PATCH 18/18] Fix: ensure alarm plays immediately if user enters a time of 0 seconds, without 1 second delay --- Sprint-3/alarmclock/alarmclock.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Sprint-3/alarmclock/alarmclock.js b/Sprint-3/alarmclock/alarmclock.js index 6d842f6fe..2d504fca0 100644 --- a/Sprint-3/alarmclock/alarmclock.js +++ b/Sprint-3/alarmclock/alarmclock.js @@ -49,9 +49,14 @@ function setAlarm() { resetAlarm(); timeRemaining = numericTime; - timerInterval = setInterval(decreaseAlarmTime, 1000); displayAlarm(timeRemaining); + + if (timeRemaining === 0) { + playAlarm(); + } else { + timerInterval = setInterval(decreaseAlarmTime, 1000); + } } var audio = new Audio("alarmsound.mp3");