skbeta/components/task-info.tsx
Christopher Arraya c55ab3d49e initial commit
2024-01-13 20:55:51 -05:00

222 lines
6.8 KiB
TypeScript

"use client";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { Calendar as CalendarIcon } from "lucide-react";
import { format } from "date-fns";
import { cn } from "@/lib/utils";
import { Calendar } from "@/components/ui/calendar";
import {
Popover,
PopoverContent,
PopoverTrigger,
} from "@/components/ui/popover";
import {
Sheet,
SheetContent,
SheetDescription,
SheetHeader,
SheetTitle,
SheetTrigger,
} from "@/components/ui/sheet";
import { Button } from "@/components/ui/button";
import React, { ReactNode } from "react";
import { useParams } from "next/navigation";
import { useRouter } from "next/navigation";
import { Badge } from "./ui/badge";
export default function TaskInfo({
row,
children,
}: {
row: any;
children: ReactNode;
}) {
const [date, setDate] = React.useState<Date | undefined>(
row.due_date ? new Date(row.due_date) : undefined
);
const params = useParams();
const router = useRouter();
const [isSheetOpen, setIsSheetOpen] = React.useState(false);
async function updateTask(info: any) {
try {
const req = {
id: row.id,
...info,
};
const data = await fetch(
`/w/${params.workspaceID}/p/${params.projectID}/tasks/mutate`,
{
method: "PUT",
body: JSON.stringify(req),
}
);
} catch (err) {
console.error(err);
}
}
async function fetchWorkspaceUsers() {
try {
const data = await fetch(`/w/${params.workspaceID}/user/fetch`);
const res = await data.json();
console.log("FETCH WORKSPACE USERS RES ===>", res);
} catch (err) {
console.error(err);
}
}
// TODO: add a function that takes in the task id and user id and then assigns the user to the task using the /w/:workspaceID/p/:projectID/tasks/assign API route.
async function assignUserToTask() {
try {
const data = await fetch(
`/w/${params.workspaceID}/p/${params.projectID}/tasks/assign`,
{
method: "POST",
body: JSON.stringify({
task_id: row.id,
user_id: 1,
}),
}
);
const res = await data.json();
console.log("ASSIGN USER TO TASK RES ===>", res);
} catch (err) {
console.error(err);
}
}
const handleDateChange = (newDate: Date | undefined) => {
setDate(newDate); // Update the local state
if (newDate) {
updateTask({ due_date: newDate.toISOString() }); // Persist the change
}
};
const handleSheetOpenChange = (open: boolean) => {
setIsSheetOpen(open);
// If the sheet is being closed, refresh the router
if (!open) {
router.refresh();
}
};
return (
<Sheet open={isSheetOpen} onOpenChange={handleSheetOpenChange}>
<div className="flex space-x-2">
{row.feature_id && (
<Badge variant="outline">FEAT-{row.feature_id}</Badge>
)}
<SheetTrigger className="max-w-[500px] truncate font-medium">
{row.name}
</SheetTrigger>
</div>
<SheetContent className="w-[800px]">
<SheetHeader>
<SheetTitle>{row.name}</SheetTitle>
<SheetDescription>{row.description}</SheetDescription>
</SheetHeader>
<div className="flex flex-col space-y-2 py-4">
{/* <div className="flex flex-row space-x-24 items-center">
<h5 className="font-medium text-muted-foreground text-sm">
Assignee
</h5>
<div className="w-1/3">
<Select onValueChange={handleUserSelect}>
<SelectTrigger>
<SelectValue placeholder="Select a user" />
</SelectTrigger>
<SelectContent>
{users.map((user) => (
<SelectItem key={user.id} value={user.id}>
{user.email}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
</div> */}
<div className="flex flex-row space-x-24 items-center">
<h5 className="font-medium text-muted-foreground text-sm">
Status
</h5>
<div className="w-1/3">
<Select
defaultValue={row.status}
onValueChange={(value) => updateTask({ status: value })}
>
<SelectTrigger>
<SelectValue placeholder="Select status" />
</SelectTrigger>
<SelectContent>
<SelectItem value="backlog">Backlog</SelectItem>
<SelectItem value="todo">Todo</SelectItem>
<SelectItem value="in_progress">In Progress</SelectItem>
<SelectItem value="done">Done</SelectItem>
</SelectContent>
</Select>
</div>
</div>
<div className="flex flex-row space-x-24 items-center">
<h5 className="font-medium text-muted-foreground text-sm">
Priority
</h5>
<div className="w-1/3">
<Select
defaultValue={row.priority}
onValueChange={(value) => updateTask({ priority: value })}
>
<SelectTrigger>
<SelectValue placeholder="Select priority" />
</SelectTrigger>
<SelectContent>
<SelectItem value="low">Low</SelectItem>
<SelectItem value="medium">Medium</SelectItem>
<SelectItem value="high">High</SelectItem>
</SelectContent>
</Select>
</div>
</div>
<div className="flex flex-row space-x-24 items-center">
<h5 className="font-medium text-muted-foreground text-sm">
Due Date
</h5>
<div className="w-1/3">
<Popover>
<PopoverTrigger asChild>
<Button
variant={"outline"}
className={cn(
"w-[280px] justify-start text-left font-normal",
!date && "text-muted-foreground"
)}
>
<CalendarIcon className="mr-2 h-4 w-4" />
{date ? format(date, "PPP") : <span>Pick a date</span>}
</Button>
</PopoverTrigger>
<PopoverContent className="w-auto p-0">
<Calendar
mode="single"
selected={date}
onSelect={handleDateChange}
initialFocus
/>
</PopoverContent>
</Popover>
</div>
</div>
{children}
</div>
</SheetContent>
</Sheet>
);
}