From 7f5831fed8ce1ff0d7fda1e466a3d4a01f2e0b4a Mon Sep 17 00:00:00 2001 From: Nikita Mashchenko Date: Fri, 12 May 2023 19:26:42 -0500 Subject: [PATCH 01/15] Initial cleanning --- .../defaultAvatars/user/unregistered.png | Bin 0 -> 1767 bytes .../src/components/NavBar/Profile/Profile.jsx | 15 ++---- .../ProfileDetails/ProfileDetails.jsx | 10 ++-- .../Profile/components/ProfileForm/index.jsx | 13 +++--- .../Teammates/Teammates.js} | 8 ++-- .../Teammates/Teammates.styles.js} | 0 .../components/CardSkeleton/CardSkeleton.js | 0 .../CardSkeleton/CardSkeleton.styles.js | 0 .../Teammates}/components/Cards/Cards.js | 0 .../components/Cards/Cards.styles.js | 0 .../components/FiltersMenu/FiltersMenu.js | 3 -- .../FiltersMenu/FiltersMenu.styles.js | 0 .../components/NotFound/NotFound.js | 0 .../components/NotFound/NotFound.styles.js | 0 .../components/SelectField/MenuProps.js | 0 .../components/SelectField/SelectField.css | 0 .../components/SelectField/SelectField.js | 0 .../SelectField/SelectField.styles.js | 0 .../components/SliderToTop/SliderToTop.jsx | 0 .../SliderToTop/SliderToTop.styles.js | 0 .../TopBar/Contentration.options.js | 0 .../components/TopBar/Filters/Countries.js | 0 .../TopBar/Filters/ProgrammingLanguages.js | 0 .../components/TopBar/Filters/Roles.js | 0 .../TopBar/ProgrammingLanguages.options.js | 0 .../Teammates}/components/TopBar/TopBar.js | 0 .../components/TopBar/TopBar.styles.js | 0 .../FrameworksCases/LengthFourCase.js | 2 +- .../FrameworksCases/LengthFourSlicedCase.js | 2 +- .../UserCard/FrameworksCases/LengthOneCase.js | 2 +- .../FrameworksCases/LengthThreeCase.js | 2 +- .../UserCard/FrameworksCases/LengthTwoCase.js | 2 +- .../components/UserCard/UserCard.js | 9 +--- .../components/UserCard/UserCard.styles.js | 0 .../components/UserProfile/UserProfile.js | 0 .../UserProfile/UserProfile.styles.js | 0 .../UserProfilePhone/UserProfilePhone.js | 0 .../UserProfilePhone.styles.js | 0 .../Teammates}/img/Country.svg | 0 .../Teammates}/img/Crown.svg | 0 .../Teammates}/img/CrownTest.png | Bin .../Teammates}/img/tempImg.jpg | Bin .../src/constants/finishRegistrationData.js | 2 +- .../frameworkColors.js} | 0 client/src/constants/images.js | 1 + client/src/constants/programmingLanguages.js | 37 ++++++++++++++- client/src/routes/routes.js | 43 +++++++++--------- .../{Forms => }/Confirmation/Confirmation.js | 2 +- .../{Forms => }/CreateTeam/CreateTeam.js | 2 +- .../FinishRegistration/FinishRegistration.js | 2 +- .../screens/{Forms => }/Form404/Form404.js | 2 +- .../LeaderboardScreen/LeaderboardScreen.js | 2 +- .../{Forms => }/LoaderScreen/LoaderScreen.js | 2 +- client/src/screens/{Forms => }/Login/Login.js | 2 +- .../{Forms => }/NoTeamScreen/NoTeamScreen.js | 2 +- .../screens/{Forms => }/Profile/Profile.js | 2 +- .../{Forms => }/Registration/Registration.js | 2 +- .../ResetNewPasswords/ResetNewPasswords.js | 2 +- .../ResetPassword/ResetPassword.js | 2 +- .../ResetPasswordConfirmation.js | 2 +- .../{Forms => }/TeamScreen/TeamScreen.js | 2 +- .../TeammatesScreen/TeammatesScreen.js | 14 ++++++ .../{Forms => }/TeamsScreen/TeamsScreen.js | 2 +- .../TournamentCodingScreen.js | 2 +- .../TournamentInfo/TournamentInfo.js | 2 +- .../{Forms => }/Tournaments/Tournaments.js | 2 +- .../UserCard/ProgrammingLanguages.js | 36 --------------- .../components/CustomSelect/CustomSelect.jsx | 5 +- 68 files changed, 117 insertions(+), 125 deletions(-) create mode 100644 client/src/assets/defaultAvatars/user/unregistered.png rename client/src/{screens/UsersList/UsersList.js => components/Teammates/Teammates.js} (96%) rename client/src/{screens/UsersList/UsersList.styles.js => components/Teammates/Teammates.styles.js} (100%) rename client/src/{screens/UsersList => components/Teammates}/components/CardSkeleton/CardSkeleton.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/CardSkeleton/CardSkeleton.styles.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/Cards/Cards.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/Cards/Cards.styles.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/FiltersMenu/FiltersMenu.js (93%) rename client/src/{screens/UsersList => components/Teammates}/components/FiltersMenu/FiltersMenu.styles.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/NotFound/NotFound.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/NotFound/NotFound.styles.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/SelectField/MenuProps.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/SelectField/SelectField.css (100%) rename client/src/{screens/UsersList => components/Teammates}/components/SelectField/SelectField.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/SelectField/SelectField.styles.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/SliderToTop/SliderToTop.jsx (100%) rename client/src/{screens/UsersList => components/Teammates}/components/SliderToTop/SliderToTop.styles.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/TopBar/Contentration.options.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/TopBar/Filters/Countries.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/TopBar/Filters/ProgrammingLanguages.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/TopBar/Filters/Roles.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/TopBar/ProgrammingLanguages.options.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/TopBar/TopBar.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/TopBar/TopBar.styles.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/UserCard/FrameworksCases/LengthFourCase.js (88%) rename client/src/{screens/UsersList => components/Teammates}/components/UserCard/FrameworksCases/LengthFourSlicedCase.js (90%) rename client/src/{screens/UsersList => components/Teammates}/components/UserCard/FrameworksCases/LengthOneCase.js (83%) rename client/src/{screens/UsersList => components/Teammates}/components/UserCard/FrameworksCases/LengthThreeCase.js (88%) rename client/src/{screens/UsersList => components/Teammates}/components/UserCard/FrameworksCases/LengthTwoCase.js (82%) rename client/src/{screens/UsersList => components/Teammates}/components/UserCard/UserCard.js (94%) rename client/src/{screens/UsersList => components/Teammates}/components/UserCard/UserCard.styles.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/UserProfile/UserProfile.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/UserProfile/UserProfile.styles.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/UserProfilePhone/UserProfilePhone.js (100%) rename client/src/{screens/UsersList => components/Teammates}/components/UserProfilePhone/UserProfilePhone.styles.js (100%) rename client/src/{screens/UsersList => components/Teammates}/img/Country.svg (100%) rename client/src/{screens/UsersList => components/Teammates}/img/Crown.svg (100%) rename client/src/{screens/UsersList => components/Teammates}/img/CrownTest.png (100%) rename client/src/{screens/UsersList => components/Teammates}/img/tempImg.jpg (100%) rename client/src/{screens/UsersList/components/UserCard/FrameworkColors.js => constants/frameworkColors.js} (100%) create mode 100644 client/src/constants/images.js rename client/src/screens/{Forms => }/Confirmation/Confirmation.js (71%) rename client/src/screens/{Forms => }/CreateTeam/CreateTeam.js (87%) rename client/src/screens/{Forms => }/FinishRegistration/FinishRegistration.js (74%) rename client/src/screens/{Forms => }/Form404/Form404.js (72%) rename client/src/screens/{Forms => }/LeaderboardScreen/LeaderboardScreen.js (74%) rename client/src/screens/{Forms => }/LoaderScreen/LoaderScreen.js (76%) rename client/src/screens/{Forms => }/Login/Login.js (63%) rename client/src/screens/{Forms => }/NoTeamScreen/NoTeamScreen.js (74%) rename client/src/screens/{Forms => }/Profile/Profile.js (77%) rename client/src/screens/{Forms => }/Registration/Registration.js (60%) rename client/src/screens/{Forms => }/ResetNewPasswords/ResetNewPasswords.js (72%) rename client/src/screens/{Forms => }/ResetPassword/ResetPassword.js (72%) rename client/src/screens/{Forms => }/ResetPasswordConfirmation/ResetPasswordConfirmation.js (70%) rename client/src/screens/{Forms => }/TeamScreen/TeamScreen.js (90%) create mode 100644 client/src/screens/TeammatesScreen/TeammatesScreen.js rename client/src/screens/{Forms => }/TeamsScreen/TeamsScreen.js (89%) rename client/src/screens/{Forms => }/TournamentCodingScreen/TournamentCodingScreen.js (73%) rename client/src/screens/{Forms => }/TournamentInfo/TournamentInfo.js (88%) rename client/src/screens/{Forms => }/Tournaments/Tournaments.js (70%) delete mode 100644 client/src/screens/UsersList/components/UserCard/ProgrammingLanguages.js diff --git a/client/src/assets/defaultAvatars/user/unregistered.png b/client/src/assets/defaultAvatars/user/unregistered.png new file mode 100644 index 0000000000000000000000000000000000000000..1430ddaa7e7595423a30da06635e1637da907dbe GIT binary patch literal 1767 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 Ee-~yqg#Z8m literal 0 HcmV?d00001 diff --git a/client/src/components/NavBar/Profile/Profile.jsx b/client/src/components/NavBar/Profile/Profile.jsx index 59ce0193e..0ce2e4027 100644 --- a/client/src/components/NavBar/Profile/Profile.jsx +++ b/client/src/components/NavBar/Profile/Profile.jsx @@ -1,9 +1,8 @@ import React, { useEffect, useState } from 'react' import { useCheckAuth } from '../../../api/hooks/auth/useCheckAuth' +import unregisteredImg from '../../../assets/defaultAvatars/user/unregistered.png' import { LOCAL_PATH } from '../../../http' -import userImg from '../../../screens/UsersList/img/tempImg.jpg' -import defaultImg from '../defaultImg.png' import { ProfileIcon, UserContent, UserInfo, UserRealName, UserUsername } from './Profile.styles' @@ -11,7 +10,7 @@ let defaultData = { userRealName: 'Unknown', userUsername: 'unknown@email.com', notificationBell: false, - userImg: defaultImg, + userImg: unregisteredImg, } const changeData = (data) => { @@ -19,22 +18,18 @@ const changeData = (data) => { userRealName: data.fullName, userUsername: data.username, notificationBell: true, - userImg: defaultImg, + userImg: LOCAL_PATH + '/' + data.image, } } const Profile = ({ sidebar }) => { const { data: user } = useCheckAuth() const isUserRegistered = user?.isRegistered - const userImage = !isUserRegistered - ? defaultImg - : user?.image - ? LOCAL_PATH + '/' + user?.image - : userImg const [data, setData] = useState(defaultData) useEffect(() => { if (isUserRegistered) { + console.log(user) setData(changeData(user)) } else { setData(defaultData) @@ -43,7 +38,7 @@ const Profile = ({ sidebar }) => { return ( - + {data?.userRealName} @{data?.userUsername} diff --git a/client/src/components/Profile/components/ProfileDetails/ProfileDetails.jsx b/client/src/components/Profile/components/ProfileDetails/ProfileDetails.jsx index 8e392c5a8..9b3cd1634 100644 --- a/client/src/components/Profile/components/ProfileDetails/ProfileDetails.jsx +++ b/client/src/components/Profile/components/ProfileDetails/ProfileDetails.jsx @@ -3,20 +3,16 @@ import { useNavigate } from 'react-router-dom' import { useCheckAuth } from '../../../../api/hooks/auth/useCheckAuth' import { useGetTeamData } from '../../../../api/hooks/team/useGetTeamData' -import EditIcon from '../../../../assets/EditIcon' import Email from '../../../../assets/UserProfile/Email' import Github from '../../../../assets/UserProfile/Github' import Linkedin from '../../../../assets/UserProfile/Linkedin' import Location from '../../../../assets/UserProfile/Location' import Star from '../../../../assets/UserProfile/Star' +import { Framework } from '../../../../components/Teammates/components/UserCard/UserCard.styles' +import { frameworkColors, frameworkTextColors } from '../../../../constants/frameworkColors' +import { languageOptions } from '../../../../constants/programmingLanguages' import ROUTES from '../../../../constants/routes' import { LOCAL_PATH } from '../../../../http' -import { - frameworkColors, - frameworkTextColors, -} from '../../../../screens/UsersList/components/UserCard/FrameworkColors' -import languageOptions from '../../../../screens/UsersList/components/UserCard/ProgrammingLanguages' -import { Framework } from '../../../../screens/UsersList/components/UserCard/UserCard.styles' import AvatarEditButton from '../../../../shared/components/Forms/UserAvatar/AvatarEditButton/AvatarEditButton' import { UserAvatar } from '../../../../shared/components/Forms/UserAvatar/UserAvatar.styles' import Loader from '../../../../shared/components/Loader/Loader' diff --git a/client/src/components/Profile/components/ProfileForm/index.jsx b/client/src/components/Profile/components/ProfileForm/index.jsx index 80c0d8a88..81f7bc65d 100644 --- a/client/src/components/Profile/components/ProfileForm/index.jsx +++ b/client/src/components/Profile/components/ProfileForm/index.jsx @@ -12,20 +12,19 @@ import Github from '../../../../assets/UserProfile/Github' import Linkedin from '../../../../assets/UserProfile/Linkedin' import Location from '../../../../assets/UserProfile/Location' import Star from '../../../../assets/UserProfile/Star' +import { Framework } from '../../../../components/Teammates/components/UserCard/UserCard.styles' import concentrationOptions from '../../../../constants/concentrations' import { userExperienceOptions } from '../../../../constants/finishRegistrationData' +import { frameworkColors, frameworkTextColors } from '../../../../constants/frameworkColors' import frameworkOptions from '../../../../constants/frameworks' -import programmingLanguageOptions from '../../../../constants/programmingLanguages' +import { + languageOptions, + programmingLanguageOptions, +} from '../../../../constants/programmingLanguages' import ROUTES from '../../../../constants/routes' import { usePrompt } from '../../../../hooks/usePrompt' import { LOCAL_PATH } from '../../../../http' import { editProfileValidation } from '../../../../schemas' -import { - frameworkColors, - frameworkTextColors, -} from '../../../../screens/UsersList/components/UserCard/FrameworkColors' -import languageOptions from '../../../../screens/UsersList/components/UserCard/ProgrammingLanguages' -import { Framework } from '../../../../screens/UsersList/components/UserCard/UserCard.styles' import CustomButton from '../../../../shared/components/CustomButton/CustomButton' import CustomInput from '../../../../shared/components/CustomInput/CustomInput' import CustomSelect from '../../../../shared/components/CustomSelect/CustomSelect' diff --git a/client/src/screens/UsersList/UsersList.js b/client/src/components/Teammates/Teammates.js similarity index 96% rename from client/src/screens/UsersList/UsersList.js rename to client/src/components/Teammates/Teammates.js index 13457e9b0..5aac825dc 100644 --- a/client/src/screens/UsersList/UsersList.js +++ b/client/src/components/Teammates/Teammates.js @@ -20,13 +20,12 @@ import { GridContainer, InfoContainer, UserCardModal, -} from './UsersList.styles' +} from './Teammates.styles' -function UsersList() { +function Teammates() { /** * Set of states that are used by this component */ - const [open, setOpen] = useState(false) const [showUser, setShowUser] = useState({}) const [isNotFound, setIsNotFound] = useState(false) @@ -68,7 +67,6 @@ function UsersList() { return ( <> - {/* ! USED ONLY FOR 730px or more */} { diff --git a/client/src/screens/UsersList/components/UserCard/FrameworksCases/LengthFourSlicedCase.js b/client/src/components/Teammates/components/UserCard/FrameworksCases/LengthFourSlicedCase.js similarity index 90% rename from client/src/screens/UsersList/components/UserCard/FrameworksCases/LengthFourSlicedCase.js rename to client/src/components/Teammates/components/UserCard/FrameworksCases/LengthFourSlicedCase.js index 889c0b327..a7b696dbb 100644 --- a/client/src/screens/UsersList/components/UserCard/FrameworksCases/LengthFourSlicedCase.js +++ b/client/src/components/Teammates/components/UserCard/FrameworksCases/LengthFourSlicedCase.js @@ -1,6 +1,6 @@ // * Styles // * Colors -import { frameworkColors, frameworkTextColors } from '../FrameworkColors' +import { frameworkColors, frameworkTextColors } from '../../../../../constants/frameworkColors' import { AndMore, Framework } from '../UserCard.styles' const LengthFourSlicedCase = ({ userFrameworks }) => { diff --git a/client/src/screens/UsersList/components/UserCard/FrameworksCases/LengthOneCase.js b/client/src/components/Teammates/components/UserCard/FrameworksCases/LengthOneCase.js similarity index 83% rename from client/src/screens/UsersList/components/UserCard/FrameworksCases/LengthOneCase.js rename to client/src/components/Teammates/components/UserCard/FrameworksCases/LengthOneCase.js index 8f61211a5..f856664d3 100644 --- a/client/src/screens/UsersList/components/UserCard/FrameworksCases/LengthOneCase.js +++ b/client/src/components/Teammates/components/UserCard/FrameworksCases/LengthOneCase.js @@ -1,6 +1,6 @@ // * Styles // * Colors -import { frameworkColors, frameworkTextColors } from '../FrameworkColors' +import { frameworkColors, frameworkTextColors } from '../../../../../constants/frameworkColors' import { Framework } from '../UserCard.styles' const LengthOneCase = ({ userFrameworks }) => { diff --git a/client/src/screens/UsersList/components/UserCard/FrameworksCases/LengthThreeCase.js b/client/src/components/Teammates/components/UserCard/FrameworksCases/LengthThreeCase.js similarity index 88% rename from client/src/screens/UsersList/components/UserCard/FrameworksCases/LengthThreeCase.js rename to client/src/components/Teammates/components/UserCard/FrameworksCases/LengthThreeCase.js index e8edb81fc..67a712414 100644 --- a/client/src/screens/UsersList/components/UserCard/FrameworksCases/LengthThreeCase.js +++ b/client/src/components/Teammates/components/UserCard/FrameworksCases/LengthThreeCase.js @@ -1,6 +1,6 @@ // * Styles // * Colors -import { frameworkColors, frameworkTextColors } from '../FrameworkColors' +import { frameworkColors, frameworkTextColors } from '../../../../../constants/frameworkColors' import { Framework } from '../UserCard.styles' const LengthThreeCase = ({ userFrameworks }) => { diff --git a/client/src/screens/UsersList/components/UserCard/FrameworksCases/LengthTwoCase.js b/client/src/components/Teammates/components/UserCard/FrameworksCases/LengthTwoCase.js similarity index 82% rename from client/src/screens/UsersList/components/UserCard/FrameworksCases/LengthTwoCase.js rename to client/src/components/Teammates/components/UserCard/FrameworksCases/LengthTwoCase.js index dc86f3b23..b0b2e2632 100644 --- a/client/src/screens/UsersList/components/UserCard/FrameworksCases/LengthTwoCase.js +++ b/client/src/components/Teammates/components/UserCard/FrameworksCases/LengthTwoCase.js @@ -1,6 +1,6 @@ // * Styles // * Colors -import { frameworkColors, frameworkTextColors } from '../FrameworkColors' +import { frameworkColors, frameworkTextColors } from '../../../../../constants/frameworkColors' import { Framework } from '../UserCard.styles' const LengthTwoCase = ({ userFrameworks }) => { diff --git a/client/src/screens/UsersList/components/UserCard/UserCard.js b/client/src/components/Teammates/components/UserCard/UserCard.js similarity index 94% rename from client/src/screens/UsersList/components/UserCard/UserCard.js rename to client/src/components/Teammates/components/UserCard/UserCard.js index 7a4a7097e..c4ed22d0c 100644 --- a/client/src/screens/UsersList/components/UserCard/UserCard.js +++ b/client/src/components/Teammates/components/UserCard/UserCard.js @@ -1,6 +1,7 @@ import React from 'react' -import Photo from '../../../../components/Profile/Photo.jpg' +// * Colors +import { languageOptions } from '../../../../constants/programmingLanguages' import { LOCAL_PATH } from '../../../../http' // * Images import CrownImg from '../../img/CrownTest.png' @@ -12,8 +13,6 @@ import LengthFourSlicedCase from './FrameworksCases/LengthFourSlicedCase' import LengthOneCase from './FrameworksCases/LengthOneCase' import LengthThreeCase from './FrameworksCases/LengthThreeCase' import LengthTwoCase from './FrameworksCases/LengthTwoCase' -// * Colors -import languageOptions from './ProgrammingLanguages' // * Styles import { AndMore, @@ -31,10 +30,6 @@ import { Wrapper, } from './UserCard.styles' -//programminglanguages when hovering, change last SVG to +4 - -// frameworks - // PASS IN PROPS TO RESPECTIVE COMPONENT TO RENDER const UserCard = React.forwardRef((props, ref) => { const person = props.person diff --git a/client/src/screens/UsersList/components/UserCard/UserCard.styles.js b/client/src/components/Teammates/components/UserCard/UserCard.styles.js similarity index 100% rename from client/src/screens/UsersList/components/UserCard/UserCard.styles.js rename to client/src/components/Teammates/components/UserCard/UserCard.styles.js diff --git a/client/src/screens/UsersList/components/UserProfile/UserProfile.js b/client/src/components/Teammates/components/UserProfile/UserProfile.js similarity index 100% rename from client/src/screens/UsersList/components/UserProfile/UserProfile.js rename to client/src/components/Teammates/components/UserProfile/UserProfile.js diff --git a/client/src/screens/UsersList/components/UserProfile/UserProfile.styles.js b/client/src/components/Teammates/components/UserProfile/UserProfile.styles.js similarity index 100% rename from client/src/screens/UsersList/components/UserProfile/UserProfile.styles.js rename to client/src/components/Teammates/components/UserProfile/UserProfile.styles.js diff --git a/client/src/screens/UsersList/components/UserProfilePhone/UserProfilePhone.js b/client/src/components/Teammates/components/UserProfilePhone/UserProfilePhone.js similarity index 100% rename from client/src/screens/UsersList/components/UserProfilePhone/UserProfilePhone.js rename to client/src/components/Teammates/components/UserProfilePhone/UserProfilePhone.js diff --git a/client/src/screens/UsersList/components/UserProfilePhone/UserProfilePhone.styles.js b/client/src/components/Teammates/components/UserProfilePhone/UserProfilePhone.styles.js similarity index 100% rename from client/src/screens/UsersList/components/UserProfilePhone/UserProfilePhone.styles.js rename to client/src/components/Teammates/components/UserProfilePhone/UserProfilePhone.styles.js diff --git a/client/src/screens/UsersList/img/Country.svg b/client/src/components/Teammates/img/Country.svg similarity index 100% rename from client/src/screens/UsersList/img/Country.svg rename to client/src/components/Teammates/img/Country.svg diff --git a/client/src/screens/UsersList/img/Crown.svg b/client/src/components/Teammates/img/Crown.svg similarity index 100% rename from client/src/screens/UsersList/img/Crown.svg rename to client/src/components/Teammates/img/Crown.svg diff --git a/client/src/screens/UsersList/img/CrownTest.png b/client/src/components/Teammates/img/CrownTest.png similarity index 100% rename from client/src/screens/UsersList/img/CrownTest.png rename to client/src/components/Teammates/img/CrownTest.png diff --git a/client/src/screens/UsersList/img/tempImg.jpg b/client/src/components/Teammates/img/tempImg.jpg similarity index 100% rename from client/src/screens/UsersList/img/tempImg.jpg rename to client/src/components/Teammates/img/tempImg.jpg diff --git a/client/src/constants/finishRegistrationData.js b/client/src/constants/finishRegistrationData.js index c789a9db4..c5cc9ed0f 100644 --- a/client/src/constants/finishRegistrationData.js +++ b/client/src/constants/finishRegistrationData.js @@ -10,7 +10,7 @@ import TelegramIcon from '../assets/Links/TelegramIcon' import concentrationOptions from './concentrations' import frameworkOptions from './frameworks' -import programmingLanguageOptions from './programmingLanguages' +import { programmingLanguageOptions } from './programmingLanguages' export const userConcentrations = [ { diff --git a/client/src/screens/UsersList/components/UserCard/FrameworkColors.js b/client/src/constants/frameworkColors.js similarity index 100% rename from client/src/screens/UsersList/components/UserCard/FrameworkColors.js rename to client/src/constants/frameworkColors.js diff --git a/client/src/constants/images.js b/client/src/constants/images.js new file mode 100644 index 000000000..c44c19ab1 --- /dev/null +++ b/client/src/constants/images.js @@ -0,0 +1 @@ +// export const unregisteredImg = diff --git a/client/src/constants/programmingLanguages.js b/client/src/constants/programmingLanguages.js index 93f8d5578..8a65abc09 100644 --- a/client/src/constants/programmingLanguages.js +++ b/client/src/constants/programmingLanguages.js @@ -1,3 +1,20 @@ +// * Logos +import C from '../assets/LanguageLogo/C' +import Cplusplus from '../assets/LanguageLogo/Cplusplus' +import Csharp from '../assets/LanguageLogo/Csharp' +import Dart from '../assets/LanguageLogo/Dart' +import GO from '../assets/LanguageLogo/GO' +import Html from '../assets/LanguageLogo/Html' +import Java from '../assets/LanguageLogo/Java' +import JS from '../assets/LanguageLogo/JS' +import Perl from '../assets/LanguageLogo/Perl' +import Php from '../assets/LanguageLogo/Php' +import Python from '../assets/LanguageLogo/Python' +import Ruby from '../assets/LanguageLogo/Ruby' +import Scala from '../assets/LanguageLogo/Scala' +import SQL from '../assets/LanguageLogo/SQL' +import Swift from '../assets/LanguageLogo/Swift' + const programmingLanguageOptions = [ { label: 'JS', @@ -46,4 +63,22 @@ const programmingLanguageOptions = [ }, ] -export default programmingLanguageOptions +const languageOptions = Object.freeze({ + JS: , + 'C++': , + C: , + Python: , + Swift: , + Ruby: , + Scala: , + PHP: , + Go: , + 'C#': , + Java: , + 'HTML/CSS': , + Dart: , + Perl: , + SQL: , +}) + +export { languageOptions, programmingLanguageOptions } diff --git a/client/src/routes/routes.js b/client/src/routes/routes.js index 44682a7e0..dcf181f07 100644 --- a/client/src/routes/routes.js +++ b/client/src/routes/routes.js @@ -2,33 +2,35 @@ import React from 'react' import { Route, Routes } from 'react-router-dom' +// * Components import ProfileDetails from '../components/Profile/components/ProfileDetails/ProfileDetails' import ProfileForm from '../components/Profile/components/ProfileForm' // * Constants import ROUTES from '../constants/routes' +// * Layouts import AuthLayout from '../layouts/AuthLayout/AuthLayout' import NavBarItemPageLayout from '../layouts/NavBarItemPageLayout/NavBarItemPageLayout' -import Confirmation from '../screens/Forms/Confirmation/Confirmation' -import CreateTeam from '../screens/Forms/CreateTeam/CreateTeam' -import FinishRegistration from '../screens/Forms/FinishRegistration/FinishRegistration' -import Form404 from '../screens/Forms/Form404/Form404' -import LeaderboardScreen from '../screens/Forms/LeaderboardScreen/LeaderboardScreen' -import LoaderScreen from '../screens/Forms/LoaderScreen/LoaderScreen' // * Screens -import Login from '../screens/Forms/Login/Login' -import NoTeamScreen from '../screens/Forms/NoTeamScreen/NoTeamScreen' -import ProfilePage from '../screens/Forms/Profile/Profile' -import Registration from '../screens/Forms/Registration/Registration' -import ResetNewPasswords from '../screens/Forms/ResetNewPasswords/ResetNewPasswords' -import ResetPassword from '../screens/Forms/ResetPassword/ResetPassword' -import ResetPasswordConfirmation from '../screens/Forms/ResetPasswordConfirmation/ResetPasswordConfirmation' -import TeamScreen from '../screens/Forms/TeamScreen/TeamScreen' -import TeamsScreen from '../screens/Forms/TeamsScreen/TeamsScreen' -import TournamentCodingScreen from '../screens/Forms/TournamentCodingScreen/TournamentCodingScreen' -import TournamentInfo from '../screens/Forms/TournamentInfo/TournamentInfo' -import Tournaments from '../screens/Forms/Tournaments/Tournaments' -import UsersList from '../screens/UsersList/UsersList' +import Confirmation from '../screens/Confirmation/Confirmation' +import CreateTeam from '../screens/CreateTeam/CreateTeam' +import FinishRegistration from '../screens/FinishRegistration/FinishRegistration' +import Form404 from '../screens/Form404/Form404' +import LeaderboardScreen from '../screens/LeaderboardScreen/LeaderboardScreen' +import LoaderScreen from '../screens/LoaderScreen/LoaderScreen' +import Login from '../screens/Login/Login' +import NoTeamScreen from '../screens/NoTeamScreen/NoTeamScreen' +import ProfilePage from '../screens/Profile/Profile' +import Registration from '../screens/Registration/Registration' +import ResetNewPasswords from '../screens/ResetNewPasswords/ResetNewPasswords' +import ResetPassword from '../screens/ResetPassword/ResetPassword' +import ResetPasswordConfirmation from '../screens/ResetPasswordConfirmation/ResetPasswordConfirmation' +import TeammatesScreen from '../screens/TeammatesScreen/TeammatesScreen' +import TeamScreen from '../screens/TeamScreen/TeamScreen' +import TeamsScreen from '../screens/TeamsScreen/TeamsScreen' +import TournamentInfo from '../screens/TournamentInfo/TournamentInfo' +import Tournaments from '../screens/Tournaments/Tournaments' +// * Protected import ProtectFinishRegistration from './protected/ProtectFinishRegistration' export const useRoutes = () => { @@ -36,7 +38,7 @@ export const useRoutes = () => { {/* // * for authenticated user */} }> - } /> + } /> { } /> } /> } /> - } /> } /> {/* // * for not authenticated user */} diff --git a/client/src/screens/Forms/Confirmation/Confirmation.js b/client/src/screens/Confirmation/Confirmation.js similarity index 71% rename from client/src/screens/Forms/Confirmation/Confirmation.js rename to client/src/screens/Confirmation/Confirmation.js index de2cd6769..aeb759928 100644 --- a/client/src/screens/Forms/Confirmation/Confirmation.js +++ b/client/src/screens/Confirmation/Confirmation.js @@ -1,7 +1,7 @@ import React from 'react' import CssBaseline from '@mui/material/CssBaseline' -import ConfirmEmail from '../../../components/Forms/ConfirmEmailForm/ConfirmEmail' +import ConfirmEmail from '../../components/Forms/ConfirmEmailForm/ConfirmEmail' function Confirmation() { return ( diff --git a/client/src/screens/Forms/CreateTeam/CreateTeam.js b/client/src/screens/CreateTeam/CreateTeam.js similarity index 87% rename from client/src/screens/Forms/CreateTeam/CreateTeam.js rename to client/src/screens/CreateTeam/CreateTeam.js index 05030ef9e..558a16096 100644 --- a/client/src/screens/Forms/CreateTeam/CreateTeam.js +++ b/client/src/screens/CreateTeam/CreateTeam.js @@ -3,7 +3,7 @@ import { styled } from '@mui/material' import CssBaseline from '@mui/material/CssBaseline' import { SnackbarProvider } from 'notistack' -import CreateTeamForm from '../../../components/Forms/CreateTeamForm/CreateTeamForm' +import CreateTeamForm from '../../components/Forms/CreateTeamForm/CreateTeamForm' const SnackbarStyled = styled(SnackbarProvider)` &.SnackbarItem-contentRoot { diff --git a/client/src/screens/Forms/FinishRegistration/FinishRegistration.js b/client/src/screens/FinishRegistration/FinishRegistration.js similarity index 74% rename from client/src/screens/Forms/FinishRegistration/FinishRegistration.js rename to client/src/screens/FinishRegistration/FinishRegistration.js index 3262cb2d7..d423775b2 100644 --- a/client/src/screens/Forms/FinishRegistration/FinishRegistration.js +++ b/client/src/screens/FinishRegistration/FinishRegistration.js @@ -1,7 +1,7 @@ import React from 'react' import CssBaseline from '@mui/material/CssBaseline' -import ConfirmRegistration from '../../../components/Forms/RegistrationPipeline' +import ConfirmRegistration from '../../components/Forms/RegistrationPipeline' function FinishRegistration() { return ( diff --git a/client/src/screens/Forms/Form404/Form404.js b/client/src/screens/Form404/Form404.js similarity index 72% rename from client/src/screens/Forms/Form404/Form404.js rename to client/src/screens/Form404/Form404.js index e309664a7..b3d3450d6 100644 --- a/client/src/screens/Forms/Form404/Form404.js +++ b/client/src/screens/Form404/Form404.js @@ -1,7 +1,7 @@ import React from 'react' import CssBaseline from '@mui/material/CssBaseline' -import Page404Form from '../../../components/Forms/Page404Form/Page404Form' +import Page404Form from '../../components/Forms/Page404Form/Page404Form' function Page404() { return ( diff --git a/client/src/screens/Forms/LeaderboardScreen/LeaderboardScreen.js b/client/src/screens/LeaderboardScreen/LeaderboardScreen.js similarity index 74% rename from client/src/screens/Forms/LeaderboardScreen/LeaderboardScreen.js rename to client/src/screens/LeaderboardScreen/LeaderboardScreen.js index 31b3d971d..c6acb796e 100644 --- a/client/src/screens/Forms/LeaderboardScreen/LeaderboardScreen.js +++ b/client/src/screens/LeaderboardScreen/LeaderboardScreen.js @@ -1,7 +1,7 @@ import React from 'react' import CssBaseline from '@mui/material/CssBaseline' -import Leaderboard from '../../../components/Forms/Leaderboard/Leaderboard' +import Leaderboard from '../../components/Forms/Leaderboard/Leaderboard' function LeaderboardScreen() { return ( diff --git a/client/src/screens/Forms/LoaderScreen/LoaderScreen.js b/client/src/screens/LoaderScreen/LoaderScreen.js similarity index 76% rename from client/src/screens/Forms/LoaderScreen/LoaderScreen.js rename to client/src/screens/LoaderScreen/LoaderScreen.js index 901e35496..735c344d7 100644 --- a/client/src/screens/Forms/LoaderScreen/LoaderScreen.js +++ b/client/src/screens/LoaderScreen/LoaderScreen.js @@ -1,7 +1,7 @@ import React from 'react' import CssBaseline from '@mui/material/CssBaseline' -import Loader from '../../../shared/components/Loader/Loader' +import Loader from '../../shared/components/Loader/Loader' function LoaderScreen() { return ( diff --git a/client/src/screens/Forms/Login/Login.js b/client/src/screens/Login/Login.js similarity index 63% rename from client/src/screens/Forms/Login/Login.js rename to client/src/screens/Login/Login.js index 80836029c..184e9e26b 100644 --- a/client/src/screens/Forms/Login/Login.js +++ b/client/src/screens/Login/Login.js @@ -1,6 +1,6 @@ import React from 'react' -import LoginForm from '../../../components/Forms/LoginForm/LoginForm' +import LoginForm from '../../components/Forms/LoginForm/LoginForm' function Login() { return ( diff --git a/client/src/screens/Forms/NoTeamScreen/NoTeamScreen.js b/client/src/screens/NoTeamScreen/NoTeamScreen.js similarity index 74% rename from client/src/screens/Forms/NoTeamScreen/NoTeamScreen.js rename to client/src/screens/NoTeamScreen/NoTeamScreen.js index 657f914cf..c07804f5e 100644 --- a/client/src/screens/Forms/NoTeamScreen/NoTeamScreen.js +++ b/client/src/screens/NoTeamScreen/NoTeamScreen.js @@ -1,7 +1,7 @@ import React from 'react' import CssBaseline from '@mui/material/CssBaseline' -import NoTeamForm from '../../../components/Forms/NoTeamForm/NoTeamForm' +import NoTeamForm from '../../components/Forms/NoTeamForm/NoTeamForm' function NoTeamScreen() { return ( diff --git a/client/src/screens/Forms/Profile/Profile.js b/client/src/screens/Profile/Profile.js similarity index 77% rename from client/src/screens/Forms/Profile/Profile.js rename to client/src/screens/Profile/Profile.js index 368eee085..76cf1709a 100644 --- a/client/src/screens/Forms/Profile/Profile.js +++ b/client/src/screens/Profile/Profile.js @@ -1,7 +1,7 @@ import React from 'react' import CssBaseline from '@mui/material/CssBaseline' -import { Cards } from '../../../components/Profile/Profile.styles' +import { Cards } from '../../components/Profile/Profile.styles' function ProfilePage({ children }) { return ( diff --git a/client/src/screens/Forms/Registration/Registration.js b/client/src/screens/Registration/Registration.js similarity index 60% rename from client/src/screens/Forms/Registration/Registration.js rename to client/src/screens/Registration/Registration.js index 66760eed8..82c92a075 100644 --- a/client/src/screens/Forms/Registration/Registration.js +++ b/client/src/screens/Registration/Registration.js @@ -1,6 +1,6 @@ import React from 'react' -import RegistrationForm from '../../../components/Forms/RegistrationForm/RegistrationForm' +import RegistrationForm from '../../components/Forms/RegistrationForm/RegistrationForm' function Registration() { return ( diff --git a/client/src/screens/Forms/ResetNewPasswords/ResetNewPasswords.js b/client/src/screens/ResetNewPasswords/ResetNewPasswords.js similarity index 72% rename from client/src/screens/Forms/ResetNewPasswords/ResetNewPasswords.js rename to client/src/screens/ResetNewPasswords/ResetNewPasswords.js index b95207d87..3a2e7b3b3 100644 --- a/client/src/screens/Forms/ResetNewPasswords/ResetNewPasswords.js +++ b/client/src/screens/ResetNewPasswords/ResetNewPasswords.js @@ -1,7 +1,7 @@ import React from 'react' import CssBaseline from '@mui/material/CssBaseline' -import ResetNewPasswordsForm from '../../../components/Forms/NewPasswords/NewPasswords' +import ResetNewPasswordsForm from '../../components/Forms/NewPasswords/NewPasswords' function ResetNewPasswords() { return ( diff --git a/client/src/screens/Forms/ResetPassword/ResetPassword.js b/client/src/screens/ResetPassword/ResetPassword.js similarity index 72% rename from client/src/screens/Forms/ResetPassword/ResetPassword.js rename to client/src/screens/ResetPassword/ResetPassword.js index c78bd21c0..adf70ad34 100644 --- a/client/src/screens/Forms/ResetPassword/ResetPassword.js +++ b/client/src/screens/ResetPassword/ResetPassword.js @@ -1,7 +1,7 @@ import React from 'react' import CssBaseline from '@mui/material/CssBaseline' -import ResetForm from '../../../components/Forms/RecoverPassword/RecoverPassword' +import ResetForm from '../../components/Forms/RecoverPassword/RecoverPassword' function ResetPassword() { return ( diff --git a/client/src/screens/Forms/ResetPasswordConfirmation/ResetPasswordConfirmation.js b/client/src/screens/ResetPasswordConfirmation/ResetPasswordConfirmation.js similarity index 70% rename from client/src/screens/Forms/ResetPasswordConfirmation/ResetPasswordConfirmation.js rename to client/src/screens/ResetPasswordConfirmation/ResetPasswordConfirmation.js index 6233771c4..4a6a6fe8d 100644 --- a/client/src/screens/Forms/ResetPasswordConfirmation/ResetPasswordConfirmation.js +++ b/client/src/screens/ResetPasswordConfirmation/ResetPasswordConfirmation.js @@ -1,7 +1,7 @@ import React from 'react' import CssBaseline from '@mui/material/CssBaseline' -import ResetFormConfirmation from '../../../components/Forms/RecoverConfirmation/RecoverConfirmation' +import ResetFormConfirmation from '../../components/Forms/RecoverConfirmation/RecoverConfirmation' function ResetPasswordConfirmation() { return ( diff --git a/client/src/screens/Forms/TeamScreen/TeamScreen.js b/client/src/screens/TeamScreen/TeamScreen.js similarity index 90% rename from client/src/screens/Forms/TeamScreen/TeamScreen.js rename to client/src/screens/TeamScreen/TeamScreen.js index a62788021..252b363dc 100644 --- a/client/src/screens/Forms/TeamScreen/TeamScreen.js +++ b/client/src/screens/TeamScreen/TeamScreen.js @@ -3,7 +3,7 @@ import { styled } from '@mui/material' import CssBaseline from '@mui/material/CssBaseline' import { SnackbarProvider } from 'notistack' -import TeamForm from '../../../components/Forms/TeamForm/TeamForm' +import TeamForm from '../../components/Forms/TeamForm/TeamForm' function TeamScreen() { const SnackbarStyled = styled(SnackbarProvider)` diff --git a/client/src/screens/TeammatesScreen/TeammatesScreen.js b/client/src/screens/TeammatesScreen/TeammatesScreen.js new file mode 100644 index 000000000..b2536cd63 --- /dev/null +++ b/client/src/screens/TeammatesScreen/TeammatesScreen.js @@ -0,0 +1,14 @@ +import CssBaseline from '@mui/material/CssBaseline' + +import Teammates from '../../components/Teammates/Teammates' + +function TeammatesScreen() { + return ( + <> + + + + ) +} + +export default TeammatesScreen diff --git a/client/src/screens/Forms/TeamsScreen/TeamsScreen.js b/client/src/screens/TeamsScreen/TeamsScreen.js similarity index 89% rename from client/src/screens/Forms/TeamsScreen/TeamsScreen.js rename to client/src/screens/TeamsScreen/TeamsScreen.js index 857928c7a..10365092b 100644 --- a/client/src/screens/Forms/TeamsScreen/TeamsScreen.js +++ b/client/src/screens/TeamsScreen/TeamsScreen.js @@ -2,7 +2,7 @@ import { styled } from '@mui/material' import CssBaseline from '@mui/material/CssBaseline' import { SnackbarProvider } from 'notistack' -import TeamsList from '../../../components/Forms/TeamsList/TeamsList' +import TeamsList from '../../components/Forms/TeamsList/TeamsList' function TeamsScreen() { const SnackbarStyled = styled(SnackbarProvider)` diff --git a/client/src/screens/Forms/TournamentCodingScreen/TournamentCodingScreen.js b/client/src/screens/TournamentCodingScreen/TournamentCodingScreen.js similarity index 73% rename from client/src/screens/Forms/TournamentCodingScreen/TournamentCodingScreen.js rename to client/src/screens/TournamentCodingScreen/TournamentCodingScreen.js index 26b3879a5..9ff259b36 100644 --- a/client/src/screens/Forms/TournamentCodingScreen/TournamentCodingScreen.js +++ b/client/src/screens/TournamentCodingScreen/TournamentCodingScreen.js @@ -1,6 +1,6 @@ import CssBaseline from '@mui/material/CssBaseline' -import CodingForm from '../../../components/Forms/CodingForm/CodingForm' +import CodingForm from '../../components/Forms/CodingForm/CodingForm' function TournamentCodingScreen() { return ( diff --git a/client/src/screens/Forms/TournamentInfo/TournamentInfo.js b/client/src/screens/TournamentInfo/TournamentInfo.js similarity index 88% rename from client/src/screens/Forms/TournamentInfo/TournamentInfo.js rename to client/src/screens/TournamentInfo/TournamentInfo.js index 75f64d86e..11c858edb 100644 --- a/client/src/screens/Forms/TournamentInfo/TournamentInfo.js +++ b/client/src/screens/TournamentInfo/TournamentInfo.js @@ -3,7 +3,7 @@ import { styled } from '@mui/material' import CssBaseline from '@mui/material/CssBaseline' import { SnackbarProvider } from 'notistack' -import TournamentInfo from '../../../components/Forms/TournamentInfo/TournamentInfo' +import TournamentInfo from '../../components/Forms/TournamentInfo/TournamentInfo' function TournamentScreen() { const SnackbarStyled = styled(SnackbarProvider)` diff --git a/client/src/screens/Forms/Tournaments/Tournaments.js b/client/src/screens/Tournaments/Tournaments.js similarity index 70% rename from client/src/screens/Forms/Tournaments/Tournaments.js rename to client/src/screens/Tournaments/Tournaments.js index 4e12ad220..b1456a8d0 100644 --- a/client/src/screens/Forms/Tournaments/Tournaments.js +++ b/client/src/screens/Tournaments/Tournaments.js @@ -1,7 +1,7 @@ import React from 'react' import CssBaseline from '@mui/material/CssBaseline' -import TournamentsForm from '../../../components/Forms/TournamentsForm/TournamentsForm' +import TournamentsForm from '../../components/Forms/TournamentsForm/TournamentsForm' function Tournaments() { return ( diff --git a/client/src/screens/UsersList/components/UserCard/ProgrammingLanguages.js b/client/src/screens/UsersList/components/UserCard/ProgrammingLanguages.js deleted file mode 100644 index 2cd08faa3..000000000 --- a/client/src/screens/UsersList/components/UserCard/ProgrammingLanguages.js +++ /dev/null @@ -1,36 +0,0 @@ -// * Logos -import C from '../../../../assets/LanguageLogo/C' -import Cplusplus from '../../../../assets/LanguageLogo/Cplusplus' -import Csharp from '../../../../assets/LanguageLogo/Csharp' -import Dart from '../../../../assets/LanguageLogo/Dart' -import GO from '../../../../assets/LanguageLogo/GO' -import Html from '../../../../assets/LanguageLogo/Html' -import Java from '../../../../assets/LanguageLogo/Java' -import JS from '../../../../assets/LanguageLogo/JS' -import Perl from '../../../../assets/LanguageLogo/Perl' -import Php from '../../../../assets/LanguageLogo/Php' -import Python from '../../../../assets/LanguageLogo/Python' -import Ruby from '../../../../assets/LanguageLogo/Ruby' -import Scala from '../../../../assets/LanguageLogo/Scala' -import SQL from '../../../../assets/LanguageLogo/SQL' -import Swift from '../../../../assets/LanguageLogo/Swift' - -const languageOptions = Object.freeze({ - JS: , - 'C++': , - C: , - Python: , - Swift: , - Ruby: , - Scala: , - PHP: , - Go: , - 'C#': , - Java: , - 'HTML/CSS': , - Dart: , - Perl: , - SQL: , -}) - -export default languageOptions diff --git a/client/src/shared/components/CustomSelect/CustomSelect.jsx b/client/src/shared/components/CustomSelect/CustomSelect.jsx index 3962b0a79..53b89127a 100644 --- a/client/src/shared/components/CustomSelect/CustomSelect.jsx +++ b/client/src/shared/components/CustomSelect/CustomSelect.jsx @@ -2,10 +2,7 @@ import React from 'react' import FormControl from '@mui/material/FormControl' import { useField } from 'formik' -import { - Item, - PlaceholderText, -} from '../../../screens/UsersList/components/SelectField/SelectField.styles' +import { Item } from '../../../components/Teammates/components/SelectField/SelectField.styles' import { ErrorMessage, Label, Text } from '../../styles/Tpography.styles' import { Line, MenuProps, SelectCustom } from './CustomSelect.styles' From 6e0f52e9f71fd8ec44663081b824697a9e37bc1c Mon Sep 17 00:00:00 2001 From: Nikita Mashchenko Date: Fri, 12 May 2023 22:43:26 -0500 Subject: [PATCH 02/15] Fixes part2 --- client/package-lock.json | 38 +++ client/package.json | 1 + client/public/index.html | 2 +- .../hooks/sidebar/useChangeMessageStatus.js | 2 +- client/src/api/hooks/team/useCreateTeam.js | 9 +- .../src/api/hooks/team/useTeamMembership.js | 12 +- .../UserProfile/LeaderCrown.png} | Bin .../Forms/CodingForm/Backend/Backend.js | 241 -------------- .../components/Forms/CodingForm/CodingForm.js | 108 ------- .../Forms/CodingForm/CodingForm.styles.js | 116 ------- .../CodingForm/Frontend/CodeEvaluation.js | 29 -- .../Forms/CodingForm/Frontend/Frontend.js | 148 --------- .../Forms/CreateTeamForm/CreateTeamForm.js | 5 +- .../Forms/Leaderboard/Leaderboard.js | 120 ------- .../Forms/Leaderboard/Leaderboard.styles.js | 53 ---- .../components/Forms/NoTeamForm/NoTeamForm.js | 4 +- .../RegistrationForm/RegistrationForm.js | 1 - .../components/Forms/TeamsList/TeamsList.js | 11 +- .../TournamentInfo/TournamentInfo.data.js | 18 -- .../Forms/TournamentInfo/TournamentInfo.js | 300 ------------------ .../TournamentInfo/TournamentInfo.styles.js | 171 ---------- .../Forms/TournamentsForm/TournamentsForm.js | 8 +- .../TournamentsForm/TournamentsForm.styles.js | 2 +- client/src/components/NavBar/NavBar.data.js | 2 +- client/src/components/NavBar/NavBar.jsx | 2 +- .../NotificationModal/NotificationModal.jsx | 73 ----- .../NotificationModal.styles.js | 99 ------ .../src/components/NavBar/Profile/Profile.jsx | 2 +- client/src/components/NavBar/defaultImg.png | Bin 1090 -> 0 bytes client/src/components/NavBar/tempImg.jpg | Bin 80801 -> 0 bytes client/src/components/Teammates/Teammates.js | 72 +++-- .../components/Teammates/Teammates.styles.js | 28 -- .../components/SelectField/SelectField.css | 12 - .../Teammates/components/TopBar/TopBar.js | 2 - .../Teammates/components/UserCard/UserCard.js | 10 +- .../components/UserProfile/UserProfile.js | 8 +- .../UserProfilePhone/UserProfilePhone.js | 7 +- .../src/components/Teammates/img/Country.svg | 9 - client/src/components/Teammates/img/Crown.svg | 9 - .../src/components/Teammates/img/tempImg.jpg | Bin 80801 -> 0 bytes .../TopTemplate/TopTemplate.styles.js | 13 - .../src/constants/finishRegistrationData.js | 12 +- client/src/constants/routes.js | 11 +- client/src/constants/teamFormData.js | 12 +- .../src/fonts/FontsFree-Net-Noir_regular.woff | Bin 8656 -> 0 bytes client/src/index.js | 39 +-- client/src/routes/routes.js | 68 ++-- .../Form404.js => 404Screen/404Screen.js} | 4 +- .../ConfirmationScreen.js} | 4 +- client/src/screens/CreateTeam/CreateTeam.js | 32 -- .../CreateTeamScreen/CreateTeamScreen.js | 15 + .../FinishRegistrationScreen.js} | 4 +- .../LeaderboardScreen/LeaderboardScreen.js | 15 - .../Login.js => LoginScreen/LoginScreen.js} | 6 +- .../ProfileScreen.js} | 4 +- .../RegistrationScreen.js} | 6 +- .../ResetNewPasswordsScreen.js} | 4 +- .../ResetPasswordConfirmationScreen.js} | 4 +- .../ResetPasswordScreen.js} | 4 +- client/src/screens/TeamsScreen/TeamsScreen.js | 21 +- .../TournamentCodingScreen.js | 14 - .../screens/TournamentInfo/TournamentInfo.js | 32 -- .../Tournaments.js | 0 client/src/shared/styles/Global.styles.js | 37 +++ 64 files changed, 254 insertions(+), 1841 deletions(-) rename client/src/{components/Teammates/img/CrownTest.png => assets/UserProfile/LeaderCrown.png} (100%) delete mode 100644 client/src/components/Forms/CodingForm/Backend/Backend.js delete mode 100644 client/src/components/Forms/CodingForm/CodingForm.js delete mode 100644 client/src/components/Forms/CodingForm/CodingForm.styles.js delete mode 100644 client/src/components/Forms/CodingForm/Frontend/CodeEvaluation.js delete mode 100644 client/src/components/Forms/CodingForm/Frontend/Frontend.js delete mode 100644 client/src/components/Forms/Leaderboard/Leaderboard.js delete mode 100644 client/src/components/Forms/Leaderboard/Leaderboard.styles.js delete mode 100644 client/src/components/Forms/TournamentInfo/TournamentInfo.data.js delete mode 100644 client/src/components/Forms/TournamentInfo/TournamentInfo.js delete mode 100644 client/src/components/Forms/TournamentInfo/TournamentInfo.styles.js delete mode 100644 client/src/components/NavBar/Profile/NotificationModal/NotificationModal.jsx delete mode 100644 client/src/components/NavBar/Profile/NotificationModal/NotificationModal.styles.js delete mode 100644 client/src/components/NavBar/defaultImg.png delete mode 100644 client/src/components/NavBar/tempImg.jpg delete mode 100644 client/src/components/Teammates/img/Country.svg delete mode 100644 client/src/components/Teammates/img/Crown.svg delete mode 100644 client/src/components/Teammates/img/tempImg.jpg delete mode 100644 client/src/fonts/FontsFree-Net-Noir_regular.woff rename client/src/screens/{Form404/Form404.js => 404Screen/404Screen.js} (82%) rename client/src/screens/{Confirmation/Confirmation.js => ConfirmationScreen/ConfirmationScreen.js} (78%) delete mode 100644 client/src/screens/CreateTeam/CreateTeam.js create mode 100644 client/src/screens/CreateTeamScreen/CreateTeamScreen.js rename client/src/screens/{FinishRegistration/FinishRegistration.js => FinishRegistrationScreen/FinishRegistrationScreen.js} (75%) delete mode 100644 client/src/screens/LeaderboardScreen/LeaderboardScreen.js rename client/src/screens/{Login/Login.js => LoginScreen/LoginScreen.js} (55%) rename client/src/screens/{Profile/Profile.js => ProfileScreen/ProfileScreen.js} (77%) rename client/src/screens/{Registration/Registration.js => RegistrationScreen/RegistrationScreen.js} (57%) rename client/src/screens/{ResetNewPasswords/ResetNewPasswords.js => ResetNewPasswordsScreen/ResetNewPasswordsScreen.js} (76%) rename client/src/screens/{ResetPasswordConfirmation/ResetPasswordConfirmation.js => ResetPasswordConfirmationScreen/ResetPasswordConfirmationScreen.js} (74%) rename client/src/screens/{ResetPassword/ResetPassword.js => ResetPasswordScreen/ResetPasswordScreen.js} (77%) delete mode 100644 client/src/screens/TournamentCodingScreen/TournamentCodingScreen.js delete mode 100644 client/src/screens/TournamentInfo/TournamentInfo.js rename client/src/screens/{Tournaments => TournamentsScreen}/Tournaments.js (100%) create mode 100644 client/src/shared/styles/Global.styles.js diff --git a/client/package-lock.json b/client/package-lock.json index 679c5e918..51877db5d 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -35,6 +35,7 @@ "react-country-flag": "^3.0.2", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", + "react-hot-toast": "^2.4.1", "react-loader-spinner": "^5.3.4", "react-loading-skeleton": "^3.1.0", "react-query": "^3.39.2", @@ -9380,6 +9381,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/goober": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.13.tgz", + "integrity": "sha512-jFj3BQeleOoy7t93E9rZ2de+ScC4lQICLwiAQmKMg9F6roKGaLSHoCDYKkWlSafg138jejvq/mTdvmnwDQgqoQ==", + "peerDependencies": { + "csstype": "^3.0.10" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -15154,6 +15163,21 @@ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" }, + "node_modules/react-hot-toast": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.4.1.tgz", + "integrity": "sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==", + "dependencies": { + "goober": "^2.1.10" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -24897,6 +24921,12 @@ "slash": "^3.0.0" } }, + "goober": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.13.tgz", + "integrity": "sha512-jFj3BQeleOoy7t93E9rZ2de+ScC4lQICLwiAQmKMg9F6roKGaLSHoCDYKkWlSafg138jejvq/mTdvmnwDQgqoQ==", + "requires": {} + }, "gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -28906,6 +28936,14 @@ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" }, + "react-hot-toast": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.4.1.tgz", + "integrity": "sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==", + "requires": { + "goober": "^2.1.10" + } + }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", diff --git a/client/package.json b/client/package.json index d51efc6e0..67ab438b6 100644 --- a/client/package.json +++ b/client/package.json @@ -30,6 +30,7 @@ "react-country-flag": "^3.0.2", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", + "react-hot-toast": "^2.4.1", "react-loader-spinner": "^5.3.4", "react-loading-skeleton": "^3.1.0", "react-query": "^3.39.2", diff --git a/client/public/index.html b/client/public/index.html index 6990c239c..a0b379217 100644 --- a/client/public/index.html +++ b/client/public/index.html @@ -26,7 +26,7 @@ --> - + Teameights diff --git a/client/src/api/hooks/sidebar/useChangeMessageStatus.js b/client/src/api/hooks/sidebar/useChangeMessageStatus.js index 979766768..207386d05 100644 --- a/client/src/api/hooks/sidebar/useChangeMessageStatus.js +++ b/client/src/api/hooks/sidebar/useChangeMessageStatus.js @@ -25,7 +25,7 @@ export const useChangeMessageStatus = (teamId) => { queryClient.invalidateQueries('checkAuth', { refetchInactive: true }) if (decision === 'accept') { queryClient.invalidateQueries(['getTeamById', teamId], { refetchInactive: true }) - navigate('/myteam') + navigate(`/team/${teamId}`) } }, onError: (error) => { diff --git a/client/src/api/hooks/team/useCreateTeam.js b/client/src/api/hooks/team/useCreateTeam.js index 97b5d2dfa..1cc65f43b 100644 --- a/client/src/api/hooks/team/useCreateTeam.js +++ b/client/src/api/hooks/team/useCreateTeam.js @@ -1,3 +1,4 @@ +import toast from 'react-hot-toast' import { useMutation, useQueryClient } from 'react-query' import { useNavigate } from 'react-router-dom' @@ -9,6 +10,7 @@ const { api } = http export const useCreateTeam = (teamAvatar) => { const queryClient = useQueryClient() const { mutate: updateAvatar } = useUpdateAvatar('teams') + // const notify = (err) => toast.error(err, { id: 'error' }) const navigate = useNavigate() const createTeam = async (details) => { @@ -24,7 +26,12 @@ export const useCreateTeam = (teamAvatar) => { updateAvatar({ teamID: data._id, image: teamAvatar.split(',')[1] }) } await queryClient.invalidateQueries('checkAuth', { refetchInactive: true }) - navigate('/myteam') + navigate(`/team/${data._id}`) + }, + onError: (error) => { + console.log(error) + // TODO: fix this + // notify(error?.response?.data[0]) }, }) } diff --git a/client/src/api/hooks/team/useTeamMembership.js b/client/src/api/hooks/team/useTeamMembership.js index e8a71e8a7..3d9584213 100644 --- a/client/src/api/hooks/team/useTeamMembership.js +++ b/client/src/api/hooks/team/useTeamMembership.js @@ -1,4 +1,4 @@ -import React from 'react' +import toast from 'react-hot-toast' import { useMutation, useQueryClient } from 'react-query' import http from '../../../http' @@ -7,9 +7,10 @@ const { api } = http export const useTeamMembership = (action) => { const queryClient = useQueryClient() + const notify = (err) => toast.error(err, { id: 'error' }) const toggleMembership = async (details) => { - const response = await api.put(`/teams/${action}`, { + return await api.put(`/teams/${action}`, { user_id: details.userId, teamid: details.teamId, }) @@ -17,8 +18,13 @@ export const useTeamMembership = (action) => { return useMutation(toggleMembership, { mutationKey: 'toggleMembership', - onSuccess: async () => { + onSuccess: async (result) => { await queryClient.invalidateQueries('checkAuth', { refetchInactive: true }) + + return result.data + }, + onError: (error) => { + notify(error?.response?.data?.message) }, }) } diff --git a/client/src/components/Teammates/img/CrownTest.png b/client/src/assets/UserProfile/LeaderCrown.png similarity index 100% rename from client/src/components/Teammates/img/CrownTest.png rename to client/src/assets/UserProfile/LeaderCrown.png diff --git a/client/src/components/Forms/CodingForm/Backend/Backend.js b/client/src/components/Forms/CodingForm/Backend/Backend.js deleted file mode 100644 index f3d3d6905..000000000 --- a/client/src/components/Forms/CodingForm/Backend/Backend.js +++ /dev/null @@ -1,241 +0,0 @@ -// * Modules -import { useState } from 'react' -import Countdown from 'react-countdown' -import { useNavigate } from 'react-router-dom' -import Typewriter from '@mikhail2404/react-ts-typewriter' -import Editor from '@monaco-editor/react' -import axios from 'axios' -import isEqual from 'lodash/isEqual' - -// * API -import submissionAPI from '../../../../api/endpoints/submission' -// * Styles -import { - Container, - LeftContainer, - OutputContainer, - ResultContainer, - ResultStatus, - RightContainer, - SubmitButton, - TaskContainer, - Text, -} from '../CodingForm.styles' - -function Backend({ renderer, value, output, handleEditorChange, code, setOutput, user, team }) { - const [processing, setProcessing] = useState(false) - const [results, setResults] = useState(null) - const [status, setStatus] = useState('N/A') - const [memory, setMemory] = useState('N/A') - const [time, setTime] = useState('N/A') - const [points, setPoints] = useState(0) - const navigate = useNavigate() - - const handleCompile = () => { - setProcessing(true) - const formData = { - language_id: 63, - // encode source code in base64 - source_code: btoa(code), - stdin: btoa('12345'), - } - const options = { - method: 'POST', - url: process.env.REACT_APP_RAPID_API_URL, - params: { base64_encoded: 'true', fields: '*' }, - headers: { - 'content-type': 'application/json', - 'Content-Type': 'application/json', - 'X-RapidAPI-Host': process.env.REACT_APP_RAPID_API_HOST, - 'X-RapidAPI-Key': process.env.REACT_APP_RAPID_API_KEY, - }, - data: formData, - } - - axios - .request(options) - .then(function (response) { - console.log('res.data', response.data) - const token = response.data.token - - checkStatus(token) - }) - .catch((err) => { - console.log(err) - let error = err.response ? err.response.data : err - - setProcessing(false) - console.log(error) - }) - } - - const checkStatus = async (token) => { - const options = { - method: 'GET', - url: process.env.REACT_APP_RAPID_API_URL + '/' + token, - params: { base64_encoded: 'true', fields: '*' }, - headers: { - 'X-RapidAPI-Host': process.env.REACT_APP_RAPID_API_HOST, - 'X-RapidAPI-Key': process.env.REACT_APP_RAPID_API_KEY, - }, - } - - try { - let response = await axios.request(options) - let statusId = response.data.status?.id - - // Processed - we have a result - if (statusId === 1 || statusId === 2) { - // still processing - setTimeout(() => { - checkStatus(token) - }, 2000) - - return - } else { - setProcessing(false) - setResults(response.data) - // setOutput(atob(response.data.stdout)) - let statusId = response.data?.status?.id - - if (statusId === 3) { - atob(response.data.stdout) !== null - ? setOutput(atob(response.data.stdout)) - : setOutput('') - - const check = atob(response.data.stdout).split(' ') - - console.log(check) - if (check.includes("'juice',") && check.includes("'cs484'")) { - setPoints(70) - const s_parts = { - backend: { - submission_time: new Date().getTime(), - points: 70, - }, - } - - console.log(s_parts) - const submission = await submissionAPI.makeSubmission(s_parts, user.userTeam) - - setTimeout(function () { - setOutput('Redirecting you to the leaderboards...') - }, 2000) - - setTimeout(function () { - navigate('/leaderboard') - }, 4000) - } else { - setPoints(0) - } - } else if (statusId === 5) { - setOutput('Time Limit Exceeded') - } else if (statusId === 6) { - setOutput(atob(response.data?.compile_output)) - } else { - setOutput(atob(response.data?.stderr)) - } - setStatus(response.data.status.description) - setTime(response.data.time) - setMemory(response.data.memory) - console.log('response.data', response.data) - - return - } - } catch (err) { - console.log('err', err) - setProcessing(false) - } - } - - return ( - - - - Teameights cup #1 - - - Back-End - - - - - - - - - -
- Output: -
- - - {output} - - - -
- - - Status: - - - - {status} - - - - - - - Points: - - - - {points} - - - - - - - Time: - - - - {time} - - - -
-
- - - {', - '\t/*', - '\t\timplement your solution here', - '\t*/', - '}', - '', - `// Don't change these lines!`, - `const array = ['juice', 'apple', 'cs484']`, - `console.log(removeElements(array))`, - ].join('\n')} - onChange={handleEditorChange} - /> - - SUBMIT - -
- ) -} - -export default Backend diff --git a/client/src/components/Forms/CodingForm/CodingForm.js b/client/src/components/Forms/CodingForm/CodingForm.js deleted file mode 100644 index eb61a6cc7..000000000 --- a/client/src/components/Forms/CodingForm/CodingForm.js +++ /dev/null @@ -1,108 +0,0 @@ -// * Modules -import React, { useEffect, useState } from 'react' -// * Redux -import { useSelector } from 'react-redux' -import { useNavigate } from 'react-router-dom' -import isEqual from 'lodash/isEqual' - -// * API -import teamsAPI from '../../../api/endpoints/team' -import tournamentAPI from '../../../api/endpoints/tournament' -import { useCheckAuth } from '../../../api/hooks/auth/useCheckAuth' - -import Backend from './Backend/Backend' -// * Assets -import Frontend from './Frontend/Frontend' -// * Styles -import { Text } from './CodingForm.styles' - -function CodingForm() { - const [code, setCode] = useState(``) - const [value, setValue] = useState(code || '') - const [output, setOutput] = useState('Your output here...') - const [role, setRole] = useState('') - - const [team, setTeam] = useState('') - const [updating, setUpdating] = useState(true) - const { data: user } = useCheckAuth() - const navigate = useNavigate() - - useEffect(() => { - const getData = async () => { - if (isEqual(user, {})) { - navigate('/auth/login', { replace: true }) - } else { - const team = await teamsAPI.getTeamById(user.userTeam) - const checkSignedUp = await tournamentAPI.checkUserSignedUp(user._id) - - setRole(checkSignedUp.data.role) - setTeam(team.data) - - setUpdating(false) - } - } - - getData() - }, []) - - const onChange = (action, data) => { - switch (action) { - case 'code': { - setCode(data) - break - } - default: { - console.warn('case not handled!', action, data) - } - } - } - - const renderer = ({ hours, minutes, seconds, completed }) => { - if (completed) { - // Render a complete state - return ( - - Time is up, you are not allowed to code. - - ) - } else { - // Render a countdown - return ( - - {minutes}:{seconds} - - ) - } - } - - const handleEditorChange = (value) => { - setValue(value) - console.log(value) - onChange('code', value) - } - - return role === 'frontend' ? ( - - ) : ( - - ) -} - -export default CodingForm diff --git a/client/src/components/Forms/CodingForm/CodingForm.styles.js b/client/src/components/Forms/CodingForm/CodingForm.styles.js deleted file mode 100644 index 727dd2f91..000000000 --- a/client/src/components/Forms/CodingForm/CodingForm.styles.js +++ /dev/null @@ -1,116 +0,0 @@ -import styled from 'styled-components' - -import { BLACK, WHITE } from '../../../constants/colors' - -export const Container = styled.div` - width: 100%; - min-height: 100vh; - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - background: #26292b; -` - -export const Text = styled.h1` - font-weight: ${(props) => props.fontWeight || '400'}; - font-size: ${(props) => props.fontSize || '22px'}; - color: ${(props) => props.color || 'white'}; - text-align: ${(props) => props.alignment || 'start'}; - margin: ${(props) => props.marginAll || '0'}; -` - -export const LeftContainer = styled.div` - display: flex; - flex-direction: column; - width: 50%; - justify-content: start; - align-items: center; -` - -export const RightContainer = styled.div` - display: flex; - flex-direction: column; - width: 50%; - justify-content: center; - align-items: center; - gap: 30px; -` - -export const TaskContainer = styled.div` - display: flex; - flex-direction: column; - justify-content: start; - align-items: center; - width: 512px; - height: 166px; - margin: 25px 25px 35px 0; - background-color: #1a1c22; - border-radius: 15px; - padding: 5px 15px; - -webkit-box-shadow: -3px -3px 36px -24px rgba(0, 0, 0, 0.6); - -moz-box-shadow: -3px -3px 36px -24px rgba(0, 0, 0, 0.6); - box-shadow: -3px -3px 36px -24px rgba(0, 0, 0, 0.6); - overflow-y: scroll; - scrollbar-width: none; /* Firefox */ - -ms-overflow-style: none; /* Internet Explorer 10+ */ - ::-webkit-scrollbar { - /* WebKit */ - width: 0; - height: 0; - } -` - -export const OutputContainer = styled.div` - display: flex; - width: 512px; - flex-direction: column; - align-items: flex-start; - background-color: #1a1c22; - padding: 20px; - margin: 15px 25px 35px 0; - border-radius: 15px; - height: 243px; - -webkit-box-shadow: -3px -3px 36px -24px rgba(0, 0, 0, 0.6); - -moz-box-shadow: -3px -3px 36px -24px rgba(0, 0, 0, 0.6); - box-shadow: -3px -3px 36px -24px rgba(0, 0, 0, 0.6); - overflow-y: scroll; - scrollbar-width: none; /* Firefox */ - -ms-overflow-style: none; /* Internet Explorer 10+ */ - ::-webkit-scrollbar { - /* WebKit */ - width: 0; - height: 0; - } -` - -export const ResultContainer = styled.div` - display: flex; - flex-direction: row; - align-items: center; - margin-bottom: 15px; - width: 270px; - justify-content: space-between; -` - -export const ResultStatus = styled.div` - display: flex; - flex-direction: row; - background-color: #1a1c22; - border-radius: 8px; - width: 160px; - align-items: center; - justify-content: center; - padding: 5px 0; -` - -export const SubmitButton = styled.button` - background-color: #1a1c22; - border-radius: 5px; - color: #5d9d0b; - border: none; - padding: 10px 0; - font-size: 18px; - width: 105px; - cursor: pointer; -` diff --git a/client/src/components/Forms/CodingForm/Frontend/CodeEvaluation.js b/client/src/components/Forms/CodingForm/Frontend/CodeEvaluation.js deleted file mode 100644 index a3d3ecdd6..000000000 --- a/client/src/components/Forms/CodingForm/Frontend/CodeEvaluation.js +++ /dev/null @@ -1,29 +0,0 @@ -const CodeEvaluation = (code) => { - let points = 0 - const answers = [ - 'teameightsDiv1', - 'display', - 'flex', - 'justifycontent', - 'center', - 'alignitems', - 'center', - ] - const words = code.split(' ') - - const result = words.filter((word) => word !== '') - - const finalResult = result.map((word) => word.replace(/[^a-zA-Z0-9]/g, '')) - - console.log(finalResult) - - for (let i = 0; i < finalResult.length; i++) { - if (answers.includes(finalResult[i])) { - points = points + 10 - } - } - - return points -} - -export default CodeEvaluation diff --git a/client/src/components/Forms/CodingForm/Frontend/Frontend.js b/client/src/components/Forms/CodingForm/Frontend/Frontend.js deleted file mode 100644 index 12838c1e3..000000000 --- a/client/src/components/Forms/CodingForm/Frontend/Frontend.js +++ /dev/null @@ -1,148 +0,0 @@ -// * Modules -import { useState } from 'react' -import Countdown from 'react-countdown' -import { useNavigate } from 'react-router-dom' -import Typewriter from '@mikhail2404/react-ts-typewriter' -import Editor from '@monaco-editor/react' - -// * API -import submissionAPI from '../../../../api/endpoints/submission' -// * Styles -import { - Container, - LeftContainer, - OutputContainer, - ResultContainer, - ResultStatus, - RightContainer, - SubmitButton, - TaskContainer, - Text, -} from '../CodingForm.styles' - -// * Assets -import CodeEvaluation from './CodeEvaluation' - -function CodingForm({ renderer, value, output, handleEditorChange, team, user, setOutput, code }) { - const navigate = useNavigate() - - const makeSubmission = async () => { - const curPoints = CodeEvaluation(code) - - setPoints(points) - - curPoints < 70 - ? setOutput(`You received ${curPoints} points, probably missing something!`) - : setOutput( - `You received ${curPoints} points, good job! Waiting for your teameight to finish!`, - ) - setStatus('Accepted') - setMemory('40') - setTime('0.002') - const s_parts = { - frontend: { - submission_time: new Date().getTime(), - points: curPoints, - }, - } - const submission = await submissionAPI.makeSubmission(s_parts, user.userTeam) - - if (curPoints === 70) { - setTimeout(function () { - setOutput('Redirecting you to the leaderboards...') - }, 2000) - - setTimeout(function () { - navigate('/leaderboard') - }, 4000) - } - } - const [status, setStatus] = useState('N/A') - const [memory, setMemory] = useState('N/A') - const [time, setTime] = useState('N/A') - const [points, setPoints] = useState(0) - - return ( - - - - Teameights cup #1 - - - Front-End - - - - - - - - - -
- Output: -
- - - {output} - - - -
- - - Status: - - - - {status} - - - - - - - Memory: - - - - {memory} - - - - - - - Time: - - - - {time} - - - -
-
- - - - - SUBMIT - -
- ) -} - -export default CodingForm diff --git a/client/src/components/Forms/CreateTeamForm/CreateTeamForm.js b/client/src/components/Forms/CreateTeamForm/CreateTeamForm.js index c470cb7e7..46cf11abc 100644 --- a/client/src/components/Forms/CreateTeamForm/CreateTeamForm.js +++ b/client/src/components/Forms/CreateTeamForm/CreateTeamForm.js @@ -1,10 +1,9 @@ // * Modules import React, { useState } from 'react' +import { Toaster } from 'react-hot-toast' import { useDispatch } from 'react-redux' // * Redux import { useNavigate } from 'react-router-dom' -import isEqual from 'lodash/isEqual' -import { useSnackbar } from 'notistack' // API import { useCheckAuth } from '../../../api/hooks/auth/useCheckAuth' @@ -21,7 +20,6 @@ import InfoForm from '../RegistrationPipeline/components/RegistrationForms/InfoF function CreateTeamForm() { const navigate = useNavigate() const dispatch = useDispatch() - const { enqueueSnackbar } = useSnackbar() const [teamName, setTeamName] = useState('') const [teamAvatar, setTeamAvatar] = useState(null) @@ -85,6 +83,7 @@ function CreateTeamForm() { initialValues={initialValues} submitForm={submitForm} /> + {/* {!isCreatingTeam && !isUserLoading && } */} ) } diff --git a/client/src/components/Forms/Leaderboard/Leaderboard.js b/client/src/components/Forms/Leaderboard/Leaderboard.js deleted file mode 100644 index 0662a85ea..000000000 --- a/client/src/components/Forms/Leaderboard/Leaderboard.js +++ /dev/null @@ -1,120 +0,0 @@ -// * Modules -import { useEffect, useState } from 'react' -import { InfinitySpin } from 'react-loader-spinner' -// * Redux -import { useSelector } from 'react-redux' -import { useNavigate } from 'react-router-dom' -import isEqual from 'lodash/isEqual' - -import submissionAPI from '../../../api/endpoints/submission' -// * API -import teamsAPI from '../../../api/endpoints/team' -import { useCheckAuth } from '../../../api/hooks/auth/useCheckAuth' -// * Assets -import TopTemplate from '../../TopTemplate/TopTemplate' - -// * Styles -import { - BaseContainer, - Container, - Content, - InfoContainer, - Text, - TextCTA, -} from './Leaderboard.styles' - -function Leaderboard() { - const [updating, setUpdating] = useState(true) - const { data: user } = useCheckAuth() - const [submissions, setSubmissions] = useState([]) - - const navigate = useNavigate() - - useEffect(() => { - const getData = async () => { - if (isEqual(user, {})) { - navigate('/auth/login', { replace: true }) - } else { - const results = await submissionAPI.getSubmissions() - let filtered = await Promise.all( - results.data.map(async (result) => { - let teamrequest = await teamsAPI.getTeamById(result.team_id) - let teamName = teamrequest.data.name - let teamScore = 0 - - if ( - result.submission_parts.backend !== undefined && - result.submission_parts.frontend !== undefined - ) { - teamScore = - result.submission_parts.backend.points + result.submission_parts.frontend.points - } else if (result.submission_parts.backend !== undefined) { - teamScore = result.submission_parts.backend.points - } else if (result.submission_parts.frontend !== undefined) { - teamScore = result.submission_parts.frontend.points - } - - return { teamName, teamScore } - }), - ) - - filtered.sort((a, b) => b.teamScore - a.teamScore) - - setSubmissions(filtered) - - setUpdating(false) - } - } - - getData() - }, []) - - return ( - - - - {updating ? ( -
- -
- ) : ( - - - - Leaderboard - - - - - - TOP - - - TEAM - - - SCORE - - - - {submissions.map((item, i) => ( - - - #{i} - - - {item.teamName} - - - {item.teamScore} - - - ))} - - )} -
-
- ) -} - -export default Leaderboard diff --git a/client/src/components/Forms/Leaderboard/Leaderboard.styles.js b/client/src/components/Forms/Leaderboard/Leaderboard.styles.js deleted file mode 100644 index 432cf970f..000000000 --- a/client/src/components/Forms/Leaderboard/Leaderboard.styles.js +++ /dev/null @@ -1,53 +0,0 @@ -import styled from 'styled-components' - -export const Container = styled.div` - width: 100%; - min-height: 100vh; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - background: #26292b; -` - -export const Text = styled.h1` - font-weight: ${(props) => props.fontWeight || '400'}; - font-size: ${(props) => props.fontSize || '16px'}; - color: ${(props) => props.color || 'white'}; - text-align: ${(props) => props.alignment || 'start'}; - margin: ${(props) => props.marginAll || '0'}; -` - -export const Content = styled.div` - min-height: 100vh; - display: flex; - justify-content: center; - align-items: center; -` - -export const BaseContainer = styled.div` - width: 774px; - min-height: 600px; - display: flex; - flex-direction: column; - background: #1a1c22; - border-radius: 15px; - padding: 2rem 5rem; -` - -export const InfoContainer = styled.div` - display: flex; - flex-direction: row; - justify-content: space-between; - background: #26292b; - border-radius: 5px; - padding: 5px 15px; - margin-bottom: 14px; -` - -export const TextCTA = styled.div` - display: flex; - flex-direction: row; - align-items: center; - justify-content: center; -` diff --git a/client/src/components/Forms/NoTeamForm/NoTeamForm.js b/client/src/components/Forms/NoTeamForm/NoTeamForm.js index a06ea5630..b012c2aaa 100644 --- a/client/src/components/Forms/NoTeamForm/NoTeamForm.js +++ b/client/src/components/Forms/NoTeamForm/NoTeamForm.js @@ -21,7 +21,7 @@ function NoTeamForm() { navigate(ROUTES.login) } else { dispatch(startRegistration()) - navigate('/create-team', { replace: true }) + navigate('/teams/create', { replace: true }) } } @@ -34,7 +34,7 @@ function NoTeamForm() { } if (user?.userTeam) { - return + return } return ( diff --git a/client/src/components/Forms/RegistrationForm/RegistrationForm.js b/client/src/components/Forms/RegistrationForm/RegistrationForm.js index 6465aa3cc..98de27f9d 100644 --- a/client/src/components/Forms/RegistrationForm/RegistrationForm.js +++ b/client/src/components/Forms/RegistrationForm/RegistrationForm.js @@ -34,7 +34,6 @@ function RegistrationForm() { const [showPassword, setShowPassword] = useState(false) const [password, setPassword] = useState('') const [confirmPassword, setConfirmPassword] = useState('') - const [username, setUsername] = useState('') const [email, setEmail] = useState('') const { mutate: registerUser, isLoading: isUserRegistrationLoading } = useRegister() diff --git a/client/src/components/Forms/TeamsList/TeamsList.js b/client/src/components/Forms/TeamsList/TeamsList.js index 78859d49f..dda0953ee 100644 --- a/client/src/components/Forms/TeamsList/TeamsList.js +++ b/client/src/components/Forms/TeamsList/TeamsList.js @@ -1,11 +1,11 @@ // * Modules import { useEffect, useState } from 'react' +import { Toaster } from 'react-hot-toast' // * Redux import { useDispatch } from 'react-redux' import { useNavigate } from 'react-router-dom' import Box from '@mui/material/Box' import Modal from '@mui/material/Modal' -import { useSnackbar } from 'notistack' // * API import teamsAPI from '../../../api/endpoints/team' @@ -28,10 +28,8 @@ import { function TeamsList() { const navigate = useNavigate() - const dispatch = useDispatch() const { data: user } = useCheckAuth() - const { enqueueSnackbar } = useSnackbar() const [teams, setTeams] = useState([]) const [open, setOpen] = useState(false) @@ -63,17 +61,16 @@ function TeamsList() { if (result) { handleClose() - navigate('/myteam') + navigate(`/team/${teamId}`) } else { - enqueueSnackbar('You have joined the team already!', { - preventDuplicate: true, - }) + console.log('here') } } return ( <> + setOpen(true) - const handleClose = () => setOpen(false) - - const handleFront = (e) => { - console.log('front: ' + e.target.value) - setFrontEnd(e.target.value) - } - const handleBack = (e) => { - console.log('back: ' + e.target.value) - setBackEnd(e.target.value) - } - - const handleTournamentCheck = (userRole) => { - setUserRole(userRole) - setAllowStart(true) - } - - const handleSubmit = async () => { - if (frontEnd === backEnd) { - enqueueSnackbar('Should be different users!', { - preventDuplicate: true, - }) - } else if (frontEnd === '' || backEnd === '') { - enqueueSnackbar('Select both front & back!', { - preventDuplicate: true, - }) - } else { - const res = await tournamentAPI.addTeamToTournament(team._id, frontEnd, backEnd) - - console.log(res) - if (res.data?.error) { - enqueueSnackbar(res.data.error, { - preventDuplicate: true, - }) - } else { - setAllowStart(true) - handleClose() - } - } - } - - const handleStart = async () => { - navigate('/coding') - } - - useEffect(() => { - const getData = async () => { - if (isEqual(user, {})) { - navigate('/auth/login', { replace: true }) - } else { - const team = await teamsAPI.getTeamById(user.userTeam) - const users = await teamsAPI.getTeamMembers(team.data.members) - const checkSignedUp = await tournamentAPI.checkUserSignedUp(user._id) - - console.log(checkSignedUp) - checkSignedUp.data.exists && checkSignedUp.data.exists === true - ? handleTournamentCheck(checkSignedUp.data.role) - : setAllowStart(false) - setTeam(team.data) - setMembers(users.data) - setUpdating(false) - } - } - - getData() - }, []) - - return ( - - - - - -
- -
-
- {members.length >= 2 ? ( - <> - - Select team members - - - Frontend dev - - - - {members.map((member, i) => ( - - {member.userRealName} - - ))} - - - Backend dev - - - - {members.map((member, i) => ( - - {member.userRealName} - - ))} - - - Submit - - - ) : user?.userTeam ? ( - You need at least two team members. - ) : ( - You need to join team first - )} -
-
- - navigate('/tournament', { replace: true })}> - - - Teameights cup #1 - - - - OVERVIEW - - - - - -
-
- - Sign up closes in 7h 22m - -
- -
- - - - - ENTRY FEE - - - Free to enter - - - - - - STARTS AT - - - 02/08/2022 06:00 - - - - -
- - {allowStart ? ( - Start coding - ) : ( - SIGN UP - )} - navigate('/leaderboard')}> - Leaderboard - - -
- - - - AVAILABLE SLOTS - - - {data.map((item, i) => ( - - - {item.name} - - - {item.number} - - - ))} - -
- Tournament restrictions -
- - - RANK RESTRICTION - - - None specified - - - - - - ALLOWED EXCEPTIONS - - - 0 out of 5 team members may be from other countries - - -
-
-
-
-
- ) -} - -export default TournamentInfo diff --git a/client/src/components/Forms/TournamentInfo/TournamentInfo.styles.js b/client/src/components/Forms/TournamentInfo/TournamentInfo.styles.js deleted file mode 100644 index eeb530ae3..000000000 --- a/client/src/components/Forms/TournamentInfo/TournamentInfo.styles.js +++ /dev/null @@ -1,171 +0,0 @@ -import styled from 'styled-components' - -import { BLACK, WHITE } from '../../../constants/colors' - -export const Container = styled.div` - width: 100%; - height: 100vh; - background: ${BLACK.background}; -` - -export const Content = styled.div` - max-width: 1280px; - margin: auto; - height: 100%; - display: flex; - flex-direction: column; - background: #26292b; -` - -export const Div = styled.div` - display: flex; - flex-direction: column; -` - -export const TopContainer = styled.div` - margin-bottom: 25px; -` - -export const ComeBackBtn = styled.button` - border: none; - outline: none; - background: inherit; - margin: 10rem 0 20px 0; - padding: 0; - cursor: pointer; -` - -export const SelectContainer = styled.div` - width: 110px; - align-items: center; - border-bottom: solid 2px #5d9d0b; - display: flex; - flex-direction: column; -` - -export const SelectItem = styled.div` - margin-top: 20px; - padding-bottom: 5px; - cursor: pointer; -` - -export const TournamentInfoContainer = styled.div` - display: flex; - position: relative; -` - -export const EntryStartsContainer = styled.div` - display: flex; - align-items: center; - height: 85px; - border-bottom: solid 2px #353535; -` - -export const InfoContainer = styled.div` - display: flex; - flex-direction: column; - margin-right: ${(props) => props.mr || '5rem'}; -` - -export const ButtonContainer = styled.div` - display: flex; - flex-direction: column; - /* border-bottom: solid 2px #353535; */ - gap: 12px; -` - -export const AvailableSlotsContainer = styled.div` - display: flex; - flex-direction: column; - position: absolute; - right: 0; -` - -export const AvailableSlotsItem = styled.div` - display: flex; - flex-direction: ${(props) => props.fd || 'row'}; - background: ${(props) => props.background || ' #2b2e36'}; - color: white; - width: ${(props) => props.width || '320px'}; - height: ${(props) => props.height || '60px'}; - font-size: 20px; - justify-content: ${(props) => props.justify || 'space-between'}; - align-items: ${(props) => props.align || 'start'}; - padding: 0 20px; - border-radius: 5px 5px 0 0; - border-bottom: ${(props) => props.borderb || 'none'}; -` - -export const Text = styled.h1` - font-weight: ${(props) => props.fontWeight || '400'}; - font-size: ${(props) => props.fontSize || '36px'}; - color: ${(props) => props.color || 'white'}; - text-align: ${(props) => props.alignment || 'start'}; - margin: ${(props) => props.margin || '0'}; -` - -export const Span = styled.span` - color: ${(props) => props.color || 'white'}; -` - -export const PrimaryButton = styled.button` - color: ${(props) => props.color || 'white'}; - background: ${(props) => props.background || '#5D9D0B'}; - font-weight: ${(props) => props.fontWeight || '600'}; - border: none; - border-radius: 5px; - padding: ${(props) => props.padding || '10px 120px'}; - cursor: ${(props) => props.cursor || 'pointer'}; - margin: ${(props) => props.margin || '0'}; -` - -export const style = { - position: 'absolute', - top: '50%', - left: '50%', - transform: 'translate(-50%, -50%)', - width: 670, - height: 400, - background: '#26292B', - border: 'none', - borderRadius: '15px', - boxShadow: 24, - p: 3, - display: 'flex', - justifyContent: 'start', - alignItems: 'center', - flexDirection: 'column', -} - -export const CloseContainer = styled.div` - width: 100%; - display: flex; - justify-content: end; - align-items: center; -` - -export const CustomSelect = styled.select` - margin: 10px 0 0 0; - appearance: none; - border: 0; - outline: none; - font: inherit; - /* Personalize */ - width: 18em; - height: 3em; - padding: 0 4em 0 1em; - background: #5d9d0b; - color: white; - border-radius: 0.25em; - box-shadow: 0 0 1em 0 rgba(0, 0, 0, 0.2); - cursor: pointer; - /* Remove focus outline */ - &:focus { - outline: none; - } -` - -export const CustomOption = styled.option` - /* background: white; - color: #26292b; */ -` diff --git a/client/src/components/Forms/TournamentsForm/TournamentsForm.js b/client/src/components/Forms/TournamentsForm/TournamentsForm.js index 4d5883218..a6c0d67bc 100644 --- a/client/src/components/Forms/TournamentsForm/TournamentsForm.js +++ b/client/src/components/Forms/TournamentsForm/TournamentsForm.js @@ -23,7 +23,7 @@ function TournamentsForm() { - 12/04 + Soon❤️ Teameights cup #1 @@ -43,13 +43,11 @@ function TournamentsForm() { - navigate('/tournament-info', { replace: true })}> - View - + View - No recent tournaments found... + Tournaments coming in the next updates🎉 ) diff --git a/client/src/components/Forms/TournamentsForm/TournamentsForm.styles.js b/client/src/components/Forms/TournamentsForm/TournamentsForm.styles.js index 6e0a9a12b..47559577e 100644 --- a/client/src/components/Forms/TournamentsForm/TournamentsForm.styles.js +++ b/client/src/components/Forms/TournamentsForm/TournamentsForm.styles.js @@ -90,7 +90,7 @@ export const ButtonGeneral = styled.button` box-shadow: 0px 4px 50px rgba(93, 157, 11, 0.15); &:hover { border: none; - cursor: pointer; + cursor: not-allowed; transition: 0.15s; } ` diff --git a/client/src/components/NavBar/NavBar.data.js b/client/src/components/NavBar/NavBar.data.js index 9c424715c..c6a21e2ab 100644 --- a/client/src/components/NavBar/NavBar.data.js +++ b/client/src/components/NavBar/NavBar.data.js @@ -15,7 +15,7 @@ export const NavBarData = [ }, { title: 'Tournaments', - path: '/tournament', + path: '/tournaments', icon: , }, { diff --git a/client/src/components/NavBar/NavBar.jsx b/client/src/components/NavBar/NavBar.jsx index c2d83de49..cceb4274f 100644 --- a/client/src/components/NavBar/NavBar.jsx +++ b/client/src/components/NavBar/NavBar.jsx @@ -45,7 +45,7 @@ const NavBar = () => { { title: 'Team', icon: , - path: user?.team ? '/myteam' : '/team', + path: user?.team ? `/team/${user.team._id}` : '/team', }, ...NavBarData.slice(1), ] diff --git a/client/src/components/NavBar/Profile/NotificationModal/NotificationModal.jsx b/client/src/components/NavBar/Profile/NotificationModal/NotificationModal.jsx deleted file mode 100644 index e9f1e0820..000000000 --- a/client/src/components/NavBar/Profile/NotificationModal/NotificationModal.jsx +++ /dev/null @@ -1,73 +0,0 @@ -import React from 'react' -import Modal from '@mui/material/Modal' -import { v4 as uuidv4 } from 'uuid' - -import HollowNotificationBell from '../../../../assets/HollowNotificationBell' -import X from '../../../../assets/X' -import userImg from '../../tempImg.jpg' - -import { - Join, - Notification, - NotificationBackDrop, - NotificationData, - NotificationDesc, - NotificationModalDiv, - NotificationTitle, - NotificationToggle, - NotificationUserData, - NotificationUserImg, - NotificationUserRealName, - TopBar, -} from './NotificationModal.styles' - -const userNotificationList = [] - -const userNotification = { - img: userImg, - userRealName: 'Dummy Test', - desc: 'lorem asoidjasodijasoidjasoidajsdioj', - key: uuidv4(), -} - -for (let i = 0; i < 5; ++i) { - userNotificationList.push(userNotification) -} - -const NotificationModal = ({ notificationModal, toggleNotificationModal }) => { - return ( - - { - e.stopPropagation() - }} - > - - - - - Notifications - - - - - - - {userNotificationList.map((data) => { - return ( - - - - {data.userRealName} - {data.desc.slice(0, 20)}... - - - ) - })} - - - - ) -} - -export default NotificationModal diff --git a/client/src/components/NavBar/Profile/NotificationModal/NotificationModal.styles.js b/client/src/components/NavBar/Profile/NotificationModal/NotificationModal.styles.js deleted file mode 100644 index afe6e5948..000000000 --- a/client/src/components/NavBar/Profile/NotificationModal/NotificationModal.styles.js +++ /dev/null @@ -1,99 +0,0 @@ -import styled from 'styled-components' - -export const NotificationModalDiv = styled.div` - background: linear-gradient(180deg, rgba(26, 28, 34, 0.5) 0%, rgba(40, 47, 71, 0.5) 100%); - border-radius: 15px; - z-index: 9999; - transform: translate(50%, 0%); - position: absolute; - width: 250px; - height: 60%; - padding: 15px; - overflow: hidden; - top: 10rem; - left: 5rem; - outline: none; - color: #fff; -` - -export const NotificationBackDrop = styled.div` - -webkit-backdrop-filter: blur(15px); - backdrop-filter: blur(15px); - width: 100%; - height: 100%; - position: absolute; - top: 0; - left: 0; - z-index: -1; -` - -export const NotificationToggle = styled.div` - cursor: pointer; -` - -export const TopBar = styled.div` - display: flex; - align-items: center; - justify-content: space-between; - // padding: 0 10px; -` -export const NotificationTitle = styled.h4` - margin: 0; - margin-left: 2px; - text-align: start; - font-weight: 300; -` -export const Join = styled.div` - display: flex; - align-items: center; - gap: 4px; -` - -export const NotificationData = styled.ul` - margin-top: 24px; - padding: 0; - display: flex; - flex-direction: column; - gap: 16px; - overflow: hidden; - list-style: none; -` - -export const Notification = styled.li` - width: 100%; - margin: 0; - display: flex; - align-items: center; - gap: 4px; - padding: 5px; - border-radius: 4px; - background: #26292b; - box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.02), 0px 2px 4px rgba(0, 0, 0, 0.08); - border-radius: 6px; - cursor: pointer; -` - -export const NotificationUserImg = styled.img` - width: 30px; - height: 30px; - border-radius: 4px; -` - -export const NotificationUserRealName = styled.strong` - margin: 0; - font-size: 0.75rem; - font-weight: 500; - line-height: 1; -` - -export const NotificationDesc = styled.p` - margin: 0; - font-size: 0.625rem; - line-height: 1; -` - -export const NotificationUserData = styled.div` - width: 100%; - height: 100%; - padding-left: 1px; -` diff --git a/client/src/components/NavBar/Profile/Profile.jsx b/client/src/components/NavBar/Profile/Profile.jsx index 0ce2e4027..a7b6ddd2f 100644 --- a/client/src/components/NavBar/Profile/Profile.jsx +++ b/client/src/components/NavBar/Profile/Profile.jsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from 'react' import { useCheckAuth } from '../../../api/hooks/auth/useCheckAuth' -import unregisteredImg from '../../../assets/defaultAvatars/user/unregistered.png' +import unregisteredImg from '../../../assets/DefaultAvatars/user/unregistered.png' import { LOCAL_PATH } from '../../../http' import { ProfileIcon, UserContent, UserInfo, UserRealName, UserUsername } from './Profile.styles' diff --git a/client/src/components/NavBar/defaultImg.png b/client/src/components/NavBar/defaultImg.png deleted file mode 100644 index 8c8162254e315cce8292cf85996fc9efae0dcae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1090 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�-1`WM87k86i{+AJFi;Xx$wOeuH1}K=GWF_F~DwTAH4UvpFr%AZ*k)P`r>v z-0l&l9n>Xi&CdNVK?mWQoE@U1O)eM{iD8Lznp*J8A)|s&XlzZhqV1r%-;FsYRK6e&{WQ$7Xib8V5m;b0ThjCyVmiDWbwr%=~u6Td; zFffrkD7EMAdy(iL?1}G1Vt+8sFG$mKH5xCYa^?gf!z>YaOnqS;`-7?9i`;Av{)ZJb z7vGftg~O!%vTIa?xlC)IbEkNZ%i5s_1V2z?+}n`)El*ZS{ZZc#T8dPhW(+D#yaX>) zto*2)EUk*!WNp&N0<6*2$VYRyMrP;{m1)nNOfnR98OD*Ctlq@Lv3>FQnXV$mxa!gwdf%+07+tbTfII`agHow@*G1Y_Be3cFZYP zF3A2nBPX?LSy7OvZa>j%nW?QK_}y9xx7RCW+efB{s*rUGgJED?rnCpk6nxHb)V(T} zOScvq>aAs8U^?)yI6fE;)4RYpMO%-Db;SwY#TE&}fY}T|v-O0mOQO{ufRq<>_q=}Y zMbY|hI4*RBor844{<-3O@+*+3O-+-E(UH7(P<8wUy!CH z1VcldbQjV7jud$E{YY={69XAdTud^_h$sG&br*Lv2r610@C`N1qSW*iwN{!y^*$%yW*m-+h(H8G_{{A8sJ{fv)=5*z} zy!9MpgYzWP9CVsfPS>cMa>&p>p(TsQO)~)-aVkI8S(c>xgbwQaryfu%b};I*ePqmd z=A-tPfU8gOoQihq3eBOoWZOg735ePwKAbHz<^1>HuMc_emw z_8+N_PR4eIVq@#xBizEql0ES;9cxri{t^r%|99{_`b$s+6#Yq>FJDm@BK1`K=x5Vk zf+L1kPQw<8@r?#DfmO!?w-o`Q%9E9?dRmgxH%0D^N9~1Za|UE=h}-AY+wOK3yJA3w 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 diff --git a/client/src/components/Teammates/Teammates.js b/client/src/components/Teammates/Teammates.js index 5aac825dc..1c80d2911 100644 --- a/client/src/components/Teammates/Teammates.js +++ b/client/src/components/Teammates/Teammates.js @@ -1,9 +1,10 @@ // * Modules import React, { useState } from 'react' -import CssBaseline from '@mui/material/CssBaseline' +import { ThemeProvider } from 'styled-components' // * API import { useCheckAuth } from '../../api/hooks/auth/useCheckAuth' +import { GlobalStyle } from '../../shared/styles/Global.styles' import Cards from './components/Cards/Cards' import NotFound from './components/NotFound/NotFound' @@ -16,7 +17,6 @@ import UserProfilePhone from './components/UserProfilePhone/UserProfilePhone' import { CardsContainer, CardsZone, - GlobalStyle, GridContainer, InfoContainer, UserCardModal, @@ -66,39 +66,41 @@ function Teammates() { return ( <> - - - {/* ! USED ONLY FOR 730px or more */} - - - - {/* ! USED ONLY FOR 730px or less */} - - {/* If nothing was found, show user a NotFound container */} - {isNotFound ? ( - - - - ) : ( - - - - - - - - - )} + + + + {/* ! USED ONLY FOR 730px or more */} + + + + {/* ! USED ONLY FOR 730px or less */} + + {/* If nothing was found, show user a NotFound container */} + {isNotFound ? ( + + + + ) : ( + + + + + + + + + )} + ) } diff --git a/client/src/components/Teammates/Teammates.styles.js b/client/src/components/Teammates/Teammates.styles.js index e211f5f24..8b7a790a6 100644 --- a/client/src/components/Teammates/Teammates.styles.js +++ b/client/src/components/Teammates/Teammates.styles.js @@ -57,31 +57,3 @@ export const UserCardModal = styled(Modal)` display: none; } ` -/** - * Global style applied for this component. - * TODO: Move this global style to the root component after refactoring - */ -export const GlobalStyle = createGlobalStyle` - body { - background: #26292B !important; - overflow-y: scroll; - scrollbar-width: none; /* Firefox */ - -ms-overflow-style: none; /* Internet Explorer 10+ */ - ::-webkit-scrollbar { /* WebKit */ - transition: all 0.2s; - width: ${(props) => (props.scrollbar ? `10px` : '0')}; - height: ${(props) => (props.scrollbar ? `auto` : '0')}; - } - ::-webkit-scrollbar-track { - background: transparent; - } - - ::-webkit-scrollbar-thumb { - background-color: - ${(props) => (props.scrollbar ? `#5D9D0B;` : '#000000')}; - border-radius: 10px; - } - - - } -` diff --git a/client/src/components/Teammates/components/SelectField/SelectField.css b/client/src/components/Teammates/components/SelectField/SelectField.css index 77849d7b2..14de5c797 100644 --- a/client/src/components/Teammates/components/SelectField/SelectField.css +++ b/client/src/components/Teammates/components/SelectField/SelectField.css @@ -4,18 +4,6 @@ fieldset{ outline: none !important; } -/* remove background */ -/* .css-vrp7az-MuiSelect-select-MuiInputBase-input-MuiOutlinedInput-input.css-vrp7az-MuiSelect-select-MuiInputBase-input-MuiOutlinedInput-input.css-vrp7az-MuiSelect-select-MuiInputBase-input-MuiOutlinedInput-input{ - background: none; -} */ - -/* customize input */ -/* .css-vrp7az-MuiSelect-select-MuiInputBase-input-MuiOutlinedInput-input { - color: white !important; - font-size: 0.875rem !important; - font-weight: 600 !important; -} */ - /* scrollbar customization */ .css-1poimk-MuiPaper-root-MuiMenu-paper-MuiPaper-root-MuiPopover-paper::-webkit-scrollbar { width: 9px; diff --git a/client/src/components/Teammates/components/TopBar/TopBar.js b/client/src/components/Teammates/components/TopBar/TopBar.js index 9fb91e48f..53f0625df 100644 --- a/client/src/components/Teammates/components/TopBar/TopBar.js +++ b/client/src/components/Teammates/components/TopBar/TopBar.js @@ -7,10 +7,8 @@ import { Form, Formik } from 'formik' import Filters from '../../../../assets/Filters' // * Assets -import PlatformLogo from '../../../../assets/PlatformLogo' import Search from '../../../../assets/SearchIcon' // * Components -import NavBarContainer from '../../../../components/NavBar/NavBar' import frameworkOptions from '../../../../constants/frameworks' import CustomSelect from '../../../../shared/components/CustomSelect/CustomSelect' import { setFilters } from '../../../../store/reducers/Shared' diff --git a/client/src/components/Teammates/components/UserCard/UserCard.js b/client/src/components/Teammates/components/UserCard/UserCard.js index c4ed22d0c..8cfc914c8 100644 --- a/client/src/components/Teammates/components/UserCard/UserCard.js +++ b/client/src/components/Teammates/components/UserCard/UserCard.js @@ -1,11 +1,10 @@ import React from 'react' +// * Images +import CrownImg from '../../../../assets/UserProfile/LeaderCrown.png' // * Colors import { languageOptions } from '../../../../constants/programmingLanguages' import { LOCAL_PATH } from '../../../../http' -// * Images -import CrownImg from '../../img/CrownTest.png' -import userImg from '../../img/tempImg.jpg' import LengthFourCase from './FrameworksCases/LengthFourCase' import LengthFourSlicedCase from './FrameworksCases/LengthFourSlicedCase' @@ -82,10 +81,7 @@ const UserCard = React.forwardRef((props, ref) => { {/* TODO: Change for real image! */}
- +
{programmingLanguages}
diff --git a/client/src/components/Teammates/components/UserProfile/UserProfile.js b/client/src/components/Teammates/components/UserProfile/UserProfile.js index 06e6b5ae5..7a117d85c 100644 --- a/client/src/components/Teammates/components/UserProfile/UserProfile.js +++ b/client/src/components/Teammates/components/UserProfile/UserProfile.js @@ -11,8 +11,6 @@ import AddIcon from '../../../../assets/AddIcon' import LinkIcon from '../../../../assets/LinkIcon' import MessageIcon from '../../../../assets/MessageIcon' import { LOCAL_PATH } from '../../../../http' -// * Temporary image -import AvatarImage from '../../img/tempImg.jpg' import { Button, @@ -36,12 +34,8 @@ const UserProfile = ({ user, handleClose }) => { - {/* TODO: Change for the REAL photo! */}
- +
{/* TODO: Change for real links! & rewrite for the .map() */} diff --git a/client/src/components/Teammates/components/UserProfilePhone/UserProfilePhone.js b/client/src/components/Teammates/components/UserProfilePhone/UserProfilePhone.js index c88620c5b..8af2f30dd 100644 --- a/client/src/components/Teammates/components/UserProfilePhone/UserProfilePhone.js +++ b/client/src/components/Teammates/components/UserProfilePhone/UserProfilePhone.js @@ -10,7 +10,6 @@ import ComebackArrow from '../../../../assets/ComebackArrow' import LinkIcon from '../../../../assets/LinkIcon' import MessageIcon from '../../../../assets/MessageIcon' import { LOCAL_PATH } from '../../../../http' -import TempImg from '../../img/tempImg.jpg' // * Styles import { @@ -38,12 +37,8 @@ const UserProfilePhone = ({ user, mobileProfile, handleClose }) => { - {/* TODO: Change for the REAL photo! */}
- +
diff --git a/client/src/components/Teammates/img/Country.svg b/client/src/components/Teammates/img/Country.svg deleted file mode 100644 index dd7412147..000000000 --- a/client/src/components/Teammates/img/Country.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/client/src/components/Teammates/img/Crown.svg b/client/src/components/Teammates/img/Crown.svg deleted file mode 100644 index 35d493d91..000000000 --- a/client/src/components/Teammates/img/Crown.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/client/src/components/Teammates/img/tempImg.jpg b/client/src/components/Teammates/img/tempImg.jpg deleted file mode 100644 index 852d17b52d6dfb974feb78650fe2a65a597b0a06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80801 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�-1`WM87k86i{+AJFi;Xx$wOeuH1}K=GWF_F~DwTAH4UvpFr%AZ*k)P`r>v z-0l&l9n>Xi&CdNVK?mWQoE@U1O)eM{iD8Lznp*J8A)|s&XlzZhqV1r%-;FsYRK6e&{WQ$7Xib8V5m;b0ThjCyVmiDWbwr%=~u6Td; zFffrkD7EMAdy(iL?1}G1Vt+8sFG$mKH5xCYa^?gf!z>YaOnqS;`-7?9i`;Av{)ZJb z7vGftg~O!%vTIa?xlC)IbEkNZ%i5s_1V2z?+}n`)El*ZS{ZZc#T8dPhW(+D#yaX>) zto*2)EUk*!WNp&N0<6*2$VYRyMrP;{m1)nNOfnR98OD*Ctlq@Lv3>FQnXV$mxa!gwdf%+07+tbTfII`agHow@*G1Y_Be3cFZYP zF3A2nBPX?LSy7OvZa>j%nW?QK_}y9xx7RCW+efB{s*rUGgJED?rnCpk6nxHb)V(T} zOScvq>aAs8U^?)yI6fE;)4RYpMO%-Db;SwY#TE&}fY}T|v-O0mOQO{ufRq<>_q=}Y zMbY|hI4*RBor844{<-3O@+*+3O-+-E(UH7(P<8wUy!CH z1VcldbQjV7jud$E{YY={69XAdTud^_h$sG&br*Lv2r610@C`N1qSW*iwN{!y^*$%yW*m-+h(H8G_{{A8sJ{fv)=5*z} zy!9MpgYzWP9CVsfPS>cMa>&p>p(TsQO)~)-aVkI8S(c>xgbwQaryfu%b};I*ePqmd z=A-tPfU8gOoQihq3eBOoWZOg735ePwKAbHz<^1>HuMc_emw z_8+N_PR4eIVq@#xBizEql0ES;9cxri{t^r%|99{_`b$s+6#Yq>FJDm@BK1`K=x5Vk zf+L1kPQw<8@r?#DfmO!?w-o`Q%9E9?dRmgxH%0D^N9~1Za|UE=h}-AY+wOK3yJA3w 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 diff --git a/client/src/components/TopTemplate/TopTemplate.styles.js b/client/src/components/TopTemplate/TopTemplate.styles.js index 296feb184..ec7c454c4 100644 --- a/client/src/components/TopTemplate/TopTemplate.styles.js +++ b/client/src/components/TopTemplate/TopTemplate.styles.js @@ -1,18 +1,5 @@ import styled from 'styled-components' -import { BLACK } from '../../constants/colors' - -// export const ToolbarContainer = styled.div` -// width: 100%; -// background: ${BLACK.background}; -// display: grid; -// grid-template-columns: repeat(3, 1fr); -// justify-items: center; -// align-items: center; -// height: 78px; -// grid-auto-flow: column; -// ` - export const NavContainer = styled.div` justify-self: center; ` diff --git a/client/src/constants/finishRegistrationData.js b/client/src/constants/finishRegistrationData.js index c5cc9ed0f..f4b318c9d 100644 --- a/client/src/constants/finishRegistrationData.js +++ b/client/src/constants/finishRegistrationData.js @@ -1,9 +1,9 @@ -import blueAvatar from '../assets/defaultAvatars/user/default-blue.png' -import greenAvatar from '../assets/defaultAvatars/user/default-green.png' -import orangeAvatar from '../assets/defaultAvatars/user/default-orange.png' -import pinkAvatar from '../assets/defaultAvatars/user/default-pink.png' -import purpleAvatar from '../assets/defaultAvatars/user/default-purple.png' -import yellowAvatar from '../assets/defaultAvatars/user/default-yellow.png' +import blueAvatar from '../assets/DefaultAvatars/user/default-blue.png' +import greenAvatar from '../assets/DefaultAvatars/user/default-green.png' +import orangeAvatar from '../assets/DefaultAvatars/user/default-orange.png' +import pinkAvatar from '../assets/DefaultAvatars/user/default-pink.png' +import purpleAvatar from '../assets/DefaultAvatars/user/default-purple.png' +import yellowAvatar from '../assets/DefaultAvatars/user/default-yellow.png' import GitHubIcon from '../assets/Links/GitHubIcon' import LinkedInIcon from '../assets/Links/LinkedInIcon' import TelegramIcon from '../assets/Links/TelegramIcon' diff --git a/client/src/constants/routes.js b/client/src/constants/routes.js index 628c8685e..4e7408c06 100644 --- a/client/src/constants/routes.js +++ b/client/src/constants/routes.js @@ -1,13 +1,20 @@ const ROUTES = Object.freeze({ + default: '/', login: '/auth/login', registration: '/auth/registration', confirmEmail: '/auth/confirm-email', + authVerification: '/auth/verification', finishRegistration: '/auth/finish-registration', passwordRecover: '/auth/password-recover', passwordRecoverConfirm: '/auth/password-recover-confirm', passwordRecoverSuccess: '/auth/password-recover/:id/:token', - temporary: '/platform', - Profile: '/profile', + profile: '/profile', + profileEdit: '/profile-edit', + tournaments: '/tournaments', + specificTeam: '/team/:id', + noTeam: '/team', + allTeams: '/teams', + createTeam: '/teams/create', }) export default ROUTES diff --git a/client/src/constants/teamFormData.js b/client/src/constants/teamFormData.js index 375bbcf8b..83d15f026 100644 --- a/client/src/constants/teamFormData.js +++ b/client/src/constants/teamFormData.js @@ -1,9 +1,9 @@ -import blueAvatar from '../assets/defaultAvatars/team/default-blue.png' -import greenAvatar from '../assets/defaultAvatars/team/default-green.png' -import orangeAvatar from '../assets/defaultAvatars/team/default-orange.png' -import pinkAvatar from '../assets/defaultAvatars/team/default-pink.png' -import purpleAvatar from '../assets/defaultAvatars/team/default-purple.png' -import yellowAvatar from '../assets/defaultAvatars/team/default-yellow.png' +import blueAvatar from '../assets/DefaultAvatars/team/default-blue.png' +import greenAvatar from '../assets/DefaultAvatars/team/default-green.png' +import orangeAvatar from '../assets/DefaultAvatars/team/default-orange.png' +import pinkAvatar from '../assets/DefaultAvatars/team/default-pink.png' +import purpleAvatar from '../assets/DefaultAvatars/team/default-purple.png' +import yellowAvatar from '../assets/DefaultAvatars/team/default-yellow.png' export const teamTypes = [ { diff --git a/client/src/fonts/FontsFree-Net-Noir_regular.woff b/client/src/fonts/FontsFree-Net-Noir_regular.woff deleted file mode 100644 index 2d111784356180a6009ec90ef3688be9d8c0620a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8656 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 Aw*UYD diff --git a/client/src/index.js b/client/src/index.js index 15f641239..a702b570d 100644 --- a/client/src/index.js +++ b/client/src/index.js @@ -4,44 +4,25 @@ import ReactDOM from 'react-dom/client' import { QueryClient, QueryClientProvider } from 'react-query' // * Redux import { Provider } from 'react-redux' -import { createGlobalStyle } from 'styled-components' +import { ThemeProvider } from 'styled-components' +import { GlobalStyle } from './shared/styles/Global.styles' import { setupStore } from './store/store' // * Components import App from './App' -const GlobalStyle = createGlobalStyle` - - @font-face { - font-family: NoirPro-Regular; - src: local('NoirPro-Regular'), url(./fonts/FontsFree-Net-Noir_regular.woff) format('woff'); - font-display: swap; - } - - *, - *::before, - *::after { - margin: 0; - padding: 0; - box-sizing: border-box; - font-family: "Montserrat" !important; - - } - - ul{ - list-style-type: none; - } -` const store = setupStore() const queryClient = new QueryClient() const root = ReactDOM.createRoot(document.getElementById('root')) root.render( - - - - - - , + + + + + + + + , ) diff --git a/client/src/routes/routes.js b/client/src/routes/routes.js index dcf181f07..8d5156728 100644 --- a/client/src/routes/routes.js +++ b/client/src/routes/routes.js @@ -10,25 +10,23 @@ import ROUTES from '../constants/routes' // * Layouts import AuthLayout from '../layouts/AuthLayout/AuthLayout' import NavBarItemPageLayout from '../layouts/NavBarItemPageLayout/NavBarItemPageLayout' +import Screen404 from '../screens/404Screen/404Screen' // * Screens -import Confirmation from '../screens/Confirmation/Confirmation' -import CreateTeam from '../screens/CreateTeam/CreateTeam' -import FinishRegistration from '../screens/FinishRegistration/FinishRegistration' -import Form404 from '../screens/Form404/Form404' -import LeaderboardScreen from '../screens/LeaderboardScreen/LeaderboardScreen' +import ConfirmationScreen from '../screens/ConfirmationScreen/ConfirmationScreen' +import CreateTeamScreen from '../screens/CreateTeamScreen/CreateTeamScreen' +import FinishRegistrationScreen from '../screens/FinishRegistrationScreen/FinishRegistrationScreen' import LoaderScreen from '../screens/LoaderScreen/LoaderScreen' -import Login from '../screens/Login/Login' +import LoginScreen from '../screens/LoginScreen/LoginScreen' import NoTeamScreen from '../screens/NoTeamScreen/NoTeamScreen' -import ProfilePage from '../screens/Profile/Profile' -import Registration from '../screens/Registration/Registration' -import ResetNewPasswords from '../screens/ResetNewPasswords/ResetNewPasswords' -import ResetPassword from '../screens/ResetPassword/ResetPassword' -import ResetPasswordConfirmation from '../screens/ResetPasswordConfirmation/ResetPasswordConfirmation' +import ProfileScreen from '../screens/ProfileScreen/ProfileScreen' +import RegistrationScreen from '../screens/RegistrationScreen/RegistrationScreen' +import ResetNewPasswordsScreen from '../screens/ResetNewPasswordsScreen/ResetNewPasswordsScreen' +import ResetPasswordConfirmationScreen from '../screens/ResetPasswordConfirmationScreen/ResetPasswordConfirmationScreen' +import ResetPasswordScreen from '../screens/ResetPasswordScreen/ResetPasswordScreen' import TeammatesScreen from '../screens/TeammatesScreen/TeammatesScreen' import TeamScreen from '../screens/TeamScreen/TeamScreen' import TeamsScreen from '../screens/TeamsScreen/TeamsScreen' -import TournamentInfo from '../screens/TournamentInfo/TournamentInfo' -import Tournaments from '../screens/Tournaments/Tournaments' +import TournamentsScreen from '../screens/TournamentsScreen/Tournaments' // * Protected import ProtectFinishRegistration from './protected/ProtectFinishRegistration' @@ -38,47 +36,45 @@ export const useRoutes = () => { {/* // * for authenticated user */} }> - } /> + } /> + - + } /> + - + } /> - } /> - } /> - } /> - } /> + } /> + } /> + } /> + } /> }> - } /> + } /> - } /> - } /> - } /> - } /> + } /> + } /> {/* // * for not authenticated user */} }> - } /> - } /> + } /> + } /> - } /> - } /> - } /> - } /> + } /> + } /> + } /> + } /> - } /> + } /> ) } diff --git a/client/src/screens/Form404/Form404.js b/client/src/screens/404Screen/404Screen.js similarity index 82% rename from client/src/screens/Form404/Form404.js rename to client/src/screens/404Screen/404Screen.js index b3d3450d6..0a5139838 100644 --- a/client/src/screens/Form404/Form404.js +++ b/client/src/screens/404Screen/404Screen.js @@ -3,7 +3,7 @@ import CssBaseline from '@mui/material/CssBaseline' import Page404Form from '../../components/Forms/Page404Form/Page404Form' -function Page404() { +function Screen404() { return ( <> @@ -12,4 +12,4 @@ function Page404() { ) } -export default Page404 +export default Screen404 diff --git a/client/src/screens/Confirmation/Confirmation.js b/client/src/screens/ConfirmationScreen/ConfirmationScreen.js similarity index 78% rename from client/src/screens/Confirmation/Confirmation.js rename to client/src/screens/ConfirmationScreen/ConfirmationScreen.js index aeb759928..e8569f527 100644 --- a/client/src/screens/Confirmation/Confirmation.js +++ b/client/src/screens/ConfirmationScreen/ConfirmationScreen.js @@ -3,7 +3,7 @@ import CssBaseline from '@mui/material/CssBaseline' import ConfirmEmail from '../../components/Forms/ConfirmEmailForm/ConfirmEmail' -function Confirmation() { +function ConfirmationScreen() { return ( <> @@ -12,4 +12,4 @@ function Confirmation() { ) } -export default Confirmation +export default ConfirmationScreen diff --git a/client/src/screens/CreateTeam/CreateTeam.js b/client/src/screens/CreateTeam/CreateTeam.js deleted file mode 100644 index 558a16096..000000000 --- a/client/src/screens/CreateTeam/CreateTeam.js +++ /dev/null @@ -1,32 +0,0 @@ -// * Modules -import { styled } from '@mui/material' -import CssBaseline from '@mui/material/CssBaseline' -import { SnackbarProvider } from 'notistack' - -import CreateTeamForm from '../../components/Forms/CreateTeamForm/CreateTeamForm' - -const SnackbarStyled = styled(SnackbarProvider)` - &.SnackbarItem-contentRoot { - background-color: #cf625e; - } -` - -function CreateTeam() { - return ( - <> - - - - - - ) -} - -export default CreateTeam diff --git a/client/src/screens/CreateTeamScreen/CreateTeamScreen.js b/client/src/screens/CreateTeamScreen/CreateTeamScreen.js new file mode 100644 index 000000000..d38631722 --- /dev/null +++ b/client/src/screens/CreateTeamScreen/CreateTeamScreen.js @@ -0,0 +1,15 @@ +// * Modules +import CssBaseline from '@mui/material/CssBaseline' + +import CreateTeamForm from '../../components/Forms/CreateTeamForm/CreateTeamForm' + +function CreateTeamScreen() { + return ( + <> + + + + ) +} + +export default CreateTeamScreen diff --git a/client/src/screens/FinishRegistration/FinishRegistration.js b/client/src/screens/FinishRegistrationScreen/FinishRegistrationScreen.js similarity index 75% rename from client/src/screens/FinishRegistration/FinishRegistration.js rename to client/src/screens/FinishRegistrationScreen/FinishRegistrationScreen.js index d423775b2..6ac47bcfc 100644 --- a/client/src/screens/FinishRegistration/FinishRegistration.js +++ b/client/src/screens/FinishRegistrationScreen/FinishRegistrationScreen.js @@ -3,7 +3,7 @@ import CssBaseline from '@mui/material/CssBaseline' import ConfirmRegistration from '../../components/Forms/RegistrationPipeline' -function FinishRegistration() { +function FinishRegistrationScreen() { return ( <> @@ -12,4 +12,4 @@ function FinishRegistration() { ) } -export default FinishRegistration +export default FinishRegistrationScreen diff --git a/client/src/screens/LeaderboardScreen/LeaderboardScreen.js b/client/src/screens/LeaderboardScreen/LeaderboardScreen.js deleted file mode 100644 index c6acb796e..000000000 --- a/client/src/screens/LeaderboardScreen/LeaderboardScreen.js +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react' -import CssBaseline from '@mui/material/CssBaseline' - -import Leaderboard from '../../components/Forms/Leaderboard/Leaderboard' - -function LeaderboardScreen() { - return ( - <> - - - - ) -} - -export default LeaderboardScreen diff --git a/client/src/screens/Login/Login.js b/client/src/screens/LoginScreen/LoginScreen.js similarity index 55% rename from client/src/screens/Login/Login.js rename to client/src/screens/LoginScreen/LoginScreen.js index 184e9e26b..7a123c81c 100644 --- a/client/src/screens/Login/Login.js +++ b/client/src/screens/LoginScreen/LoginScreen.js @@ -1,13 +1,15 @@ import React from 'react' +import { CssBaseline } from '@mui/material' import LoginForm from '../../components/Forms/LoginForm/LoginForm' -function Login() { +function LoginScreen() { return ( <> + ) } -export default Login +export default LoginScreen diff --git a/client/src/screens/Profile/Profile.js b/client/src/screens/ProfileScreen/ProfileScreen.js similarity index 77% rename from client/src/screens/Profile/Profile.js rename to client/src/screens/ProfileScreen/ProfileScreen.js index 76cf1709a..82a74f988 100644 --- a/client/src/screens/Profile/Profile.js +++ b/client/src/screens/ProfileScreen/ProfileScreen.js @@ -3,7 +3,7 @@ import CssBaseline from '@mui/material/CssBaseline' import { Cards } from '../../components/Profile/Profile.styles' -function ProfilePage({ children }) { +function ProfileScreen({ children }) { return ( <> @@ -12,4 +12,4 @@ function ProfilePage({ children }) { ) } -export default ProfilePage +export default ProfileScreen diff --git a/client/src/screens/Registration/Registration.js b/client/src/screens/RegistrationScreen/RegistrationScreen.js similarity index 57% rename from client/src/screens/Registration/Registration.js rename to client/src/screens/RegistrationScreen/RegistrationScreen.js index 82c92a075..06815045a 100644 --- a/client/src/screens/Registration/Registration.js +++ b/client/src/screens/RegistrationScreen/RegistrationScreen.js @@ -1,13 +1,15 @@ import React from 'react' +import { CssBaseline } from '@mui/material' import RegistrationForm from '../../components/Forms/RegistrationForm/RegistrationForm' -function Registration() { +function RegistrationScreen() { return ( <> + ) } -export default Registration +export default RegistrationScreen diff --git a/client/src/screens/ResetNewPasswords/ResetNewPasswords.js b/client/src/screens/ResetNewPasswordsScreen/ResetNewPasswordsScreen.js similarity index 76% rename from client/src/screens/ResetNewPasswords/ResetNewPasswords.js rename to client/src/screens/ResetNewPasswordsScreen/ResetNewPasswordsScreen.js index 3a2e7b3b3..73637c2b0 100644 --- a/client/src/screens/ResetNewPasswords/ResetNewPasswords.js +++ b/client/src/screens/ResetNewPasswordsScreen/ResetNewPasswordsScreen.js @@ -3,7 +3,7 @@ import CssBaseline from '@mui/material/CssBaseline' import ResetNewPasswordsForm from '../../components/Forms/NewPasswords/NewPasswords' -function ResetNewPasswords() { +function ResetNewPasswordsScreen() { return ( <> @@ -12,4 +12,4 @@ function ResetNewPasswords() { ) } -export default ResetNewPasswords +export default ResetNewPasswordsScreen diff --git a/client/src/screens/ResetPasswordConfirmation/ResetPasswordConfirmation.js b/client/src/screens/ResetPasswordConfirmationScreen/ResetPasswordConfirmationScreen.js similarity index 74% rename from client/src/screens/ResetPasswordConfirmation/ResetPasswordConfirmation.js rename to client/src/screens/ResetPasswordConfirmationScreen/ResetPasswordConfirmationScreen.js index 4a6a6fe8d..7b8122894 100644 --- a/client/src/screens/ResetPasswordConfirmation/ResetPasswordConfirmation.js +++ b/client/src/screens/ResetPasswordConfirmationScreen/ResetPasswordConfirmationScreen.js @@ -3,7 +3,7 @@ import CssBaseline from '@mui/material/CssBaseline' import ResetFormConfirmation from '../../components/Forms/RecoverConfirmation/RecoverConfirmation' -function ResetPasswordConfirmation() { +function ResetPasswordConfirmationScreen() { return ( <> @@ -12,4 +12,4 @@ function ResetPasswordConfirmation() { ) } -export default ResetPasswordConfirmation +export default ResetPasswordConfirmationScreen diff --git a/client/src/screens/ResetPassword/ResetPassword.js b/client/src/screens/ResetPasswordScreen/ResetPasswordScreen.js similarity index 77% rename from client/src/screens/ResetPassword/ResetPassword.js rename to client/src/screens/ResetPasswordScreen/ResetPasswordScreen.js index adf70ad34..9814ba31f 100644 --- a/client/src/screens/ResetPassword/ResetPassword.js +++ b/client/src/screens/ResetPasswordScreen/ResetPasswordScreen.js @@ -3,7 +3,7 @@ import CssBaseline from '@mui/material/CssBaseline' import ResetForm from '../../components/Forms/RecoverPassword/RecoverPassword' -function ResetPassword() { +function ResetPasswordScreen() { return ( <> @@ -12,4 +12,4 @@ function ResetPassword() { ) } -export default ResetPassword +export default ResetPasswordScreen diff --git a/client/src/screens/TeamsScreen/TeamsScreen.js b/client/src/screens/TeamsScreen/TeamsScreen.js index 10365092b..6db21bfff 100644 --- a/client/src/screens/TeamsScreen/TeamsScreen.js +++ b/client/src/screens/TeamsScreen/TeamsScreen.js @@ -1,29 +1,12 @@ -import { styled } from '@mui/material' import CssBaseline from '@mui/material/CssBaseline' -import { SnackbarProvider } from 'notistack' import TeamsList from '../../components/Forms/TeamsList/TeamsList' function TeamsScreen() { - const SnackbarStyled = styled(SnackbarProvider)` - &.SnackbarItem-contentRoot { - background-color: #cf625e; - } - ` - return ( <> - - - - + + ) } diff --git a/client/src/screens/TournamentCodingScreen/TournamentCodingScreen.js b/client/src/screens/TournamentCodingScreen/TournamentCodingScreen.js deleted file mode 100644 index 9ff259b36..000000000 --- a/client/src/screens/TournamentCodingScreen/TournamentCodingScreen.js +++ /dev/null @@ -1,14 +0,0 @@ -import CssBaseline from '@mui/material/CssBaseline' - -import CodingForm from '../../components/Forms/CodingForm/CodingForm' - -function TournamentCodingScreen() { - return ( - <> - - - - ) -} - -export default TournamentCodingScreen diff --git a/client/src/screens/TournamentInfo/TournamentInfo.js b/client/src/screens/TournamentInfo/TournamentInfo.js deleted file mode 100644 index 11c858edb..000000000 --- a/client/src/screens/TournamentInfo/TournamentInfo.js +++ /dev/null @@ -1,32 +0,0 @@ -import React from 'react' -import { styled } from '@mui/material' -import CssBaseline from '@mui/material/CssBaseline' -import { SnackbarProvider } from 'notistack' - -import TournamentInfo from '../../components/Forms/TournamentInfo/TournamentInfo' - -function TournamentScreen() { - const SnackbarStyled = styled(SnackbarProvider)` - &.SnackbarItem-contentRoot { - background-color: #cf625e; - } - ` - - return ( - <> - - - - - - ) -} - -export default TournamentScreen diff --git a/client/src/screens/Tournaments/Tournaments.js b/client/src/screens/TournamentsScreen/Tournaments.js similarity index 100% rename from client/src/screens/Tournaments/Tournaments.js rename to client/src/screens/TournamentsScreen/Tournaments.js diff --git a/client/src/shared/styles/Global.styles.js b/client/src/shared/styles/Global.styles.js new file mode 100644 index 000000000..39aa00b41 --- /dev/null +++ b/client/src/shared/styles/Global.styles.js @@ -0,0 +1,37 @@ +import { createGlobalStyle } from 'styled-components' + +export const GlobalStyle = createGlobalStyle` + *, + *::before, + *::after { + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Rubik', sans-serif !important; + } + + body { + background: #26292B !important; + overflow-y: scroll; + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* Internet Explorer 10+ */ + ::-webkit-scrollbar { /* WebKit */ + transition: all 0.2s; + width: ${(props) => (props.theme.scrollbar ? `5px` : '0')}; + height: ${(props) => (props.theme.scrollbar ? `auto` : '0')}; + } + ::-webkit-scrollbar-track { + background: transparent; + } + + ::-webkit-scrollbar-thumb { + background-color: + ${(props) => (props.theme.scrollbar ? `#5D9D0B;` : '#000000')}; + border-radius: 10px; + } + } + + ul{ + list-style-type: none; + } +` From 436f880b2cd7b87481f8f726cb98d2b9dbee76eb Mon Sep 17 00:00:00 2001 From: Nikita Mashchenko Date: Mon, 15 May 2023 23:05:38 -0500 Subject: [PATCH 03/15] Fixes part3 --- client/src/App.js | 2 + client/src/api/hooks/auth/useCheckAuth.js | 4 +- .../src/api/hooks/auth/useEditUserDetails.js | 9 +--- client/src/api/hooks/auth/useLoginUser.js | 3 +- client/src/api/hooks/auth/useLogoutUser.js | 4 +- client/src/api/hooks/auth/useRegister.js | 3 +- client/src/api/hooks/auth/useUpdateAvatar.js | 6 +-- .../src/api/hooks/auth/useValidateUsername.js | 5 +- client/src/api/hooks/team/useCreateTeam.js | 7 --- .../src/api/hooks/team/useTeamMembership.js | 5 +- .../Forms/CreateTeamForm/CreateTeamForm.js | 27 ++++------ .../components/Forms/LoginForm/LoginForm.js | 9 ---- .../components/InitialPart/InitialPart.jsx | 1 - .../InitialPart/InitialPart.styles.js | 2 +- .../components/NavLogo/Hover.js | 10 +++- .../components/ProgressBar/ProgressBar.js | 24 --------- .../ProgressBar/ProgressBar.styles.js | 50 ------------------- .../src/components/Forms/TeamForm/TeamForm.js | 3 +- .../components/Forms/TeamsList/TeamsList.js | 1 - client/src/components/SnackBar/SnackBar.js | 29 ----------- .../components/SnackBar/SnackBar.styles.js | 16 ------ client/src/layouts/AuthLayout/AuthLayout.jsx | 16 ------ client/src/screens/TeamScreen/TeamScreen.js | 21 +------- .../components/Toasters/Error.toaster.js | 24 +++++++++ 24 files changed, 67 insertions(+), 214 deletions(-) delete mode 100644 client/src/components/Forms/RegistrationPipeline/components/ProgressBar/ProgressBar.js delete mode 100644 client/src/components/Forms/RegistrationPipeline/components/ProgressBar/ProgressBar.styles.js delete mode 100644 client/src/components/SnackBar/SnackBar.js delete mode 100644 client/src/components/SnackBar/SnackBar.styles.js create mode 100644 client/src/shared/components/Toasters/Error.toaster.js diff --git a/client/src/App.js b/client/src/App.js index db3b25290..55ee4c24a 100644 --- a/client/src/App.js +++ b/client/src/App.js @@ -1,5 +1,6 @@ // * Routes // * Modules +import { Toaster } from 'react-hot-toast' import { BrowserRouter as Router } from 'react-router-dom' import { GoogleOAuthProvider } from '@react-oauth/google' @@ -11,6 +12,7 @@ function App() { return ( <> + {routes} diff --git a/client/src/api/hooks/auth/useCheckAuth.js b/client/src/api/hooks/auth/useCheckAuth.js index 7860641f3..5a2dfd5b7 100644 --- a/client/src/api/hooks/auth/useCheckAuth.js +++ b/client/src/api/hooks/auth/useCheckAuth.js @@ -3,6 +3,7 @@ import { useQuery } from 'react-query' import { useDispatch } from 'react-redux' import http from '../../../http' +import { errorToaster } from '../../../shared/components/Toasters/Error.toaster' import { userAuth } from '../../../store/reducers/UserAuth' const { api } = http @@ -22,7 +23,8 @@ export const useCheckAuth = () => { } }, onError: (error) => { - dispatch(userAuth.actions.authUserError(error.response?.data?.message)) + // set error message + errorToaster(error) }, refetchOnMount: false, refetchOnWindowFocus: false, diff --git a/client/src/api/hooks/auth/useEditUserDetails.js b/client/src/api/hooks/auth/useEditUserDetails.js index 4513e2949..e2912c4d6 100644 --- a/client/src/api/hooks/auth/useEditUserDetails.js +++ b/client/src/api/hooks/auth/useEditUserDetails.js @@ -1,16 +1,11 @@ -import React from 'react' import { useMutation, useQueryClient } from 'react-query' -import { useDispatch } from 'react-redux' import http from '../../../http' -import { registrationAuth } from '../../../store/reducers/RegistrationAuth' - -import { useUpdateAvatar } from './useUpdateAvatar' +import { errorToaster } from '../../../shared/components/Toasters/Error.toaster' const { api } = http export const useEditUserDetails = (successHandler) => { - const dispatch = useDispatch() const queryClient = useQueryClient() const finishRegistration = async (userData) => { @@ -25,7 +20,7 @@ export const useEditUserDetails = (successHandler) => { }, onError: (error) => { // set error message - dispatch(registrationAuth.actions.finishRegistrationError(error.response?.data?.message)) + errorToaster(error) }, }) } diff --git a/client/src/api/hooks/auth/useLoginUser.js b/client/src/api/hooks/auth/useLoginUser.js index bbbfadf41..61f50d4be 100644 --- a/client/src/api/hooks/auth/useLoginUser.js +++ b/client/src/api/hooks/auth/useLoginUser.js @@ -5,6 +5,7 @@ import { useNavigate } from 'react-router-dom' import ROUTES from '../../../constants/routes' import http from '../../../http' +import { errorToaster } from '../../../shared/components/Toasters/Error.toaster' import { setIsFinishRegistrationStarted } from '../../../store/reducers/RegistrationAuth' import { userAuth } from '../../../store/reducers/UserAuth' @@ -45,7 +46,7 @@ export const useLoginUser = (type) => { }, onError: (error) => { // set error message - dispatch(userAuth.actions.authUserError(error.response?.data?.message)) + errorToaster(error) }, }) } diff --git a/client/src/api/hooks/auth/useLogoutUser.js b/client/src/api/hooks/auth/useLogoutUser.js index eece30a0c..20283241a 100644 --- a/client/src/api/hooks/auth/useLogoutUser.js +++ b/client/src/api/hooks/auth/useLogoutUser.js @@ -1,8 +1,8 @@ -import React from 'react' import { useMutation, useQueryClient } from 'react-query' import { useDispatch } from 'react-redux' import http from '../../../http' +import { errorToaster } from '../../../shared/components/Toasters/Error.toaster' import { userAuth } from '../../../store/reducers/UserAuth' const { api } = http @@ -33,7 +33,7 @@ export const useLogoutUser = () => { }, onError: (error) => { // set error message - dispatch(userAuth.actions.authUserError(error.response?.data?.message)) + errorToaster(error) }, }) } diff --git a/client/src/api/hooks/auth/useRegister.js b/client/src/api/hooks/auth/useRegister.js index 9dde53eb4..290704919 100644 --- a/client/src/api/hooks/auth/useRegister.js +++ b/client/src/api/hooks/auth/useRegister.js @@ -5,6 +5,7 @@ import { useNavigate } from 'react-router-dom' import ROUTES from '../../../constants/routes' import http from '../../../http' +import { errorToaster } from '../../../shared/components/Toasters/Error.toaster' import { userAuth } from '../../../store/reducers/UserAuth' const { api } = http @@ -30,7 +31,7 @@ export const useRegister = () => { }, onError: (error) => { // set error message - dispatch(userAuth.actions.authUserError(error.response?.data?.message)) + errorToaster(error) }, }) } diff --git a/client/src/api/hooks/auth/useUpdateAvatar.js b/client/src/api/hooks/auth/useUpdateAvatar.js index 20d45af9e..1c76aae20 100644 --- a/client/src/api/hooks/auth/useUpdateAvatar.js +++ b/client/src/api/hooks/auth/useUpdateAvatar.js @@ -1,14 +1,12 @@ -import React from 'react' import { useMutation, useQueryClient } from 'react-query' import { useDispatch } from 'react-redux' import http from '../../../http' -import { registrationAuth } from '../../../store/reducers/RegistrationAuth' +import { errorToaster } from '../../../shared/components/Toasters/Error.toaster' const { api } = http export const useUpdateAvatar = (type) => { - const dispatch = useDispatch() const queryClient = useQueryClient() const updateUserAvatar = async (userData) => { @@ -22,7 +20,7 @@ export const useUpdateAvatar = (type) => { }, onError: (error) => { // set error message - dispatch(registrationAuth.actions.finishRegistrationError(error.response?.data?.message)) + errorToaster(error) }, }) } diff --git a/client/src/api/hooks/auth/useValidateUsername.js b/client/src/api/hooks/auth/useValidateUsername.js index f219439b5..608935dea 100644 --- a/client/src/api/hooks/auth/useValidateUsername.js +++ b/client/src/api/hooks/auth/useValidateUsername.js @@ -1,8 +1,8 @@ -import React from 'react' import { useQuery } from 'react-query' import { useDispatch } from 'react-redux' import http from '../../../http' +import { errorToaster } from '../../../shared/components/Toasters/Error.toaster' import { finishRegistrationError, setActiveState, @@ -25,7 +25,8 @@ export const useValidateUsername = (username, email) => { dispatch(setStageOneCompleted(true)) }, onError: (error) => { - dispatch(finishRegistrationError(error.response?.data?.message)) + // set error message + errorToaster(error) }, enabled: false, }) diff --git a/client/src/api/hooks/team/useCreateTeam.js b/client/src/api/hooks/team/useCreateTeam.js index 1cc65f43b..ad318db7a 100644 --- a/client/src/api/hooks/team/useCreateTeam.js +++ b/client/src/api/hooks/team/useCreateTeam.js @@ -1,4 +1,3 @@ -import toast from 'react-hot-toast' import { useMutation, useQueryClient } from 'react-query' import { useNavigate } from 'react-router-dom' @@ -10,7 +9,6 @@ const { api } = http export const useCreateTeam = (teamAvatar) => { const queryClient = useQueryClient() const { mutate: updateAvatar } = useUpdateAvatar('teams') - // const notify = (err) => toast.error(err, { id: 'error' }) const navigate = useNavigate() const createTeam = async (details) => { @@ -28,10 +26,5 @@ export const useCreateTeam = (teamAvatar) => { await queryClient.invalidateQueries('checkAuth', { refetchInactive: true }) navigate(`/team/${data._id}`) }, - onError: (error) => { - console.log(error) - // TODO: fix this - // notify(error?.response?.data[0]) - }, }) } diff --git a/client/src/api/hooks/team/useTeamMembership.js b/client/src/api/hooks/team/useTeamMembership.js index 3d9584213..e797be406 100644 --- a/client/src/api/hooks/team/useTeamMembership.js +++ b/client/src/api/hooks/team/useTeamMembership.js @@ -1,13 +1,12 @@ -import toast from 'react-hot-toast' import { useMutation, useQueryClient } from 'react-query' import http from '../../../http' +import { errorToaster } from '../../../shared/components/Toasters/Error.toaster' const { api } = http export const useTeamMembership = (action) => { const queryClient = useQueryClient() - const notify = (err) => toast.error(err, { id: 'error' }) const toggleMembership = async (details) => { return await api.put(`/teams/${action}`, { @@ -24,7 +23,7 @@ export const useTeamMembership = (action) => { return result.data }, onError: (error) => { - notify(error?.response?.data?.message) + errorToaster(error) }, }) } diff --git a/client/src/components/Forms/CreateTeamForm/CreateTeamForm.js b/client/src/components/Forms/CreateTeamForm/CreateTeamForm.js index 46cf11abc..d64d0dc05 100644 --- a/client/src/components/Forms/CreateTeamForm/CreateTeamForm.js +++ b/client/src/components/Forms/CreateTeamForm/CreateTeamForm.js @@ -1,9 +1,5 @@ // * Modules import React, { useState } from 'react' -import { Toaster } from 'react-hot-toast' -import { useDispatch } from 'react-redux' -// * Redux -import { useNavigate } from 'react-router-dom' // API import { useCheckAuth } from '../../../api/hooks/auth/useCheckAuth' @@ -12,20 +8,19 @@ import { defaultTeamAvatars } from '../../../constants/teamFormData' // * Assets import { createTeamValidation } from '../../../schemas' import Loader from '../../../shared/components/Loader/Loader' -import { setIsModalOpen } from '../../../store/reducers/Shared' +import { errorToaster } from '../../../shared/components/Toasters/Error.toaster' import MultiStepRegistration from '../RegistrationPipeline/components/MultiStepRegistration/MultiStepRegistration' import AvatarForm from '../RegistrationPipeline/components/RegistrationForms/AvatarForm/AvatarForm' import InfoForm from '../RegistrationPipeline/components/RegistrationForms/InfoForm' function CreateTeamForm() { - const navigate = useNavigate() - const dispatch = useDispatch() - - const [teamName, setTeamName] = useState('') const [teamAvatar, setTeamAvatar] = useState(null) - - const [country, setCountry] = useState('') - const { mutate: createTeam, isLoading: isCreatingTeam } = useCreateTeam(teamAvatar) + const { + mutate: createTeam, + isLoading: isCreatingTeam, + isError: isCreatingTeamError, + error, + } = useCreateTeam(teamAvatar) const { data: user, isLoading: isUserLoading } = useCheckAuth() const userId = user?._id const steps = [ @@ -66,24 +61,24 @@ function CreateTeamForm() { members: formData.members, } - await setTeamAvatar(formData.file) + setTeamAvatar(formData.file) createTeam(teamData) } - if (isUserLoading || isCreatingTeam) { - return + if (isCreatingTeamError && !isCreatingTeam) { + errorToaster(error) } return ( <> + {(isUserLoading || isCreatingTeam) && } - {/* {!isCreatingTeam && !isUserLoading && } */} ) } diff --git a/client/src/components/Forms/LoginForm/LoginForm.js b/client/src/components/Forms/LoginForm/LoginForm.js index e028d9c97..2c82cfc93 100644 --- a/client/src/components/Forms/LoginForm/LoginForm.js +++ b/client/src/components/Forms/LoginForm/LoginForm.js @@ -1,18 +1,12 @@ // * Modules import React, { useEffect, useState } from 'react' -// * Api // * Redux import { useSelector } from 'react-redux' import Visibility from '@mui/icons-material/Visibility' import VisibilityOff from '@mui/icons-material/VisibilityOff' -import isEqual from 'lodash/isEqual' import { useLoginUser } from '../../../api/hooks/auth/useLoginUser' import Loader from '../../../shared/components/Loader/Loader' -// * Constants -// * Assets -import SnackBar from '../../SnackBar/SnackBar' -// * Helpers import SocialLoginRegistration from '../SocialLoginRegistration/SocialLoginRegistration' import { @@ -20,7 +14,6 @@ import { EmailPasswordContainer, LeftScreenContainer, LoginButton, - LoginContainer, LoginInput, LoginLink, LoginSignUpContainer, @@ -33,8 +26,6 @@ import { } from './LoginForm.styles' function LoginForm() { - const { error } = useSelector((state) => state.userReducer) - const [showPassword, setShowPassword] = useState(false) const [password, setPassword] = useState('') const [inputEmail, setInputEmail] = useState('') diff --git a/client/src/components/Forms/RegistrationPipeline/components/InitialPart/InitialPart.jsx b/client/src/components/Forms/RegistrationPipeline/components/InitialPart/InitialPart.jsx index 874c8155a..0cdd58bd2 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/InitialPart/InitialPart.jsx +++ b/client/src/components/Forms/RegistrationPipeline/components/InitialPart/InitialPart.jsx @@ -43,7 +43,6 @@ function InitialPart() { return ( <> -
diff --git a/client/src/components/Forms/RegistrationPipeline/components/InitialPart/InitialPart.styles.js b/client/src/components/Forms/RegistrationPipeline/components/InitialPart/InitialPart.styles.js index fc429d38a..78c02d777 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/InitialPart/InitialPart.styles.js +++ b/client/src/components/Forms/RegistrationPipeline/components/InitialPart/InitialPart.styles.js @@ -21,7 +21,7 @@ export const Container = styled.div` gap: 50px; justify-content: center; align-items: center; - min-height: calc(100vh - 2.375rem); + min-height: 100vh; width: 100%; background: ${BLACK.background}; ` diff --git a/client/src/components/Forms/RegistrationPipeline/components/NavLogo/Hover.js b/client/src/components/Forms/RegistrationPipeline/components/NavLogo/Hover.js index 0a858fcbd..dc5d2b5f6 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/NavLogo/Hover.js +++ b/client/src/components/Forms/RegistrationPipeline/components/NavLogo/Hover.js @@ -8,7 +8,12 @@ export default function Hover({ open, handlePopoverClose, anchorEl }) { id="mouse-over-popover" sx={{ pointerEvents: 'none', - marginTop: '3px', + marginTop: '5px', + borderRadius: '5px', + '& .MuiPopover-paper': { + background: '#2F3239', + color: 'white', + }, }} open={open} anchorEl={anchorEl} @@ -24,7 +29,8 @@ export default function Hover({ open, handlePopoverClose, anchorEl }) { disableRestoreFocus > - If you encounter any problems, email us at helpteameights@gmail.com + If you have any issues, please email +
us at helpteameights@gmail.com
diff --git a/client/src/components/Forms/RegistrationPipeline/components/ProgressBar/ProgressBar.js b/client/src/components/Forms/RegistrationPipeline/components/ProgressBar/ProgressBar.js deleted file mode 100644 index cd178408b..000000000 --- a/client/src/components/Forms/RegistrationPipeline/components/ProgressBar/ProgressBar.js +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react' - -import { ProgressBarContainer, ProgressDone } from './ProgressBar.styles' - -const ProgressBar = ({ done }) => { - const [style, setStyle] = React.useState({}) - - setTimeout(() => { - const newStyle = { - opacity: 1, - width: `${done}%`, - } - - setStyle(newStyle) - }, 200) - - return ( - - {done >= '10' ? done + '%' : ''} - - ) -} - -export default ProgressBar diff --git a/client/src/components/Forms/RegistrationPipeline/components/ProgressBar/ProgressBar.styles.js b/client/src/components/Forms/RegistrationPipeline/components/ProgressBar/ProgressBar.styles.js deleted file mode 100644 index 08266bcac..000000000 --- a/client/src/components/Forms/RegistrationPipeline/components/ProgressBar/ProgressBar.styles.js +++ /dev/null @@ -1,50 +0,0 @@ -import styled, { keyframes } from 'styled-components' - -import { device } from '../../../../../constants/breakpoints' - -const linearGradient = keyframes` - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -` - -export const ProgressBarContainer = styled.div` - display: flex; - background-color: #d8d8d8; - border-radius: 20px; - position: relative; - margin: 0px 0 15px 0; - height: 30px; - width: 500px; - - @media ${device.tablet} { - max-width: 415px; - } - - @media ${device.mobileL} { - max-width: 325px; - } -` - -export const ProgressDone = styled.div` - background: linear-gradient(13deg, #17b94b, #39a59d, #e0ff00, #5d5d5a); - box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.25); - background-size: 240% 240%; - animation: ${linearGradient} 10s ease infinite; - border-radius: 20px; - color: #fff; - font-weight: 600; - display: flex; - align-items: center; - justify-content: center; - height: 100%; - width: 0; - opacity: 0; - transition: 1s ease 0.3s; -` diff --git a/client/src/components/Forms/TeamForm/TeamForm.js b/client/src/components/Forms/TeamForm/TeamForm.js index b6a89b101..1083894f8 100644 --- a/client/src/components/Forms/TeamForm/TeamForm.js +++ b/client/src/components/Forms/TeamForm/TeamForm.js @@ -4,7 +4,6 @@ import React, { useState } from 'react' import { Navigate } from 'react-router-dom' import Box from '@mui/material/Box' import Modal from '@mui/material/Modal' -import { useSnackbar } from 'notistack' // * API import { useCheckAuth } from '../../../api/hooks/auth/useCheckAuth' @@ -50,7 +49,7 @@ function TeamForm() { const { mutate: deleteTeam, isLoading: isDeleting } = useDelete() const { mutate: leaveTeam } = useTeamMembership('leave') const { mutate: inviteUser, isLoading: isInviting } = useInviteUser(handleClose) - const { enqueueSnackbar } = useSnackbar() + const createDate = new Date(team?.createdAt) .toLocaleDateString({}, { timeZone: 'UTC', month: 'long', day: '2-digit', year: 'numeric' }) .replace(',', '') diff --git a/client/src/components/Forms/TeamsList/TeamsList.js b/client/src/components/Forms/TeamsList/TeamsList.js index dda0953ee..3ee0781f7 100644 --- a/client/src/components/Forms/TeamsList/TeamsList.js +++ b/client/src/components/Forms/TeamsList/TeamsList.js @@ -70,7 +70,6 @@ function TeamsList() { return ( <> - { - const Alert = React.forwardRef(function Alert(props, ref) { - return - }) - - return ( - - - {error} - - - ) -} - -export default SnackBar diff --git a/client/src/components/SnackBar/SnackBar.styles.js b/client/src/components/SnackBar/SnackBar.styles.js deleted file mode 100644 index 6d4c9c682..000000000 --- a/client/src/components/SnackBar/SnackBar.styles.js +++ /dev/null @@ -1,16 +0,0 @@ -import MuiAlert from '@mui/material/Alert' -import styled from 'styled-components' - -import { device } from '../../constants/breakpoints' -import { RED } from '../../constants/colors' - -export const AlertBox = styled(MuiAlert)` - && { - /* margin-top: 100px; */ - background: ${RED.alert}; - } - - @media ${device.tablet} { - max-width: 250px; - } -` diff --git a/client/src/layouts/AuthLayout/AuthLayout.jsx b/client/src/layouts/AuthLayout/AuthLayout.jsx index 7b8c6fdae..9ac9d46f7 100644 --- a/client/src/layouts/AuthLayout/AuthLayout.jsx +++ b/client/src/layouts/AuthLayout/AuthLayout.jsx @@ -5,7 +5,6 @@ import { Button } from '@mui/material' import CssBaseline from '@mui/material/CssBaseline' import CodingImage from '../../assets/CodingImage' -import SnackBar from '../../components/SnackBar/SnackBar' import { AuthContainer, @@ -20,25 +19,10 @@ import { const AuthLayout = () => { const navigate = useNavigate() const location = useLocation() - const { error } = useSelector((state) => state.userReducer) - const [open, setOpen] = useState(false) - const handleClose = (event, reason) => { - if (reason === 'clickaway') { - return - } - setOpen(false) - } - - useEffect(() => { - if (error) { - setOpen(true) - } - }, [error]) return ( <> - {error && }