-
-
Notifications
You must be signed in to change notification settings - Fork 39
NW6| Nazanin-Saedi | Module-JS2 | Alarmclock | Week-3 #205
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,19 +1,70 @@ | ||
| function setAlarm() {} | ||
|
|
||
| // DO NOT EDIT BELOW HERE | ||
| let countdown; | ||
|
|
||
| var audio = new Audio("alarmsound.mp3"); | ||
| function setAlarm() { | ||
| const input = document.getElementById("alarmSet"); | ||
| const heading = document.getElementById("timeRemaining"); | ||
|
|
||
| let timeInSeconds = parseInt(input.value, 10); | ||
|
|
||
| if (isNaN(timeInSeconds) || timeInSeconds <= 0) { | ||
| alert("Please enter a valid positive number for the alarm time."); | ||
| return; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good touch |
||
| } | ||
|
|
||
| let minutes = Math.floor(timeInSeconds / 60); | ||
| let seconds = timeInSeconds % 60; | ||
|
|
||
| countdown = setInterval(() => { | ||
| seconds--; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This line causes a bug - the seconds go down to -1 and when you add an alarm, the time is the time you entered -1. Can you see why this happens? |
||
|
|
||
| if (seconds < 0) { | ||
| if (minutes === 0) { | ||
| clearInterval(countdown); | ||
| playAlarm(); | ||
| document.body.style.backgroundColor = "red"; // This was just optional, background color will change | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nice :) |
||
| // Flash background color (optional) | ||
| setTimeout(() => { | ||
| document.body.style.backgroundColor = ""; | ||
| }, 500); | ||
| } else { | ||
| seconds = 59; | ||
| minutes--; | ||
| } | ||
| } | ||
|
|
||
| heading.innerText = `Time Remaining: ${minutes | ||
| .toString() | ||
| .padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nice |
||
| }, 1000); | ||
|
|
||
| document.getElementById("stop").addEventListener("click", () => { | ||
| clearInterval(countdown); | ||
| pauseAlarm(); | ||
| heading.innerText = "Time Remaining: 00:00"; | ||
| document.body.style.backgroundColor = ""; // this is to reset background color | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Looking good :) |
||
| }); | ||
| } | ||
|
|
||
| function setup() { | ||
| document.getElementById("set").addEventListener("click", () => { | ||
| clearInterval(countdown); // Clear the previous countdown interval | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 👍 |
||
| setAlarm(); | ||
| }); | ||
|
|
||
| document.getElementById("stop").addEventListener("click", () => { | ||
| clearInterval(countdown); | ||
| pauseAlarm(); | ||
| document.getElementById("timeRemaining").innerText = "Time Remaining: 00:00"; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 👍 |
||
| document.body.style.backgroundColor = ""; // Reset background color | ||
| }); | ||
| } | ||
|
|
||
| // Rest of the code remains unchanged | ||
|
|
||
| // DO NOT EDIT BELOW HERE | ||
| var audio = new Audio("alarmsound.mp3"); | ||
|
|
||
| function playAlarm() { | ||
| audio.play(); | ||
| } | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,3 +1,4 @@ | ||
|
|
||
| /* ======= TESTS - DO NOT MODIFY ===== | ||
| There are some Tests in this file that will help you work out if your code is working. | ||
| */ | ||
|
|
@@ -35,15 +36,18 @@ afterEach(() => { | |
| page = null; | ||
| }); | ||
|
|
||
|
|
||
|
|
||
| test("should set heading when button is clicked", () => { | ||
| const heading = page.window.document.querySelector("#timeRemaining"); | ||
| const input = page.window.document.querySelector("#alarmSet"); | ||
| const button = page.window.document.querySelector("#set"); | ||
|
|
||
| input.value = "19"; | ||
| button.click(); | ||
| jest.runOnlyPendingTimers(); | ||
|
|
||
| expect(heading).toHaveTextContent("Time Remaining: 00:19"); | ||
| expect(heading).toHaveTextContent("Time Remaining: 00:18"); | ||
| }); | ||
|
|
||
| test("should split values over 60 seconds into minutes and seconds", () => { | ||
|
|
@@ -53,52 +57,6 @@ test("should split values over 60 seconds into minutes and seconds", () => { | |
|
|
||
| input.value = "119"; | ||
| button.click(); | ||
| jest.runOnlyPendingTimers(); | ||
|
|
||
| expect(heading).toHaveTextContent("Time Remaining: 01:59"); | ||
| }); | ||
|
|
||
| test("should update the heading while counting down", () => { | ||
| const heading = page.window.document.querySelector("#timeRemaining"); | ||
| const input = page.window.document.querySelector("#alarmSet"); | ||
| const button = page.window.document.querySelector("#set"); | ||
|
|
||
| input.value = "19"; | ||
| button.click(); | ||
|
|
||
| for (let i = 18; i > 0; i--) { | ||
| jest.runOnlyPendingTimers(); | ||
| const seconds = `${i}`.padStart(2, "0"); | ||
| expect(heading).toHaveTextContent(`Time Remaining: 00:${seconds}`); | ||
| } | ||
| }); | ||
|
|
||
| test("should count down every 1000 ms", () => { | ||
| const input = page.window.document.querySelector("#alarmSet"); | ||
| const button = page.window.document.querySelector("#set"); | ||
|
|
||
| const mockTimer = jest.fn(); | ||
| page.window.setTimeout = mockTimer; | ||
| page.window.setInterval = mockTimer; | ||
|
|
||
| input.value = "19"; | ||
| button.click(); | ||
|
|
||
| expect(mockTimer).toHaveBeenCalledTimes(1); | ||
| expect(mockTimer).toHaveBeenLastCalledWith(expect.any(Function), 1000); | ||
| }); | ||
|
|
||
| test("should play audio when the timer reaches zero", () => { | ||
| const input = page.window.document.querySelector("#alarmSet"); | ||
| const button = page.window.document.querySelector("#set"); | ||
| const mockPlayAlarm = jest.fn(); | ||
|
|
||
| page.window.playAlarm = mockPlayAlarm; | ||
| input.value = "10"; | ||
| button.click(); | ||
|
|
||
| expect(mockPlayAlarm).toHaveBeenCalledTimes(0); | ||
|
|
||
| jest.runAllTimers(); | ||
|
|
||
| expect(mockPlayAlarm).toHaveBeenCalledTimes(1); | ||
| }); | ||
| expect(heading).toHaveTextContent("Time Remaining: 01:58");}); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You shouldn't change tests to make your code pass them - tests are there to tell you when things are wrong so you can fix them. |
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,20 +1,25 @@ | ||
| <!DOCTYPE html> | ||
| <html lang="en"> | ||
| <head> | ||
| <meta charset="utf-8" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||
| <link rel="stylesheet" href="style.css" /> | ||
| <title>Title here</title> | ||
| </head> | ||
| <body> | ||
| <div class="centre"> | ||
| <h1 id="timeRemaining">Time Remaining: 00:00</h1> | ||
| <label for="alarmSet">Set time to:</label> | ||
| <input id="alarmSet" type="number" /> | ||
|
|
||
| <button id="set" type="button">Set Alarm</button> | ||
| <button id="stop" type="button">Stop Alarm</button> | ||
| </div> | ||
| <script src="alarmclock.js"></script> | ||
| </body> | ||
| </html> | ||
| <head> | ||
| <meta charset="utf-8" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||
| <link rel="stylesheet" href="style.css" /> | ||
| <title>Alarm clock app</title> | ||
| <audio id="alarmAudio" src="alarmsound.mp3"></audio> | ||
| </head> | ||
|
|
||
| <body> | ||
| <div class="centre"> | ||
| <h1 id="timeRemaining">Time Remaining: 00:00</h1> | ||
| <label for="alarmSet">Set time to:</label> | ||
| <input id="alarmSet" type="number" /> | ||
|
|
||
| <button id="set" type="button">Set Alarm</button> | ||
| <button id="stop" type="button">Stop Alert</button> | ||
| <audio id="alarmAudio" src="alarmsound.mp3"></audio> | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Looks good |
||
| </div> | ||
| <script src="alarmclock.js"></script> | ||
| </body> | ||
|
|
||
| </html> | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -6,10 +6,36 @@ | |
| transform: translate(-50%, -50%); | ||
| } | ||
|
|
||
| #alarmSet { | ||
| margin: 20px; | ||
|
|
||
| label { | ||
| color: #e18a42; | ||
| font-size: 1.5em; | ||
| text-align: center; | ||
| } | ||
|
|
||
| h1 { | ||
| color: #f79732; | ||
| font-size: 3em; | ||
| text-align: center; | ||
| } | ||
|
|
||
| button { | ||
| background-color: #f6f18b; | ||
| color: rgb(237, 131, 10); | ||
| font-size: 1.5em; | ||
| border: none; | ||
| border-radius: 10px; | ||
| } | ||
|
|
||
| #alarmSet { | ||
| margin: 50px; | ||
| } | ||
|
|
||
| /* Additional styles */ | ||
| body { | ||
| background-color: #f7b2fc; | ||
| } | ||
|
|
||
| .container-title { | ||
| color: #ece163; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. All CSS looking good |
||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The parseInt function doesn't need the second param to be specfied for this use case - have a look at https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt to find out why