import { HStack, VStack, Text, Popover, PopoverTrigger, PopoverContent, Flex, IconButton, Icon, Divider, Button, useDisclosure, Spinner, } from "@chakra-ui/react"; import React, { useEffect, useState } from "react"; import Link from "next/link"; import { AiFillCaretDown } from "react-icons/ai"; import { BsGear, BsPlus } from "react-icons/bs"; import { type Project } from "@prisma/client"; import { useAppStore } from "~/state/store"; import { api } from "~/utils/api"; import NavSidebarOption from "./NavSidebarOption"; import { useHandledAsyncCallback, useSelectedProject } from "~/utils/hooks"; import { useRouter } from "next/router"; export default function ProjectMenu() { const router = useRouter(); const utils = api.useContext(); const selectedProjectId = useAppStore((s) => s.selectedProjectId); const setselectedProjectId = useAppStore((s) => s.setselectedProjectId); const { data: projects } = api.projects.list.useQuery(); useEffect(() => { if ( projects && projects[0] && (!selectedProjectId || !projects.find((proj) => proj.id === selectedProjectId)) ) { setselectedProjectId(projects[0].id); } }, [selectedProjectId, setselectedProjectId, projects]); const { data: selectedProject } = useSelectedProject(); const popover = useDisclosure(); const createMutation = api.projects.create.useMutation(); const [createProject, isLoading] = useHandledAsyncCallback(async () => { const newProj = await createMutation.mutateAsync({ name: "New Project" }); await utils.projects.list.invalidate(); setselectedProjectId(newProj.id); await router.push({ pathname: "/project/settings" }); }, [createMutation, router]); return ( PROJECT {selectedProject?.name[0]?.toUpperCase()} {selectedProject?.name} PROJECTS {projects?.map((proj) => ( ))} New project ); } const ProjectOption = ({ proj, isActive, onClose, }: { proj: Project; isActive: boolean; onClose: () => void; }) => { const setselectedProjectId = useAppStore((s) => s.setselectedProjectId); const [gearHovered, setGearHovered] = useState(false); return ( { setselectedProjectId(proj.id); onClose(); }} w="full" justifyContent="space-between" bgColor={isActive ? "gray.100" : "transparent"} _hover={gearHovered ? undefined : { bgColor: "gray.200", textDecoration: "none" }} p={2} > {proj.name} } variant="ghost" size="xs" p={0} onMouseEnter={() => setGearHovered(true)} onMouseLeave={() => setGearHovered(false)} _hover={{ bgColor: isActive ? "gray.300" : "gray.100", transitionDelay: 0 }} borderRadius={4} /> ); };