This repository was archived by the owner on Jun 19, 2025. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 227
Expand file tree
/
Copy pathworkspace-members-config.tsx
More file actions
94 lines (85 loc) · 3 KB
/
workspace-members-config.tsx
File metadata and controls
94 lines (85 loc) · 3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import { useState } from "react";
import Button from "components/shared/Button/button";
import Search from "components/atoms/Search/search";
import { useToast } from "lib/hooks/useToast";
import { getAvatarByUsername } from "lib/utils/github";
import WorkspaceMemberRow from "../WorkspaceMemberRow/workspace-member-row";
interface WorkspaceMembersConfigProps {
className?: string;
members: WorkspaceMember[];
onAddMember: (username: string) => Promise<WorkspaceMember> | undefined;
onDeleteMember: (memberId: string) => void;
onUpdateMember: (memberId: string, role: WorkspaceMemberRole) => Promise<any>;
}
const WorkspaceMembersConfig = ({
className,
members,
onAddMember,
onDeleteMember,
onUpdateMember,
}: WorkspaceMembersConfigProps) => {
const [validInput, setValidInput] = useState(false);
const [username, setUsername] = useState("");
const [loading, setLoading] = useState(false);
const { toast } = useToast();
const handleChange = async (value: string) => {
setUsername(value);
setValidInput(!!value && value.length > 3);
};
const handleAddMember = async () => {
const memberExists = members.find((member) => member.member.login.toLowerCase() === username.toLowerCase());
if (memberExists) {
toast({ description: "Member already exists", variant: "danger" });
return;
}
setLoading(true);
const res = await onAddMember(username);
setLoading(false);
if (res && res !== null) {
toast({ description: "Member added successfully", variant: "success" });
setUsername("");
} else if (res === false) {
toast({ description: "Error: The user entered was not found on OpenSauced!", variant: "danger" });
}
};
return (
<div className={` ${className && className}`}>
<div>
<h2 className="flex gap-1 font-medium mb-2 text-md">Workspace Members</h2>
</div>
<div className="flex justify-between">
<div className="w-1/2 max-w-md">
<Search
isLoading={loading}
value={username}
onChange={(value) => handleChange(value)}
placeholder="Enter username"
labelText="Enter full username"
name="search"
className="flex-1 text-base"
/>
</div>
<Button onClick={handleAddMember} disabled={!validInput} variant="primary" className="w-max h-max">
Add Member
</Button>
</div>
<div className="mt-7">
{members.map((member) => (
<WorkspaceMemberRow
key={member.id}
className="mb-4"
onUpdate={onUpdateMember}
onDelete={onDeleteMember}
{...member}
name={member.member.login}
email={member.member.email}
avatarUrl={getAvatarByUsername(member.member.login)}
pending={!member.member.is_open_sauced_member}
role={member.role as unknown as WorkspaceMemberRole}
/>
))}
</div>
</div>
);
};
export default WorkspaceMembersConfig;