A clean and responsive User Management Dashboard built with React, Vite, and Tailwind CSS, interacting with the JSONPlaceholder REST API to demonstrate complete CRUD workflows, search, pagination, validation, and reusable component architecture.
Managing users efficiently requires an intuitive interface, responsive interactions, and clean architecture. This project demonstrates a production-inspired User Management Dashboard capable of performing CRUD operations using the JSONPlaceholder Mock REST API while maintaining a scalable React component architecture.
The application focuses on:
- 📋 User listing
- ➕ Create users
- ✏️ Update user information
- 🗑 Delete users (with safety interceptors)
- 🔍 Instant search & sorting
- 📄 Dynamic Pagination
- ✅ Client-side Form validation
- ⚡ Responsive UI
- 🧪 Unit testing
| Resource | Link |
|---|---|
| 🌐 Live Application | https://user-management-dashboard-topaz-three.vercel.app/ |
| 🎥 Video Walkthrough | https://www.loom.com/share/0ffe3b14e0ed4a93b814d2c428f46087 |
| Category | Technology |
|---|---|
| Frontend | React 18 |
| Bundler | Vite |
| Styling | Tailwind CSS v4 |
| HTTP Client | Axios |
| Icons | Lucide React |
| Testing | Vitest |
| API | JSONPlaceholder |
src/
├── api/ # Axios API service layer (userService.js)
├── components/ # Reusable UI components (UserTable, Pagination, UserForm, ConfirmDelete)
├── hooks/ # Custom React hooks (useUsers state management)
├── utils/ # Pure utility functions and validators (validators.js)
├── App.jsx # Main application orchestrator
└── main.jsx # React entry point
- Clone Repository
git clone <repository-url>
cd user-management-dashboard
- Install Dependencies
npm install
- Start Development Server
npm run dev
*Application runs at http://localhost:5173*
- Run Tests
npm run test
Since JSONPlaceholder is a generic mock REST API, several client-side strategies were implemented to meet business requirements:
- Name Parsing: The API returns a single
namefield (e.g., "Leanne Graham"). The customuseUsershook splits this internally intofirstName(Leanne) andlastName(Graham). - Department Mapping: The API provides no department information. Departments are assigned deterministically using
departments[user.id % departments.length]to keep assignments consistent across renders without backend support. - Local CRUD State: Although JSONPlaceholder accepts POST, PUT, and DELETE requests, it does not permanently store changes. The
useUsers()hook maintains local React state so that new users appear instantly, updates reflect immediately, and deleted users disappear without a browser refresh.
Duplicate IDs on POST:
JSONPlaceholder always returns id: 11 for newly created users. To prevent duplicate React keys and UI rendering bugs in the data grid, locally created users receive Date.now() as a fallback unique identifier.
If expanded into a production application, the following enhancements would be implemented:
- Global State Management: Replace prop drilling with Redux Toolkit or Zustand.
- Debounced Search: Implement a reusable
useDebounce()hook to minimize unnecessary renders while typing. - Server-side Pagination: Instead of slicing arrays locally, pass parameters to the backend (
GET /users?page=2&limit=10).
Made with ❤️ using React, Vite & Tailwind CSS