import Button from "@components/Button"; import { CommandItem } from "@components/Command"; import { Popover, PopoverContent, PopoverTrigger } from "@components/Popover"; import { ScrollArea } from "@components/ScrollArea"; import { Command, CommandGroup, CommandList } from "cmdk"; import { trim } from "lodash"; import { ChevronsUpDown, Cog, User2 } from "lucide-react"; import * as React from "react"; import { useState } from "react"; import NetBirdIcon from "@/assets/icons/NetBirdIcon"; import { useDialog } from "@/contexts/DialogProvider"; import { useLoggedInUser } from "@/contexts/UsersProvider"; import { useElementSize } from "@/hooks/useElementSize"; import { Role, User } from "@/interfaces/User"; interface MultiSelectProps { value?: Role; onChange: (item: Role) => void; disabled?: boolean; popoverWidth?: "auto" | number; hideOwner?: boolean; currentUser?: User; } const UserRoles = [ { name: "Owner", value: Role.Owner, icon: NetBirdIcon, }, { name: "Admin", value: Role.Admin, icon: Cog, }, { name: "User", value: Role.User, icon: User2, }, ]; export function UserRoleSelector({ onChange, value, disabled = false, popoverWidth = "auto", hideOwner = false, currentUser, }: MultiSelectProps) { const [inputRef, { width }] = useElementSize(); const { isOwner } = useLoggedInUser(); const { confirm } = useDialog(); const toggle = async (item: Role) => { if (item === Role.Owner) { let ok = await confirm({ title: "Transfer Ownership?", type: "warning", description: (
This action will transfer the{" "} Owner{" "} role to{" "} {currentUser ? ( {currentUser.name} ) : ( "this user" )}{" "} and leave you with the{" "} Admin{" "} role. This action can only be undone if the new owner transfers the role back to you.
), }); if (!ok) return; } const isSelected = value == item; if (isSelected) { } else { onChange && onChange(item); } setOpen(false); }; const [open, setOpen] = useState(false); const selectedRole = UserRoles.find((role) => role.value === value); return ( { setOpen(isOpen); }} > { const formatValue = trim(value.toLowerCase()); const formatSearch = trim(search.toLowerCase()); if (formatValue.includes(formatSearch)) return 1; return 0; }} >
{UserRoles.map((item) => { if (!isOwner && item.value === Role.Owner) return null; if (hideOwner && item.value === Role.Owner) return null; return ( toggle(item.value)} onClick={(e) => e.preventDefault()} >
{item.name}
); })}
); }