diff --git a/assets/js/scripts/app.js b/assets/js/scripts/app.js index b666db1..a41893a 100644 --- a/assets/js/scripts/app.js +++ b/assets/js/scripts/app.js @@ -1,13 +1,12 @@ // Register Service Worker // window.onload = () => { - 'use strict'; + "use strict"; - if ('serviceWorker' in navigator) { - navigator.serviceWorker - .register('./sw.js'); + if ("serviceWorker" in navigator) { + navigator.serviceWorker.register("./sw.js"); } -} +}; //get today's date for all kinds of function let currentHour = new Date().getHours(); @@ -21,23 +20,10 @@ currDate.setHours(0, 0, 0, 0); // generate current streakBar based on localStorage let streak = 0; -let streakBar = document.getElementById("streakbar"); +let streakBar = document.getElementById("streakbar"); // change it to streakBarElem - rename symbol let yourStreak = parseInt(localStorage.getItem("yourStreak")); let streakBarDummy = ""; -let sevenDayStreak = 7; -/** -for (var i = 0; i < sevenDayStreak; i++) { - if (yourStreak > 0) { - streakBarDummy += ''; - yourStreak -= 1; - } else { - streakBarDummy += ''; - } -} - */ - -// Using innerHTML without += to increase DOM Performances -streakBar.innerHTML = streakBarDummy; +const sevenDayStreak = 7; // Accessing the Quotes - How to work with APIs based on this tutorial https://www.taniarascia.com/how-to-use-the-javascript-fetch-api-to-get-json-data let quote; @@ -74,14 +60,16 @@ const ambientSound = new Howl({ autoplay: true, }); const endSound = new Howl({ - src: ["assets/media/sounds/endbell.webm", "assets/media/sounds/endbell.mp3"], + src: [ + "assets/media/sounds/endbell.webm", + "assets/media/sounds/endbell.mp3" + ], + html5: true, }); // Building a Timer /** * Define the meditation Time - * Define the warmup time - * define the cool down time * calculate total length * press play -> switch icon to pause & show reset button * count down 3 seconds @@ -96,21 +84,31 @@ const endSound = new Howl({ * store successfully finished session to local storage */ + + // Const const outline = document.querySelector(".moving-outline circle"); const outlineLength = outline.getTotalLength(); -let meditationTimeElem = document.querySelector(".meditationtime"); +// Global Variables let meditationDuration = 10; let meditationProgress = meditationDuration; let meditationTimer; let countdownTimer; +let timeLeft; +let currentTime = 0; +let progress; +let showCountDown = true; +let counter; +let countdownleft = 3; +let startSoundPlayed = false; + +// Elements / BTNs + +let meditationTimeElem = document.querySelector(".meditationtime"); let medTimeSetBtn = document.querySelectorAll(".meditationduration button"); let changeBackgroundBTN = document.querySelectorAll(".changebackground button"); let startStopButton = document.querySelector(".starttimer"); let startStopBtnIcon = startStopButton.querySelector("i"); -let timeLeft; -let currentTime = 0; -let progress; let status = startStopButton.getAttribute("data-status"); init(); @@ -120,22 +118,23 @@ init(); outline.style.strokeDasharray = outlineLength; outline.style.strokeDashoffset = outlineLength; -function animateCircle() {} - -// Updating the Meditation Duration based on settingsā€š +// Initiliazation of the App function init() { dateSetup(); timeSensitivBackground(currentHour); timerSettings(); controlTimer(); - streakInit() + streakInit(); checkStreak(); changeBackground(); updateStreakData(streak); } // Timer Settings +/** + * Setup the Timer after changes are made in the Modal Settings by the user + */ function timerSettings() { meditationTimeElem.textContent = `${Math.floor( @@ -161,7 +160,13 @@ function timerSettings() { }); } -// Control Start Stop Button +/** + * Control the timer based on the status + * Change Icons + * Stop Timer + * Reset Timer + * Start/Resume Timer + */ function controlTimer() { startStopButton.addEventListener("click", function () { @@ -193,16 +198,19 @@ function controlTimer() { }); } -// Reset Active State on none chosen Settings - +/** + * Remove the active state from all Timer Settings + * @param {Status} settingsTimer + */ function removeActive(settingsTimer) { settingsTimer.forEach((setting) => { setting.classList.remove("active"); }); } -// Counting down the meditationduration (Solution based on https://stackoverflow.com/questions/31106189/create-a-simple-10-second-countdown) -let startSoundPlayed = false; + + + function playStartSound() { if (!startSoundPlayed) { @@ -211,10 +219,14 @@ function playStartSound() { } } -let showCountDown = true; -let counter; -let countdownleft = 3; +/** Counting down the countdown & meditationduration + * (Solution based on https://stackoverflow.com/questions/31106189/create-a-simple-10-second-countdown) + * */ + /** + * Countdown is played before meditation starts + * Countdown is not played if it was completed and meditation is paused and resumed + */ function countDown() { counter = countdownleft; if (showCountDown) { @@ -241,6 +253,10 @@ function countDown() { showCountDown = false; } +/** + * Controling the Countdown and stopping it if the pause button was hit + * Timeleft is stored to resume the countdown after play button wass hit + */ function pauseCountdown() { console.log("nothing is happening"); clearInterval(countdownTimer); @@ -249,9 +265,13 @@ function pauseCountdown() { showCountDown = true; } +/** + * This function controls the meditation time incl. the coloring of the outline circle + */ function startTimer() { playStartSound(); meditationTimer = setInterval(function () { + // trying to also be prepared for unexpected edge cases in the if statement since meditationeProgress should never be smaller 0 if (meditationProgress <= 0) { progress = outlineLength - (currentTime / meditationDuration) * outlineLength; @@ -284,6 +304,9 @@ function startTimer() { }, 1000); } +/** + * Stopping the Timer if the settings are changed while the timer is running + */ function stopTimer() { clearInterval(meditationTimer); currentTime = 0; @@ -295,6 +318,9 @@ function stopTimer() { startStopBtnIcon.classList.add("fa-play"); } +/** + * After succesful meditation the timer can be reset + */ function resetTimer() { currentTime = 0; meditationProgress = meditationDuration; @@ -303,6 +329,10 @@ function resetTimer() { timerSettings(); } +/** + * The moment when the user hits the button the time left is stored, + * so that the user can continue right where they left + */ function pauseTimer() { clearInterval(meditationTimer); timeLeft = meditationProgress; @@ -312,23 +342,29 @@ function pauseTimer() { )}`; } -// Use Background based on Time or Settings +/** + * Depending on the day of time 0-12 and 12-24 a different background is presented + * @param {Integer} currentHour + */ function timeSensitivBackground(currentHour) { - console.log("current hours", currentHour) + console.log("current hours", currentHour); if (currentHour >= 0 && currentHour < 12) { // after Midnight and before 12:00PM document.getElementById("myDiv").style.backgroundImage = "url('assets/media/img/sunrise.jpg')"; - console.log("its morning") + console.log("its morning"); } else if (currentHour >= 12) { - // after 12:00P + // after 12:00PM and befor Midnight document.getElementById("myDiv").style.backgroundImage = "url('assets/media/img/afternoon.jpg')"; - console.log("its afternoon") + console.log("its afternoon"); } } +/** + * Enables the user to change background by herself + */ function changeBackground() { let bgimage = ""; changeBackgroundBTN.forEach((option) => { @@ -369,12 +405,18 @@ function changeBackground() { //Set streak (days completed) by converting locally stored value to Int +/** + * Calling and setting the date variables through their respective function + */ function dateSetup() { - setDates(); - setTodayDate(); - setOneDayAgo(); + setDates(); + setTodayDate(); + setOneDayAgo(); } +/** + * Define the various date variables + */ function setDates() { currDate = new Date(); currYear = currDate.getFullYear(); @@ -389,18 +431,26 @@ function setDates() { } } +/** + * Define the date of today + */ function setTodayDate() { - setDates(); - todayDate = currYear + "-" + currMonth + "-" + currDay; + setDates(); + todayDate = currYear + "-" + currMonth + "-" + currDay; } +/** + * Calculate and define yesterdays date + */ function setOneDayAgo() { - setDates(); - oneDayAgo = currYear + "-" + currMonth + "-" + (currDay - 1); -} - -//Sets a date value for the last day completed in, or marks it as Never. + setDates(); + oneDayAgo = currYear + "-" + currMonth + "-" + (currDay - 1); +} +/** + * Sets a date value for the last day completed in from the localStorage, or marks it as Never. + * Set a value for consecutives days from the localStorage, or define it as Never + */ function streakInit() { if (!localStorage.getItem("dateLastDone")) { dateLastDone = "Never"; @@ -413,29 +463,39 @@ function streakInit() { } } +/** + * Controlls the + */ function mediStreak() { localStorage.setItem("dateLastDone", todayDate); + // if streak is 6 the user reached a full week --> Streak completed and congratz shown if (streak == 6) { streak += 1; console.log("Congratz"); showCongratzPopup(); streakReset(); + // if streak is 0 the user just completed her first meditation } else if (streak === 0) { console.log("you did it the first time"); streak += 1; updateStreakData(streak); dateLastDone = localStorage.getItem("dateLastDone", todayDate); + // if streak bigger than 0 and dateLastDone from the localStorage are equal a succesful attempt is undertaken } else if (streak > 0 && dateLastDone == oneDayAgo) { console.log("you are getting there"); streak += 1; updateStreakData(streak); dateLastDone = localStorage.getItem("dateLastDone", todayDate); + // if streak bigger than 0 and dateLastDone equal to todays date the streak does not get increased } else if (streak > 0 && dateLastDone == todayDate) { console.log("you already did it today"); - updateStreakData(streak); + updateStreakData(streak); + // if none of the above works, the checkStreak() function is called to see if the streak was broken } else checkStreak(); } - +/** + * Compare the dates and see if the day-to-day streak was failed to complete + */ function checkStreak() { console.log("dateLastDone:", dateLastDone); console.log("oneDayAgo:", oneDayAgo); @@ -450,6 +510,9 @@ function checkStreak() { } } +/** + * Reset the streak if day-to-day streak was failed to complete + */ function streakReset() { localStorage.removeItem("dateLastDone"); localStorage.removeItem("yourStreak"); @@ -460,6 +523,11 @@ function streakReset() { updateStreakData(); } +/** + * Build the streak boxes in the streakbar section of the App + * @param {Integer} streak + */ + function updateStreakData(streak) { yourStreak = streak; streakBarDummy = ""; @@ -476,11 +544,18 @@ function updateStreakData(streak) { localStorage.setItem("yourStreak", streak); } +/** + * If user meditates 7 days in a row + * show modal with congratulation + */ function showCongratzPopup() { this.successModal = $("#streak-success"); this.successModal.modal("show"); } +/** + * Control the Whitenoise in the Settings + */ function controlAmbientSound() { let ambientnoise = ambientSound.playing(); if (ambientnoise) { @@ -490,7 +565,9 @@ function controlAmbientSound() { } } -/** Update Sound Volume **/ +/** + * Update Sound Volume + */ function updateVolume() { let volume = document.getElementById("myRange").value;