45 lines
1.6 KiB
JavaScript
45 lines
1.6 KiB
JavaScript
import React from "react";
|
|
import { useSelector } from "react-redux";
|
|
import { useDashboardTasksCardData } from "../../hooks/useDashboard_Data";
|
|
import TeamsSkeleton from "./TeamsSkeleton";
|
|
|
|
const TasksCard = () => {
|
|
const projectId = useSelector((store) => store.localVariables?.projectId);
|
|
const { tasksCardData, loading, error } = useDashboardTasksCardData(projectId);
|
|
|
|
return (
|
|
<div className="card p-3 h-100 text-center d-flex justify-content-between">
|
|
<div className="d-flex justify-content-start align-items-center mb-3">
|
|
<h5 className="fw-bold mb-0 ms-2">
|
|
<i className="bx bx-task text-success"></i> Tasks
|
|
</h5>
|
|
</div>
|
|
|
|
{loading ? (
|
|
// Loader will be displayed when loading is true
|
|
<TeamsSkeleton/>
|
|
) : error ? (
|
|
// Error message if there's an error
|
|
<div className="text-danger flex-grow-1 d-flex justify-content-center align-items-center">{error}</div>
|
|
) : (
|
|
// Actual data when loaded successfully
|
|
<div className="d-flex justify-content-around align-items-start mt-n2">
|
|
<div>
|
|
<h4 className="mb-0 fw-bold">
|
|
{tasksCardData?.totalTasks?.toLocaleString()}
|
|
</h4>
|
|
<small className="text-muted">Total</small>
|
|
</div>
|
|
<div>
|
|
<h4 className="mb-0 fw-bold">
|
|
{tasksCardData?.completedTasks?.toLocaleString()}
|
|
</h4>
|
|
<small className="text-muted">Completed</small>
|
|
</div>
|
|
</div>
|
|
)}
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default TasksCard; |