Kombai Logo

Building a Step-Based File Upload Progress with React MUI

When developing modern web applications, providing visual feedback during file uploads is crucial for a good user experience. Users want to know how their upload is progressing, especially for larger files. Material UI (MUI) offers several progress components that can be leveraged to create intuitive and visually appealing upload indicators.

In this comprehensive guide, I'll walk you through building a step-based file upload progress system using React MUI's Progress components. By the end of this tutorial, you'll understand how to implement a robust file upload interface with real-time progress tracking, error handling, and a polished user experience.

What You'll Learn

  • Understanding MUI's various Progress components and their use cases
  • Building a multi-step file upload progress indicator
  • Implementing real-time progress updates with axios interceptors
  • Handling upload states (pending, uploading, success, error)
  • Customizing Progress components with MUI theming and styling
  • Creating accessible progress indicators
  • Best practices for file upload UX

Deep Dive into MUI Progress Components

Before we start building, let's understand the Progress components offered by MUI. Material UI provides two main types of progress indicators: determinate and indeterminate.

Linear Progress Component

The LinearProgress component is a horizontal progress indicator that represents the completion of a process. It's perfect for file uploads as it clearly shows the percentage of completion.

Key Props

PropTypeDefaultDescription
colorstring'primary'The color of the component. Options include 'primary', 'secondary', 'error', 'info', 'success', 'warning', or a custom color.
valuenumber0The value of the progress indicator for the determinate variant (0-100).
variantstring'indeterminate'The variant to use. Options include 'determinate', 'indeterminate', 'buffer', or 'query'.
valueBuffernumber-The value for the buffer variant (used for the buffer bar).
sxobject-The system prop that allows defining custom styles.

Variants

  1. Determinate: Shows a fixed progress value (0-100). Perfect for when you know the exact progress percentage.
  2. Indeterminate: Continuously animates, suitable when progress isn't quantifiable.
  3. Buffer: Shows both progress and a buffer bar, useful for streaming operations.
  4. Query: Indicates a loading state before the progress starts.

Circular Progress Component

The CircularProgress component displays a circular animation. It's useful for compact spaces or as a more subtle indicator.

Key Props

PropTypeDefaultDescription
colorstring'primary'The color of the component. Options include 'primary', 'secondary', 'error', 'info', 'success', 'warning', or a custom color.
sizenumber | string40The size of the circle (in pixels or with CSS unit).
thicknessnumber3.6The thickness of the circle (as a percentage of size).
valuenumber0The value of the progress indicator for the determinate variant (0-100).
variantstring'indeterminate'The variant to use. Options include 'determinate' or 'indeterminate'.
disableShrinkbooleanfalseIf true, the shrink animation won't be applied (indeterminate variant only).

Accessibility Considerations

Both progress components are designed with accessibility in mind. They include appropriate ARIA attributes by default:

  • role="progressbar" is automatically applied
  • aria-valuenow, aria-valuemin, and aria-valuemax are set for determinate variants
  • For indeterminate variants, aria-busy="true" is used

However, you should also consider adding descriptive text for screen readers:

Step-by-Step Guide: Building a File Upload Progress System

Now that we understand the components, let's build a complete file upload system with progress tracking. We'll break this down into manageable steps.

Step 1: Setting Up the Project

First, let's create a new React project and install the necessary dependencies.

These packages provide:

  • MUI components and styling system
  • Icon components for visual indicators
  • Axios for handling HTTP requests with progress tracking

Step 2: Creating the File Upload Component Structure

Let's start by creating a basic file upload component with a dropzone area and progress indicator.

This component sets up:

  • A styled dropzone area for file selection
  • States to track the selected file, upload progress, and status
  • A progress bar that will display during upload
  • Status alerts for success and error states

Step 3: Implementing File Upload with Progress Tracking

Now, let's implement the actual file upload functionality with progress tracking using Axios.

This implementation:

  • Creates a FormData object to send the file
  • Uses Axios's onUploadProgress callback to track and update progress
  • Handles success and error states appropriately
  • Sets the uploading state to false when complete

