TaskMaster is a feature-rich task management application developed as part of the GSoC 2025 application for JdeRobot. Built with React, Redux, and Vite, it extends a basic task manager with advanced functionalities like task filtering, categorization, prioritization, search, drag-and-drop reordering, due dates with notifications, and a sleek UI with dark/light mode support. It integrates Firebase for authentication and Supabase for file storage, offering a robust and modern user experience.
- Task Management: Add, remove, and toggle task completion with a clean interface.
- Filtering: Filter tasks by status (all, active, completed, due soon), category, and priority.
- Categories: Assign tasks to categories (personal, work, groceries, health, finance) with filtering support.
- Priorities: Set task priority (high, medium, low) with visual indicators and sorting.
- Search: Search tasks by title in real-time.
- Drag-and-Drop: Reorder tasks using React DnD for seamless task organization.
- Due Dates: Set due dates with
react-datepicker
, highlighting tasks due within 24 hours with notifications. - Dashboard: Visualize task stats (total, completed, due soon) with a progress bar and category breakdown.
- Analytics: View task completion and distribution with bar and pie charts (
react-chartjs-2
). - Calendar: Display tasks with due dates in a calendar view (
react-big-calendar
). - Authentication: User sign-in/sign-up via Firebase Authentication with email/password.
- Profile Management: Edit user profile (name, photo) with photo uploads to Supabase Storage (work in progress).
- UI Enhancements: Dark/light mode toggle, sidebar with icons, and animations via Framer Motion.
- Responsive Design: Fully responsive across mobile and desktop devices.
Below are key features of TaskMaster:
- Language: TypeScript with React
- Libraries:
react
,react-dom
: UI components@reduxjs/toolkit
,react-redux
: State managementreact-dnd
,react-dnd-html5-backend
: Drag-and-drop functionalityreact-datepicker
: Due date selectionreact-big-calendar
: Calendar viewreact-chartjs-2
,chart.js
: Analytics chartsfirebase
: Authentication@supabase/supabase-js
: File storage for profile photosframer-motion
: Animationstailwindcss
: Stylinguuid
: Unique task IDs@heroicons/react
: Icons for sidebar
- Structure: Modular components (
Navbar
,TaskForm
,TaskList
,TaskFilters
,SearchBar
,Dashboard
,Analytics
,Calendar
,ProfileModal
) with Redux slices (tasksSlice
,authSlice
). - Bundler: Vite (see justification below)
While the challenge suggested Webpack, I opted for Vite due to:
- Speed: Native ES modules and instant HMR make development faster than Webpack’s rebuilds.
- Simplicity: Minimal configuration compared to Webpack’s complexity for TypeScript and React.
- Modernity: Aligns with current tooling trends, integrating seamlessly with Tailwind and TypeScript.
- Efficiency: Rollup-based production builds are lightweight and optimized.
Vite’s advantages made it ideal for rapid prototyping within the GSoC timeline, though Webpack remains viable for larger-scale projects.
- Node.js (v22.14.0)
- npm (v11.2.0)
- Firebase project (for authentication)
- Supabase project (for storage)
- Clone the Repository:
git clone https://github.com/mohababsa/JdeRobot-TaskMaster.git cd JdeRobot-TaskMaster
- Install Dependencies:
npm install
- Configure Firebase:
- Create a Firebase project at console firebase.
- Enable Email/Password authentication in Authentication > Sign-in method.
- Copy your Firebase config from Project Settings > General > Your apps > Firebase SDK snippet.
- Add it to
src/lib/firebase.ts
:const firebaseConfig = { apiKey: "your-api-key", authDomain: "your-auth-domain", projectId: "your-project-id", storageBucket: "your-storage-bucket", messagingSenderId: "your-sender-id", appId: "your-app-id", };
- Configure Supabase:
- Create a Supabase project at supabase.
- Create a bucket named profile_photos in Storage.
- Copy your Supabase URL and Anon Key from Settings > API.
- Add them to
src/lib/supabase.ts
:const supabaseUrl = 'https://your-project-id.supabase.co'; const supabaseAnonKey = 'your-anon-key'; export const supabase = createClient(supabaseUrl, supabaseAnonKey);
- Run the Application:
Opens at
npm run dev
http://localhost:5173
- Build for Production:
npm run build npm run preview
- Purpose: Manages user sign-in, sign-up, and profile data (display name, photo URL).
- Setup:
- Initialized in
src/lib/firebase.ts
withgetAuth
. - Configured with your Firebase project’s credentials.
- Initialized in
- Features:
- Sign In/Sign Up: Handled via
SignInModal
andSignUpModal
usingsignInWithEmailAndPassword
andcreateUserWithEmailAndPassword
. - Sign Out: Triggered from
Navbar
withsignOut
, clearing Redux state viareduxSignOut
. - Profile Updates:
updateProfile
inProfileModal
updatesdisplayName
andphotoURL
.
- Sign In/Sign Up: Handled via
- State Management: User data is stored in Redux (
authSlice
) and synced with Firebase viaonAuthStateChanged
inApp.tsx
. - Verification: Check user details in Firebase Console > Authentication > Users.
- Purpose: Stores profile photos, replacing Firebase Storage to stay within free tier limits.
- Setup:
- Initialized in
src/lib/supabase.ts
withcreateClient
. - Bucket:
profile_photos
created in Supabase Dashboard.
- Initialized in
- Features:
- Photo Upload: In
ProfileModal
, photos are uploaded toprofile_photos/<uid>/<filename>
usingsupabase.storage.from('profile_photos').upload
. - URL Retrieval: Public URLs are fetched with
getPublicUrl
and saved to Firebase Auth’sphotoURL
.
- Photo Upload: In
- Policies: Default authenticated upload policy with a custom rule ensuring users only upload to their UID folder:
Verification: Check uploaded files in Supabase Dashboard > Storage > profile_photos
allow authenticated users to upload: (auth.uid() = split_part(name, '/', 1))
Mohamed ABABSA - GSoC 2025 Applicant
TaskMaster is licensed under the MIT License