Newer
Older
import { useHistory, useParams } from 'react-router';
import { useCallback, useEffect, useMemo, useState } from 'react';
import { getTeamMembers, getTeamProjects, getTeams, leaveTeam, Team, TeamMember } from 'adapters/team';
import { Project } from 'adapters/project';
import Button from 'components/ui/Button';
import DetailGrid from 'components/layout/DetailGrid';
import Tabs from 'components/navigation/Tabs';
import LoadingScreen from 'components/ui/LoadingScreen';
import ButtonLink from 'components/navigation/ButtonLink';
import Dropdown from 'components/navigation/Dropdown';
import TeamsMembers from './TeamsMembers';
import TeamsStats from './TeamsStats';
export interface Params {
teamId: string;
}

Planoetscher Daniel (Student Com20)
committed
export default function Teams() {
const [teams, setTeams] = useState<Team[]>();
const [projects, setProjects] = useState<Project[]>([]);
const [members, setMembers] = useState<TeamMember[]>([]);
const history = useHistory();
const { teamId: teamParamId } = useParams<Params>();
const lastTeam = sessionStorage.getItem('last-selected-team');
const teamId = teamParamId ?? lastTeam ?? teams?.[0]?.id
if (teamId) {
sessionStorage.setItem('last-selected-team', teamId);
}
let currentTeam = teams?.find(team => team.id === teamId);
useEffect(() => {
if (teamId && !teamParamId) {
history.replace('/teams/' + teamId);
} else if (teams && teams.length === 0) {
history.push('/introduction');
}, [teamId, teamParamId, teams, history]);
useEffect(() => {
getTeams().then(setTeams);
}, []);
useEffect(() => {
if (teamId) {
getTeamProjects(teamId).then(setProjects);
}
}, [teamId]);
useEffect(() => {
if (teamId) {
getTeamMembers(teamId).then(setMembers);
}, [teamId]);
const leaveCurrentTeam = useCallback(async () => {
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
95
96
97
98
99
if (teamId && teams) {
await leaveTeam(teamId);
setTeams(teams.filter(team => team.id !== teamId));
}
}, [teams, teamId])
const tabs = useMemo(() => currentTeam && members && [
{
route: '/teams/' + currentTeam.id,
label: 'Members',
component: (<TeamsMembers members={members} team={currentTeam} />)
}, {
route: '/teams/' + currentTeam.id + '/stats/:time',
link: '/teams/' + currentTeam.id + '/stats/week',
label: 'Stats',
component: <TeamsStats teamId={currentTeam.id} />
}
], [currentTeam, members]);
const dropdownList = useMemo(() => teamId && teams && (
teams.filter(team => team.id !== teamId).map(team => ({
route: '/teams/' + team.id,
label: team.name,
}))
), [teams, teamId]);
const details = useMemo(() => members && projects && [
{
icon: 'folder',
title: 'Projects',
number: projects.length
},
{
icon: 'group',
title: 'Members',
number: members.length
], [members, projects]);
if (teamId) {
return (
<div className="teams-page">
<div className="content-container">
<h1 className="underlined">Teams</h1>
<div className="description-container">
<p>Here you can see information about your teams, as well as its stats and members.</p>
</div>
dropdownList
<Dropdown items={dropdownList}>
<h2>{currentTeam?.name}</h2>
<span className="material-icons icon">
expand_more
</span>
</Dropdown>
)
: <LoadingScreen />
? <DetailGrid details={details} />
<div className="button-row">
<ButtonLink href={'/teams/' + currentTeam?.id + '/edit'} className="expanded">
Edit
</ButtonLink>
<ButtonLink href={'/teams/create'} className="expanded">
Create a new team
teams && teams.length > 1 && (
<Button className="expanded dark" onClick={leaveCurrentTeam}>
Leave Team
? <Tabs tabs={tabs} />
: <LoadingScreen />

Planoetscher Daniel (Student Com20)
committed
</div>
} else {
return (
<LoadingScreen />
)