Step 4: Creating a Multi-Step Upload Progress Indicator

Let's enhance our uploader with a multi-step progress indicator that shows different stages of the upload process.

This enhanced component:

  • Uses a Stepper to show the different stages of the upload process
  • Provides visual feedback at each step
  • Simulates a complete upload flow including server-side processing
  • Handles errors at any stage
  • Allows restarting the process

Step 5: Integrating with Your App

Now, let's integrate our uploader into the main App component:

This App component:

  • Sets up a custom theme for consistent styling
  • Creates a tabbed interface to showcase both uploader variants
  • Provides a clean, responsive container for our components

Step 6: Creating a Custom Progress Component

Let's create a more advanced custom progress component that combines both linear and circular progress indicators for a richer UI:

Now let's integrate this custom component into our StepProgressUploader:

This custom component:

  • Combines circular and linear progress for a more engaging UI
  • Provides configurable options for size, thickness, and labels
  • Maintains accessibility with appropriate ARIA attributes
  • Can be easily reused throughout your application

Step 7: Implementing a Chunked File Upload with Progress

For large files, chunked uploads are more reliable. Let's implement a chunked upload with progress tracking:

This chunked uploader:

  • Divides large files into manageable chunks (1MB by default)
  • Tracks both overall progress and individual chunk uploads
  • Simulates a complete chunked upload flow
  • Provides detailed progress information to the user

Step 8: Implementing Drag and Drop Functionality

Let's enhance our uploader with proper drag and drop support:

This drag and drop uploader:

  • Provides visual feedback when files are dragged over the drop zone
  • Handles all the necessary drag and drop events
  • Uses smooth transitions for a polished user experience
  • Integrates with our custom progress indicator

Advanced Customization and Theming

MUI's progress components can be extensively customized using the theme system and the sx prop. Let's explore some advanced customization options.

Custom Progress Colors and Animations

Creating a Themed Progress Bar Component

This ThemedProgress component:

  • Changes color based on the progress value
  • Supports different sizes
  • Includes an optional label with percentage display
  • Uses custom styling via the sx prop

Best Practices and Common Issues

When implementing file uploads with progress indicators, there are several best practices to follow and common issues to avoid.

Best Practices

  1. Provide Clear Feedback

    • Always show the current progress percentage
    • Include file name and size information
    • Indicate when processing is happening on the server side
  2. Handle Edge Cases

    • Implement proper error handling for network issues
    • Allow users to retry failed uploads
    • Provide clear error messages when uploads fail
  3. Optimize for Large Files

    • Use chunked uploads for large files
    • Implement resumable uploads when possible
    • Consider implementing file compression before upload
  4. Accessibility Considerations

    • Ensure progress indicators have proper ARIA attributes
    • Provide text alternatives for visual indicators
    • Make sure keyboard users can interact with upload controls
  5. Performance Optimizations

    • Debounce progress updates for smoother animations
    • Avoid unnecessary re-renders during progress updates
    • Use web workers for heavy client-side processing

Common Issues and Solutions

Issue: Progress Jumps or Appears Inconsistent

Solution: Use a throttled or debounced update function to smooth out progress updates:

Issue: No Progress Events in Some Browsers or Network Conditions

Solution: Implement a fallback indeterminate progress:

Issue: Memory Leaks from Progress Updates after Component Unmount

Solution: Use a cleanup function with useEffect:

Issue: Progress Resets on Network Fluctuations

Solution: Implement a progress that never decreases during a single upload:

Wrapping Up

In this comprehensive guide, we've explored how to use React MUI's Progress components to build a robust and user-friendly file upload system. We've covered everything from basic progress indicators to advanced multi-step uploaders with chunked file handling.

By leveraging MUI's flexible components and styling system, we've created visually appealing and accessible progress indicators that provide clear feedback to users during the upload process. We've also addressed common challenges and best practices to ensure your implementation is reliable and performant.

The techniques demonstrated here can be adapted for various use cases beyond file uploads, such as form submissions, data processing, or any long-running operation where visual feedback improves the user experience.