Build a Countdown timer using React & React Hooks

Web Development

Description

In this Web Development tutorial we are going to create a countdown timer using the React JavaScript librari / framework and also using React Hock like useState and useEffect

Donation!

pexels-chevanon-photography-312418

Buy me a Coffee

Hi, if you like my content and you wish to give back you can buy me a Coffee!

$3.00

Buy me a Pizza

Hi, if you like my content and you wish to give back you can buy me a Pizza!

$7.00

Content of this tutorial

What is a Hook?

 A Hook is a special function that lets you “hook into” React features. For example, useState is a Hook that lets you add React state to function components. We’ll learn other Hooks later.

When would I use a Hook?

 If you write a function component and realize you need to add some state to it, previously you had to convert it to a class. Now you can use a Hook inside the existing function component. We’re going to do that right now!

need to have node.js and npm installed:

React doc:

  • npx create-react-app .
  • npm start to start the server
  • React hooks used:
  • useState
  • useEffect

App.js Code:

import "./App.css";
import React, { useState, useEffect } from "react";
import Clock from "./Components/Clock";

function App() {
  const [timerDays, setTimerDays] = useState();
  const [timerHours, setTimerHours] = useState();
  const [timerMinutes, setTimerMinutes] = useState();
  const [timerSeconds, setTimerSeconds] = useState();

  let interval;

  const startTimer = () => {
    const countDownDate = new Date("May 30,2021 ").getTime();

    interval = setInterval(() => {
      const now = new Date().getTime();

      const distance = countDownDate - now;

      const days = Math.floor(distance / (24 * 60 * 60 * 1000));
      const hours = Math.floor(
        (distance % (24 * 60 * 60 * 1000)) / (1000 * 60 * 60)
      );
      const minutes = Math.floor((distance % (60 * 60 * 1000)) / (1000 * 60));
      const seconds = Math.floor((distance % (60 * 1000)) / 1000);

      if (distance < 0) {
        // Stop Timer

        clearInterval(interval.current);
      } else {
        // Update Timer
        setTimerDays(days);
        setTimerHours(hours);
        setTimerMinutes(minutes);
        setTimerSeconds(seconds);
      }
    });
  };

  useEffect(() => {
    startTimer();
  });

  return (
    <div className="App">
      <Clock
        timerDays={timerDays}
        timerHours={timerHours}
        timerMinutes={timerMinutes}
        timerSeconds={timerSeconds}
      />
    </div>
  );
}

export default App;

App.css Code:


* {
  margin: 0;
  padding: 0;
}

.App {
  text-align: center;
  height: 100vh;
  background-color: #282c34;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}

.clock {
  position: relative;
  margin: a;
  display: flex;
  justify-content: center;
  align-items: center;
  background: linear-gradient(270deg, #051817, #0e3839);
  height: 180px;
  width: 360px;
  color: #06f1f6;
  text-shadow: 1px 1px 7px;
  border-radius: 15px;
  border: 2px solid silver;
  box-shadow: 0 0 5px 25px;
}

.clock section {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  padding: 1rem;
}
.clock section p {
  font-size: 4rem;
}
.clock section small {
  color: silver;
  text-shadow: none;
}
.App-logo {
  height: 40vmin;
  pointer-events: none;
}

@media (prefers-reduced-motion: no-preference) {
  .App-logo {
    animation: App-logo-spin infinite 20s linear;
  }
}

.App-header {
  background-color: #282c34;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  font-size: calc(10px + 2vmin);
  color: white;
}

.App-link {
  color: #61dafb;
}

@keyframes App-logo-spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}


Component: Arrays

import React, { Fragment } from "react";

const Clock = ({ timerDays, timerHours, timerMinutes, timerSeconds }) => {
  return (
    <Fragment>
      <section className="timer-container">
        <section className="timer">
          <div className="clock">
            <section>
              <p>{timerDays}</p>
              <small>Days</small>
            </section>
            <span>:</span>
            <section>
              <p>{timerHours}</p>
              <small>Hours</small>
            </section>{" "}
            <span>:</span>
            <section>
              <p>{timerMinutes}</p>
              <small>Minutes</small>
            </section>{" "}
            <span>:</span>
            <section>
              <p>{timerSeconds}</p>
              <small>Seconds</small>
            </section>
          </div>
        </section>
      </section>
    </Fragment>
  );
};

Clock.defaultProps = {
  timerDays: 10,
  timerHours: 10,
  timerMinutes: 10,
  timerSeconds: 10,
};

export default Clock;


For more information about JavaScript get the Complete Modern JavaScript Course NOW and become a javascript developer

https://norbertbm.com/web-development/web-dev-courses/

Modern JavaScript and NodeJS from Beginner to Advanced

Popular course:

https://www.udemy.com/course/30-html-css-javascript-projects-in-30-days-for-beginners/?couponCode=APR2021

30 HTML, CSS & JavaScript projects in 30 Days for Beginners

4 thoughts on “Build a Countdown timer using React & React Hooks

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.