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