Skip to content
Snippets Groups Projects
index.tsx 5.74 KiB
Newer Older

import { useHistory, useParams } from 'react-router';
import { useCallback, useEffect, useState } from 'react';

import { getTeamMembers, getTeamProjects, getTeams, leaveTeam, Team } from 'adapters/team';

import Button from 'components/ui/Button';
import { DetailProps } from 'components/ui/DetailBox';
import DetailGrid from 'components/layout/DetailGrid';
import Tabs, { Tab } from 'components/navigation/Tabs';
import LoadingScreen from 'components/ui/LoadingScreen';
import ButtonLink from 'components/navigation/ButtonLink';
import Dropdown, { DropDownItem } from 'components/navigation/Dropdown';
import TeamsMembers from './TeamsMembers';
import TeamsStats from './TeamsStats';

import './teams.scss';

export interface Params {
    teamId: string;
}
    const [tabs, setTabs] = useState<Tab[]>([]);
    const [allTeams, setTeams] = useState<Team[]>();
    const [currentTeam, setCurrentTeam] = useState<Team>();
    const [details, setDetails] = useState<DetailProps[]>([]);
    const [pageLinks, setPageLinks] = useState<DropDownItem[]>([]);
    const history = useHistory();
    const { teamId } = useParams<Params>();
        getTeams()
            .then((teams) => {
                //if no team is defined, take the first one
                if ((!teamId && teams[0]) || !teams.find(team => team.id === teamId)) {
                    history.push('/teams/' + teams[0].id);
                }
                setTeams(teams);
                setCurrentTeam(teams.find(team => team.id === teamId));
            })
            .catch(() => { });
    }, [teamId, history]);

    useEffect(() => {
        if (currentTeam && allTeams) {
            getTeamProjects(currentTeam.id).then((projects) => {
                setDetails((state) => state
                    .filter(detail => detail.title !== 'Projects')
                    .concat({
                        icon: 'folder',
                        title: 'Projects',
                        number: projects.length
            });
            getTeamMembers(currentTeam.id).then((members) => {
                setDetails((state) =>
                    state
                        .filter(detail => detail.title !== 'Members')
                        .concat({
                            icon: 'group',
                            title: 'Members',
                            number: members.length
                        })
                );
                setTabs([
                    {
                        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} />
                    }
                ]);
            });
            //update Tabs link
            setPageLinks(allTeams.filter(team => currentTeam.id !== team.id).map(team => {
                return {
                    route: '/teams/' + team.id,
    }, [currentTeam, allTeams]);

    const leaveCurrentTeam = useCallback(async () => {
        if (currentTeam) {
            await leaveTeam(currentTeam.id);
            history.go(0);
        }
    }, [currentTeam, history])
    if (currentTeam) {
        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>
                        allTeams
                            ? (
                                <Dropdown items={pageLinks}>
                                    <h2>{currentTeam?.name}</h2>
                                    <span className="material-icons icon">
                                        expand_more
                                    </span>
                                </Dropdown>
                            )
                            : <LoadingScreen />
                        details
                            ? (<DetailGrid details={details} />)
                            : (<LoadingScreen />)
                    <div className="buttons">
                        <div className="button-row">
                            <ButtonLink href={'/teams/' + currentTeam?.id + '/edit'} className="expanded">
                                Edit
                            </ButtonLink>
                            <ButtonLink href={'/teams/create'} className="expanded">
                                Create a new team
                            </ButtonLink>
                        {
                            allTeams && allTeams.length > 1 && (
                                <Button className="expanded dark" onClick={leaveCurrentTeam}>
                                    Leave Team
                        tabs
                            ? (<Tabs tabs={tabs} />)
                            : (<LoadingScreen />)
    } else {
        return (
            <LoadingScreen />
        )