"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> ); }