import { useRouter } from "next/router"; import useSWR from "swr"; // services import { WorkspaceService } from "services/workspace.service"; // ui import { Avatar, CustomSelect, CustomSearchSelect, Input } from "@plane/ui"; // types import { IGithubRepoCollaborator } from "types"; import { IUserDetails } from "./root"; // fetch-keys import { WORKSPACE_MEMBERS } from "constants/fetch-keys"; type Props = { collaborator: IGithubRepoCollaborator; index: number; users: IUserDetails[]; setUsers: React.Dispatch<React.SetStateAction<IUserDetails[]>>; }; const importOptions = [ { key: "map", label: "Map to existing", }, { key: "invite", label: "Invite by email", }, { key: false, label: "Do not import", }, ]; // services const workspaceService = new WorkspaceService(); export const SingleUserSelect: React.FC<Props> = ({ collaborator, index, users, setUsers }) => { const router = useRouter(); const { workspaceSlug } = router.query; const { data: members } = useSWR( workspaceSlug ? WORKSPACE_MEMBERS(workspaceSlug.toString()) : null, workspaceSlug ? () => workspaceService.fetchWorkspaceMembers(workspaceSlug.toString()) : null ); const options = members?.map((member) => ({ value: member.member.display_name, query: member.member.display_name ?? "", content: ( <div className="flex items-center gap-2"> <Avatar name={member?.member.display_name} src={member?.member.avatar} /> {member.member.display_name} </div> ), })); return ( <div className="grid grid-cols-3 items-center gap-2 rounded-md bg-custom-background-80 px-2 py-3"> <div className="flex items-center gap-2"> <div className="relative h-8 w-8 flex-shrink-0 rounded"> <img src={collaborator.avatar_url} className="absolute left-0 top-0 h-full w-full rounded object-cover" alt={`${collaborator.login} GitHub user`} /> </div> <p className="text-sm">{collaborator.login}</p> </div> <div> <CustomSelect value={users[index].import} label={<div className="text-xs">{importOptions.find((o) => o.key === users[index].import)?.label}</div>} onChange={(val: any) => { const newUsers = [...users]; newUsers[index].import = val; newUsers[index].email = ""; setUsers(newUsers); }} optionsClassName="w-full" noChevron > {importOptions.map((option) => ( <CustomSelect.Option key={option.label} value={option.key}> <div>{option.label}</div> </CustomSelect.Option> ))} </CustomSelect> </div> {users[index].import === "invite" && ( <Input id="email" type="email" name={`userEmail${index}`} value={users[index].email} onChange={(e) => { const newUsers = [...users]; newUsers[index].email = e.target.value; setUsers(newUsers); }} placeholder="Enter email of the user" className="w-full py-1 text-xs" /> )} {users[index].import === "map" && members && ( <CustomSearchSelect value={users[index].email} label={users[index].email !== "" ? users[index].email : "Select user from project"} options={options} onChange={(val: string) => { const newUsers = [...users]; newUsers[index].email = val; setUsers(newUsers); }} optionsClassName="w-full" /> )} </div> ); };