Fri Aug 09 2024
How to Create Countdown Timer in React Component
Next.JS125 views
If you want to launch a new site or add new pages, a countdown timer is a great way to inform your users that your site is under construction and will be live soon. It creates anticipation and keeps visitors engaged, especially when paired with a visually appealing under-construction page. Here, we'll walk through a simple countdown timer component of a Next.js and TailwindCSS project.
Time left calculation from millisecond
const dys = Math.floor(difference / (1000 * 60 * 60 * 24));
const hrs = Math.floor((difference / (1000 * 60 * 60)) % 24);
const mnt = Math.floor((difference / (1000 * 60)) % 60);
const snd = Math.floor((difference / 1000) % 60);
File Name: timer.tsx
"use client";
import { useEffect, useState } from "react";
interface TimeCount {
days: string;
hours: string;
minutes: string;
seconds: string;
}
const getTimeLeft = (expiry: string): TimeCount => {
let days = "0";
let hours = "0";
let minutes = "0";
let seconds = "0";
const difference = new Date(expiry).getTime() - new Date().getTime();
if (difference <= 0) {
return {
days,
hours,
minutes,
seconds,
};
}
const dys = Math.floor(difference / (1000 * 60 * 60 * 24));
const hrs = Math.floor((difference / (1000 * 60 * 60)) % 24);
const mnt = Math.floor((difference / (1000 * 60)) % 60);
const snd = Math.floor((difference / 1000) % 60);
days = dys < 10 ? `0${dys}` : dys.toString();
hours = hrs < 10 ? `0${hrs}` : hrs.toString();
minutes = mnt < 10 ? `0${mnt}` : mnt.toString();
seconds = snd < 10 ? `0${snd}` : snd.toString();
return {
days,
hours,
minutes,
seconds,
};
};
const Timer = ({ launchDate }: { launchDate: string }) => {
const [timeLeft, setTimeLeft] = useState<TimeCount>(getTimeLeft(launchDate));
useEffect(() => {
const interval = setInterval(() => {
setTimeLeft(getTimeLeft(launchDate));
}, 1000);
}, [launchDate]);
return (
<div className="flex justify-center lg:justify-start mt-10 gap-3">
<span className="flex flex-col justify-center items-center bg-black text-yellow text-3xl lg:text-5xl w-36 py-3 shadow-lg rounded-lg">
{timeLeft.days}
<small className="text-xs lg:text-sm uppercase font-semibold text-white">
Days
</small>
</span>
<span className="flex flex-col justify-center items-center bg-black text-yellow text-3xl lg:text-5xl w-36 py-3 shadow-lg rounded-lg">
{timeLeft.hours}
<small className="text-xs lg:text-sm uppercase font-semibold text-white">
Hours
</small>
</span>
<span className="flex flex-col justify-center items-center bg-black text-yellow text-3xl lg:text-5xl w-36 py-3 shadow-lg rounded-lg">
{timeLeft.minutes}
<small className="text-xs lg:text-sm uppercase font-semibold text-white">
Minutes
</small>
</span>
<span className="flex flex-col justify-center items-center bg-black text-yellow text-3xl lg:text-5xl w-36 py-3 shadow-lg rounded-lg">
{timeLeft.seconds}
<small className="text-xs lg:text-sm uppercase font-semibold text-white">
Seconds
</small>
</span>
</div>
);
};
export default Timer;
Reference:
Download the full project from WebGraphiz.com
Author:Geekboots