You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Application-Web/front/views/TeamPanel.tsx

240 lines
6.7 KiB

import "../style/team_panel.css"
import { BASE } from "../Constants"
import { Team, TeamInfo, Member } from "../model/Team"
import {Tactic} from "../model/tactic/Tactic";
import {fetchAPI} from "../Fetcher";
import {useState} from "react";
export default function TeamPanel({
isCoach,
team,
currentUserId,
tactics,
}: {
isCoach: boolean
team: Team
currentUserId: number
tactics : Tactic[]
}) {
const [teamTactics, setTeamTactics] = useState(tactics);
function handleTacticDelete(tacticId) {
fetchAPI(`tactic/${tacticId}/unshare-to-team`, team.info)
const updatedTactics = teamTactics.filter((tactic) => tactic.id !== tacticId);
setTeamTactics(updatedTactics);
}
return (
<div id="main-div">
<div id="header-div">
<header>
<h1>
<a href={BASE + "/"}>IQBall</a>
</h1>
</header>
</div>
<div id="content-container">
<div id="left-panel">
<TeamDisplay team={team.info} />
{isCoach && <CoachOptions id={team.info.id} />}
<MembersDisplay
members={team.members}
isCoach={isCoach}
idTeam={team.info.id}
currentUserId={currentUserId}
/>
</div>
<div id="right-panel">
<TacticsDisplay tactics={teamTactics} isCoach={isCoach} onTacticDelete={(tacticId) => handleTacticDelete(tacticId)}/>
</div>
</div>
</div>
)
}
function TeamDisplay({ team }: { team: TeamInfo }) {
return (
<div id="team-info">
<div id="first-part">
<h1 id="team-name">{team.name}</h1>
<img id="logo" src={team.picture} alt="Logo d'équipe" />
</div>
<div id="colors">
<div id="colorsTitle">
<p>Couleur principale</p>
<p>Couleur secondaire</p>
</div>
<div id="actual-colors">
<ColorDisplay color={team.mainColor} />
<ColorDisplay color={team.secondColor} />
</div>
</div>
</div>
)
}
function ColorDisplay({ color }: { color: string }) {
return <div className="square" style={{ backgroundColor: color }} />
}
function CoachOptions({ id }: { id: number }) {
return (
<div>
<button
id="delete"
onClick={() =>
confirm("Êtes-vous sûr de supprimer cette équipe?")
? (window.location.href = `${BASE}/team/${id}/delete`)
: {}
}>
Supprimer
</button>
<button
id="edit"
onClick={() =>
(window.location.href = `${BASE}/team/${id}/edit`)
}>
Modifier
</button>
</div>
)
}
function MembersDisplay({
members,
isCoach,
idTeam,
currentUserId,
}: {
members: Member[]
isCoach: boolean
idTeam: number
currentUserId: number
}) {
const listMember = members.map((member) => (
<MemberDisplay
key={member.user.id}
member={member}
isCoach={isCoach}
idTeam={idTeam}
currentUserId={currentUserId}
/>
))
return (
<div id="members">
<div id="head-members">
<h2>Membres :</h2>
{isCoach && (
<button
id="add-member"
onClick={() =>
(window.location.href = `${BASE}/team/${idTeam}/addMember`)
}>
+
</button>
)}
</div>
{listMember}
</div>
)
}
function MemberDisplay({
member,
isCoach,
idTeam,
currentUserId,
}: {
member: Member
isCoach: boolean
idTeam: number
currentUserId: number
}) {
return (
<div className="member">
<img
id="profile-picture"
src={member.user.profilePicture}
alt="Photo de profile"
/>
<p>{member.user.name}</p>
<p>{member.role}</p>
<p>{member.user.email}</p>
{isCoach && currentUserId !== member.user.id && (
<button
id="delete"
onClick={() =>
confirm(
"Êtes-vous sûr de retirer ce membre de l'équipe?",
)
? (window.location.href = `${BASE}/team/${idTeam}/remove/${member.user.id}`)
: {}
}>
Retirer
</button>
)}
{isCoach && currentUserId == member.user.id && (
<button
id="delete"
onClick={() =>
confirm("Êtes-vous sûr de quitter cette équipe?")
? (window.location.href = `${BASE}/team/${idTeam}/remove/${member.user.id}`)
: {}
}>
Quitter
</button>
)}
</div>
)
}
function TacticsDisplay({
tactics,
isCoach,
onTacticDelete,
} : {
tactics : Tactic[]
isCoach : boolean
onTacticDelete : (tacticId: number) => void
}) {
const listTactic = tactics.map((tactic) => (
<TacticDisplay key={tactic.id} tactic={tactic} isCoach={isCoach} onTacticDelete={() => onTacticDelete(tactic.id)}/>
))
return (
<div id="tactics">
<div id="head-tactics">
<h1>Tactiques partagées</h1>
</div>
{listTactic}
</div>
)
}
function TacticDisplay({
tactic,
isCoach,
onTacticDelete,
} : {
tactic : Tactic
isCoach : boolean
onTacticDelete: () => void
}) {
return (
<div className="tactic" onClick={() => location.pathname = BASE + "/tactic/" + tactic.id + "/edit"}>
<p>{tactic.name}</p>
{isCoach && (
<button
id="delete"
onClick={(event) => {
event.stopPropagation();
confirm("Êtes-vous sûr de vouloir supprimer le partage cette tactique ?") && onTacticDelete();
}}
>
Retirer
</button>
)}
</div>
)
}