DEV Community

Cover image for React Custom Hooks (useCounter)
sundarbadagala
sundarbadagala

Posted on

React Custom Hooks (useCounter)

INTRO ๐Ÿ””

Hello World! ๐Ÿ‘‹
Today we are discussing another custom hook ๐Ÿช named useCounter๐Ÿ”ฅ. In this post, we will discuss useCounter๐Ÿ”ฅ hook code and use case.

USAGE ๐Ÿ””

Sometimes in Frontend development, we need to use count down or counter or time. That counter may have some restrictions like no need to update on refreshing the page i.e. If the counter starts with 30 and decreases one by one with one one-second interval, It should not start from 30 again after refreshing the page. ๐Ÿ‘‰๐ŸปSession Storage๐Ÿ‘ˆ๐Ÿป is a beautiful property in a browser that will help us to overcome this problem. Let's look deep into the code ๐Ÿš€.

CODE ๐Ÿ””

import { useEffect, useState } from 'react';

export const useCounter = (inititalCounter = 30, sessionName = 'count_timer') => {
  const [counter, setCounter] = useState('');
  useEffect(() => {
    const value = sessionStorage.getItem(sessionName);
    if (value) {
      setCounter(value);
    } else {
      sessionStorage.setItem(sessionName, inititalCounter);
      setCounter(inititalCounter)
    }
  }, []);
  useEffect(() => {
    const interval = setInterval(() => {
      setCounter(prev => prev - 1);
    }, 1000);
    return () => {
      clearInterval(interval);
    };
  }, []);
  useEffect(() => {
    return () => {
      if (counter < 1) {
        sessionStorage.setItem(sessionName, inititalCounter);
      } else {
        sessionStorage.setItem(sessionName, counter - 1);
      }
    };
  }, [counter]);
  const handleReset = () => {
    setCounter(inititalCounter + 1);
  };
  return [counter > inititalCounter ? inititalCounter : counter, handleReset];
};
Enter fullscreen mode Exit fullscreen mode

USE CASE

import React from "react";
import { useCounter } from "./useCounter";

function App() {
  const [counter, handleReset] = useCounter(30);
  return (
    <div>
      {counter}
      <button onClick={handleReset}>reset</button>
    </div>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

CONCLUSION ๐Ÿ””

I hope this post is helpful ๐Ÿ˜Š and helps to use a counter in frontend development ๐Ÿง‘๐Ÿปโ€๐Ÿ’ป. We will meet with another hook in the next post.

Peace ๐Ÿ™‚

Top comments (0)