import { useEffect, useRef, useState } from "react"; import { ReactSortable, ReactSortableProps } from "react-sortablejs"; import { apiAuth, User } from "./api"; import { TeamState, useSession } from "./Session"; import TabController from "./TabController"; import { Chemistry, MVPRanking, PlayerType } from "./types"; type PlayerListProps = Partial> & { orderedList?: boolean; gender?: boolean; }; function PlayerList(props: PlayerListProps) { const fmps = props.list?.filter((item) => item.gender === "fmp").length; return ( {props.list && props.list.map((item, index) => (
))}
); } function PlayerMenuList(props: PlayerListProps) { const fmps = props.list?.filter((item) => item.gender === "fmp").length; return ( {props.list && props.list.map((item, index) => (

{props.orderedList ? props.gender ? index + 1 - (item.gender !== "fmp" ? fmps! : 0) + ". " + item.display_name : index + 1 + ". " + item.display_name : item.display_name}

))}
); } function filterSort(list: User[], ids: number[]): User[] { const objectMap = new Map(list.map((obj) => [obj.id, obj])); const filteredAndSortedObjects = ids .map((id) => objectMap.get(id)) .filter((obj) => obj !== undefined); return filteredAndSortedObjects; } interface PlayerInfoProps { user: User; teams: TeamState; players: User[]; } function TypeDnD({ user, teams, players }: PlayerInfoProps) { const [availablePlayers, setAvailablePlayers] = useState(players); const [handlers, setHandlers] = useState([]); const [combis, setCombis] = useState([]); const [cutters, setCutters] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { handleGet(); }, [players]); const [dialog, setDialog] = useState("dialog"); const dialogRef = useRef(null); async function handleSubmit() { if (dialogRef.current) dialogRef.current.showModal(); setDialog("sending..."); let handlerlist = handlers.map(({ id }) => id); let combilist = combis.map(({ id }) => id); let cutterlist = cutters.map(({ id }) => id); const data = { user: user.id, handlers: handlerlist, combis: combilist, cutters: cutterlist, team: teams.activeTeam, }; const response = await apiAuth("playertype", data, "PUT"); setDialog(response || "try sending again"); } async function handleGet() { setLoading(true); const data = await apiAuth(`playertype/${teams.activeTeam}`, null, "GET"); if (data.detail) { console.log(data.detail); setAvailablePlayers(players); setHandlers([]); setCombis([]); setCutters([]); } else { const playertype = data as PlayerType; setAvailablePlayers( players.filter( (player) => !playertype.handlers.includes(player.id) && !playertype.combis.includes(player.id) && !playertype.cutters.includes(player.id) ) ); setHandlers(filterSort(players, playertype.handlers)); setCombis(filterSort(players, playertype.combis)); setCutters(filterSort(players, playertype.cutters)); } setLoading(false); } return ( <> { setAvailablePlayers(players); setHandlers([]); setCombis([]); setCutters([]); }} onSubmit={handleSubmit} />

available players

handler

combi

cutter

{ event.currentTarget.close(); }} > {dialog} ); } function MVPDnD({ user, teams, players }: PlayerInfoProps) { const [availablePlayers, setAvailablePlayers] = useState(players); const [rankedPlayers, setRankedPlayers] = useState([]); const [loading, setLoading] = useState(false); const [mixed, setMixed] = useState(false); useEffect(() => { const activeTeam = teams.teams.find((team) => team.id == teams.activeTeam); activeTeam && setMixed(activeTeam.mixed); handleGet(); }, [players]); useEffect(() => { handleGet(); // setMixedList(rankedPlayers); }, [mixed]); const [dialog, setDialog] = useState("dialog"); const dialogRef = useRef(null); async function handleSubmit() { if (dialogRef.current) dialogRef.current.showModal(); setDialog("sending..."); let mvps = rankedPlayers.map(({ id }) => id); const data = { user: user.id, mvps: mvps, team: teams.activeTeam }; const response = await apiAuth("mvps", data, "PUT"); response ? setDialog(response) : setDialog("try sending again"); } const setMixedList = (newList: User[]) => mixed ? setRankedPlayers( newList.sort((a, b) => a.gender && b.gender ? a.gender.localeCompare(b.gender) : -1 ) ) : setRankedPlayers(newList); async function handleGet() { setLoading(true); const data = await apiAuth(`mvps/${teams.activeTeam}`, null, "GET"); if (data.detail) { console.log(data.detail); setAvailablePlayers(players); setRankedPlayers([]); } else { const mvps = data as MVPRanking; setMixedList(filterSort(players, mvps.mvps)); setAvailablePlayers( players.filter((user) => !mvps.mvps.includes(user.id)) ); } setLoading(false); } return ( <> { setAvailablePlayers(players); setRankedPlayers([]); }} onSubmit={handleSubmit} /> {loading ? (
) : (

available players

๐Ÿ†

)} { event.currentTarget.close(); }} > {dialog} ); } function ChemistryDnDMobile({ user, teams, players }: PlayerInfoProps) { var otherPlayers = players.filter((player) => player.id !== user.id); const [playersLeft, setPlayersLeft] = useState([]); const [playersMiddle, setPlayersMiddle] = useState(otherPlayers); const [playersRight, setPlayersRight] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { handleGet(); }, [players]); const [dialog, setDialog] = useState("dialog"); const dialogRef = useRef(null); async function handleSubmit() { if (dialogRef.current) dialogRef.current.showModal(); setDialog("sending..."); let left = playersLeft.map(({ id }) => id); let middle = playersMiddle.map(({ id }) => id); let right = playersRight.map(({ id }) => id); const data = { user: user.id, hate: left, undecided: middle, love: right, team: teams.activeTeam, }; const response = await apiAuth("chemistry", data, "PUT"); setDialog(response || "try sending again"); } async function handleGet() { setLoading(true); const data = await apiAuth(`chemistry/${teams.activeTeam}`, null, "GET"); if (data.detail) { console.log(data.detail); setPlayersRight([]); setPlayersMiddle(otherPlayers); setPlayersLeft([]); } else { const chemistry = data as Chemistry; setPlayersLeft(filterSort(otherPlayers, chemistry.hate)); setPlayersMiddle( otherPlayers.filter( (player) => !chemistry.hate.includes(player.id) && !chemistry.love.includes(player.id) ) ); setPlayersRight(filterSort(otherPlayers, chemistry.love)); } setLoading(false); } return ( <> { setPlayersRight([]); setPlayersMiddle(otherPlayers); setPlayersLeft([]); }} onSubmit={handleSubmit} /> {loading ? (
) : (

neutral

rather not

yes, please โ™ฅ๏ธ

)} { event.currentTarget.close(); }} > {dialog} ); } interface HeaderControlProps { onLoad: () => void; onClear: () => void; onSubmit: () => void; } function HeaderControl({ onLoad, onClear, onSubmit }: HeaderControlProps) { return (
); } export default function Rankings() { const { user, teams, players } = useSession(); const tabs = [ { id: "Chemistry", label: "๐Ÿงช Chemistry" }, { id: "MVP", label: "๐Ÿ† MVP" }, { id: "Type", label: "๐Ÿƒ Type" }, ]; return (

assign as many or as few players as you want and don't forget to ๐Ÿ’พ submit when you're done :)

{user && teams && players ? ( ) : (
)}
); }