Skip to content

Documents Component

Overview

The Documents component is a React-based front-end module designed to serve as a navigation hub for various document-related functionalities. It displays a grid of document options when accessed directly at the /documents route and renders child routes (via <Outlet />) for specific document pages. The component uses React Router for navigation and is styled with Tailwind CSS for a responsive, modern UI. It also incorporates React Icons for visual enhancement.

Dependencies

  • React: For building the UI and managing component logic.
  • React Router: Provides useNavigate, useLocation, and Outlet for routing and navigation.
  • React Icons: For rendering icons from the react-icons/fa library.
  • Tailwind CSS: For styling the component.

Component Structure

The Documents component has two primary rendering modes:

  1. Document Grid (at /documents): Displays a grid of clickable cards, each representing a document-related feature (e.g., Transcript, ID Card, Fee Receipt).
  2. Child Route Rendering (at sub-routes): Renders the content of child routes (e.g., /documents/bonafide) using <Outlet />.

Code Explanation

Imports

import React from 'react';
import { useNavigate, useLocation, Outlet } from 'react-router-dom';
import { FaFileAlt, FaIdCard, FaPassport, FaCertificate, FaReceipt, FaArrowRight } from 'react-icons/fa';
  • React: Core library for building the component.
  • React Router:
  • useNavigate: For programmatic navigation to document sub-routes.
  • useLocation: To determine the current URL path.
  • Outlet: Renders child routes.
  • React Icons: Provides icons for each document type (e.g., FaFileAlt for Transcript) and navigation (FaArrowRight).

Component Definition

const Documents = () => {
    const navigate = useNavigate();
    const location = useLocation();
  • useNavigate: Provides the navigate function to redirect to sub-routes.
  • useLocation: Provides the location object to check the current path (location.pathname).

Conditional Rendering: Document Grid

if (location.pathname === '/documents') {
    const documents = [
        {
            title: "Transcript",
            path: "/documents/transcript",
            description: "Grade Card for all semesters - instant download",
            icon: <FaFileAlt className="text-blue-500 text-4xl mb-4" />
        },
        ...
        {
            title: "Other Forms",
            path: "/documents/othersform",
            description: "Download your forms",
            icon: <FaFileAlt className="text-yellow-500 text-4xl mb-4" />
        }
    ];

    return (
        <div className="min-h-screen py-10 px-4 sm:px-6 lg:px-8">
            <div className="container mx-auto">
                <h1 className="text-4xl font-extrabold text-center text-gray-800 mb-12">
                    Documents
                </h1>
                <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8">
                    {documents.map((doc) => (
                        <div
                            key={doc.path}
                            className="bg-white p-6 rounded-xl shadow-lg cursor-pointer
                                       hover:shadow-2xl hover:scale-105
                                       transform transition-all duration-300 ease-in-out
                                       flex flex-col items-center text-center group"
                            onClick={() => navigate(doc.path)}
                        >
                            {doc.icon}
                            <h2 className="text-xl font-semibold text-gray-900 mb-2">{doc.title}</h2>
                            <p className="text-gray-600 text-sm mb-4">{doc.description}</p>
                            <div
                                className="mt-auto flex items-center gap-2 text-blue-600
                                           transition-transform duration-300 ease-in-out
                                           group-hover:translate-x-1"
                            >
                                <span className="text-sm font-medium">View</span>
                                <FaArrowRight className="text-lg" />
                            </div>
                        </div>
                    ))}
                </div>
            </div>
        </div>
    );
}
  • Condition: Checks if the current path is exactly /documents.
  • Documents Array: Defines a static array of document objects, each with:
  • title: Display name (e.g., "Transcript").
  • path: Route to navigate to (e.g., /documents/transcript).
  • description: Brief explanation of the document's purpose.
  • icon: A React Icon component with Tailwind styling (e.g., text-blue-500).
  • Rendering:
  • A full-screen container (min-h-screen) with responsive padding (px-4 sm:px-6 lg:px-8).
  • A centered title ("Documents") with bold, large text.
  • A responsive grid (grid-cols-1 sm:grid-cols-2 lg:grid-cols-3) of document cards.
  • Card Styling:
  • Each card is a clickable <div> with Tailwind classes for styling (white background, shadow, rounded corners).
  • Hover effects: Scales up (hover:scale-105) and increases shadow (hover:shadow-2xl).
  • Smooth transitions (transition-all duration-300 ease-in-out).
  • Flex column layout with centered content.
  • A "View" link with an arrow icon that shifts right on hover (group-hover:translate-x-1).
  • Navigation: Clicking a card triggers navigate(doc.path) to redirect to the corresponding sub-route.

Conditional Rendering: Child Routes

return (
    <div className="p-6">
        <Outlet />
    </div>
);
  • Condition: Renders when the path is not exactly /documents (e.g., /documents/bonafide).
  • Rendering:
  • A simple container with padding (p-6).
  • <Outlet /> renders the child route's component (e.g., BonafidePage, IDCardPage).
  • Purpose: Acts as a layout component for document-related sub-routes.

Export

export default Documents;
  • Exports the Documents component as the default export for use in the application's router.

Styling

  • Tailwind CSS: Used for responsive, modern styling.
  • Container: Full-height (min-h-screen), centered (mx-auto), with responsive padding.
  • Title: Large, bold, centered text (text-4xl font-extrabold).
  • Grid: Responsive columns (grid-cols-1 sm:grid-cols-2 lg:grid-cols-3) with gaps (gap-8).
  • Cards: White background, shadow, rounded corners, hover effects (scale, shadow), and smooth transitions.
  • Icons: Colored per document type (e.g., blue for Transcript, green for ID Card).
  • View Link: Blue text with a moving arrow on hover.
  • Responsive Design: Adapts to different screen sizes (1 column on mobile, 2 on small screens, 3 on large screens).

Assumptions

  • React Router Setup: The component assumes a router configuration where /documents is a parent route with child routes (e.g., /documents/transcript, /documents/idcard).
  • Child Routes: Corresponding components (e.g., BonafidePage, IDCardPage) are defined and mapped to the paths in the documents array.
  • Static Data: The documents array is hardcoded; in a real application, it could be fetched from an API or configured dynamically.

Notes

  • Static Document List: The list of documents is hardcoded, which is fine for a small, fixed set but may need to be dynamic for scalability.
  • No Error Handling: The component assumes location and navigate work correctly; no fallback for invalid routes.
  • Accessibility: Lacks ARIA attributes for the clickable cards and keyboard navigation support.
  • Title Consistency: The title "Documents" is hardcoded; consider making it configurable via props or context.
  • Outlet Styling: The <Outlet /> container has minimal styling (p-6); child routes are responsible for their own layout.