From db76048d249a9b4dd13d710c2a56245242644b16 Mon Sep 17 00:00:00 2001 From: Mathias Wagner Date: Sun, 21 Jul 2024 15:23:42 +0200 Subject: [PATCH] Create Members page --- .../Dashboard/pages/Members/Members.jsx | 113 ++++++++++++++++++ .../states/Dashboard/pages/Members/index.js | 1 + 2 files changed, 114 insertions(+) create mode 100644 dashboard/src/states/Dashboard/pages/Members/Members.jsx create mode 100644 dashboard/src/states/Dashboard/pages/Members/index.js diff --git a/dashboard/src/states/Dashboard/pages/Members/Members.jsx b/dashboard/src/states/Dashboard/pages/Members/Members.jsx new file mode 100644 index 0000000..3f0482a --- /dev/null +++ b/dashboard/src/states/Dashboard/pages/Members/Members.jsx @@ -0,0 +1,113 @@ +import {useContext, useEffect, useState} from "react"; +import {deleteRequest, getRequest} from "@/common/utils/RequestUtil.js"; +import {ProjectContext} from "@/states/Dashboard/contexts/Project"; +import {Button, Chip, CircularProgress, IconButton, Link, Stack, Typography} from "@mui/material"; +import {AdminPanelSettings, Delete} from "@mui/icons-material"; +import MemberCreationDialog from "./components/MemberCreationDialog"; + +export const Members = () => { + const {currentProject} = useContext(ProjectContext); + + const [loading, setLoading] = useState(true); + const [dialogOpen, setDialogOpen] = useState(false); + const [members, setMembers] = useState([]); + const [editUser, setEditUser] = useState(null); + + const fetchMembers = async () => { + try { + const data = await getRequest(`/member/${currentProject.id}/list`); + + if (!data) return; + + setMembers(data); + setLoading(false); + } catch (e) { + console.error(e); + } + } + + const deleteMember = async (member) => { + try { + await deleteRequest(`/member/${currentProject.id}/${member}`); + await fetchMembers(); + } catch (e) { + console.error(e); + } + } + + useEffect(() => { + fetchMembers(); + + const timer = setInterval(fetchMembers, 5000); + + return () => clearInterval(timer); + }, []); + + const getUserRole = (role) => { + switch (role) { + case 0: + return "Viewer"; + case 1: + return "Project manager"; + case 2: + return "Administrator"; + } + + return "Unknown"; + } + + return ( + + setDialogOpen(false)} + fetchMembers={fetchMembers} editUser={editUser} setEditUser={setEditUser}/> + + + + {loading && <>Members} + {!loading && <>{members.length} Members} + + + + + + {members.map((member, index) => ( + + + + avatar + {member.user.username} + {!member.accepted && } + + {getUserRole(member.role)} + + + + { + setEditUser(member); + setDialogOpen(true); + }}> + deleteMember(member.user.id)}> + + + ))} + + {loading && + + } + + {!loading && members.length === 0 && + + No members invited. setDialogOpen(true)} color="primary" + sx={{cursor: "pointer"}}>Invite one + + } + + + ); +} \ No newline at end of file diff --git a/dashboard/src/states/Dashboard/pages/Members/index.js b/dashboard/src/states/Dashboard/pages/Members/index.js new file mode 100644 index 0000000..95850ae --- /dev/null +++ b/dashboard/src/states/Dashboard/pages/Members/index.js @@ -0,0 +1 @@ +export {Members as default} from "./Members.jsx"; \ No newline at end of file