task-managment / src / components / tasks / TaskItem.tsx
TaskItem.tsx
Raw
'use client'
import {
  addLocalOffsetFromDate,
  cn,
  formatDateSpecial,
  getPriorityColor,
  getStatusColor,
} from "@/lib/utils";
import { CircleUserRound } from "lucide-react";
import React, { useState } from "react";
import ModifyTaskSidebar from "./ModifyTask";
import moment from "moment";
import { Task } from "@/server/task/domain/models";

const TaskItem = ({ task, isTeamTask, isRecentModify=false }:{task:Task,isTeamTask:boolean,isRecentModify?:boolean}) => {
  const [selectedTask, setSelectedTask] = useState<Task | null>(null);

  if(!task)return

  return (
    <article
      className="relative flex justify-between rounded-xl bg-white"
    >
      <div
        className={cn(
          "w-[80px] h-full text-nowrap absolute grid place-content-center px-2 left-0 top-0 bottom-0 rounded-l-xl",
          getStatusColor(task?.status)
        )}
      >
        <p className="text-xs font-bold first-letter:uppercase text-white mb-0.5">
          {task?.status}
        </p>
      </div>
      <div className="py-4 px-24">
        <div className="flex gap-5">
          <div>
            {isRecentModify ? (
              <p className="space-x-1 text-xs">
                <span>{task.projectName}</span>
                <span>-</span>
                <span>{moment(addLocalOffsetFromDate(task?.updatedAt!)).fromNow()}
                </span>
              </p>
            ) : (
              <p className="text-xs space-x-2 first-letter:uppercase font-light">
                <span>{task.projectName}</span>
                <span>{formatDateSpecial(task?.startDate)}</span>
                {task?.expireDate && (
                  <span>- {formatDateSpecial(task?.expireDate)}</span>
                )}
              </p>
            )}
          </div>
        </div>

        <p className="space-x-0.5 text-sm">
          <span className="font-bold">{task?.areaName}</span>
          <span>-</span>
          <span>{task?.floorName}</span>
        </p>
        <p className="text-xs text-gray-500 text-left">{task?.comments}</p>
      </div>

      <div className="border-l-2xl grid place-content-center gap-4 min-w-14 px-5">
        {isTeamTask ? (
          <div className="flex items-center gap-1 text-gray-500">
            <CircleUserRound size={20} />
            <span>{task?.user?.firstName}</span>
          </div>
        ) : (
          <button onClick={() => setSelectedTask(task)}>
            <ModifyTaskSidebar
              selectedTask={selectedTask!}
              isEmployeeEdit={true}
            />
          </button>
        )}
        <div className="flex flex-col justify-end">
          <div className="flex items-center text-right justify-end gap-1">
            <p className="text-xs font-light first-letter:capitalize">
              {task?.priority}
            </p>
            <div
              className={cn(
                "w-2 h-2 rounded-xl",
                getPriorityColor(task?.priority)
              )}
            ></div>
          </div>
        </div>
      </div>
    </article>
  );
};

export default TaskItem;