اپلیکیشن مدیریت وظایف
این پروژه یک اپلیکیشن مدیریت وظایف با قابلیتهای پیشرفته است که با استفاده از React، Redux و Firebase پیادهسازی شده است.
ReactReduxFirebaseTailwind CSSReact DnDReact QueryPWA
نمای لیست وظایف
نمای کانبان
ویژگیها
- ایجاد، ویرایش و حذف وظایف
- دستهبندی وظایف با برچسبها
- تعیین اولویت و تاریخ سررسید
- فیلتر و جستجوی وظایف
- نمایش وظایف به صورت لیست یا کانبان
- یادآوری وظایف با نوتیفیکیشن
- همگامسازی وظایف بین دستگاههای مختلف
- طراحی ریسپانسیو برای تمام دستگاهها
جزئیات فنی
این اپلیکیشن با استفاده از React و Redux پیادهسازی شده است. برای ذخیرهسازی دادهها از Firebase Firestore استفاده شده و برای احراز هویت کاربران از Firebase Authentication بهره گرفتهایم. همچنین برای قابلیت کشیدن و رها کردن (Drag and Drop) در نمای کانبان از کتابخانه React DnD استفاده شده است.
این اپلیکیشن به صورت PWA (Progressive Web App) پیادهسازی شده و قابلیت نصب روی دستگاههای مختلف را دارد. همچنین به صورت کامل ریسپانسیو طراحی شده و در تمام دستگاهها به خوبی نمایش داده میشود.
کد نمونه
// نمونه کد برای کامپوننت TaskList
import { useState, useEffect } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { fetchTasks, updateTask, deleteTask } from '@/redux/tasksSlice';
import TaskItem from './TaskItem';
import TaskFilter from './TaskFilter';
export default function TaskList() {
const [filter, setFilter] = useState('all');
const [searchTerm, setSearchTerm] = useState('');
const dispatch = useDispatch();
const { tasks, loading, error } = useSelector(state => state.tasks);
useEffect(() => {
dispatch(fetchTasks());
}, [dispatch]);
const handleStatusChange = (taskId, newStatus) => {
dispatch(updateTask({ id: taskId, status: newStatus }));
};
const handleDelete = (taskId) => {
dispatch(deleteTask(taskId));
};
const filteredTasks = tasks.filter(task => {
// فیلتر بر اساس وضعیت
if (filter !== 'all' && task.status !== filter) return false;
// فیلتر بر اساس جستجو
if (searchTerm && !task.title.toLowerCase().includes(searchTerm.toLowerCase())) return false;
return true;
});
if (loading) return <div>در حال بارگذاری...</div>;
if (error) return <div>خطا در بارگذاری وظایف</div>;
return (
<div>
<TaskFilter
filter={filter}
setFilter={setFilter}
searchTerm={searchTerm}
setSearchTerm={setSearchTerm}
/>
{filteredTasks.length === 0 ? (
<div className="text-center py-8 text-gray-500">هیچ وظیفهای یافت نشد</div>
) : (
<div className="space-y-4">
{filteredTasks.map(task => (
<TaskItem
key={task.id}
task={task}
onStatusChange={handleStatusChange}
onDelete={handleDelete}
/>
))}
</div>
)}
</div>
);
}