From 17e3fd05df013b8b6b0d5ea4eed7c891df1066f9 Mon Sep 17 00:00:00 2001 From: Stephen Feddes Date: Thu, 9 Nov 2023 17:59:18 -0600 Subject: [PATCH] Submitting for approval. --- public/images/nbaLogos/1610612741.svg | 2 + public/images/nbaLogos/1610612745.svg | 57 +++++ public/images/nbaLogos/1610612748.svg | 21 ++ public/images/news.svg | 1 + src/components/DraftRoom/ChatRoom.tsx | 3 + src/components/DraftRoom/DraftGrade.tsx | 2 + src/components/DraftRoom/RosterPickList.tsx | 70 ------ .../DraftRoom/center/PlayersTable.tsx | 183 ++++++++++++-- .../DraftRoom/leftColumn/DraftRoster.tsx | 53 +++- src/components/Invites.tsx | 4 +- src/components/PlayerDraftPopup.tsx | 64 ----- src/components/PlayerInfoPopup.tsx | 232 ++++++++++++++++++ src/components/RoundedPickList.tsx | 67 +++++ src/components/UserInviter.tsx | 2 + src/components/buttons/CloseButton.tsx | 15 ++ .../buttons/PlayerInfoPopupButton.tsx | 37 +++ src/css/buttons/closeBtn.css | 12 + src/css/buttons/outlinedRoundedButton.css | 2 +- src/css/buttons/playerInfoPopupButton.css | 26 ++ src/css/chatRoom.css | 2 +- src/css/draftRoom/center/draftCenter.css | 1 - src/css/draftRoom/center/playersTable.css | 59 ++++- src/css/draftRoom/draftGrade.css | 11 +- src/css/draftRoom/leftColumn/draftRoster.css | 9 + .../draftRoom/leftColumn/userPickQueue.css | 2 +- src/css/draftRoom/rosterPickList.css | 122 --------- src/css/draftsPage.css | 13 +- src/css/invites.css | 14 +- src/css/pageLayout.css | 1 + src/css/playerDraftPopup.css | 197 +++++++++++++-- src/css/roundedPickList.css | 53 ++++ src/css/userInviter.css | 20 +- src/index.css | 7 +- src/pages/DraftsPage.tsx | 4 +- src/pages/LoginPage.tsx | 13 +- src/utils/draft.ts | 20 ++ src/utils/fantasyPointConverter.ts | 25 ++ 37 files changed, 1070 insertions(+), 356 deletions(-) create mode 100644 public/images/nbaLogos/1610612741.svg create mode 100644 public/images/nbaLogos/1610612745.svg create mode 100644 public/images/nbaLogos/1610612748.svg create mode 100644 public/images/news.svg delete mode 100644 src/components/DraftRoom/RosterPickList.tsx delete mode 100644 src/components/PlayerDraftPopup.tsx create mode 100644 src/components/PlayerInfoPopup.tsx create mode 100644 src/components/RoundedPickList.tsx create mode 100644 src/components/buttons/CloseButton.tsx create mode 100644 src/components/buttons/PlayerInfoPopupButton.tsx create mode 100644 src/css/buttons/closeBtn.css create mode 100644 src/css/buttons/playerInfoPopupButton.css delete mode 100644 src/css/draftRoom/rosterPickList.css create mode 100644 src/css/roundedPickList.css create mode 100644 src/utils/fantasyPointConverter.ts diff --git a/public/images/nbaLogos/1610612741.svg b/public/images/nbaLogos/1610612741.svg new file mode 100644 index 00000000..3dc76572 --- /dev/null +++ b/public/images/nbaLogos/1610612741.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/public/images/nbaLogos/1610612745.svg b/public/images/nbaLogos/1610612745.svg new file mode 100644 index 00000000..7202ebfd --- /dev/null +++ b/public/images/nbaLogos/1610612745.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/nbaLogos/1610612748.svg b/public/images/nbaLogos/1610612748.svg new file mode 100644 index 00000000..3fe6c960 --- /dev/null +++ b/public/images/nbaLogos/1610612748.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/news.svg b/public/images/news.svg new file mode 100644 index 00000000..bce6651d --- /dev/null +++ b/public/images/news.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/DraftRoom/ChatRoom.tsx b/src/components/DraftRoom/ChatRoom.tsx index 9128720d..e90e606d 100644 --- a/src/components/DraftRoom/ChatRoom.tsx +++ b/src/components/DraftRoom/ChatRoom.tsx @@ -25,6 +25,9 @@ const ChatRoom = () => { const sendMessage = (message: string) => { socket?.emit('send-message', message, username); + let messageList: Message[] = [...messages, {message: message, username: username}]; + messages.push({message: message, username: username}); + setMessages(messageList); } useEffect(() => { diff --git a/src/components/DraftRoom/DraftGrade.tsx b/src/components/DraftRoom/DraftGrade.tsx index 35856ebc..8126167b 100644 --- a/src/components/DraftRoom/DraftGrade.tsx +++ b/src/components/DraftRoom/DraftGrade.tsx @@ -38,6 +38,8 @@ const DraftGrade = (props: Props) => { draftGrade: props.draftGrade }), }); + alert('Email Sent!'); + setIsDraftGradeOpen(false); } return ( diff --git a/src/components/DraftRoom/RosterPickList.tsx b/src/components/DraftRoom/RosterPickList.tsx deleted file mode 100644 index e198332c..00000000 --- a/src/components/DraftRoom/RosterPickList.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import '../../css/draftRoom/rosterPickList.css'; -import React, { useEffect, useState, useRef } from 'react'; -import { useAuth } from '../../authentication/AuthContext'; -import { useDraft } from './DraftContext'; -import { User } from '../../utils/users'; -import { FaChevronDown } from 'react-icons/fa'; -import {RxCross1} from 'react-icons/rx'; -const API_URL = import.meta.env.VITE_API_URL; - -const RosterPickList = () => { - - const { userId } = useAuth(); - const modalRef = useRef(null); - const [isModalOpen, setIsModalOpen] = useState(false); - const draftContext = useDraft(); - const draftId = draftContext?.draftId; - const [ draftUsers, setDraftUsers ] = useState([]); - const [ draftBots, setDraftBots ] = useState([]); - const [ draftUser, setDraftUser ] = useState(); - - useEffect(() => { - if (draftId) { - fetch(API_URL+"/drafts/members?draftId="+draftId) - .then(response => response.json()) - .then(data => { - const user = data.draftUsers.find(user => user.user_id == userId); - const otherDraftUsers = data.draftUsers.filter(user => user.user_id != userId); - setDraftUsers(otherDraftUsers); - setDraftBots(data.draftBots); - setDraftUser(user); - }) - .catch(error => { - console.error('Error fetching data:', error); - }); - } - }, [draftId]); - - return ( - <> - {if (e.target==modalRef.current) {setIsModalOpen(false)}}} - > -
-

- setIsModalOpen(false)}/> - Teams -

-
    -
  • {`Team ${draftUser?.username}`}
  • - - {draftUsers.map((user, index) => ( -
  • {`Team ${user.username}`}
  • - ))} - - {draftBots.map((botNumber, index) => ( -
  • {`Team ${botNumber}`}
  • - ))} -
-
-
-
{setIsModalOpen(true)}}> - - -
- - ) -}; - -export default RosterPickList; \ No newline at end of file diff --git a/src/components/DraftRoom/center/PlayersTable.tsx b/src/components/DraftRoom/center/PlayersTable.tsx index f175519a..a7b0200c 100644 --- a/src/components/DraftRoom/center/PlayersTable.tsx +++ b/src/components/DraftRoom/center/PlayersTable.tsx @@ -2,9 +2,14 @@ import '../../../css/draftRoom/center/playersTable.css'; import React, { useEffect, useState } from 'react'; import { useDraft } from '../DraftContext'; import { useAuth } from '../../../authentication/AuthContext'; -import { addPlayer, PlayerPreviousSeasonStats, formatPlayerPositions, Player} from '../../../utils/draft'; +import { addPlayer, PlayerPreviousSeasonStats, formatPlayerPositions, Player, + ProjectedSeasonStats} from '../../../utils/draft'; +import { PlayerInfo } from '../../PlayerInfoPopup'; +import { FantasyPointConverter } from '../../../utils/fantasyPointConverter'; import OutlinedRoundedButton from '../../buttons/OutlinedRoundedButton'; -import PlayerDraftPopup from '../../PlayerDraftPopup'; +import PlayerInfoPopup from '../../PlayerInfoPopup'; +import RoundedPickList from '../../RoundedPickList'; +import PlayerInfoPopupButton from '../../buttons/PlayerInfoPopupButton'; const PlayersTable = () => { @@ -15,9 +20,43 @@ const PlayersTable = () => { const playerQueue = draftContext?.playerQueue; const setRoster = draftContext?.setRoster; const socket = draftContext?.socket; - const [playerList, setPlayerList] = useState(); + const [playerList, setPlayerList] = useState(); const currentTurnUserId = draftContext?.currentTurnUserId; + const [filteredPlayerList, setFilteredPlayerList] = useState(playerList); + const [searchPlayer, setSearchPlayer] = useState(''); + const [searchPosition, setSearchPosition] = useState(''); const { userId } = useAuth(); + const [aggregateChoice, setAggregateChoice] = useState('Average'); + const [seasonChoice, setSeasonChoice] = useState('Projections'); + const [selectedPlayerInfo, setSelectedPlayerInfo] = useState(); + const fanPtConverter = new FantasyPointConverter(1,1,4,4,-2,2); + + useEffect(() => { + + let filteredPlayers = playerList?.filter((player) => + (player.first_name.toLowerCase()+" "+player.last_name.toLowerCase()).includes(searchPlayer.toLowerCase()) + ); + + if (searchPosition=='PG') { + filteredPlayers = filteredPlayers?.filter((player) => player.is_pointguard); + } + else if (searchPosition=='SG') { + filteredPlayers = filteredPlayers?.filter((player) => player.is_shootingguard); + } + else if (searchPosition=='SF') { + filteredPlayers = filteredPlayers?.filter((player) => player.is_smallforward); + } + else if (searchPosition=='PF') { + filteredPlayers = filteredPlayers?.filter((player) => player.is_powerforward); + } + else if (searchPosition=='C') { + filteredPlayers = filteredPlayers?.filter((player) => player.is_center); + } + + if (filteredPlayers) { + setFilteredPlayerList(filteredPlayers); + } + }, [searchPlayer, searchPosition, playerList]); const handleQueueClick = (player: Player) => { const tempRoster = JSON.parse(JSON.stringify(roster)); @@ -62,25 +101,52 @@ const PlayersTable = () => { } return ( + <> + +
+ setSeasonChoice(season as string)} + width={100} + /> + setSearchPosition(searchPosition as string)} + width={75} + /> + setAggregateChoice(aggregate as string)} + width={75} + /> + ) => setSearchPlayer(e.target.value)} + /> +
- - + + - + - - + + + + + + + - {playerList?.map((player, index) => ( + {(filteredPlayerList as PlayerInfo[])?.map((player, index) => ( - - - - - - - + {seasonChoice=='Projections' && ( + <> + + + + + + + + + + + + + + )} + {seasonChoice=='Last Season' && ( + <> + + + + + + + + + + + + + + )} ))}
RKPLAYERRK    PLAYERFPTS AGE GPMPGMP PTSREBSASTSREBASTBLKSTLTOFG%3PM
{player.rank_number} + {player.rank_number} { @@ -90,7 +156,7 @@ const PlayersTable = () => { }} />
- {player.first_name + " " + player.last_name} +

{player.team_abbreviation}  @@ -116,17 +182,100 @@ const PlayersTable = () => { )}

{player.player_age}{player.games_played}{(player.minutes_played / player.games_played).toFixed(1)}{player.points_total}{player.rebounds_total}{player.assists_total} + {(fanPtConverter.convert(player.projected_rebounds, + player.projected_points, player.projected_blocks, + player.projected_steals, player.projected_turnovers, + player.projected_assists + )/((aggregateChoice=='Average') ? player.projected_games_played : 1)).toFixed(1)} + + {player.player_age} + + {player.projected_games_played} + + {(player.projected_minutes_played/((aggregateChoice=='Average') ? player.projected_games_played : 1)).toFixed(1)} + + {(player.projected_points/((aggregateChoice=='Average') ? player.projected_games_played : 1)).toFixed(1)} + + {(player.projected_rebounds/((aggregateChoice=='Average') ? player.projected_games_played : 1)).toFixed(1)} + + {(player.projected_assists/((aggregateChoice=='Average') ? player.projected_games_played : 1)).toFixed(1)} + + {(player.projected_blocks/((aggregateChoice=='Average') ? player.projected_games_played : 1)).toFixed(1)} + + {(player.projected_steals/((aggregateChoice=='Average') ? player.projected_games_played : 1)).toFixed(1)} + + {(player.projected_turnovers/((aggregateChoice=='Average') ? player.projected_games_played : 1)).toFixed(1)} + + {(100 * player.projected_fieldgoal_percentage).toFixed(1) + '%'} + + {(player.projected_threepointers/((aggregateChoice=='Average') ? player.projected_games_played : 1)).toFixed(1)} + + {(fanPtConverter.convert(player.rebounds_total, + player.points_total, player.blocks_total, + player.steals_total, player.turnovers_total, + player.assists_total + )/((aggregateChoice=='Average') ? player.games_played : 1)).toFixed(1)} + + {player.player_age} + + {player.games_played} + + {(player.minutes_played/((aggregateChoice=='Average') ? player.games_played : 1)).toFixed(1)} + + {(player.points_total/((aggregateChoice=='Average') ? player.games_played : 1)).toFixed(1)} + + {(player.rebounds_total/((aggregateChoice=='Average') ? player.games_played : 1)).toFixed(1)} + + {(player.assists_total/((aggregateChoice=='Average') ? player.games_played : 1)).toFixed(1)} + + {(player.blocks_total/((aggregateChoice=='Average') ? player.games_played : 1)).toFixed(1)} + + {(player.steals_total/((aggregateChoice=='Average') ? player.games_played : 1)).toFixed(1)} + + {(player.turnovers_total/((aggregateChoice=='Average') ? player.games_played : 1)).toFixed(1)} + + {(100 * player.fieldgoals_made / player.fieldgoals_attempted).toFixed(1) + '%'} + + {(player.threes_made/((aggregateChoice=='Average') ? player.games_played : 1)).toFixed(1)} +
+ ) }; diff --git a/src/components/DraftRoom/leftColumn/DraftRoster.tsx b/src/components/DraftRoom/leftColumn/DraftRoster.tsx index fc682697..2ca90489 100644 --- a/src/components/DraftRoom/leftColumn/DraftRoster.tsx +++ b/src/components/DraftRoom/leftColumn/DraftRoster.tsx @@ -1,11 +1,20 @@ import '../../../css/draftRoom/leftColumn/draftRoster.css'; -import RosterPickList from '../RosterPickList'; import React, { useEffect, useState } from 'react'; +import PlayerInfoPopup from '../../PlayerInfoPopup'; +import RoundedPickList from '../../RoundedPickList'; +import { PlayerInfo } from '../../PlayerInfoPopup'; import { useDraft } from '../DraftContext'; +import { useAuth } from '../../../authentication/AuthContext'; +const API_URL = import.meta.env.VITE_API_URL; const DraftRoster = () => { const draftContext = useDraft(); + const draftId = draftContext?.draftId; + const {username} = useAuth(); + const [selectedPlayerInfo, setSelectedPlayerInfo] = useState(); + const [teams, setTeams] = useState([]); + const [selectedTeam, setSelectedTeam] = useState(''); const roster = draftContext?.roster; const positionAbbreviation = { @@ -14,11 +23,38 @@ const DraftRoster = () => { "forward": "F", "center": "C", "utility": "UTIL", "bench": "BE" } + useEffect(() => { + if (draftId) { + fetch(API_URL+"/drafts/members?draftId="+draftId) + .then(response => response.json()) + .then(data => { + let teamNames: string[] = []; + data.draftBots.forEach((bot: number) => { + teamNames.push(`Team ${bot}`); + }); + data.draftUsers.forEach((user) => { + teamNames.push(user.username); + }); + setTeams(teamNames); + }) + .catch(error => { + console.error('Error fetching data:', error); + }); + } +}, [draftId]); + return ( + <> +
Roster - + setSelectedTeam(team as string)} + width={100} + height={25} + />
@@ -35,10 +71,14 @@ const DraftRoster = () => { {positionAbbreviation[position]} )) @@ -46,6 +86,7 @@ const DraftRoster = () => {
- {players[index] != null ? - (players[index]?.first_name[0]+". "+players[index]?.last_name) - : Empty - } + {players[index] != null && ( + setSelectedPlayerInfo(player)}> + {(players[index]?.first_name[0]+". "+players[index]?.last_name)} + + )} + {players[index] == null && ( + Empty + )}
+ ) }; diff --git a/src/components/Invites.tsx b/src/components/Invites.tsx index 33e21d1b..6923f265 100644 --- a/src/components/Invites.tsx +++ b/src/components/Invites.tsx @@ -4,6 +4,7 @@ import { useAuth } from "../authentication/AuthContext"; import {AiOutlineMail} from 'react-icons/ai'; import { useNavigate } from "react-router-dom"; import {RxCross1} from 'react-icons/rx'; +import CloseButton from "./buttons/CloseButton"; const API_URL = import.meta.env.VITE_API_URL; interface Invite { @@ -85,8 +86,7 @@ const Invites = () => { >

- setIsOpen(false)}/> + setIsOpen(false)} /> Invites

    diff --git a/src/components/PlayerDraftPopup.tsx b/src/components/PlayerDraftPopup.tsx deleted file mode 100644 index 83f4ef12..00000000 --- a/src/components/PlayerDraftPopup.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import '../css/playerDraftPopup.css'; -import '../css/modal.css'; -import React, {useState, useRef} from 'react'; - -interface Props { - playerId: number -} - -const PlayerDraftPopup = (props: Props) => { - - const [isOpen, setIsOpen] = useState(false); - const modalRef = useRef(null); - - return ( - <> - setIsOpen(true)}> - Nikola Jokic - - { - if (e.target == modalRef.current) { - setIsOpen(false); - } - }} - className="modal" - > -
    -
    - { - const imgElement = event.target as HTMLImageElement; - imgElement.src = "/images/playerImages/201935.png"; - imgElement.onerror = null; // Prevents future errors from being logged - }} - /> -
    Rank #20
    -
    - James Harden -

    Los Angeles Clippers

    -
    - { - const imgElement = event.target as HTMLImageElement; - imgElement.src = "/images/nbaLogos/1610612737.svg"; - imgElement.onerror = null; // Prevents future errors from being logged - }} - /> -
    -
    - 2023 Fantasy Outlook -
    -
    -
    -
    -
    - - ); -}; - -export default PlayerDraftPopup; \ No newline at end of file diff --git a/src/components/PlayerInfoPopup.tsx b/src/components/PlayerInfoPopup.tsx new file mode 100644 index 00000000..46749922 --- /dev/null +++ b/src/components/PlayerInfoPopup.tsx @@ -0,0 +1,232 @@ +import '../css/playerDraftPopup.css'; +import '../css/modal.css'; +import { Player } from '../utils/draft'; +import React, {useState, useRef, useEffect} from 'react'; +import CloseButton from './buttons/CloseButton'; + +export interface PlayerInfo extends Player { + fantasy_outlook: string; + injury_status: string; + points_total: number + rebounds_total: number; + assists_total: number; + blocks_total: number; + steals_total: number; + projected_points: number; + projected_rebounds: number; + projected_assists: number; + projected_blocks: number; + projected_steals: number; + projected_turnovers: number; + team_abbreviation: string; + games_played: number; + projected_games_played: number; + city_name: string; + team_name: string; + rank_number: number; + projected_fieldgoal_percentage: number; + projected_minutes_played: number; + projected_threepointers: number; + turnovers_total: number; + minutes_played: number; + fieldgoals_made: number; + fieldgoals_attempted: number; + threes_made: number; + summary: string; + analysis: string; + title: string; + news_date: string; +} + +interface Props { + player: PlayerInfo | undefined | null; + setPlayer(playerInfo: PlayerInfo | undefined | null): void; +} + +const PlayerInfoPopup = (props: Props) => { + + const [isOpen, setIsOpen] = useState(false); + const [player, setPlayer] = useState() + const modalRef = useRef(null); + + const formatDate = (dateString) => { + const months = [ + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December" + ]; + + const date = new Date(dateString); + const monthIndex = date.getMonth(); + const day = date.getDate(); + const year = date.getFullYear(); + + return `${months[monthIndex]} ${day}, ${year}`; + }; + + useEffect(() => { + if (props.player) { + setIsOpen(true); + setPlayer(props.player); + } + }, [props.player]) + + return ( + <> + {player && ( + { + if (e.target == modalRef.current) { + setIsOpen(false); + props.setPlayer(null); + } + }} + className="modal" + > +
    +
    +
    + {player && ( + { + const imgElement = event.target as HTMLImageElement; + imgElement.onerror = null; // Prevents future errors from being logged + }} + /> + )} +
    + {`Rank #${player.rank_number}`} + + {player.is_shootingguard && ( + + SG + + )} +   + {player.is_pointguard && ( + + PG + + )} +   + {player.is_smallforward && ( + + SF + + )} +   + {player.is_powerforward && ( + + PF + + )} +   + {player.is_center && ( + + C + + )} + + {setIsOpen(false); props.setPlayer(null);}} /> +
    +
    + {player.first_name+" "+player.last_name} +

    {player.city_name+" "+player.team_name}

    +
    + { + const imgElement = event.target as HTMLImageElement; + imgElement.onerror = null; // Prevents future errors from being logged + }} + /> +
    +
    + + {player.injury_status ? player.injury_status : 'HEALTHY'} + +
    +
    +
    +

    Last Season Stats

    + + + + + + + + + + + + + + + + + + + +
    PTSREBASTSTLBLK
    {(player.points_total/player.games_played).toFixed(1)}{(player.rebounds_total/player.games_played).toFixed(1)}{(player.assists_total/player.games_played).toFixed(1)}{(player.steals_total/player.games_played).toFixed(1)}{(player.blocks_total/player.games_played).toFixed(1)}
    +
    +
    +

    Projected Stats

    + + + + + + + + + + + + + + + + + + + +
    PTSREBASTSTLBLK
    {(player.projected_points/player.games_played).toFixed(1)}{(player.projected_rebounds/player.games_played).toFixed(1)}{(player.projected_assists/player.games_played).toFixed(1)}{(player.projected_steals/player.games_played).toFixed(1)}{(player.projected_blocks/player.games_played).toFixed(1)}
    +
    +
    +
    +
    + Fantasy Outlook +

    + {player.fantasy_outlook} +

    +
    +
    +
    +
    + + {player.title} + + + {formatDate(player.news_date)} + +

    + {player.summary} +

    + + Analysis + +

    + {player.analysis} +

    +
    +
    +
    + )} + + ); +}; + +export default PlayerInfoPopup; \ No newline at end of file diff --git a/src/components/RoundedPickList.tsx b/src/components/RoundedPickList.tsx new file mode 100644 index 00000000..f81cd672 --- /dev/null +++ b/src/components/RoundedPickList.tsx @@ -0,0 +1,67 @@ +import '../css/roundedPickList.css'; +import React, { useState, useRef, useEffect, MouseEvent } from 'react'; +import { FaChevronDown } from 'react-icons/fa'; + +interface Props { + itemList: (string | number)[]; + defaultValue?: string | number; + setValue: (item: string | number) => void; + width?: number; + height?: number; +} + +const RoundedPickList: React.FC = ({ itemList, defaultValue, width = 500, height=30, setValue }) => { + const [isOpen, setIsOpen] = useState(false); + const [selectedItem, setSelectedItem] = useState( + defaultValue !== undefined ? defaultValue : null + ); + const listRef = useRef(null); + + const handleClickOutside = (event) => { + if (event.target != listRef.current && event.target.tagName != "LI") { + setIsOpen(false); + } + }; + + useEffect(() => { + // Watch for changes in the defaultValue prop + setSelectedItem(defaultValue !== undefined ? defaultValue : null); + }, [defaultValue]); // Trigger the effect when defaultValue changes + + useEffect(() => { + document.addEventListener('mousedown', handleClickOutside as unknown as EventListener); + + // Clean up the event listener on unmount + return () => { + document.removeEventListener('mousedown', handleClickOutside as unknown as EventListener); + }; + }, []); + + return ( +
    +
    setIsOpen(!isOpen)} className="input"> + + +
    + {isOpen && ( +
      + {itemList.map((item, index) => ( +
    • { + setValue(item); + setSelectedItem(item); + setIsOpen(false); + }} + key={index} + > + {item} +
    • + ))} +
    + )} +
    + ); +}; + +export default RoundedPickList; \ No newline at end of file diff --git a/src/components/UserInviter.tsx b/src/components/UserInviter.tsx index db9e7656..1f1b8ee6 100644 --- a/src/components/UserInviter.tsx +++ b/src/components/UserInviter.tsx @@ -5,6 +5,7 @@ import { User } from "../utils/users"; import {RxCross1} from 'react-icons/rx'; import { useAuth } from "../authentication/AuthContext"; import TranslucentButton from "./buttons/TranslucentButton"; +import CloseButton from "./buttons/CloseButton"; const API_URL = import.meta.env.VITE_API_URL; interface Props { @@ -113,6 +114,7 @@ const UserInviter = (props: Props) => { >
    + {setIsOpen(false)}} /> { + return ( + + ); +}; + +export default CloseButton; \ No newline at end of file diff --git a/src/components/buttons/PlayerInfoPopupButton.tsx b/src/components/buttons/PlayerInfoPopupButton.tsx new file mode 100644 index 00000000..b48aecd0 --- /dev/null +++ b/src/components/buttons/PlayerInfoPopupButton.tsx @@ -0,0 +1,37 @@ +import '../../css/buttons/playerInfoPopupButton.css'; +import '../../css/modal.css'; +import { PlayerInfo } from '../PlayerInfoPopup'; +import React, {useState, useRef} from 'react'; + +interface Props { + setPlayer(playerInfo: PlayerInfo| undefined | null): void + player: PlayerInfo +} + +const PlayerInfoPopupButton = (props: Props) => { + + const givenDateString = props.player.news_date; + const givenDate = new Date(givenDateString); + const currentDate = new Date(); + const timeDiff = currentDate.getTime() - givenDate.getTime(); + const daysDiff = timeDiff / (1000 * 3600 * 24); + + return ( + props.setPlayer(props.player)}> + {props.player.first_name+" "+props.player.last_name} {props.player.injury_status} + {props.player.team_id && daysDiff > 8 && ( + { + const imgElement = event.target as HTMLImageElement; + imgElement.src = `/images/chicagoB.svg`; + imgElement.onerror = null; + }} + /> + )} + {props.player.injury_status} + + ); +}; + +export default PlayerInfoPopupButton; \ No newline at end of file diff --git a/src/css/buttons/closeBtn.css b/src/css/buttons/closeBtn.css new file mode 100644 index 00000000..ffb85d60 --- /dev/null +++ b/src/css/buttons/closeBtn.css @@ -0,0 +1,12 @@ +.close-btn { + border-radius: 10px; + cursor: pointer; + height: 20px; + width: 20px; + padding: 2px; + color: var(--white); +} + +.close-btn:hover { + background-color: rgba(200,200,200,.5); +} \ No newline at end of file diff --git a/src/css/buttons/outlinedRoundedButton.css b/src/css/buttons/outlinedRoundedButton.css index c2db2036..91bb8c09 100644 --- a/src/css/buttons/outlinedRoundedButton.css +++ b/src/css/buttons/outlinedRoundedButton.css @@ -6,7 +6,7 @@ cursor: pointer; transition: 0.3s; font-size: 16px; - height: 25px; + height: 30px; font-weight: 500; line-height: 0; background-color: white; diff --git a/src/css/buttons/playerInfoPopupButton.css b/src/css/buttons/playerInfoPopupButton.css new file mode 100644 index 00000000..9780ad8f --- /dev/null +++ b/src/css/buttons/playerInfoPopupButton.css @@ -0,0 +1,26 @@ +.player-popup-btn { + color: var(--blue); + cursor: pointer; + position: relative; + padding-right: 30px; +} + +.player-popup-btn img { + max-width: 20px; + max-height: 20px; + position: absolute; + right: 5px; + top: 0px; +} + +.player-popup-btn b { + position: absolute; + right: 0px; + font-size: 10px; + bottom: -15px; + color: var(--red); +} + +.player-popup-btn:hover { + color: var(--darkBlue); +} \ No newline at end of file diff --git a/src/css/chatRoom.css b/src/css/chatRoom.css index 7b040c74..4dbddd17 100644 --- a/src/css/chatRoom.css +++ b/src/css/chatRoom.css @@ -53,7 +53,7 @@ } .chat-room .messages .sent-by-self { - background-color: rgba(0, 200, 255, 0.15); + background-color: var(--transparentBlue); border-radius: 3px; padding: 0px 5px 0px 5px; text-align: right; diff --git a/src/css/draftRoom/center/draftCenter.css b/src/css/draftRoom/center/draftCenter.css index b695be44..15842dd0 100644 --- a/src/css/draftRoom/center/draftCenter.css +++ b/src/css/draftRoom/center/draftCenter.css @@ -25,7 +25,6 @@ .user-next-pick-notifier { padding: 3px 8px 8px 50px; border-bottom: 3px solid var(--mediumGrey); - margin-bottom: 20px; height: 55px; } diff --git a/src/css/draftRoom/center/playersTable.css b/src/css/draftRoom/center/playersTable.css index d9bded95..3c95d383 100644 --- a/src/css/draftRoom/center/playersTable.css +++ b/src/css/draftRoom/center/playersTable.css @@ -1,23 +1,48 @@ .players-table { width: 100%; - padding: 0px 10px 10px 10px; - overflow-y: auto; max-height: calc(100vh - 195px); position: relative; + border-left: 10px solid white; + border-right: 10px solid white; + overflow-y: auto; +} + +.players-table::-webkit-scrollbar { + height: 0px; } .players-table table { width: 100%; + background-color: white; + z-index: 20; } .players-table table tbody { width: 100%; } -.players-table table th:nth-child(2) { +.players-table table thead th:first-child { + min-width: 400px; + position: sticky; + left: 0; + background-color: white; + z-index: 3; +} + +.players-table table thead th { + min-width: 60px; + background-color: white; + z-index: 2 +} + +.players-table table tbody td:nth-child(1) { + position: sticky; + left: 0; + background-color: white; min-width: 300px; } + .players-table table td { font-size: 14px; border-bottom: 1px solid var(--mediumGrey); @@ -25,9 +50,10 @@ .players-table table tbody tr { height: 35px; + position: relative; } -.players-table table tbody tr:nth-child(even) { +.players-table table tbody tr:nth-child(even) td { background-color: var(--coolWhite); } @@ -49,6 +75,7 @@ .players-table table .player-cell img { height: 35px; + margin-left: 30px; width: 50px; } @@ -57,6 +84,28 @@ margin-right: 10px; } +.players-table .player-details { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + position: relative; +} + .players-table .player-details p, .players-table .player-details b { font-size: 12px; -} \ No newline at end of file +} + +.player-table-filters { + padding: 5px 10px 5px 10px; + display: flex; + gap: 10px; + justify-content: flex-start; +} + +.player-table-filters .search-player { + border: 2px solid var(--mediumGrey); + padding: 2px 5px 2px 5px; + height: 30px; + margin-left: auto; +} + diff --git a/src/css/draftRoom/draftGrade.css b/src/css/draftRoom/draftGrade.css index e4fc99d0..0d50ca7d 100644 --- a/src/css/draftRoom/draftGrade.css +++ b/src/css/draftRoom/draftGrade.css @@ -15,15 +15,6 @@ margin-top: 50px; padding-bottom: 50px; border: solid 1px var(--mediumDarkGrey); - transition: top 0.5s; - position: absolute; - left: calc(50% - 175px); - top: -535px; - transition: 0.5s; -} - -.draft-grade-area.active { - transform: translate(0, 535px); } .draft-grade-area h4 { @@ -62,7 +53,7 @@ } .draft-grade-area .summary { - color: var(--); + color: var(--coolWhite); margin-left: 20px; } diff --git a/src/css/draftRoom/leftColumn/draftRoster.css b/src/css/draftRoom/leftColumn/draftRoster.css index 8def018e..0a458523 100644 --- a/src/css/draftRoom/leftColumn/draftRoster.css +++ b/src/css/draftRoom/leftColumn/draftRoster.css @@ -37,4 +37,13 @@ .draft-roster .empty-spot { color: var(--grey); font-size: 13px; +} + +.draft-roster span { + font-size: 12px; + cursor: pointer; +} + +.draft-roster span:hover { + font-weight: 600; } \ No newline at end of file diff --git a/src/css/draftRoom/leftColumn/userPickQueue.css b/src/css/draftRoom/leftColumn/userPickQueue.css index c797257b..e14c7191 100644 --- a/src/css/draftRoom/leftColumn/userPickQueue.css +++ b/src/css/draftRoom/leftColumn/userPickQueue.css @@ -17,7 +17,7 @@ text-align: center; } -.user-pick-queue tbody tr:hover { +.user-pick-queue tbody tr:not(:only-child):hover { background-color: var(--lightGrey); } diff --git a/src/css/draftRoom/rosterPickList.css b/src/css/draftRoom/rosterPickList.css deleted file mode 100644 index 2504e6ae..00000000 --- a/src/css/draftRoom/rosterPickList.css +++ /dev/null @@ -1,122 +0,0 @@ -.roster-picklist { - width: 150px; - height: 25px; - border-radius: 15px; - background-color: white; - display: flex; - align-items: center; - padding: 5px 10px 5px 10px; - cursor: pointer; - border: 1px solid var(--grey); -} - -.roster-picklist .arrow { - height: 100%; - padding: 2px; -} - -.roster-picklist input { - width: 110px; - border: none; - height: 20px; - pointer-events: none; -} - -.roster-list-modal { - position: fixed; /* Stay in place */ - z-index: 10; /* Sit on top of everything */ - left: 0; - top: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.4); - border: none; - overflow: auto; -} - -.roster-list-modal .modal-content { - background-color: var(--black); - min-height: 450px; - height: 450px; - margin: auto; - display: flex; - flex-direction: column; - align-items: center; - min-width: 300px; - width: 300px; - overflow: auto; - border-radius: 10px; - box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); - z-index: 100; - margin-top: 50px; - overflow: auto; - border: 1px solid var(--mediumDarkGrey); -} - -.roster-list-modal .modal-content h4 { - color: var(--coolWhite); - background-color: var(--veryDarkGrey); - font-size: 20px; - font-weight: 500; - width: 100%; - height: 50px; - text-align: center; - border-bottom: 1px solid var(--mediumDarkGrey); - position: relative; - padding-top: 3px; -} - -.roster-list-modal .modal-content .close { - position: absolute; - left: 10px; - cursor: pointer; - top: 10px; - height: 20px; - width: 20px; - padding: 2px; -} - -.roster-list-modal .close { - position: absolute; - left: 10px; - cursor: pointer; - top: 10px; - height: 20px; - width: 20px; - padding: 2px; -} - -.roster-list-modal .close:hover { - background-color: rgba(200,200,200,.5); - border-radius: 10px; -} - -.roster-list-modal .modal-content .close:hover { - background-color: rgba(200,200,200,.5); - border-radius: 10px; -} - -.roster-list-modal .modal-content ul { - width: 100%; -} - -.roster-list-modal .modal-content li { - border-bottom: 1px solid var(--mediumDarkGrey); - width: 100%; - cursor: pointer; - transition: .3s; - padding: 0px 5px 0px 5px; - color: var(--coolWhite); -} - -.roster-list-modal .modal-content li:nth-child(even) { - background-color: var(--veryDarkGrey); -} - -.roster-list-modal .modal-content li:nth-child(odd) { - background-color: var(--black); -} - -.roster-list-modal .modal-content li:hover { - background-color: var(--black); -} \ No newline at end of file diff --git a/src/css/draftsPage.css b/src/css/draftsPage.css index 949a321a..53d14a9e 100644 --- a/src/css/draftsPage.css +++ b/src/css/draftsPage.css @@ -63,7 +63,6 @@ overflow: hidden; } - .draft-content-container.slide-left { transform: translateX(-100%); transition: transform .3s ease-in-out; @@ -80,8 +79,9 @@ width: 100%; font-weight: 600; display: flex; - color: var(--mediumGrey); + color: var(--coolWhite); justify-content: space-between; + height: 35px; } .mock-draft-menu .mock-drafts .draft-info { @@ -93,7 +93,7 @@ } .mock-draft-menu .mock-drafts .draft-info p { - color: var(--mediumGrey); + color: var(--coolWhite); } .mock-draft-menu .mock-drafts .draft-info .started { @@ -112,10 +112,11 @@ font-weight: 600; } -.mock-draft-menu .mock-drafts .join-button { +.mock-draft-menu .mock-drafts .join-btn { display: flex; + margin-top: 10px; justify-content: center; - margin-top: 15px; + } .mock-draft-menu .mock-drafts .delete { @@ -162,5 +163,5 @@ } .recommend-draft-creation { - color: var(--mediumGrey); + color: var(--coolWhite); } \ No newline at end of file diff --git a/src/css/invites.css b/src/css/invites.css index ae9fdde3..00cec2bb 100644 --- a/src/css/invites.css +++ b/src/css/invites.css @@ -58,19 +58,10 @@ padding-top: 3px; } -.invites .close { +.invites h4 *:first-child { position: absolute; left: 10px; - cursor: pointer; top: 10px; - height: 20px; - width: 20px; - padding: 2px; -} - -.invites .close:hover { - background-color: rgba(200,200,200,.5); - border-radius: 10px; } .invites ul { @@ -78,10 +69,11 @@ } .invites li { - background-color: var(--darkBlue); + background-color: var(--transparentBlue); border-radius: 5px; padding: 5px; color: var(--white); + margin-top: 5px; } .invites li i { diff --git a/src/css/pageLayout.css b/src/css/pageLayout.css index d3c68681..b8de2319 100644 --- a/src/css/pageLayout.css +++ b/src/css/pageLayout.css @@ -6,4 +6,5 @@ .page-layout { background-color: var(--black); height: 100vh; + overflow-y: hidden; } \ No newline at end of file diff --git a/src/css/playerDraftPopup.css b/src/css/playerDraftPopup.css index 59913389..3ead4126 100644 --- a/src/css/playerDraftPopup.css +++ b/src/css/playerDraftPopup.css @@ -1,12 +1,3 @@ -.player-draft-popup { - color: var(--brightBlue); - cursor: pointer; -} - -.player-draft-popup:hover { - color: var(--blue); -} - .player-info-box-header { display: flex; justify-content: flex-start; @@ -20,30 +11,47 @@ flex: 1; padding: 10px; border: 1px solid var(--darkGrey); + overflow-y: auto; } .fantasy-outlook-area b { font-size: 15px !important; } +.fantasy-outlook-area p { + font-size: 12px; + color: black; +} + .player-info-box-header-center { display: flex; flex-direction: column; justify-content: center; - padding: 10px; + padding: 0px 0px 10px 10px; flex: 1; height: 75px; - border: 1px solid var(--grey); + border: 1px solid var(--veryDarkGrey); + border-right: none; + width: 300px; +} + +.player-info-box-header-center .player-name { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .player-info-box-header img { width: 75px; height: 75px; padding: 10px; + border: 1px solid var(--veryDarkGrey); + border-left: none; + border-right: none; } .player-info-box-header img:first-child { - background-color: var(--darkBlue); + background-color: var(--veryDarkGrey); padding: 0px; } @@ -61,32 +69,109 @@ .player-info-box1 { background-color: var(--black); min-height: 250px; - margin: auto; + margin-left: auto; + margin-right: auto; + margin-top: 50px; display: flex; align-items: flex-start; padding: 40px 10px 10px 10px; width: 750px; height: 250px; min-width: 350px; + border: 1px solid var(--veryDarkGrey); border-radius: 10px 10px 0px 0px; box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); z-index: 100; } +.player-info-box1 .injury-status { + height: 35px; + display: flex; + padding: 6px 0px 0px 10px; +} + +.player-info-box1 .injury-status { + background-color: var(--transparentGreen); + border: 1px solid var(--green); +} + +.player-info-box1 .injury-status b { + background-color: var(--green); +} + +.player-info-box1 .injury-status.out { + background-color: var(--transparentRed); + border: 1px solid var(--red); +} + +.player-info-box1 .injury-status.dtd, .player-info-box1 .injury-status.gtd { + background-color: var(--transparentOrange); + border: 1px solid var(--brightOrange); +} + +.player-info-box1 .injury-status.dtd b, .player-info-box1 .injury-status.gtd b{ + background-color: var(--brightOrange); +} + +.player-info-box1 .injury-status.out b { + background-color: var(--red); +} + +.player-info-box1 .injury-status b { + font-weight: 500; + font-size: 15px; + padding: 0px 5px 0px 5px; + line-height: 22px; + color: var(--white); + border-radius: 3px; + text-align: center; + height: 22px; +} + .player-info-box-header .rank { position: absolute; + display: flex; + justify-content: space-between; color: var(--white); - top: 10px; + top: 61px; height: 30px; - background-color: var(--darkBlue); - border-radius: 3px 0px 0px 0px; - width: 395px; + background-color: var(--veryDarkGrey); + border-radius: 5px 5px 0px 0px; + width: 450px; + padding: 3px 5px 10px 10px; +} + +.player-info-box-header .rank b { + font-size: 20px; + font-weight: 500; + line-height: 0px; +} + +.player-info-box-header .rank .pointguard { + color: var(--roseRed); +} + +.player-info-box-header .rank .shootingguard { + color: var(--brightOrange); +} + +.player-info-box-header .rank .smallforward { + color: var(--green); +} + +.player-info-box-header .rank .powerforward { + color: var(--lightBlueGrey); +} + +.player-info-box-header .rank .center { + color: var(--purple); } .player-info-box2 { - background-color: var(--grey); + background-color: var(--veryDarkGrey); min-height: 250px; - margin: auto; + margin-left: auto; + margin-right: auto; display: flex; flex-direction: column; gap: 20px; @@ -95,8 +180,78 @@ width: 750px; height: 250px; min-width: 350px; - overflow: auto; border-radius: 0px 0px 10px 10px; box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); - z-index: 100; +} + +.player-stats-tables { + display: flex; + width: 100%; + background-color: var(--veryDarkGrey); +} + +.player-stats-tables p { + color: var(--coolWhite); + text-align: center; + height: 30px; + padding-top: 3px; +} + +.player-stats-tables table { + width: 225px; +} + +.player-stats-tables .projected-stats table { + border-left: 2px solid var(--veryDarkGrey); +} + +.player-stats-tables table th { + background-color: var(--darkGrey); + font-weight: 400; + font-size: 14px; + color: var(--lightBlueGrey); +} + +.player-stats-tables table td { + background-color: var(--lightBlueGrey); + text-align: center; + height: 38px; + font-weight: 500; +} + +.player-info-box2 .player-news { + display: flex; + flex-direction: column; + background-color: var(--coolWhite); + padding: 15px 20px 15px 20px; + height: 230px; + border: 2px solid var(--mediumDarkGrey); + overflow-y: auto; +} + +.player-info-box2 .player-news .title { + margin-bottom: 10px; + font-size: 20px; + color: var(--black); +} + +.player-info-box2 .player-news .date { + font-size: 13px; + font-weight: 500; + color: var(--mediumDarkGrey); +} + +.player-info-box2 .player-news .date { + font-size: 13px; + font-weight: 500; + color: var(--mediumDarkGrey); +} + +.player-info-box2 .player-news p { + color: black; +} + +.player-info-box2 .player-news .analysis { + color: var(--black); + margin-top: 10px; } \ No newline at end of file diff --git a/src/css/roundedPickList.css b/src/css/roundedPickList.css new file mode 100644 index 00000000..339d6978 --- /dev/null +++ b/src/css/roundedPickList.css @@ -0,0 +1,53 @@ +.rounded-pick-list { + position: relative; +} + +.rounded-pick-list .input { + display: flex; +} + +.rounded-pick-list .input input { + border: 1px solid var(--grey); + border-right: none; + font-size: 14px; + padding-left: 15px; + border-radius: 15px 0px 0px 15px; + outline: none; + cursor: pointer; +} + +.rounded-pick-list ul { + position: absolute; + background-color: white; + width: 100%; + border: 1px solid var(--black); + max-height: 200px; + overflow: auto; + z-index: 10; +} + +.rounded-pick-list ul li { + padding: 3px 6px 3px 6px; + cursor: pointer; + transition: 0.3s; +} + +.rounded-pick-list ul li.selected { + background-color: var(--lightGrey); +} + +.rounded-pick-list ul li:hover { + background-color: var(--lightGrey); +} + +.rounded-pick-list .input .chevron-down { + background-color: white; + width: 30px; + color: var(--darkGrey); + padding: 7px; + border-left: none; + cursor: pointer; + border: 1px solid var(--grey); + border-left: none; + border-radius: 0px 15px 15px 0px; +} \ No newline at end of file diff --git a/src/css/userInviter.css b/src/css/userInviter.css index b914fe4c..ab186718 100644 --- a/src/css/userInviter.css +++ b/src/css/userInviter.css @@ -1,13 +1,3 @@ -.open-user-inviter { - background-color: var(--orange); - border: 2px solid var(--black); - color: white; - padding: 3px 15px 3px 15px; - cursor: pointer; - transition: 0.3s; - height: 35px; -} - .open-user-inviter:hover { background-color: var(--brightOrange); } @@ -15,9 +5,16 @@ .user-inviter .invite-user { display: flex; gap: 5px; + position: relative; width: 100%; } +.user-inviter .invite-user *:first-child { + position: absolute; + left: -18px; + top: -18px; +} + .user-inviter ul { width: 100%; display: flex; @@ -26,7 +23,7 @@ } .user-inviter ul li { - background-color: var(--darkBlue); + background-color: var(--transparentBlue); width: 100%; color: var(--white); border-radius: 5px; @@ -64,6 +61,7 @@ box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); z-index: 100; margin-top: 50px; + border: 1px solid var(--mediumDarkGrey); } .modal { diff --git a/src/index.css b/src/index.css index a51a8e86..9564e281 100644 --- a/src/index.css +++ b/src/index.css @@ -10,12 +10,17 @@ --white: rgb(250, 250, 250); --brightBlue: rgb(75, 175, 250); --lightBlueGrey: rgb(135, 150, 180); - --blue: rgb(65, 145, 210); + --blue: rgb(60, 135, 190); + --transparentBlue: rgba(65, 100, 110, 0.3); + --transparentRed: rgba(255, 100, 100, 0.3); --transparentGrey: rgba(100, 100, 125, 0.5); --black: rgb(40, 45, 70); --mediumDarkGrey: rgb(100, 100, 120); + --purple: rgb(140, 70, 200); + --roseRed: rgb(255, 75, 75); --darkBlue: rgb(50, 60, 120); --green: rgb(80, 200, 115); + --transparentGreen: rgba(80, 200, 116, 0.3); --yellow: rgb(220, 150, 20); --brightYellow: rgb(255, 255, 0); --red: rgb(240, 0, 0); diff --git a/src/pages/DraftsPage.tsx b/src/pages/DraftsPage.tsx index c34e002a..7997b8a9 100644 --- a/src/pages/DraftsPage.tsx +++ b/src/pages/DraftsPage.tsx @@ -154,7 +154,7 @@ const DraftsPage = () => {

    -
    +
    { navigate("/modules/drafts/draftroom/"+userDrafts[draftIndex].draft_id); @@ -176,7 +176,7 @@ const DraftsPage = () => { navigate('/modules/mock-drafts/configure'); }} > - Create draft + Create Draft
    diff --git a/src/pages/LoginPage.tsx b/src/pages/LoginPage.tsx index 54339995..c2027924 100644 --- a/src/pages/LoginPage.tsx +++ b/src/pages/LoginPage.tsx @@ -73,11 +73,16 @@ const LoginPage = () => { }); const jwtToken = await response.json(); - localStorage.setItem('jwtToken', jwtToken); - setIsAuthenticated(true); - localStorage.setItem("previousPagePath", "/modules/dashboard"); + if (jwtToken) { + localStorage.setItem('jwtToken', jwtToken); + setIsAuthenticated(true); + localStorage.setItem("previousPagePath", "/modules/dashboard"); + } + else { + setIsCredentialsFalse(true); + setIsLoadingScreen(false); + } } catch (error) { - console.log(error); setIsCredentialsFalse(true); setIsLoadingScreen(false); } diff --git a/src/utils/draft.ts b/src/utils/draft.ts index bad0b7a6..0c6f55b1 100644 --- a/src/utils/draft.ts +++ b/src/utils/draft.ts @@ -72,9 +72,29 @@ export interface PlayerPreviousSeasonStats extends Player { games_played: number; minutes_played: number; points_total: number; + blocks_total: number; + steals_total: number; + turnovers_total: number; rebounds_total: number; assists_total: number; team_abbreviation: string; + fieldgoals_made: number; + fieldgoals_attempted: number; + threes_made: number; + threes_attempted: number; +} + +export interface ProjectedSeasonStats extends Player { + projected_games_played: number; + projected_minutes_played: number; + projected_points: number; + projected_blocks: number; + projected_steals: number; + projected_turnovers: number; + projected_rebounds: number; + projected_assists: number; + projected_fieldgoal_percentage: number; + projected_threepointers: number; } // Define the function to shift a player diff --git a/src/utils/fantasyPointConverter.ts b/src/utils/fantasyPointConverter.ts new file mode 100644 index 00000000..fadf5fa3 --- /dev/null +++ b/src/utils/fantasyPointConverter.ts @@ -0,0 +1,25 @@ +export class FantasyPointConverter { + protected rebWeight: number; + protected ptWeight: number; + protected blkWeight: number; + protected stlWeight: number; + protected turnoverWeight: number; + protected assistWeight: number; + + constructor(rebWeight: number, ptWeight: number, blkWeight: number, + stlWeight: number, turnoverWeight: number, assistWeight: number) { + this.rebWeight = rebWeight; + this.ptWeight = ptWeight; + this.blkWeight = blkWeight; + this.stlWeight = stlWeight; + this.turnoverWeight = turnoverWeight; + this.assistWeight = assistWeight; + } + + public convert(rbs: number, pts: number, blks: number, stls: number, turnovers: number, assists: number) { + const fanPts = (this.rebWeight*rbs)+(this.ptWeight*pts)+(this.stlWeight*stls)+ + (this.blkWeight*blks)+(this.stlWeight*stls)+ + (this.turnoverWeight*turnovers)+(this.assistWeight*assists); + return fanPts; + } +} \ No newline at end of file