'use client';
import { useEffect, useState } from 'react';
import Layout from '@/components/Layout';
import { getTasks, getSharedTasks } from '@/services/task';
import { profile } from '@/services/auth';
type Task = {
id: number;
name: string;
description: string;
completed: boolean;
created_at: string;
};
type SharedTask = {
id: number;
task: Task;
permission: {
id: number;
name: 'view' | 'edit';
};
};
const TasksPage = () => {
const [tasks, setTasks] = useState<Task[]>([]);
const [sharedTasks, setSharedTasks] = useState<SharedTask[]>([]);
const [username, setUsername] = useState<string>('');
const [loading, setLoading] = useState<boolean>(true);
const [error, setError] = useState<string | null>(null);
useEffect(() => {
const fetchData = async () => {
try {
setLoading(true);
const [ownTasksResponse, sharedTasksResponse] = await Promise.all([
getTasks(),
getSharedTasks(),
]);
setTasks(ownTasksResponse.data.tasks);
setSharedTasks(sharedTasksResponse.data.data);
} catch (err: any) {
setError('Failed to load tasks. Please try again.');
} finally {
setLoading(false);
}
};
fetchData();
}, []);
if (loading) {
return (
<Layout title="Tasks">
<div className="text-center mt-10">Loading tasks...</div>
</Layout>
);
}
if (error) {
return (
<Layout title="Tasks">
<div className="text-center text-red-500 mt-10">{error}</div>
</Layout>
);
}
return (
<Layout title="Tasks">
<div className="flex justify-between items-center mb-6">
<h1 className="text-3xl font-bold ">Hello! My Lord, Shall We</h1>
<a
href="/tasks/create"
className="bg-blue-500 text-white px-4 py-2 rounded-md hover:bg-blue-600"
>
+ Create Task
</a>
</div>
<section className="mb-10">
<h2 className="text-2xl font-semibold mb-4">Your Tasks</h2>
{tasks.length === 0 ? (
<p>No tasks found.</p>
) : (
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
{tasks.map((task) => (
<div key={task.id} className="bg-white p-4 shadow rounded">
<h3 className="text-lg font-bold mb-2">{task.name}</h3>
<p className="text-sm text-gray-600">{task.description || 'No description provided'}</p>
<div className="mt-4 flex justify-between items-center">
<a
href={`/tasks/view/${task.id}`}
className="text-blue-500 hover:underline"
>
View
</a>
<a
href={`/tasks/edit/${task.id}`}
className="text-yellow-500 hover:underline"
>
Edit
</a>
</div>
</div>
))}
</div>
)}
</section>
<section>
<h2 className="text-2xl font-semibold mb-4">Tasks Shared with You</h2>
{sharedTasks.length === 0 ? (
<p>No tasks shared with you.</p>
) : (
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
{sharedTasks.map((sharedTask) => (
<div key={sharedTask.id} className="bg-white p-4 shadow rounded">
<h3 className="text-lg font-bold mb-2">{sharedTask.task.name}</h3>
<p className="text-sm text-gray-600">{sharedTask.task.description || 'No description provided'}</p>
<p className="text-sm text-gray-500 mt-2">
Permission:{' '}
<span className="font-medium">{sharedTask.permission.name}</span>
</p>
<div className="mt-4 flex justify-between items-center">
<a
href={`/tasks/view/${sharedTask.task.id}`}
className="text-blue-500 hover:underline"
>
View
</a>
{sharedTask.permission.name === 'edit' && (
<a
href={`/tasks/edit/${sharedTask.task.id}`}
className="text-yellow-500 hover:underline"
>
Edit
</a>
)}
</div>
</div>
))}
</div>
)}
</section>
</Layout>
);
};
export default TasksPage;
|