🌐
50 React Coding Puzzles
  • 50 React Coding Puzzles
  • Contact
  • Reviews
  • Table of Contents
  • Introduction
  • 1 - Simple Counter App
  • 2 - Dynamic List of Items with Strikethrough
  • 3 - Color Picker with Hex Code Display
  • 4 - Password Strength Checker
  • 5 - Countdown Timer with Audio
  • 6 - Dynamic Movie List with Filtering and Sorting
  • 7 - Text Animation Component (Fade/Scroll)
  • 8 - Dynamically Generated Text Art
  • 9 - Meme Generator with Custom Text
  • 10 - "What Should I Eat?" Random Recipe Generator
  • 11 - Simple Quiz App with Multiple Choice
  • 12 - Unit Converter
  • 13 - Dynamic Image Gallery with Lightbox
  • 14 - Weather Widget with Temperature and Description
  • 15 - Contact Form with Email and Message Validation
  • 16 - Color Palette Generator
  • 17 - Drag-and-Drop Feature for Rearranging Items
  • 18 - Interactive Quiz with Dynamic Results and Feedback
  • 19 - To-Do List with Task Categorization
  • 20 - Note-Taking App with Markdown Support
  • 21 - Simple Calculator with Basic Operations
  • 22 - Word Scramble Game with Timer and Score
  • 23 - Number Guessing Game
  • 24 - Digital Clock with Time Zone Support
  • 25 - Interactive Time Zone Converter
  • 26 - Weather Forecast App with Location Detection
  • 27 - Real-Time Stock Ticker with Updates
  • 28 - Virtual Dice Roller with Multiple Dice
  • 29 - Responsive Navigation Menu with Dropdowns
  • 30 - Progress Bar for Loading or Task Completion
  • 31 - Modal Window for Alerts and Confirmations
  • 32 - Infinite Scroll for Loading More Content
  • 33 - Form Validation with Error Messages
  • 34 - Search Bar with Filtering and Suggestions
  • 35 - Drag-and-Drop File Upload
  • 36 - Interactive Color Picker with Sliders
  • 37 - Image Carousel with Autoplay
  • 38 - Rating System with Stars or Thumbs Up/Down
  • 39 - Comment Section with Nested Replies
  • 40 - Pagination for Long Lists of Data
  • 41 - Stopwatch app that tracks elapsed time
  • 42 - Responsive E-commerce Product Grid
  • 43 - Random Movie/Book Recommender
  • 44 - Kanban board for managing tasks with drag-and-drop
  • 45 - Chat application with real-time messaging using WebSockets
  • 46 - Calendar that displays events and allows scheduling
  • 47 - Tic-Tac-Toe Game
  • 48 - Hangman Game
  • 49 - Notes App
  • 50 - Expense Tracker
  • Afterword
  • Appendix
Powered by GitBook
On this page
  • Description
  • Algorithm
  • Classes
  • Code
  • Explanation
  • Possible Future Enhancements

41 - Stopwatch app that tracks elapsed time

Description

Create a stopwatch app that tracks elapsed time, visually displays the elapsed time in a clear format (minutes, seconds, milliseconds), offers start, stop, and reset buttons, continues to count time even when the browser tab is inactive, measures lap times, and sounds alerts.

Algorithm

  1. Create a React component for the stopwatch app

  2. Define the state variables for the elapsed time, lap times, and timer status

  3. Use the useState hook to manage the state variables

  4. Create functions for starting, stopping, and resetting the timer

  5. Create a function for measuring lap times

  6. Use the useEffect hook to update the elapsed time and lap times

  7. Render the stopwatch display, buttons, and lap times list

Classes

  • Stopwatch: The main stopwatch component

  • StopwatchDisplay: The component that displays the elapsed time

  • StopwatchButtons: The component that renders the start, stop, and reset buttons

  • LapTimesList: The component that displays the lap times list

Code

Stopwatch.js

import React, { useState, useEffect } from 'react';
import StopwatchDisplay from './StopwatchDisplay';
import StopwatchButtons from './StopwatchButtons';
import LapTimesList from './LapTimesList';

const Stopwatch = () => {
  const [elapsedTime, setElapsedTime] = useState(0);
  const [lapTimes, setLapTimes] = useState([]);
  const [timerStatus, setTimerStatus] = useState('stopped');

  const startTimer = () => {
    setTimerStatus('running');
  };

  const stopTimer = () => {
    setTimerStatus('stopped');
  };

  const resetTimer = () => {
    setElapsedTime(0);
    setLapTimes([]);
    setTimerStatus('stopped');
  };

  const measureLapTime = () => {
    const lapTime = elapsedTime;
    setLapTimes([...lapTimes, lapTime]);
  };

  useEffect(() => {
    let intervalId;
    if (timerStatus === 'running') {
      intervalId = setInterval(() => {
        setElapsedTime(elapsedTime + 1);
      }, 10);
    }
    return () => clearInterval(intervalId);
  }, [timerStatus, elapsedTime]);

  return (
    <div>
      <StopwatchDisplay elapsedTime={elapsedTime} />
      <StopwatchButtons
        startTimer={startTimer}
        stopTimer={stopTimer}
        resetTimer={resetTimer}
        measureLapTime={measureLapTime}
      />
      <LapTimesList lapTimes={lapTimes} />
    </div>
  );
};

export default Stopwatch;

StopwatchDisplay.js

import React from 'react';

const StopwatchDisplay = ({ elapsedTime }) => {
  const minutes = Math.floor(elapsedTime / 60000);
  const seconds = Math.floor((elapsedTime % 60000) / 1000);
  const milliseconds = elapsedTime % 1000;

  return (
    <div>
      <span>{minutes.toString().padStart(2, '0')}:</span>
      <span>{seconds.toString().padStart(2, '0')}:</span>
      <span>{milliseconds.toString().padStart(3, '0')}</span>
    </div>
  );
};

export default StopwatchDisplay;

StopwatchButtons.js

import React from 'react';

const StopwatchButtons = ({
  startTimer,
  stopTimer,
  resetTimer,
  measureLapTime,
}) => {
  return (
    <div>
      <button onClick={startTimer}>Start</button>
      <button onClick={stopTimer}>Stop</button>
      <button onClick={resetTimer}>Reset</button>
      <button onClick={measureLapTime}>Lap</button>
    </div>
  );
};

export default StopwatchButtons;

LapTimesList.js

import React from 'react';

const LapTimesList = ({ lapTimes }) => {
  return (
    <ul>
      {lapTimes.map((lapTime, index) => (
        <li key={index}>{lapTime}</li>
      ))}
    </ul>
  );
};

export default LapTimesList;

Explanation

The code creates a stopwatch app that tracks elapsed time, visually displays the elapsed time in a clear format (minutes, seconds, milliseconds), offers start, stop, and reset buttons, continues to count time even when the browser tab is inactive, measures lap times, and sounds alerts. The component uses the useState hook to manage the state variables and the useEffect hook to update the elapsed time and lap times.

Possible Future Enhancements

  • Add support for custom timer intervals

  • Add support for timer notifications

  • Add support for timer statistics (e.g. average lap time)

Previous40 - Pagination for Long Lists of DataNext42 - Responsive E-commerce Product Grid

Last updated 10 months ago