<div id="countdown-container">
  <h1>Countdown Timer</h1>

  <div id="timer-input-container">
    <input id="hour" minlength="2" maxlength="2" placeholder="HH" />
    :
    <input id="minute" minlength="2" maxlength="2" placeholder="MM" />
    :
    <input id="second" minlength="2" maxlength="2" placeholder="SS" />
    <button id="start">Start</button>
  </div>

  <div id="timer-display-container" class="hidden">
    <span id="hour-display"></span>
    :
    <span id="minute-display"></span>
    :
    <span id="second-display"></span>

    <button id="pause">Pause</button>
    <button id="resume" class="hidden">Start</button>
    <button id="reset">Reset</button>
  </div>

</div>
body {
  font-family: "Arial", cursive;
}

#countdown-container {
  text-align: center;
}

.hidden {
  display: none;
}

input {
  width: 30px;
}
/*
 * https://frontendeval.com/questions/countdown-timer
 *
 * Create a countdown timer that notifies the user
 */

let hourState = 0;
let minuteState = 0;
let secondState = 0;

const startBtn = document.getElementById("start");
const resetBtn = document.getElementById("reset");
const pauseBtn = document.getElementById("pause");
const resumeBtn = document.getElementById("resume");

const timerInputContainer = document.getElementById("timer-input-container");
const timerDisplayContainer = document.getElementById(
  "timer-display-container"
);

const hourInput = document.getElementById("hour");
const minuteInput = document.getElementById("minute");
const secondInput = document.getElementById("second");

const hourDisplay = document.getElementById("hour-display");
const minuteDisplay = document.getElementById("minute-display");
const secondDisplay = document.getElementById("second-display");

const onChangeInput = (e, inputElem) => {
  inputElem.value = e.target.value;
};

hourInput.addEventListener("input", (e) => {
  onChangeInput(e, hourInput);
});

minuteInput.addEventListener("input", (e) => {
  onChangeInput(e, minuteInput);
});

secondInput.addEventListener("input", (e) => {
  onChangeInput(e, secondInput);
});

let intervalId;

const displayValue = (value) => {
  let valueStr = `${value}`;

  if (value < 10) {
    valueStr = `0${valueStr}`;
  }

  return valueStr;
};

const handleDisplayValue = () => {
  hourDisplay.textContent = displayValue(hourState);
  minuteDisplay.textContent = displayValue(minuteState);
  secondDisplay.textContent = displayValue(secondState);
};

const handleCountDown = () => {
  if (hourState > 0) {
    if (minuteState === 0 && secondState === 0) {
      hourState--;
      minuteState = 60;
    }
  }

  if (minuteState > 0) {
    if (secondState === 0) {
      minuteState--;
      secondState = 60;
    }
  }

  secondState--;
};

const handleReset = () => {
  hourInput.value = "";
  minuteInput.value = "";
  secondInput.value = "";

  hourState = 0;
  minuteState = 0;
  secondState = 0;
};

const handleTimesUp = () => {
  if (hourState === 0 && minuteState === 0 && secondState === 0) {
    clearInterval(intervalId);
    setTimeout(() => {
      if (window.confirm("Time is up!")) {
        timerDisplayContainer.classList.add("hidden");
        timerInputContainer.classList.remove("hidden");
      } else {
        timerDisplayContainer.classList.add("hidden");
        timerInputContainer.classList.remove("hidden");
      }

      handleReset();
    }, 0);
  }
};

const intervalCallback = () => {
  handleCountDown(hourState, minuteState, secondState);
  handleDisplayValue();
  handleTimesUp();
};

startBtn.addEventListener("click", () => {
  timerDisplayContainer.classList.remove("hidden");
  timerInputContainer.classList.add("hidden");

  hourState = Number(hourInput.value);
  minuteState = Number(minuteInput.value);
  secondState = Number(secondInput.value);

  handleDisplayValue();

  intervalId = setInterval(() => intervalCallback(), 1000);
});

pauseBtn.addEventListener("click", () => {
  pauseBtn.classList.add("hidden");
  resumeBtn.classList.remove("hidden");

  clearInterval(intervalId);
});

resumeBtn.addEventListener("click", () => {
  pauseBtn.classList.remove("hidden");
  resumeBtn.classList.add("hidden");

  intervalId = setInterval(() => intervalCallback(), 1000);
});

resetBtn.addEventListener("click", () => {
  clearInterval(intervalId);

  timerDisplayContainer.classList.add("hidden");
  timerInputContainer.classList.remove("hidden");

  handleReset();
});
View Compiled
Run Pen

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.