diff --git a/client/package-lock.json b/client/package-lock.json index 679c5e918..1fc537cd2 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", @@ -1843,9 +1844,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", - "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -3523,11 +3524,11 @@ } }, "node_modules/@mui/utils": { - "version": "5.11.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.11.1.tgz", - "integrity": "sha512-lMAPgIJoil8V9ZxsMbEflMsvZmWcHbRVMc4JDY9jPO9V4welpF43h/O267b1RqlcRnC5MEbVQV605GYkTZY29Q==", + "version": "5.12.3", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.12.3.tgz", + "integrity": "sha512-D/Z4Ub3MRl7HiUccid7sQYclTr24TqUAQFFlxHQF8FR177BrCTQ0JJZom7EqYjZCdXhwnSkOj2ph685MSKNtIA==", "dependencies": { - "@babel/runtime": "^7.20.6", + "@babel/runtime": "^7.21.0", "@types/prop-types": "^15.7.5", "@types/react-is": "^16.7.1 || ^17.0.0", "prop-types": "^15.8.1", @@ -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", @@ -15403,9 +15427,9 @@ "integrity": "sha512-eRgXL613dVyJiE99yKDYLvSBKDxvIlhkmvO2DVIjdKVyUQq6kBqoMUV/2zuRIAsbRXgBGmKjeL1dxjf7zTfszg==" }, "node_modules/react-transition-group": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", - "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -19517,9 +19541,9 @@ } }, "@babel/runtime": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", - "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", "requires": { "regenerator-runtime": "^0.13.11" } @@ -20626,11 +20650,11 @@ "requires": {} }, "@mui/utils": { - "version": "5.11.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.11.1.tgz", - "integrity": "sha512-lMAPgIJoil8V9ZxsMbEflMsvZmWcHbRVMc4JDY9jPO9V4welpF43h/O267b1RqlcRnC5MEbVQV605GYkTZY29Q==", + "version": "5.12.3", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.12.3.tgz", + "integrity": "sha512-D/Z4Ub3MRl7HiUccid7sQYclTr24TqUAQFFlxHQF8FR177BrCTQ0JJZom7EqYjZCdXhwnSkOj2ph685MSKNtIA==", "requires": { - "@babel/runtime": "^7.20.6", + "@babel/runtime": "^7.21.0", "@types/prop-types": "^15.7.5", "@types/react-is": "^16.7.1 || ^17.0.0", "prop-types": "^15.8.1", @@ -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", @@ -29077,9 +29115,9 @@ "integrity": "sha512-eRgXL613dVyJiE99yKDYLvSBKDxvIlhkmvO2DVIjdKVyUQq6kBqoMUV/2zuRIAsbRXgBGmKjeL1dxjf7zTfszg==" }, "react-transition-group": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", - "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", "requires": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", 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/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..3dd99ada5 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) => { @@ -21,8 +19,9 @@ export const useUpdateAvatar = (type) => { queryClient.invalidateQueries('checkAuth', { refetchInactive: true }) }, onError: (error) => { + console.log(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..b96d27e68 100644 --- a/client/src/api/hooks/auth/useValidateUsername.js +++ b/client/src/api/hooks/auth/useValidateUsername.js @@ -1,32 +1,27 @@ -import React from 'react' -import { useQuery } from 'react-query' -import { useDispatch } from 'react-redux' +import { useMutation, useQuery, useQueryClient } from 'react-query' import http from '../../../http' -import { - finishRegistrationError, - setActiveState, - setStageOneCompleted, - setStep, -} from '../../../store/reducers/RegistrationAuth' +import { errorToaster } from '../../../shared/components/Toasters/Error.toaster' +import { successToaster } from '../../../shared/components/Toasters/Success.toaster' const { api } = http -export const useValidateUsername = (username, email) => { - const dispatch = useDispatch() - const validateUsername = async () => { - return await api.get('/check-username', { params: { username, email } }) +export const useValidateUsername = () => { + const queryClient = useQueryClient() + + const validateUsername = async (username) => { + return await api.get(`/users/get-by-username/${username}`) } - return useQuery('validateUsername', validateUsername, { - onSuccess: () => { - dispatch(setActiveState('UserConcentration')) - dispatch(setStep(2)) - dispatch(setStageOneCompleted(true)) - }, - onError: (error) => { - dispatch(finishRegistrationError(error.response?.data?.message)) + return useMutation(validateUsername, { + mutationKey: 'validateUsername', + onSuccess: async (response) => { + console.log(response) + if (response?.data) { + errorToaster('Username is already taken by another user, please change it!') + } else { + successToaster('Username is available!') + } }, - enabled: false, }) } 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..7adec8798 100644 --- a/client/src/api/hooks/team/useCreateTeam.js +++ b/client/src/api/hooks/team/useCreateTeam.js @@ -1,7 +1,9 @@ import { useMutation, useQueryClient } from 'react-query' +import { useDispatch } from 'react-redux' import { useNavigate } from 'react-router-dom' import http from '../../../http' +import { setIsFinishRegistrationStarted, setStep } from '../../../store/reducers/RegistrationAuth' import { useUpdateAvatar } from '../auth/useUpdateAvatar' const { api } = http @@ -9,6 +11,7 @@ const { api } = http export const useCreateTeam = (teamAvatar) => { const queryClient = useQueryClient() const { mutate: updateAvatar } = useUpdateAvatar('teams') + const dispatch = useDispatch() const navigate = useNavigate() const createTeam = async (details) => { @@ -24,7 +27,9 @@ export const useCreateTeam = (teamAvatar) => { updateAvatar({ teamID: data._id, image: teamAvatar.split(',')[1] }) } await queryClient.invalidateQueries('checkAuth', { refetchInactive: true }) - navigate('/myteam') + dispatch(setIsFinishRegistrationStarted(false)) + dispatch(setStep(1)) + navigate(`/team/${data._id}`) }, }) } diff --git a/client/src/api/hooks/team/useGetByTag.js b/client/src/api/hooks/team/useGetByTag.js new file mode 100644 index 000000000..f331eee7c --- /dev/null +++ b/client/src/api/hooks/team/useGetByTag.js @@ -0,0 +1,26 @@ +import { useMutation, useQueryClient } from 'react-query' + +import http from '../../../http' +import { errorToaster } from '../../../shared/components/Toasters/Error.toaster' +import { successToaster } from '../../../shared/components/Toasters/Success.toaster' + +const { api } = http + +export const useGetByTag = () => { + const queryClient = useQueryClient() + + const getTeamByTag = async (tag) => { + return await api.get(`/teams/tag/${tag}`) + } + + return useMutation(getTeamByTag, { + mutationKey: 'getTeamByTag', + onSuccess: async (response) => { + if (response?.data) { + errorToaster('TAG is already taken by another team, please change it!') + } else { + successToaster('Tag is available!') + } + }, + }) +} diff --git a/client/src/api/hooks/team/useInviteUser.js b/client/src/api/hooks/team/useInviteUser.js index ec19c324f..9c8415cb5 100644 --- a/client/src/api/hooks/team/useInviteUser.js +++ b/client/src/api/hooks/team/useInviteUser.js @@ -1,4 +1,3 @@ -import React from 'react' import { useMutation, useQueryClient } from 'react-query' import http from '../../../http' diff --git a/client/src/api/hooks/team/useTeamMembership.js b/client/src/api/hooks/team/useTeamMembership.js index e8a71e8a7..e797be406 100644 --- a/client/src/api/hooks/team/useTeamMembership.js +++ b/client/src/api/hooks/team/useTeamMembership.js @@ -1,7 +1,7 @@ -import React from 'react' import { useMutation, useQueryClient } from 'react-query' import http from '../../../http' +import { errorToaster } from '../../../shared/components/Toasters/Error.toaster' const { api } = http @@ -9,7 +9,7 @@ export const useTeamMembership = (action) => { const queryClient = useQueryClient() 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 +17,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) => { + errorToaster(error) }, }) } diff --git a/client/src/api/hooks/temeights/useDebounce.js b/client/src/api/hooks/temeights/useDebounce.js new file mode 100644 index 000000000..df4b7a7c8 --- /dev/null +++ b/client/src/api/hooks/temeights/useDebounce.js @@ -0,0 +1,26 @@ +import { useEffect, useState } from 'react' + +// Hook +export function useDebounce(value, delay) { + // State and setters for debounced value + const [debouncedValue, setDebouncedValue] = useState(value) + + useEffect( + () => { + // Update debounced value after delay + const handler = setTimeout(() => { + setDebouncedValue(value) + }, delay) + + // Cancel the timeout if value changes (also on delay change or unmount) + // This is how we prevent debounced value from updating if value is changed ... + // .. within the delay period. Timeout gets cleared and restarted. + return () => { + clearTimeout(handler) + } + }, + [value, delay], // Only re-call effect if value or delay changes + ) + + return debouncedValue +} diff --git a/client/src/api/hooks/temeights/useGetUserByUsername.js b/client/src/api/hooks/temeights/useGetUserByUsername.js new file mode 100644 index 000000000..b81dbfae0 --- /dev/null +++ b/client/src/api/hooks/temeights/useGetUserByUsername.js @@ -0,0 +1,26 @@ +import { useMutation } from 'react-query' + +import http from '../../../http' + +const { api } = http + +export const useGetUserByUsername = () => { + const useGetUserByUsername = async (username) => { + const response = await api.get(`/users/partial/${username}`) + + const responseArr = response.data + + const foundUsers = responseArr.map(({ username, image, _id, email }) => ({ + username, + image, + id: _id, + email, + })) + + return foundUsers + } + + return useMutation(useGetUserByUsername, { + mutationKey: 'useGetUserByUsername', + }) +} diff --git a/client/src/assets/ArrowLeftReset.js b/client/src/assets/Arrows/ArrowLeftReset.js similarity index 100% rename from client/src/assets/ArrowLeftReset.js rename to client/src/assets/Arrows/ArrowLeftReset.js diff --git a/client/src/assets/ComebackArrow.js b/client/src/assets/Arrows/ComebackArrow.js similarity index 100% rename from client/src/assets/ComebackArrow.js rename to client/src/assets/Arrows/ComebackArrow.js diff --git a/client/src/assets/AvatarEditIcon.jsx b/client/src/assets/Avatars/AvatarEditIcon.jsx similarity index 100% rename from client/src/assets/AvatarEditIcon.jsx rename to client/src/assets/Avatars/AvatarEditIcon.jsx diff --git a/client/src/assets/defaultAvatarSelectedIcon.svg b/client/src/assets/Avatars/defaultAvatarSelectedIcon.svg similarity index 100% rename from client/src/assets/defaultAvatarSelectedIcon.svg rename to client/src/assets/Avatars/defaultAvatarSelectedIcon.svg diff --git a/client/src/assets/uploadAvatarIcon.svg b/client/src/assets/Avatars/uploadAvatarIcon.svg similarity index 100% rename from client/src/assets/uploadAvatarIcon.svg rename to client/src/assets/Avatars/uploadAvatarIcon.svg diff --git a/client/src/assets/ChevronRight.jsx b/client/src/assets/ChevronRight.jsx deleted file mode 100644 index 2fc3323f6..000000000 --- a/client/src/assets/ChevronRight.jsx +++ /dev/null @@ -1,15 +0,0 @@ -function ChevronRight() { - return ( - - - - ) -} - -export default ChevronRight diff --git a/client/src/assets/EmailText.js b/client/src/assets/EmailText.js deleted file mode 100644 index 2e75b6eea..000000000 --- a/client/src/assets/EmailText.js +++ /dev/null @@ -1,31 +0,0 @@ -function EmailText() { - return ( - - - - - - - - - - ) -} - -export default EmailText diff --git a/client/src/assets/Exit.js b/client/src/assets/Exit.js deleted file mode 100644 index 91c7c67c4..000000000 --- a/client/src/assets/Exit.js +++ /dev/null @@ -1,34 +0,0 @@ -function Exit() { - return ( - - - - - - - - ) -} - -export default Exit diff --git a/client/src/assets/Filters.js b/client/src/assets/Filters/Filters.js similarity index 100% rename from client/src/assets/Filters.js rename to client/src/assets/Filters/Filters.js diff --git a/client/src/assets/SearchIcon.js b/client/src/assets/Filters/SearchIcon.js similarity index 100% rename from client/src/assets/SearchIcon.js rename to client/src/assets/Filters/SearchIcon.js diff --git a/client/src/assets/GitHub.js b/client/src/assets/GitHub.js deleted file mode 100644 index dda97353a..000000000 --- a/client/src/assets/GitHub.js +++ /dev/null @@ -1,23 +0,0 @@ -function GitHub() { - return ( - - - - - - - - - - - - ) -} - -export default GitHub diff --git a/client/src/assets/Google.js b/client/src/assets/Google.js deleted file mode 100644 index 74805dfd8..000000000 --- a/client/src/assets/Google.js +++ /dev/null @@ -1,25 +0,0 @@ -function Google() { - return ( - - - - - - - - ) -} - -export default Google diff --git a/client/src/assets/HollowNotificationBell.jsx b/client/src/assets/HollowNotificationBell.jsx deleted file mode 100644 index 450c3269f..000000000 --- a/client/src/assets/HollowNotificationBell.jsx +++ /dev/null @@ -1,22 +0,0 @@ -function HollowNotificationBell() { - return ( - - - - - ) -} - -export default HollowNotificationBell diff --git a/client/src/assets/defaultAvatars/team/default-blue.png b/client/src/assets/Images/team/default-blue.png similarity index 100% rename from client/src/assets/defaultAvatars/team/default-blue.png rename to client/src/assets/Images/team/default-blue.png diff --git a/client/src/assets/defaultAvatars/team/default-green.png b/client/src/assets/Images/team/default-green.png similarity index 100% rename from client/src/assets/defaultAvatars/team/default-green.png rename to client/src/assets/Images/team/default-green.png diff --git a/client/src/assets/defaultAvatars/team/default-orange.png b/client/src/assets/Images/team/default-orange.png similarity index 100% rename from client/src/assets/defaultAvatars/team/default-orange.png rename to client/src/assets/Images/team/default-orange.png diff --git a/client/src/assets/defaultAvatars/team/default-pink.png b/client/src/assets/Images/team/default-pink.png similarity index 100% rename from client/src/assets/defaultAvatars/team/default-pink.png rename to client/src/assets/Images/team/default-pink.png diff --git a/client/src/assets/defaultAvatars/team/default-purple.png b/client/src/assets/Images/team/default-purple.png similarity index 100% rename from client/src/assets/defaultAvatars/team/default-purple.png rename to client/src/assets/Images/team/default-purple.png diff --git a/client/src/assets/defaultAvatars/team/default-yellow.png b/client/src/assets/Images/team/default-yellow.png similarity index 100% rename from client/src/assets/defaultAvatars/team/default-yellow.png rename to client/src/assets/Images/team/default-yellow.png diff --git a/client/src/assets/defaultAvatars/user/default-blue.png b/client/src/assets/Images/user/default-blue.png similarity index 100% rename from client/src/assets/defaultAvatars/user/default-blue.png rename to client/src/assets/Images/user/default-blue.png diff --git a/client/src/assets/defaultAvatars/user/default-green.png b/client/src/assets/Images/user/default-green.png similarity index 100% rename from client/src/assets/defaultAvatars/user/default-green.png rename to client/src/assets/Images/user/default-green.png diff --git a/client/src/assets/defaultAvatars/user/default-orange.png b/client/src/assets/Images/user/default-orange.png similarity index 100% rename from client/src/assets/defaultAvatars/user/default-orange.png rename to client/src/assets/Images/user/default-orange.png diff --git a/client/src/assets/defaultAvatars/user/default-pink.png b/client/src/assets/Images/user/default-pink.png similarity index 100% rename from client/src/assets/defaultAvatars/user/default-pink.png rename to client/src/assets/Images/user/default-pink.png diff --git a/client/src/assets/defaultAvatars/user/default-purple.png b/client/src/assets/Images/user/default-purple.png similarity index 100% rename from client/src/assets/defaultAvatars/user/default-purple.png rename to client/src/assets/Images/user/default-purple.png diff --git a/client/src/assets/defaultAvatars/user/default-yellow.png b/client/src/assets/Images/user/default-yellow.png similarity index 100% rename from client/src/assets/defaultAvatars/user/default-yellow.png rename to client/src/assets/Images/user/default-yellow.png diff --git a/client/src/assets/Images/user/unregistered.png b/client/src/assets/Images/user/unregistered.png new file mode 100644 index 000000000..1430ddaa7 Binary files /dev/null and b/client/src/assets/Images/user/unregistered.png differ diff --git a/client/src/assets/Inputs/AlertIcon.js b/client/src/assets/Inputs/AlertIcon.js new file mode 100644 index 000000000..7d6290fe3 --- /dev/null +++ b/client/src/assets/Inputs/AlertIcon.js @@ -0,0 +1,24 @@ +function AlertIcon() { + return ( + + + + + + ) +} + +export default AlertIcon diff --git a/client/src/assets/Links/BehanceIcon.js b/client/src/assets/Links/BehanceIcon.js new file mode 100644 index 000000000..b2e7038a0 --- /dev/null +++ b/client/src/assets/Links/BehanceIcon.js @@ -0,0 +1,14 @@ +function BehanceIcon() { + return ( + + + + ) +} + +export default BehanceIcon diff --git a/client/src/assets/Links/GitHubIcon.js b/client/src/assets/Links/GitHubIcon.js index cb60a9615..c73ce4324 100644 --- a/client/src/assets/Links/GitHubIcon.js +++ b/client/src/assets/Links/GitHubIcon.js @@ -1,9 +1,12 @@ function GitHubIcon() { return ( - + ) diff --git a/client/src/assets/Links/LinkedInIcon.js b/client/src/assets/Links/LinkedInIcon.js index 921e8155e..073bd40db 100644 --- a/client/src/assets/Links/LinkedInIcon.js +++ b/client/src/assets/Links/LinkedInIcon.js @@ -1,9 +1,23 @@ function LinkedInIcon() { return ( - + + + ) diff --git a/client/src/assets/Links/TelegramIcon.js b/client/src/assets/Links/TelegramIcon.js index 44ac9818e..fda4290a0 100644 --- a/client/src/assets/Links/TelegramIcon.js +++ b/client/src/assets/Links/TelegramIcon.js @@ -1,9 +1,23 @@ function TelegramIcon() { return ( - + + + ) diff --git a/client/src/assets/CodingImage.js b/client/src/assets/Login/CodingImage.js similarity index 100% rename from client/src/assets/CodingImage.js rename to client/src/assets/Login/CodingImage.js diff --git a/client/src/assets/NavBarIcon.js b/client/src/assets/NavBarIcon.js deleted file mode 100644 index 22d37afc8..000000000 --- a/client/src/assets/NavBarIcon.js +++ /dev/null @@ -1,29 +0,0 @@ -function NavBarIcon() { - return ( - - - - - - ) -} - -export default NavBarIcon diff --git a/client/src/assets/NoNotifications.jsx b/client/src/assets/NoNotifications.jsx deleted file mode 100644 index 0edc5aa2b..000000000 --- a/client/src/assets/NoNotifications.jsx +++ /dev/null @@ -1,50 +0,0 @@ -function NoNotifications() { - return ( - - - - - - - - - - - - - - - ) -} - -export default NoNotifications diff --git a/client/src/assets/NotificationIcon.jsx b/client/src/assets/NotificationIcon.jsx deleted file mode 100644 index 897e9d6fb..000000000 --- a/client/src/assets/NotificationIcon.jsx +++ /dev/null @@ -1,16 +0,0 @@ -function NotificationIcon() { - return ( - - - - - ) -} - -export default NotificationIcon diff --git a/client/src/assets/Page404.js b/client/src/assets/Page404.js deleted file mode 100644 index 5e81e2835..000000000 --- a/client/src/assets/Page404.js +++ /dev/null @@ -1,672 +0,0 @@ -function Page404() { - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ) -} - -export default Page404 diff --git a/client/src/assets/Team/TeameightsLogo.js b/client/src/assets/Platform/TeameightsLogo.js similarity index 100% rename from client/src/assets/Team/TeameightsLogo.js rename to client/src/assets/Platform/TeameightsLogo.js diff --git a/client/src/assets/PlatformLogo.js b/client/src/assets/PlatformLogo.js deleted file mode 100644 index bd5bc7e68..000000000 --- a/client/src/assets/PlatformLogo.js +++ /dev/null @@ -1,12 +0,0 @@ -function PlatformLogo() { - return ( - - - - ) -} - -export default PlatformLogo diff --git a/client/src/assets/PlatformLogoBig.js b/client/src/assets/PlatformLogoBig.js deleted file mode 100644 index b60561ce9..000000000 --- a/client/src/assets/PlatformLogoBig.js +++ /dev/null @@ -1,12 +0,0 @@ -function PlatformLogoBig() { - return ( - - - - ) -} - -export default PlatformLogoBig diff --git a/client/src/assets/Shared/AddUserIcon.js b/client/src/assets/Shared/AddUserIcon.js new file mode 100644 index 000000000..54e41225b --- /dev/null +++ b/client/src/assets/Shared/AddUserIcon.js @@ -0,0 +1,32 @@ +function AddUserIcon() { + return ( + + + + + + + ) +} + +export default AddUserIcon diff --git a/client/src/assets/Close.js b/client/src/assets/Shared/Close.js similarity index 100% rename from client/src/assets/Close.js rename to client/src/assets/Shared/Close.js diff --git a/client/src/assets/Shared/DeleteIcon.js b/client/src/assets/Shared/DeleteIcon.js new file mode 100644 index 000000000..a910785c4 --- /dev/null +++ b/client/src/assets/Shared/DeleteIcon.js @@ -0,0 +1,15 @@ +function DeleteIcon() { + return ( + + + + ) +} + +export default DeleteIcon diff --git a/client/src/assets/EditIcon.jsx b/client/src/assets/Shared/EditIcon.jsx similarity index 100% rename from client/src/assets/EditIcon.jsx rename to client/src/assets/Shared/EditIcon.jsx diff --git a/client/src/assets/InfoIcon.js b/client/src/assets/Shared/InfoIcon.js similarity index 100% rename from client/src/assets/InfoIcon.js rename to client/src/assets/Shared/InfoIcon.js diff --git a/client/src/assets/LinkIcon.js b/client/src/assets/Shared/LinkIcon.js similarity index 100% rename from client/src/assets/LinkIcon.js rename to client/src/assets/Shared/LinkIcon.js diff --git a/client/src/assets/Shared/SearchIcon.jsx b/client/src/assets/Shared/SearchIcon.jsx new file mode 100644 index 000000000..1185a5dfe --- /dev/null +++ b/client/src/assets/Shared/SearchIcon.jsx @@ -0,0 +1,20 @@ +function SearchIcon() { + return ( + + + + + ) +} + +export default SearchIcon diff --git a/client/src/assets/NonFound.js b/client/src/assets/Shared/SearchingPeople.js similarity index 100% rename from client/src/assets/NonFound.js rename to client/src/assets/Shared/SearchingPeople.js diff --git a/client/src/assets/Shared/Slider.js b/client/src/assets/Shared/Slider.js new file mode 100644 index 000000000..1734272ce --- /dev/null +++ b/client/src/assets/Shared/Slider.js @@ -0,0 +1,21 @@ +function SiteLogo() { + return ( + + + + + + ) +} + +export default SiteLogo diff --git a/client/src/assets/Email.js b/client/src/assets/Shared/UserBehindPC.js similarity index 99% rename from client/src/assets/Email.js rename to client/src/assets/Shared/UserBehindPC.js index 22da3fa9c..440174125 100644 --- a/client/src/assets/Email.js +++ b/client/src/assets/Shared/UserBehindPC.js @@ -1,4 +1,4 @@ -function Email() { +function UserBehindPC() { return ( @@ -1039,4 +1039,4 @@ function Email() { ) } -export default Email +export default UserBehindPC diff --git a/client/src/assets/SiteLogo.js b/client/src/assets/SiteLogo.js deleted file mode 100644 index 2c9e64a49..000000000 --- a/client/src/assets/SiteLogo.js +++ /dev/null @@ -1,16 +0,0 @@ -function SiteLogo() { - return ( - - - - - ) -} - -export default SiteLogo diff --git a/client/src/assets/Slider.js b/client/src/assets/Slider.js deleted file mode 100644 index d97a3e383..000000000 --- a/client/src/assets/Slider.js +++ /dev/null @@ -1,29 +0,0 @@ -function SiteLogo() { - return ( - - - - - - ) -} - -export default SiteLogo diff --git a/client/src/assets/AddIcon.js b/client/src/assets/UserProfile/AddIcon.js similarity index 100% rename from client/src/assets/AddIcon.js rename to client/src/assets/UserProfile/AddIcon.js diff --git a/client/src/screens/UsersList/img/CrownTest.png b/client/src/assets/UserProfile/LeaderCrown.png similarity index 100% rename from client/src/screens/UsersList/img/CrownTest.png rename to client/src/assets/UserProfile/LeaderCrown.png diff --git a/client/src/assets/MessageIcon.js b/client/src/assets/UserProfile/MessageIcon.js similarity index 100% rename from client/src/assets/MessageIcon.js rename to client/src/assets/UserProfile/MessageIcon.js diff --git a/client/src/assets/PlusIcon.jsx b/client/src/assets/UserProfile/PlusIcon.jsx similarity index 100% rename from client/src/assets/PlusIcon.jsx rename to client/src/assets/UserProfile/PlusIcon.jsx diff --git a/client/src/assets/X.js b/client/src/assets/X.js deleted file mode 100644 index b24d6954f..000000000 --- a/client/src/assets/X.js +++ /dev/null @@ -1,22 +0,0 @@ -function X() { - return ( - - - - - ) -} - -export default X diff --git a/client/src/assets/chevron-right.svg b/client/src/assets/chevron-right.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/client/src/components/Backdrop/Backdrop.js b/client/src/components/Backdrop/Backdrop.js deleted file mode 100644 index f3b403437..000000000 --- a/client/src/components/Backdrop/Backdrop.js +++ /dev/null @@ -1,13 +0,0 @@ -// * Modules -import Backdrop from '@mui/material/Backdrop' -import CircularProgress from '@mui/material/CircularProgress' - -export default function SimpleBackdrop({ isLoading }) { - return ( - <> - theme.zIndex.drawer + 1 }} open={isLoading}> - - - - ) -} diff --git a/client/src/components/Forms/CreateTeamForm/CreateTeamForm.js b/client/src/components/CreateTeam/CreateTeam.js similarity index 55% rename from client/src/components/Forms/CreateTeamForm/CreateTeamForm.js rename to client/src/components/CreateTeam/CreateTeam.js index c470cb7e7..b8246e12d 100644 --- a/client/src/components/Forms/CreateTeamForm/CreateTeamForm.js +++ b/client/src/components/CreateTeam/CreateTeam.js @@ -1,37 +1,37 @@ // * Modules import React, { useState } from 'react' -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' -import { useCreateTeam } from '../../../api/hooks/team/useCreateTeam' -import { defaultTeamAvatars } from '../../../constants/teamFormData' +import { useCheckAuth } from '../../api/hooks/auth/useCheckAuth' +import { useCreateTeam } from '../../api/hooks/team/useCreateTeam' +import { defaultTeamAvatars } from '../../constants/teamFormData' // * Assets -import { createTeamValidation } from '../../../schemas' -import Loader from '../../../shared/components/Loader/Loader' -import { setIsModalOpen } from '../../../store/reducers/Shared' +import { createTeamValidation } from '../../schemas' +import Loader from '../../shared/components/Loader/Loader' +import { errorToaster } from '../../shared/components/Toasters/Error.toaster' +import { transformToCreateTeamDto } from '../../utils/transformToCreateTeamDto' import MultiStepRegistration from '../RegistrationPipeline/components/MultiStepRegistration/MultiStepRegistration' import AvatarForm from '../RegistrationPipeline/components/RegistrationForms/AvatarForm/AvatarForm' import InfoForm from '../RegistrationPipeline/components/RegistrationForms/InfoForm' +import InviteMembersForm from '../RegistrationPipeline/components/RegistrationForms/InviteMembersForm/InviteMembersForm' -function CreateTeamForm() { - const navigate = useNavigate() - const dispatch = useDispatch() - const { enqueueSnackbar } = useSnackbar() - - const [teamName, setTeamName] = useState('') +function CreateTeam() { 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 = [ { component: , name: 'Create team', isOptional: false }, + { + component: , + name: 'Invite members', + isOptional: true, + }, { component: ( { + let membersModified = transformToCreateTeamDto(formData.members) + const teamData = { name: formData.name, description: formData.description, @@ -65,20 +64,21 @@ function CreateTeamForm() { country: formData.country, type: formData.type.toLowerCase(), tag: formData.tag, - members: formData.members, + members: membersModified.members, } - await setTeamAvatar(formData.file) + setTeamAvatar(formData.file) createTeam(teamData) } - if (isUserLoading || isCreatingTeam) { - return + if (isCreatingTeamError && !isCreatingTeam) { + errorToaster(error) } return ( <> + {(isUserLoading || isCreatingTeam) && } { - 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/ConfirmEmailForm/ConfirmEmail.js b/client/src/components/Forms/ConfirmEmailForm/ConfirmEmail.js index 9e50a346b..0d270e60d 100644 --- a/client/src/components/Forms/ConfirmEmailForm/ConfirmEmail.js +++ b/client/src/components/Forms/ConfirmEmailForm/ConfirmEmail.js @@ -1,4 +1,4 @@ -import Email from '../../../assets/Email' +import UserBehindPC from '../../../assets/Shared/UserBehindPC' import { Container, ImgContainer, Text, TextContainer } from './ConfirmEmail.styles' @@ -12,7 +12,7 @@ function ConfirmEmail() { - + ) diff --git a/client/src/components/Forms/CreateTeamForm/img/Crown.svg b/client/src/components/Forms/CreateTeamForm/img/Crown.svg deleted file mode 100644 index 265d7d2af..000000000 --- a/client/src/components/Forms/CreateTeamForm/img/Crown.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/client/src/components/Forms/CreateTeamForm/img/DropDownIcon.svg b/client/src/components/Forms/CreateTeamForm/img/DropDownIcon.svg deleted file mode 100644 index 2ab32a660..000000000 --- a/client/src/components/Forms/CreateTeamForm/img/DropDownIcon.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - \ No newline at end of file diff --git a/client/src/components/Forms/CreateTeamForm/img/zxc1.jpg b/client/src/components/Forms/CreateTeamForm/img/zxc1.jpg deleted file mode 100644 index 852d17b52..000000000 Binary files a/client/src/components/Forms/CreateTeamForm/img/zxc1.jpg and /dev/null differ 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/LoginForm/LoginForm.js b/client/src/components/Forms/LoginForm/LoginForm.js index e028d9c97..096bae02c 100644 --- a/client/src/components/Forms/LoginForm/LoginForm.js +++ b/client/src/components/Forms/LoginForm/LoginForm.js @@ -1,26 +1,19 @@ // * 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 SocialLoginRegistration from '../SocialLoginRegistrationForm/SocialLoginRegistrationForm' import { AlternativeLogin, 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/LoginForm/LoginForm.styles.js b/client/src/components/Forms/LoginForm/LoginForm.styles.js index d0a2d2a64..ae0c36f8a 100644 --- a/client/src/components/Forms/LoginForm/LoginForm.styles.js +++ b/client/src/components/Forms/LoginForm/LoginForm.styles.js @@ -8,13 +8,6 @@ import styled from 'styled-components' // * Constants import { BLACK, BLUE, GREEN, WHITE } from '../../../constants/colors' -export const NavBar = styled(Toolbar)` - &.css-hyum1k-MuiToolbar-root { - background: ${BLACK.background}; - padding: 30px 40px; - } -` - export const LoginContainer = styled.div` width: 100%; min-height: 100vh; diff --git a/client/src/components/Forms/NewPasswords/NewPasswords.js b/client/src/components/Forms/NewPasswordsForm/NewPasswordsForm.js similarity index 94% rename from client/src/components/Forms/NewPasswords/NewPasswords.js rename to client/src/components/Forms/NewPasswordsForm/NewPasswordsForm.js index 52869cb0c..93ae42439 100644 --- a/client/src/components/Forms/NewPasswords/NewPasswords.js +++ b/client/src/components/Forms/NewPasswordsForm/NewPasswordsForm.js @@ -10,14 +10,13 @@ import Snackbar from '@mui/material/Snackbar' // * Api import resetPassword from '../../../api/endpoints/reset' // * Assets -import SiteLogo from '../../../assets/SiteLogo' +import SiteLogo from '../../../assets/Platform/TeameightsLogo' import ROUTES from '../../../constants/routes' import { AlertBox, Container, InputContainer, - NavBar, NewPasswordBox, NewPasswordButton, NewPasswordContainer, @@ -27,7 +26,7 @@ import { SubTitleText, TextContainer, TitleText, -} from './NewPasswords.styles' +} from './NewPasswordsForm.styles' function NewPassword() { const navigate = useNavigate() @@ -66,11 +65,7 @@ function NewPassword() { return ( - - - - - + {error && ( + return } return ( diff --git a/client/src/components/Forms/Page404Form/Page404Form.js b/client/src/components/Forms/Page404Form/Page404Form.js index eba6ad40b..06bc458f0 100644 --- a/client/src/components/Forms/Page404Form/Page404Form.js +++ b/client/src/components/Forms/Page404Form/Page404Form.js @@ -2,7 +2,7 @@ import { useNavigate } from 'react-router-dom' // * Assets -import Page404 from '../../../assets/Page404' +import Page404 from '../../../assets/Shared/SearchingPeople' // * Styles import { diff --git a/client/src/components/Forms/RecoverConfirmation/RecoverConfirmation.js b/client/src/components/Forms/RecoverConfirmationForm/RecoverConfirmationForm.js similarity index 81% rename from client/src/components/Forms/RecoverConfirmation/RecoverConfirmation.js rename to client/src/components/Forms/RecoverConfirmationForm/RecoverConfirmationForm.js index 7270e8b61..037eea94c 100644 --- a/client/src/components/Forms/RecoverConfirmation/RecoverConfirmation.js +++ b/client/src/components/Forms/RecoverConfirmationForm/RecoverConfirmationForm.js @@ -3,9 +3,9 @@ import { useLocation, useNavigate } from 'react-router-dom' import AppBar from '@mui/material/AppBar' import Box from '@mui/material/Box' -import ArrowLeftReset from '../../../assets/ArrowLeftReset' +import ArrowLeftReset from '../../../assets/Arrows/ArrowLeftReset' // * Assets -import SiteLogo from '../../../assets/SiteLogo' +import SiteLogo from '../../../assets/Platform/TeameightsLogo' import ROUTES from '../../../constants/routes' import { @@ -14,12 +14,11 @@ import { Container, MiddleContainer, MiddleText, - NavBar, RecoverBox, RecoverContainer, TextContainer, TitleText, -} from './RecoverConfirmation.styles' +} from './RecoverConfirmationForm.styles' function RecoverPassword() { const navigate = useNavigate() @@ -28,11 +27,7 @@ function RecoverPassword() { return ( - - - - - + diff --git a/client/src/components/Forms/RecoverConfirmation/RecoverConfirmation.styles.js b/client/src/components/Forms/RecoverConfirmationForm/RecoverConfirmationForm.styles.js similarity index 95% rename from client/src/components/Forms/RecoverConfirmation/RecoverConfirmation.styles.js rename to client/src/components/Forms/RecoverConfirmationForm/RecoverConfirmationForm.styles.js index 59b4df7f4..4e27b90f6 100644 --- a/client/src/components/Forms/RecoverConfirmation/RecoverConfirmation.styles.js +++ b/client/src/components/Forms/RecoverConfirmationForm/RecoverConfirmationForm.styles.js @@ -4,12 +4,6 @@ import styled from 'styled-components' import { device } from '../../../constants/breakpoints' import { BLACK, GREEN, GREY, LIME, WHITE } from '../../../constants/colors' -export const NavBar = styled(Toolbar)` - &.css-hyum1k-MuiToolbar-root { - background: ${LIME.background}; - } -` - export const Container = styled.div` display: flex; flex-direction: column; diff --git a/client/src/components/Forms/RecoverPassword/RecoverPassword.js b/client/src/components/Forms/RecoverPasswordForm/RecoverPasswordForm.js similarity index 88% rename from client/src/components/Forms/RecoverPassword/RecoverPassword.js rename to client/src/components/Forms/RecoverPasswordForm/RecoverPasswordForm.js index dd18b700e..fe0e7ff50 100644 --- a/client/src/components/Forms/RecoverPassword/RecoverPassword.js +++ b/client/src/components/Forms/RecoverPasswordForm/RecoverPasswordForm.js @@ -7,17 +7,16 @@ import Snackbar from '@mui/material/Snackbar' // * Api import resetPassword from '../../../api/endpoints/reset' -import ArrowLeftReset from '../../../assets/ArrowLeftReset' +import ArrowLeftReset from '../../../assets/Arrows/ArrowLeftReset' // * Assets -import SiteLogo from '../../../assets/SiteLogo' +import SiteLogo from '../../../assets/Platform/TeameightsLogo' import ROUTES from '../../../constants/routes' -import Alert from '../RegistrationPipeline/components/Alert/Alert' +import Alert from '../../RegistrationPipeline/components/Alert/Alert' import { BackButton, ButtonContainer, Container, - NavBar, RecoverBox, RecoverButton, RecoverContainer, @@ -25,7 +24,7 @@ import { SubTitleText, TextContainer, TitleText, -} from './RecoverPassword.styles' +} from './RecoverPasswordForm.styles' import emailValidation from './RecoverValidation' function RecoverPassword() { @@ -73,11 +72,7 @@ function RecoverPassword() { )} - - - - - + diff --git a/client/src/components/Forms/RecoverPassword/RecoverPassword.styles.js b/client/src/components/Forms/RecoverPasswordForm/RecoverPasswordForm.styles.js similarity index 100% rename from client/src/components/Forms/RecoverPassword/RecoverPassword.styles.js rename to client/src/components/Forms/RecoverPasswordForm/RecoverPasswordForm.styles.js diff --git a/client/src/components/Forms/RecoverPassword/RecoverValidation.js b/client/src/components/Forms/RecoverPasswordForm/RecoverValidation.js similarity index 100% rename from client/src/components/Forms/RecoverPassword/RecoverValidation.js rename to client/src/components/Forms/RecoverPasswordForm/RecoverValidation.js diff --git a/client/src/components/Forms/RegistrationForm/RegistrationForm.js b/client/src/components/Forms/RegistrationForm/RegistrationForm.js index 6465aa3cc..db7969404 100644 --- a/client/src/components/Forms/RegistrationForm/RegistrationForm.js +++ b/client/src/components/Forms/RegistrationForm/RegistrationForm.js @@ -7,9 +7,8 @@ import VisibilityOff from '@mui/icons-material/VisibilityOff' import { useRegister } from '../../../api/hooks/auth/useRegister' import Loader from '../../../shared/components/Loader/Loader' -import Backdrop from '../../Backdrop/Backdrop' // * Helpers -import SocialLoginRegistration from '../SocialLoginRegistration/SocialLoginRegistration' +import SocialLoginRegistration from '../SocialLoginRegistrationForm/SocialLoginRegistrationForm' // * Styles import { @@ -34,7 +33,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() @@ -49,7 +47,6 @@ function RegistrationForm() { return ( <> - diff --git a/client/src/components/Forms/RegistrationPipeline/components/ConsoleSimulator/ConsoleSimulator.jsx b/client/src/components/Forms/RegistrationPipeline/components/ConsoleSimulator/ConsoleSimulator.jsx deleted file mode 100644 index 09eec913b..000000000 --- a/client/src/components/Forms/RegistrationPipeline/components/ConsoleSimulator/ConsoleSimulator.jsx +++ /dev/null @@ -1,88 +0,0 @@ -// * Modules -import { useDispatch, useSelector } from 'react-redux' -import Typewriter from '@mikhail2404/react-ts-typewriter' -import { useFormikContext } from 'formik' - -import { Text } from '../../../../../shared/styles/Tpography.styles' -// * Styles -import { setIsFinishedAvatarLoading } from '../../../../../store/reducers/RegistrationAuth' - -import { - AvatarsContainer, - CodingArea, - DefaultImageArea, - ImageArea, -} from './ConsoleSimulator.styles' - -const photo = - 'data:image/webp;base64,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' - -const ConsoleSimulator = ({ startedUploading, returnedToPreviousSteps, setStartedUploading }) => { - const { values } = useFormikContext() - const dispatch = useDispatch() - const { isFinishedAvatarLoading } = useSelector((state) => state.registrationReducer) - const lines = [ - `teameights@ubuntu:~$ ${values.username}, ${values.age}`, - `teameights@ubuntu:~$ ${values.concentration}`, - 'teameights@ubuntu:~$ waiting...', - 'teameights@ubuntu:~$ uploading img...', - 'teameights@ubuntu:~$ uploaded!', - 'teameights@ubuntu:~$ ready to launch!', - ] - - return ( - - {values.file ? ( - - ) : ( - - )} - - {isFinishedAvatarLoading && returnedToPreviousSteps ? ( - - {lines.map((line, index) => ( - - {line} -
-
- ))} -
- ) : ( - <> - - - - {startedUploading && ( - - - - )} - {values.file && ( - - { - setStartedUploading(false) - dispatch(setIsFinishedAvatarLoading(true)) - }} - cursor={false} - speed={10} - delay={100} - newLine={true} - /> - - )} - - )} -
-
- ) -} - -export default ConsoleSimulator diff --git a/client/src/components/Forms/RegistrationPipeline/components/ConsoleSimulator/ConsoleSimulator.styles.js b/client/src/components/Forms/RegistrationPipeline/components/ConsoleSimulator/ConsoleSimulator.styles.js deleted file mode 100644 index 8a5d5293f..000000000 --- a/client/src/components/Forms/RegistrationPipeline/components/ConsoleSimulator/ConsoleSimulator.styles.js +++ /dev/null @@ -1,32 +0,0 @@ -import styled from 'styled-components' - -export const AvatarsContainer = styled.div` - width: 321px; - height: 301px; - background: rgba(14, 15, 18, 0.6); - box-shadow: 0px 4px 30px rgba(0, 0, 0, 0.25); - border-radius: 10px; - display: flex; - justify-content: space-evenly; - align-items: center; - flex-direction: column; -` -export const CodingArea = styled.div` - width: 270px; - height: 110px; - border-radius: 10px; - background: #26292b; - margin-top: 5px; -` - -export const DefaultImageArea = styled.img` - width: 130px; - height: 130px; - border-radius: 50%; -` - -export const ImageArea = styled.img` - width: 130px; - height: 130px; - border-radius: 50%; -` diff --git a/client/src/components/Forms/RegistrationPipeline/components/CustomMultipleSelect/CustomMultipleSelect.js b/client/src/components/Forms/RegistrationPipeline/components/CustomMultipleSelect/CustomMultipleSelect.js deleted file mode 100644 index f14ec3698..000000000 --- a/client/src/components/Forms/RegistrationPipeline/components/CustomMultipleSelect/CustomMultipleSelect.js +++ /dev/null @@ -1,96 +0,0 @@ -// * Modules -import React from 'react' -import CodeIcon from '@mui/icons-material/Code' -import Box from '@mui/material/Box' -import Chip from '@mui/material/Chip' -import FormControl from '@mui/material/FormControl' -import OutlinedInput from '@mui/material/OutlinedInput' -import { includes } from 'lodash' - -// * Assets -import ArrowDown from '../../../../../assets/Arrows/ArrowDown' -import ArrowDownRed from '../../../../../assets/Arrows/ArrowDownRed' - -import { Item, SelectCustom } from './CustomMultipleSelect.styles' -// * Helpers -import MenuProps from './MenuProps' - -const CustomSelect = ({ data, handleData, options, errors, error, multiple = true }) => { - const animation = includes(errors, error) ? undefined : 'none' - - return ( - <> - - } - IconComponent={includes(errors, error) ? ArrowDownRed : ArrowDown} - onChange={handleData} - labelId="demo-multiple-chip-label" - id="demo-multiple-chip" - MenuProps={MenuProps} - animation={animation} - sx={{ height: 35 }} - multiple={multiple} - renderValue={(selected) => ( - - {multiple ? ( - selected - .filter((item, index) => index < 2) - .map((item) => ( - } - key={item} - label={item} - sx={{ - background: '#2E3239', - color: 'white', - borderRadius: '5px', - marginRight: '5px', - height: '30px', - }} - /> - )) - ) : ( - } - key={selected} - label={selected} - sx={{ - background: '#2E3239', - color: 'white', - borderRadius: '5px', - marginRight: '5px', - height: '30px', - }} - /> - )} - - {selected.length > 2 && multiple && ( - - )} - - )} - > - {options.map(({ label }) => ( - - {label} - - ))} - - - - ) -} - -export default CustomSelect diff --git a/client/src/components/Forms/RegistrationPipeline/components/CustomMultipleSelect/CustomMultipleSelect.styles.js b/client/src/components/Forms/RegistrationPipeline/components/CustomMultipleSelect/CustomMultipleSelect.styles.js deleted file mode 100644 index 9f29987b7..000000000 --- a/client/src/components/Forms/RegistrationPipeline/components/CustomMultipleSelect/CustomMultipleSelect.styles.js +++ /dev/null @@ -1,63 +0,0 @@ -// * Modules -import MenuItem from '@mui/material/MenuItem' -import Select from '@mui/material/Select' -import styled, { keyframes } from 'styled-components' - -// * Constants -import { GREEN } from '../../../../../constants/colors' - -const shake = keyframes` - 0% { transform: translate(1px, 1px) rotate(0deg); } - 10% { transform: translate(-1px, -2px) rotate(-1deg); } - 20% { transform: translate(-3px, 0px) rotate(1deg); } - 30% { transform: translate(3px, 2px) rotate(0deg); } - 40% { transform: translate(1px, -1px) rotate(1deg); } - 50% { transform: translate(-1px, 2px) rotate(-1deg); } - 60% { transform: translate(-3px, 1px) rotate(0deg); } - 70% { transform: translate(3px, 1px) rotate(-1deg); } - 80% { transform: translate(-1px, -1px) rotate(1deg); } - 90% { transform: translate(1px, 2px) rotate(0deg); } - 100% { transform: translate(1px, -2px) rotate(-1deg); } -` - -export const Item = styled(MenuItem)` - /* Root */ - &.MuiMenuItem-root { - font-size: 0.875rem; - font-weight: 600; - list-style: none; - padding: 8px; - border-radius: 0.45em; - cursor: default; - margin-top: 5px; - cursor: pointer; - &:last-of-type { - border-bottom: none; - } - } - - /* Selected item inside the filter */ - &.css-kk1bwy-MuiButtonBase-root-MuiMenuItem-root.Mui-selected { - background: ${GREEN.alternativeBorder} !important; - color: white !important; - font-size: 0.875rem; - font-weight: 600; - } - - /* Hover for the selected item inside the filter */ - &.css-kk1bwy-MuiButtonBase-root-MuiMenuItem-root.Mui-selected:hover { - background: ${GREEN.alternativeBorder} !important; - color: white !important; - font-size: 0.875rem; - font-weight: 600; - } -` - -export const SelectCustom = styled(Select)` - animation-name: ${(props) => props.animation || shake}; - animation-duration: 0.3s; - - & .css-11u53oe-MuiSelect-select-MuiInputBase-input-MuiOutlinedInput-input { - padding: 5px 10px 5px 0 !important; - } -` diff --git a/client/src/components/Forms/RegistrationPipeline/components/CustomMultipleSelect/MenuProps.js b/client/src/components/Forms/RegistrationPipeline/components/CustomMultipleSelect/MenuProps.js deleted file mode 100644 index b14cc355e..000000000 --- a/client/src/components/Forms/RegistrationPipeline/components/CustomMultipleSelect/MenuProps.js +++ /dev/null @@ -1,20 +0,0 @@ -// * Constants -import { GREY, WHITE } from '../../../../../constants/colors' - -const MenuProps = { - PaperProps: { - style: { - maxHeight: '250px', - background: GREY.selectBackground, - boxSizing: 'border-box', - padding: '0 5px', - margin: '15px 0', - borderRadius: '5px', - color: WHITE.main, - overflow: 'auto', - outline: '0px', - }, - }, -} - -export default MenuProps diff --git a/client/src/components/Forms/RegistrationPipeline/components/CustomSelect/CustomSelect.js b/client/src/components/Forms/RegistrationPipeline/components/CustomSelect/CustomSelect.js deleted file mode 100644 index 6968260a4..000000000 --- a/client/src/components/Forms/RegistrationPipeline/components/CustomSelect/CustomSelect.js +++ /dev/null @@ -1,63 +0,0 @@ -// * Modules -import React, { useEffect, useState } from 'react' -import countryList from 'react-select-country-list' -import FormControl from '@mui/material/FormControl' -import { includes } from 'lodash' - -// * Assets -import ArrowDown from '../../../../../assets/Arrows/ArrowDown' -import ArrowDownRed from '../../../../../assets/Arrows/ArrowDownRed' -// * Constants -import { GREEN, WHITE } from '../../../../../constants/colors' - -import { Item, Line, SelectCustom } from './CustomSelect.styles' -// * Helpers -import MenuProps from './MenuProps' - -const CustomSelect = ({ country, handleCountry, errors }) => { - const [countries, setCountries] = useState([]) - - const animation = includes(errors, 'country') ? undefined : 'none' - - useEffect(() => { - const data = countryList().getData() - - setCountries(data) - }, []) - - return ( - <> - - - {countries.map(({ label, value }) => ( - - {label} - - ))} - - - {includes(errors, 'country') ? ( - - ) : ( - - )} - - ) -} - -export default CustomSelect diff --git a/client/src/components/Forms/RegistrationPipeline/components/CustomSelect/CustomSelect.styles.js b/client/src/components/Forms/RegistrationPipeline/components/CustomSelect/CustomSelect.styles.js deleted file mode 100644 index 51cbbed6d..000000000 --- a/client/src/components/Forms/RegistrationPipeline/components/CustomSelect/CustomSelect.styles.js +++ /dev/null @@ -1,72 +0,0 @@ -// * Modules -import MenuItem from '@mui/material/MenuItem' -import Select from '@mui/material/Select' -import styled, { keyframes } from 'styled-components' - -// * Constants -import { GREEN } from '../../../../../constants/colors' - -const shake = keyframes` - 0% { transform: translate(1px, 1px) rotate(0deg); } - 10% { transform: translate(-1px, -2px) rotate(-1deg); } - 20% { transform: translate(-3px, 0px) rotate(1deg); } - 30% { transform: translate(3px, 2px) rotate(0deg); } - 40% { transform: translate(1px, -1px) rotate(1deg); } - 50% { transform: translate(-1px, 2px) rotate(-1deg); } - 60% { transform: translate(-3px, 1px) rotate(0deg); } - 70% { transform: translate(3px, 1px) rotate(-1deg); } - 80% { transform: translate(-1px, -1px) rotate(1deg); } - 90% { transform: translate(1px, 2px) rotate(0deg); } - 100% { transform: translate(1px, -2px) rotate(-1deg); } -` - -export const Item = styled(MenuItem)` - /* Root */ - &.MuiMenuItem-root { - font-size: 0.875rem; - font-weight: 600; - list-style: none; - padding: 8px; - border-radius: 0.45em; - cursor: default; - margin-top: 5px; - cursor: pointer; - &:last-of-type { - border-bottom: none; - } - } - - /* Selected item inside the filter */ - &.css-kk1bwy-MuiButtonBase-root-MuiMenuItem-root.Mui-selected { - background: ${GREEN.alternativeBorder} !important; - color: white !important; - font-size: 0.875rem; - font-weight: 600; - } - - /* Hover for the selected item inside the filter */ - &.css-kk1bwy-MuiButtonBase-root-MuiMenuItem-root.Mui-selected:hover { - background: ${GREEN.alternativeBorder} !important; - color: white !important; - font-size: 0.875rem; - font-weight: 600; - } -` - -export const SelectCustom = styled(Select)` - animation-name: ${(props) => props.animation || shake}; - animation-duration: 0.3s; - - & .css-11u53oe-MuiSelect-select-MuiInputBase-input-MuiOutlinedInput-input { - padding: 0; - } -` - -export const Line = styled.hr` - margin: 0; - border: none; - height: 1px; - background: ${(props) => props.background || '#4b4b4b'}; - animation-name: ${(props) => props.animation || shake}; - animation-duration: 0.3s; -` diff --git a/client/src/components/Forms/RegistrationPipeline/components/CustomSelect/MenuProps.js b/client/src/components/Forms/RegistrationPipeline/components/CustomSelect/MenuProps.js deleted file mode 100644 index 47f4da0de..000000000 --- a/client/src/components/Forms/RegistrationPipeline/components/CustomSelect/MenuProps.js +++ /dev/null @@ -1,20 +0,0 @@ -// * Constants -import { GREY, WHITE } from '../../../../../constants/colors' - -const MenuProps = { - PaperProps: { - style: { - maxHeight: '250px', - background: GREY.selectBackground, - boxSizing: 'border-box', - padding: '0 5px', - margin: '5px 0', - borderRadius: '5px', - color: WHITE.main, - overflow: 'auto', - outline: '0px', - }, - }, -} - -export default MenuProps 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/RegistrationPipeline/components/RegistrationForms/InfoForm/TeamInfoForm/TeamInfoForm.jsx b/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/InfoForm/TeamInfoForm/TeamInfoForm.jsx deleted file mode 100644 index 82e182441..000000000 --- a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/InfoForm/TeamInfoForm/TeamInfoForm.jsx +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react' -import countryList from 'react-select-country-list' - -import { teamTypes } from '../../../../../../../constants/teamFormData' -import CustomInput from '../../../../../../../shared/components/CustomInput/CustomInput' -import { - GroupContainer, - SectionContainer, -} from '../../../../../../../shared/components/CustomInput/CustomInput.styles' -import CustomSelect from '../../../../../../../shared/components/CustomSelect/CustomSelect' -import CustomTextArea from '../../../../../../../shared/components/CustomTextArea/CustomTextArea' -import { InputsContainer } from '../InfoForm.styles' - -const UserInfoForm = () => { - const countriesOptions = React.useMemo(() => countryList().getData(), []) - - return ( - <> - - - - - - - - - - - - - - - - - - - - - ) -} - -export default UserInfoForm diff --git a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/InfoForm/UserInfoForm/UserInfoForm.jsx b/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/InfoForm/UserInfoForm/UserInfoForm.jsx deleted file mode 100644 index 98a0f9056..000000000 --- a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/InfoForm/UserInfoForm/UserInfoForm.jsx +++ /dev/null @@ -1,58 +0,0 @@ -import React from 'react' -import countryList from 'react-select-country-list' - -import CustomInput from '../../../../../../../shared/components/CustomInput/CustomInput' -import { - GroupContainer, - SectionContainer, -} from '../../../../../../../shared/components/CustomInput/CustomInput.styles' -import CustomSelect from '../../../../../../../shared/components/CustomSelect/CustomSelect' -import CustomTextArea from '../../../../../../../shared/components/CustomTextArea/CustomTextArea' -import { InputsContainer } from '../InfoForm.styles' - -const UserInfoForm = () => { - const countriesOptions = React.useMemo(() => countryList().getData(), []) - - return ( - <> - - - - - - - - - - - - - - - - - - - - - ) -} - -export default UserInfoForm diff --git a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/InfoForm/index.jsx b/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/InfoForm/index.jsx deleted file mode 100644 index 267b87dab..000000000 --- a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/InfoForm/index.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react' - -import { useCheckAuth } from '../../../../../../api/hooks/auth/useCheckAuth' -import { ContentContainer } from '../../MultiStepRegistration/MultiStepRegistration.styles' - -import TeamInfoForm from './TeamInfoForm/TeamInfoForm' -import UserInfoForm from './UserInfoForm/UserInfoForm' - -const InfoForm = () => { - const { data: user } = useCheckAuth() - - return ( - {user.isRegistered ? : } - ) -} - -export default InfoForm diff --git a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/UserEducationForm/UserEducationForm.jsx b/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/UserEducationForm/UserEducationForm.jsx deleted file mode 100644 index 4d843ebec..000000000 --- a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/UserEducationForm/UserEducationForm.jsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react' - -import CustomInput from '../../../../../../shared/components/CustomInput/CustomInput' -import { ContentContainer } from '../../MultiStepRegistration/MultiStepRegistration.styles' - -const UserEducationForm = () => { - return ( - - - - - - ) -} - -export default UserEducationForm diff --git a/client/src/components/Forms/SocialLoginRegistration/SocialLoginRegistration.js b/client/src/components/Forms/SocialLoginRegistrationForm/SocialLoginRegistrationForm.js similarity index 100% rename from client/src/components/Forms/SocialLoginRegistration/SocialLoginRegistration.js rename to client/src/components/Forms/SocialLoginRegistrationForm/SocialLoginRegistrationForm.js 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 78859d49f..9d3e56fc0 100644 --- a/client/src/components/Forms/TeamsList/TeamsList.js +++ b/client/src/components/Forms/TeamsList/TeamsList.js @@ -1,17 +1,16 @@ // * 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' import { useCheckAuth } from '../../../api/hooks/auth/useCheckAuth' import { useTeamMembership } from '../../../api/hooks/team/useTeamMembership' -import TopTemplate from '../../TopTemplate/TopTemplate' // * Styles import { @@ -28,10 +27,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,11 +60,9 @@ function TeamsList() { if (result) { handleClose() - navigate('/myteam') + navigate(`/team/${teamId}`) } else { - enqueueSnackbar('You have joined the team already!', { - preventDuplicate: true, - }) + console.log('here') } } @@ -102,7 +97,6 @@ function TeamsList() { - diff --git a/client/src/components/Forms/TournamentInfo/TournamentInfo.data.js b/client/src/components/Forms/TournamentInfo/TournamentInfo.data.js deleted file mode 100644 index c44d31d07..000000000 --- a/client/src/components/Forms/TournamentInfo/TournamentInfo.data.js +++ /dev/null @@ -1,18 +0,0 @@ -export const data = [ - { - name: 'Filled slots', - number: '1/16', - }, - { - name: 'Signed up', - number: '1', - }, - { - name: 'Checked in', - number: '1', - }, - { - name: 'Reserves', - number: '0', - }, -] diff --git a/client/src/components/Forms/TournamentInfo/TournamentInfo.js b/client/src/components/Forms/TournamentInfo/TournamentInfo.js deleted file mode 100644 index fa0172866..000000000 --- a/client/src/components/Forms/TournamentInfo/TournamentInfo.js +++ /dev/null @@ -1,300 +0,0 @@ -// * Modules -import { useEffect, useState } from 'react' -import { useSelector } from 'react-redux' -import { useNavigate } from 'react-router-dom' -import Box from '@mui/material/Box' -import Modal from '@mui/material/Modal' -import isEqual from 'lodash/isEqual' -import { useSnackbar } from 'notistack' - -// * API -import teamsAPI from '../../../api/endpoints/team' -import tournamentAPI from '../../../api/endpoints/tournament' -import { useCheckAuth } from '../../../api/hooks/auth/useCheckAuth' -import ArrowLeftReset from '../../../assets/ArrowLeftReset' -import X from '../../../assets/X' -import CodingForm from '../CodingForm/CodingForm' - -// * Assets -import { data } from './TournamentInfo.data' -// * Styles -import { - AvailableSlotsContainer, - AvailableSlotsItem, - ButtonContainer, - CloseContainer, - ComeBackBtn, - Container, - Content, - CustomOption, - CustomSelect, - Div, - EntryStartsContainer, - InfoContainer, - PrimaryButton, - SelectContainer, - SelectItem, - Span, - style, - Text, - TopContainer, - TournamentInfoContainer, -} from './TournamentInfo.styles' - -function TournamentInfo() { - const [open, setOpen] = useState(false) - const [frontEnd, setFrontEnd] = useState('') - const [backEnd, setBackEnd] = useState('') - const [allowStart, setAllowStart] = useState(false) - const [team, setTeam] = useState({}) - const [updating, setUpdating] = useState(true) - const [members, setMembers] = useState([]) - const [userRole, setUserRole] = useState('') - - const { data: user } = useCheckAuth() - const { enqueueSnackbar } = useSnackbar() - - const navigate = useNavigate() - const handleOpen = () => 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..f5c9281ee 100644 --- a/client/src/components/NavBar/NavBar.jsx +++ b/client/src/components/NavBar/NavBar.jsx @@ -1,5 +1,5 @@ // * Modules -import React, { useEffect, useRef, useState } from 'react' +import React, { memo, useEffect, useRef, useState } from 'react' import { useSelector } from 'react-redux' import { useNavigate } from 'react-router-dom' @@ -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), ] @@ -53,7 +53,6 @@ const NavBar = () => { const { mutate: logoutUser, isLoading: isUserLoggingOut } = useLogoutUser() const navigate = useNavigate() const navMenuRef = useRef(null) - // let socketRef = useRef(null) useEffect(() => { if (user) { @@ -174,4 +173,4 @@ const NavBar = () => { ) } -export default NavBar +export default memo(NavBar) diff --git a/client/src/components/NavBar/NotificationsContent/NotificationsContent.styles.js b/client/src/components/NavBar/NotificationsContent/NotificationsContent.styles.js index e77846f20..909151945 100644 --- a/client/src/components/NavBar/NotificationsContent/NotificationsContent.styles.js +++ b/client/src/components/NavBar/NotificationsContent/NotificationsContent.styles.js @@ -10,7 +10,7 @@ export const StyledNotificationsContent = styled.div` export const NotificationsCount = styled(motion.div)` position: absolute; /* transition: opacity var(--menu-animation-time); */ - /* opacity: ${(props) => (props.active ? 1 : 0)}; */ + ${'' /* opacity: ${(props) => (props.active ? 1 : 0)}; */} pointer-events: ${(props) => (props.active ? 'all' : 'none')}; top: ${(props) => props.top || 'auto'}; right: ${(props) => props.right || 'auto'}; diff --git a/client/src/components/NavBar/NotificationsModal/NotificationsModal.js b/client/src/components/NavBar/NotificationsModal/NotificationsModal.js index 720ff4459..06e5c683e 100644 --- a/client/src/components/NavBar/NotificationsModal/NotificationsModal.js +++ b/client/src/components/NavBar/NotificationsModal/NotificationsModal.js @@ -65,7 +65,7 @@ const NotificationsModal = ({ userNotifications, notificationModal, setNotificat return ( e.stopPropagation()} animate={notificationModal ? 'open' : 'closed'} variants={variants} 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 59ce0193e..304565ba1 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/Images/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,18 +18,13 @@ 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(() => { @@ -43,7 +37,7 @@ const Profile = ({ sidebar }) => { return ( - + {data?.userRealName} @{data?.userUsername} diff --git a/client/src/components/NavBar/defaultImg.png b/client/src/components/NavBar/defaultImg.png deleted file mode 100644 index 8c8162254..000000000 Binary files a/client/src/components/NavBar/defaultImg.png and /dev/null differ diff --git a/client/src/components/NavBar/tempImg.jpg b/client/src/components/NavBar/tempImg.jpg deleted file mode 100644 index 852d17b52..000000000 Binary files a/client/src/components/NavBar/tempImg.jpg and /dev/null differ diff --git a/client/src/components/Profile/Photo.jpg b/client/src/components/Profile/Photo.jpg deleted file mode 100644 index 06739f6dd..000000000 Binary files a/client/src/components/Profile/Photo.jpg and /dev/null differ diff --git a/client/src/components/Profile/components/ProfileDetails/ProfileDetails.jsx b/client/src/components/Profile/components/ProfileDetails/ProfileDetails.jsx index 8e392c5a8..bb5efbcff 100644 --- a/client/src/components/Profile/components/ProfileDetails/ProfileDetails.jsx +++ b/client/src/components/Profile/components/ProfileDetails/ProfileDetails.jsx @@ -3,28 +3,23 @@ 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' import ModalWindow from '../../../../shared/components/ModalWindow/ModalWindow' import { Button } from '../../../../shared/styles/Button.styles' import { CustomLink } from '../../../../shared/styles/Link.styles' -import { AvatarWrapper } from '../../../Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/AvatarForm.styles' -import Photo from '../../Photo.jpg' +import { AvatarWrapper } from '../../../RegistrationPipeline/components/RegistrationForms/AvatarForm/AvatarForm.styles' import { BannerLine, DetailsWrapper, @@ -67,11 +62,7 @@ const ProfileDetails = () => { - + navigate('/profile-edit')} /> diff --git a/client/src/components/Profile/components/ProfileForm/components/Edit/Edit.jsx b/client/src/components/Profile/components/ProfileForm/components/Edit/Edit.jsx index 67190f62b..373e7aa5c 100644 --- a/client/src/components/Profile/components/ProfileForm/components/Edit/Edit.jsx +++ b/client/src/components/Profile/components/ProfileForm/components/Edit/Edit.jsx @@ -1,4 +1,4 @@ -import PlusIcon from '../../../../../../assets/PlusIcon' +import PlusIcon from '../../../../../../assets/UserProfile/PlusIcon' import { EditButton } from './Edit.styles' diff --git a/client/src/components/Profile/components/ProfileForm/index.jsx b/client/src/components/Profile/components/ProfileForm/index.jsx index 80c0d8a88..0735a9871 100644 --- a/client/src/components/Profile/components/ProfileForm/index.jsx +++ b/client/src/components/Profile/components/ProfileForm/index.jsx @@ -6,26 +6,25 @@ import { Form, Formik } from 'formik' import { useCheckAuth } from '../../../../api/hooks/auth/useCheckAuth' import { useEditUserDetails } from '../../../../api/hooks/auth/useEditUserDetails' import { useGetTeamData } from '../../../../api/hooks/team/useGetTeamData' -import EditIcon from '../../../../assets/EditIcon' +import EditIcon from '../../../../assets/Shared/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 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' @@ -33,7 +32,6 @@ import CustomTextArea from '../../../../shared/components/CustomTextArea/CustomT import Loader from '../../../../shared/components/Loader/Loader' import { Button } from '../../../../shared/styles/Button.styles' import { ErrorMessage } from '../../../../shared/styles/Tpography.styles' -import Photo from '../../Photo.jpg' import { BannerLine, DetailsWrapper, @@ -150,7 +148,7 @@ const ProfileForm = () => { - + diff --git a/client/src/components/Forms/RegistrationPipeline/components/Alert/Alert.js b/client/src/components/RegistrationPipeline/components/Alert/Alert.js similarity index 100% rename from client/src/components/Forms/RegistrationPipeline/components/Alert/Alert.js rename to client/src/components/RegistrationPipeline/components/Alert/Alert.js diff --git a/client/src/components/Forms/RegistrationPipeline/components/Alert/Alert.styles.js b/client/src/components/RegistrationPipeline/components/Alert/Alert.styles.js similarity index 75% rename from client/src/components/Forms/RegistrationPipeline/components/Alert/Alert.styles.js rename to client/src/components/RegistrationPipeline/components/Alert/Alert.styles.js index 8bfc79e37..24eb2afdc 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/Alert/Alert.styles.js +++ b/client/src/components/RegistrationPipeline/components/Alert/Alert.styles.js @@ -1,7 +1,7 @@ import MuiAlert from '@mui/material/Alert' import styled from 'styled-components' -import { BLACK } from '../../../../../constants/colors' +import { BLACK } from '../../../../constants/colors' export const AlertBox = styled(MuiAlert)` && { diff --git a/client/src/components/RegistrationPipeline/components/CheckboxWithLabel/CheckboxWithLabel.js b/client/src/components/RegistrationPipeline/components/CheckboxWithLabel/CheckboxWithLabel.js new file mode 100644 index 000000000..804ac8ede --- /dev/null +++ b/client/src/components/RegistrationPipeline/components/CheckboxWithLabel/CheckboxWithLabel.js @@ -0,0 +1,19 @@ +import { Indicator, Input, Label } from './CheckboxWithLabel.styles' + +export default function CheckboxWithLabel({ value, checked, onChange, name, id, label, disabled }) { + return ( + + ) +} diff --git a/client/src/components/RegistrationPipeline/components/CheckboxWithLabel/CheckboxWithLabel.styles.js b/client/src/components/RegistrationPipeline/components/CheckboxWithLabel/CheckboxWithLabel.styles.js new file mode 100644 index 000000000..a8fed0266 --- /dev/null +++ b/client/src/components/RegistrationPipeline/components/CheckboxWithLabel/CheckboxWithLabel.styles.js @@ -0,0 +1,73 @@ +import styled, { keyframes } from 'styled-components' + +export const Input = styled.input` + height: 0; + width: 0; + opacity: 0; + z-index: -1; +` + +export const Label = styled.label` + position: relative; + display: inline-block; + cursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')}; + color: white; + left: 30px; + font-size: 15px; + font-weight: 400; + max-width: 170px; + max-height: 50px; + + &:hover { + color: #5bd424; + } +` + +const rotate = keyframes` + from { + opacity: 0; + transform: rotate(0deg); + } + to { + opacity: 1; + transform: rotate(45deg); + } +` + +export const Indicator = styled.div` + width: 1.2em; + height: 1.2em; + background: none; + position: absolute; + top: 0em; + left: -30px; + border: 1px solid white; + border-radius: 0.2em; + + ${Label}:hover & { + background: none; + } + + &::after { + position: absolute; + display: none; + content: ''; + } + + ${Input}:checked + &::after { + display: block; + top: 0.1em; + left: 0.35em; + width: 35%; + height: 70%; + border: solid #5bd424; + border-width: 0 0.2em 0.2em 0; + animation-name: ${rotate}; + animation-duration: 0.3s; + animation-fill-mode: forwards; + } + + &:disabled { + cursor: not-allowed; + } +` diff --git a/client/src/components/Forms/RegistrationPipeline/components/CurrentStep/CurrentStep.jsx b/client/src/components/RegistrationPipeline/components/CurrentStep/CurrentStep.jsx similarity index 100% rename from client/src/components/Forms/RegistrationPipeline/components/CurrentStep/CurrentStep.jsx rename to client/src/components/RegistrationPipeline/components/CurrentStep/CurrentStep.jsx diff --git a/client/src/components/Forms/RegistrationPipeline/components/InitialPart/InitialPart.jsx b/client/src/components/RegistrationPipeline/components/InitialPart/InitialPart.jsx similarity index 88% rename from client/src/components/Forms/RegistrationPipeline/components/InitialPart/InitialPart.jsx rename to client/src/components/RegistrationPipeline/components/InitialPart/InitialPart.jsx index 874c8155a..132e0b42b 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/InitialPart/InitialPart.jsx +++ b/client/src/components/RegistrationPipeline/components/InitialPart/InitialPart.jsx @@ -4,13 +4,12 @@ import React, { useEffect } from 'react' import { useDispatch, useSelector } from 'react-redux' import { useNavigate } from 'react-router-dom' -import { useCheckAuth } from '../../../../../api/hooks/auth/useCheckAuth' -import Loader from '../../../../../shared/components/Loader/Loader' +import { useCheckAuth } from '../../../../api/hooks/auth/useCheckAuth' +import Loader from '../../../../shared/components/Loader/Loader' import { registrationAuth, setIsFinishRegistrationStarted, -} from '../../../../../store/reducers/RegistrationAuth' -import NavLogo from '../NavLogo/NavLogo' +} from '../../../../store/reducers/RegistrationAuth' // * Assets import { @@ -43,7 +42,6 @@ function InitialPart() { return ( <> -
diff --git a/client/src/components/Forms/RegistrationPipeline/components/InitialPart/InitialPart.styles.js b/client/src/components/RegistrationPipeline/components/InitialPart/InitialPart.styles.js similarity index 92% rename from client/src/components/Forms/RegistrationPipeline/components/InitialPart/InitialPart.styles.js rename to client/src/components/RegistrationPipeline/components/InitialPart/InitialPart.styles.js index fc429d38a..794628451 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/InitialPart/InitialPart.styles.js +++ b/client/src/components/RegistrationPipeline/components/InitialPart/InitialPart.styles.js @@ -1,6 +1,6 @@ import styled from 'styled-components' -import { BLACK, GREEN, WHITE } from '../../../../../constants/colors' +import { BLACK, GREEN, WHITE } from '../../../../constants/colors' export const CardContainer = styled.div` display: flex; @@ -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/MultiStepRegistration/MultiStepRegistration.jsx b/client/src/components/RegistrationPipeline/components/MultiStepRegistration/MultiStepRegistration.jsx similarity index 88% rename from client/src/components/Forms/RegistrationPipeline/components/MultiStepRegistration/MultiStepRegistration.jsx rename to client/src/components/RegistrationPipeline/components/MultiStepRegistration/MultiStepRegistration.jsx index b05886239..ef3e12a12 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/MultiStepRegistration/MultiStepRegistration.jsx +++ b/client/src/components/RegistrationPipeline/components/MultiStepRegistration/MultiStepRegistration.jsx @@ -2,8 +2,8 @@ import React, { useState } from 'react' import { useSelector } from 'react-redux' import { Form, Formik } from 'formik' -import { useCheckAuth } from '../../../../../api/hooks/auth/useCheckAuth' -import Loader from '../../../../../shared/components/Loader/Loader' +import { useCheckAuth } from '../../../../api/hooks/auth/useCheckAuth' +import Loader from '../../../../shared/components/Loader/Loader' import CurrentStep from '../CurrentStep/CurrentStep' import NavigationButtons from '../NavigationButtons/NavigationButtons' import NavLogo from '../NavLogo/NavLogo' @@ -21,14 +21,15 @@ const MultiStepRegistration = ({ const [oneOfOptionalFieldsHasValue, setOneOfOptionalFieldsHasValue] = useState(false) const { step, isOptionalStep } = useSelector((state) => state.registrationReducer) - const { data: userData } = useCheckAuth() + const { data: userData, isFetching } = useCheckAuth() const currentStepData = steps[step - 1] const isLastStep = step === steps.length const handleSubmit = (values) => { submitForm(values, userData) } - if (isFinishingRegistration) { + console.log(step) + if (isFetching) { return } @@ -41,6 +42,7 @@ const MultiStepRegistration = ({ {() => { return (
+ {isFinishingRegistration && } diff --git a/client/src/components/Forms/RegistrationPipeline/components/MultiStepRegistration/MultiStepRegistration.styles.js b/client/src/components/RegistrationPipeline/components/MultiStepRegistration/MultiStepRegistration.styles.js similarity index 92% rename from client/src/components/Forms/RegistrationPipeline/components/MultiStepRegistration/MultiStepRegistration.styles.js rename to client/src/components/RegistrationPipeline/components/MultiStepRegistration/MultiStepRegistration.styles.js index 8a9b92ffc..7138a75a2 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/MultiStepRegistration/MultiStepRegistration.styles.js +++ b/client/src/components/RegistrationPipeline/components/MultiStepRegistration/MultiStepRegistration.styles.js @@ -1,6 +1,6 @@ import styled from 'styled-components' -import { BLACK, WHITE } from '../../../../../constants/colors' +import { BLACK, WHITE } from '../../../../constants/colors' export const RegistrationContainer = styled.div` width: 100%; @@ -34,7 +34,7 @@ export const ResetButton = styled.button` ` export const StepContainer = styled.div` - margin-top: 5rem; + margin-top: 6rem; height: 100%; ` diff --git a/client/src/components/Forms/RegistrationPipeline/components/MultiStepRegistration/components/ButtonWithSkip/ButtonWithSkip.jsx b/client/src/components/RegistrationPipeline/components/MultiStepRegistration/components/ButtonWithSkip/ButtonWithSkip.jsx similarity index 85% rename from client/src/components/Forms/RegistrationPipeline/components/MultiStepRegistration/components/ButtonWithSkip/ButtonWithSkip.jsx rename to client/src/components/RegistrationPipeline/components/MultiStepRegistration/components/ButtonWithSkip/ButtonWithSkip.jsx index 810e3309e..844a521ea 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/MultiStepRegistration/components/ButtonWithSkip/ButtonWithSkip.jsx +++ b/client/src/components/RegistrationPipeline/components/MultiStepRegistration/components/ButtonWithSkip/ButtonWithSkip.jsx @@ -2,8 +2,8 @@ import React, { useEffect } from 'react' import { useDispatch, useSelector } from 'react-redux' import { useFormikContext } from 'formik' -import SkipArrow from '../../../../../../../assets/Arrows/SkipArrow' -import { setIsOptionalStep, setStep } from '../../../../../../../store/reducers/RegistrationAuth' +import SkipArrow from '../../../../../../assets/Arrows/SkipArrow' +import { setIsOptionalStep, setStep } from '../../../../../../store/reducers/RegistrationAuth' import FormButton from '../FormButton/FormButton' import { Skip, SkipButton } from './ButtonWithSkip.styles' diff --git a/client/src/components/Forms/RegistrationPipeline/components/MultiStepRegistration/components/ButtonWithSkip/ButtonWithSkip.styles.js b/client/src/components/RegistrationPipeline/components/MultiStepRegistration/components/ButtonWithSkip/ButtonWithSkip.styles.js similarity index 88% rename from client/src/components/Forms/RegistrationPipeline/components/MultiStepRegistration/components/ButtonWithSkip/ButtonWithSkip.styles.js rename to client/src/components/RegistrationPipeline/components/MultiStepRegistration/components/ButtonWithSkip/ButtonWithSkip.styles.js index d91b4b1bc..21eaa5657 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/MultiStepRegistration/components/ButtonWithSkip/ButtonWithSkip.styles.js +++ b/client/src/components/RegistrationPipeline/components/MultiStepRegistration/components/ButtonWithSkip/ButtonWithSkip.styles.js @@ -1,6 +1,6 @@ import styled from 'styled-components' -import { WHITE } from '../../../../../../../constants/colors' +import { WHITE } from '../../../../../../constants/colors' export const Skip = styled.div` display: flex; diff --git a/client/src/components/Forms/RegistrationPipeline/components/MultiStepRegistration/components/FormButton/FormButton.jsx b/client/src/components/RegistrationPipeline/components/MultiStepRegistration/components/FormButton/FormButton.jsx similarity index 78% rename from client/src/components/Forms/RegistrationPipeline/components/MultiStepRegistration/components/FormButton/FormButton.jsx rename to client/src/components/RegistrationPipeline/components/MultiStepRegistration/components/FormButton/FormButton.jsx index f4985187f..99f1a6433 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/MultiStepRegistration/components/FormButton/FormButton.jsx +++ b/client/src/components/RegistrationPipeline/components/MultiStepRegistration/components/FormButton/FormButton.jsx @@ -1,7 +1,7 @@ import React from 'react' import { useSelector } from 'react-redux' -import { Button } from '../../../../../../../shared/styles/Button.styles' +import { Button } from '../../../../../../shared/styles/Button.styles' const FormButton = () => { const { isLastStep } = useSelector((state) => state.registrationReducer) diff --git a/client/src/components/Forms/RegistrationPipeline/components/NavLogo/Hover.js b/client/src/components/RegistrationPipeline/components/NavLogo/Hover.js similarity index 64% rename from client/src/components/Forms/RegistrationPipeline/components/NavLogo/Hover.js rename to client/src/components/RegistrationPipeline/components/NavLogo/Hover.js index 0a858fcbd..beaae254d 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/NavLogo/Hover.js +++ b/client/src/components/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: '17px', + borderRadius: '5px', + '& .MuiPopover-paper': { + background: '#2F3239', + color: 'white', + }, }} open={open} anchorEl={anchorEl} @@ -23,8 +28,9 @@ export default function Hover({ open, handlePopoverClose, anchorEl }) { onClose={handlePopoverClose} 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/NavLogo/NavLogo.js b/client/src/components/RegistrationPipeline/components/NavLogo/NavLogo.js similarity index 91% rename from client/src/components/Forms/RegistrationPipeline/components/NavLogo/NavLogo.js rename to client/src/components/RegistrationPipeline/components/NavLogo/NavLogo.js index 0602bcfaa..269f277db 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/NavLogo/NavLogo.js +++ b/client/src/components/RegistrationPipeline/components/NavLogo/NavLogo.js @@ -3,8 +3,8 @@ import { useState } from 'react' import AppBar from '@mui/material/AppBar' import Box from '@mui/material/Box' -import InfoIcon from '../../../../../assets/InfoIcon' -import { Text } from '../../../../../shared/styles/Tpography.styles' +import InfoIcon from '../../../../assets/Shared/InfoIcon' +import { Text } from '../../../../shared/styles/Tpography.styles' // * Assets import Hover from './Hover' diff --git a/client/src/components/Forms/RegistrationPipeline/components/NavLogo/NavLogo.styles.js b/client/src/components/RegistrationPipeline/components/NavLogo/NavLogo.styles.js similarity index 77% rename from client/src/components/Forms/RegistrationPipeline/components/NavLogo/NavLogo.styles.js rename to client/src/components/RegistrationPipeline/components/NavLogo/NavLogo.styles.js index 5eaf6a6d1..e4d6425ef 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/NavLogo/NavLogo.styles.js +++ b/client/src/components/RegistrationPipeline/components/NavLogo/NavLogo.styles.js @@ -3,8 +3,8 @@ import Toolbar from '@mui/material/Toolbar' import styled from 'styled-components' // * Constants -import { GREEN } from '../../../../../constants/colors' -import { Text } from '../../../../../shared/styles/Tpography.styles' +import { GREEN } from '../../../../constants/colors' +import { Text } from '../../../../shared/styles/Tpography.styles' export const NavBar = styled(Toolbar)` background: #26292b; @@ -24,9 +24,12 @@ export const SectionName = styled(Text)` font-size: 2rem; color: ${GREEN.text}; line-height: 120%; + display: flex; + gap: 5px; ` export const SectionNameOptionalText = styled.span` color: #86878b; font-size: 16px; + font-weight: 400; ` diff --git a/client/src/components/Forms/RegistrationPipeline/components/NavigationButtons/NavigationButtons.jsx b/client/src/components/RegistrationPipeline/components/NavigationButtons/NavigationButtons.jsx similarity index 84% rename from client/src/components/Forms/RegistrationPipeline/components/NavigationButtons/NavigationButtons.jsx rename to client/src/components/RegistrationPipeline/components/NavigationButtons/NavigationButtons.jsx index 9c1823e67..051e78310 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/NavigationButtons/NavigationButtons.jsx +++ b/client/src/components/RegistrationPipeline/components/NavigationButtons/NavigationButtons.jsx @@ -3,11 +3,11 @@ import { useDispatch } from 'react-redux' import { useNavigate } from 'react-router-dom' import { useFormikContext } from 'formik' -import ArrowNavigateBack from '../../../../../assets/Arrows/ArrowNavigateBack' -import ArrowNavigateFurther from '../../../../../assets/Arrows/ArrowNavigateFurther' -import { GREEN } from '../../../../../constants/colors' -import CustomButton from '../../../../../shared/components/CustomButton/CustomButton' -import { setStep } from '../../../../../store/reducers/RegistrationAuth' +import ArrowNavigateBack from '../../../../assets/Arrows/ArrowNavigateBack' +import ArrowNavigateFurther from '../../../../assets/Arrows/ArrowNavigateFurther' +import { GREEN } from '../../../../constants/colors' +import CustomButton from '../../../../shared/components/CustomButton/CustomButton' +import { setStep } from '../../../../store/reducers/RegistrationAuth' import { ButtonsContainer } from './NavigationButtons.styles' diff --git a/client/src/components/Forms/RegistrationPipeline/components/NavigationButtons/NavigationButtons.styles.js b/client/src/components/RegistrationPipeline/components/NavigationButtons/NavigationButtons.styles.js similarity index 100% rename from client/src/components/Forms/RegistrationPipeline/components/NavigationButtons/NavigationButtons.styles.js rename to client/src/components/RegistrationPipeline/components/NavigationButtons/NavigationButtons.styles.js diff --git a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/AvatarForm.jsx b/client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/AvatarForm.jsx similarity index 100% rename from client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/AvatarForm.jsx rename to client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/AvatarForm.jsx diff --git a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/AvatarForm.styles.js b/client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/AvatarForm.styles.js similarity index 100% rename from client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/AvatarForm.styles.js rename to client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/AvatarForm.styles.js diff --git a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/AvatarSelection/AvatarSelection.jsx b/client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/AvatarSelection/AvatarSelection.jsx similarity index 100% rename from client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/AvatarSelection/AvatarSelection.jsx rename to client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/AvatarSelection/AvatarSelection.jsx diff --git a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/AvatarSelection/AvatarSelection.styles.js b/client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/AvatarSelection/AvatarSelection.styles.js similarity index 100% rename from client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/AvatarSelection/AvatarSelection.styles.js rename to client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/AvatarSelection/AvatarSelection.styles.js diff --git a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/ChooseAvatar.jsx b/client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/ChooseAvatar.jsx similarity index 100% rename from client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/ChooseAvatar.jsx rename to client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/ChooseAvatar.jsx diff --git a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/ChooseAvatar.styles.js b/client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/ChooseAvatar.styles.js similarity index 88% rename from client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/ChooseAvatar.styles.js rename to client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/ChooseAvatar.styles.js index 79d6ab899..af1199911 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/ChooseAvatar.styles.js +++ b/client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/ChooseAvatar.styles.js @@ -1,6 +1,6 @@ import styled, { css } from 'styled-components' -import selectedIcon from '../../../../../../../../assets/defaultAvatarSelectedIcon.svg' +import selectedIcon from '../../../../../../../assets/Avatars/defaultAvatarSelectedIcon.svg' export const ChooseAvatarContainer = styled.div` flex: 1; @@ -17,11 +17,11 @@ export const DefaultAvatarContainer = styled.li` margin-bottom: 2rem; &:hover { - img{ + img { mix-blend-mode: overlay; } } - + ${({ selected }) => selected && css` @@ -39,8 +39,7 @@ export const DefaultAvatarContainer = styled.li` img { mix-blend-mode: overlay; } - `}} - + `} ` export const DefaultAvatar = styled.img` diff --git a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/components/CustomDropZone/CustomDropZone.jsx b/client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/components/CustomDropZone/CustomDropZone.jsx similarity index 94% rename from client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/components/CustomDropZone/CustomDropZone.jsx rename to client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/components/CustomDropZone/CustomDropZone.jsx index c3ba72a68..a5e586b72 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/components/CustomDropZone/CustomDropZone.jsx +++ b/client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/components/CustomDropZone/CustomDropZone.jsx @@ -1,7 +1,7 @@ import React, { useState } from 'react' import Dropzone from 'react-dropzone' -import { ReactComponent as UploadAvatarIcon } from '../../../../../../../../../../assets/uploadAvatarIcon.svg' +import { ReactComponent as UploadAvatarIcon } from '../../../../../../../../../assets/Avatars/uploadAvatarIcon.svg' import { DropzoneContent, DropzoneText } from './CustomDropZone.styles' diff --git a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/components/CustomDropZone/CustomDropZone.styles.js b/client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/components/CustomDropZone/CustomDropZone.styles.js similarity index 100% rename from client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/components/CustomDropZone/CustomDropZone.styles.js rename to client/src/components/RegistrationPipeline/components/RegistrationForms/AvatarForm/components/ChooseAvatar/components/CustomDropZone/CustomDropZone.styles.js diff --git a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/InfoForm/InfoForm.styles.js b/client/src/components/RegistrationPipeline/components/RegistrationForms/InfoForm/InfoForm.styles.js similarity index 100% rename from client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/InfoForm/InfoForm.styles.js rename to client/src/components/RegistrationPipeline/components/RegistrationForms/InfoForm/InfoForm.styles.js diff --git a/client/src/components/RegistrationPipeline/components/RegistrationForms/InfoForm/TeamInfoForm/TeamInfoForm.jsx b/client/src/components/RegistrationPipeline/components/RegistrationForms/InfoForm/TeamInfoForm/TeamInfoForm.jsx new file mode 100644 index 000000000..1aaf7eda5 --- /dev/null +++ b/client/src/components/RegistrationPipeline/components/RegistrationForms/InfoForm/TeamInfoForm/TeamInfoForm.jsx @@ -0,0 +1,100 @@ +import React, { useEffect, useState } from 'react' +import countryList from 'react-select-country-list' + +import { useGetByTag } from '../../../../../../api/hooks/team/useGetByTag' +import { useDebounce } from '../../../../../../api/hooks/temeights/useDebounce' +import { teamTypes } from '../../../../../../constants/teamFormData' +import CustomInput from '../../../../../../shared/components/CustomInput/CustomInput' +import { + GroupContainer, + SectionContainer, +} from '../../../../../../shared/components/CustomInput/CustomInput.styles' +import CustomSelect from '../../../../../../shared/components/CustomSelect/CustomSelect' +import CustomTextArea from '../../../../../../shared/components/CustomTextArea/CustomTextArea' +import { InputsContainer } from '../InfoForm.styles' + +const TeamInfoForm = () => { + const countriesOptions = React.useMemo(() => countryList().getData(), []) + let { mutate: getTeamByTag, data: errorStatus } = useGetByTag() + + // State and setters for ... + // Search term + const [searchTerm, setSearchTerm] = useState('') + + // Searching status (whether there is pending API request) + const [isSearching, setIsSearching] = useState(false) + // Debounce search term so that it only gives us latest value ... + // ... if searchTerm has not been updated within last 500ms. + // The goal is to only have the API call fire when user stops typing ... + // ... so that we aren't hitting our API rapidly. + const debouncedSearchTerm = useDebounce(searchTerm, 500) + + // Effect for API call + useEffect( + () => { + if (debouncedSearchTerm) { + setIsSearching(true) + getTeamByTag(debouncedSearchTerm) + } else { + // setResults([]) + setIsSearching(false) + } + }, + [debouncedSearchTerm], // Only call effect if debounced search term changes + ) + + const handleSearchInputChange = (value) => { + setSearchTerm(value) // Update the search term state with the input value + } + + return ( + <> + + + + + + + + + + + + + + + + + + + + + ) +} + +export default TeamInfoForm diff --git a/client/src/components/RegistrationPipeline/components/RegistrationForms/InfoForm/UserInfoForm/UserInfoForm.jsx b/client/src/components/RegistrationPipeline/components/RegistrationForms/InfoForm/UserInfoForm/UserInfoForm.jsx new file mode 100644 index 000000000..f43e4216f --- /dev/null +++ b/client/src/components/RegistrationPipeline/components/RegistrationForms/InfoForm/UserInfoForm/UserInfoForm.jsx @@ -0,0 +1,101 @@ +import React, { useEffect, useState } from 'react' +import countryList from 'react-select-country-list' + +import { useValidateUsername } from '../../../../../../api/hooks/auth/useValidateUsername' +import { useDebounce } from '../../../../../../api/hooks/temeights/useDebounce' +import CustomInput from '../../../../../../shared/components/CustomInput/CustomInput' +import { + GroupContainer, + SectionContainer, +} from '../../../../../../shared/components/CustomInput/CustomInput.styles' +import CustomSelect from '../../../../../../shared/components/CustomSelect/CustomSelect' +import CustomTextArea from '../../../../../../shared/components/CustomTextArea/CustomTextArea' +import { InputsContainer } from '../InfoForm.styles' + +const UserInfoForm = () => { + const countriesOptions = React.useMemo(() => countryList().getData(), []) + + let { mutate: validateUsername, data: errorStatus } = useValidateUsername() + + // State and setters for ... + // Search term + const [searchTerm, setSearchTerm] = useState('') + + // Searching status (whether there is pending API request) + const [isSearching, setIsSearching] = useState(false) + // Debounce search term so that it only gives us latest value ... + // ... if searchTerm has not been updated within last 500ms. + // The goal is to only have the API call fire when user stops typing ... + // ... so that we aren't hitting our API rapidly. + const debouncedSearchTerm = useDebounce(searchTerm, 500) + + // Effect for API call + useEffect( + () => { + if (debouncedSearchTerm) { + setIsSearching(true) + validateUsername(debouncedSearchTerm) + } else { + // setResults([]) + setIsSearching(false) + } + }, + [debouncedSearchTerm], // Only call effect if debounced search term changes + ) + + const handleSearchInputChange = (value) => { + setSearchTerm(value) // Update the search term state with the input value + } + + return ( + <> + + + + + + + + + + + + + + + + + + + + + ) +} + +export default UserInfoForm diff --git a/client/src/components/RegistrationPipeline/components/RegistrationForms/InfoForm/index.jsx b/client/src/components/RegistrationPipeline/components/RegistrationForms/InfoForm/index.jsx new file mode 100644 index 000000000..c8af93211 --- /dev/null +++ b/client/src/components/RegistrationPipeline/components/RegistrationForms/InfoForm/index.jsx @@ -0,0 +1,23 @@ +import React from 'react' + +import { useCheckAuth } from '../../../../../api/hooks/auth/useCheckAuth' +import Loader from '../../../../../shared/components/Loader/Loader' +import { ContentContainer } from '../../MultiStepRegistration/MultiStepRegistration.styles' + +import TeamInfoForm from './TeamInfoForm/TeamInfoForm' +import UserInfoForm from './UserInfoForm/UserInfoForm' + +const InfoForm = () => { + const { data: user, isLoading: isUserLoading } = useCheckAuth() + + return ( + <> + {isUserLoading && } + + {user?.isRegistered ? : } + + + ) +} + +export default InfoForm diff --git a/client/src/components/RegistrationPipeline/components/RegistrationForms/InviteMembersForm/InviteMembersForm.jsx b/client/src/components/RegistrationPipeline/components/RegistrationForms/InviteMembersForm/InviteMembersForm.jsx new file mode 100644 index 000000000..1a27758f1 --- /dev/null +++ b/client/src/components/RegistrationPipeline/components/RegistrationForms/InviteMembersForm/InviteMembersForm.jsx @@ -0,0 +1,97 @@ +import { useState } from 'react' +import { useFormikContext } from 'formik' + +import AddUserIcon from '../../../../../assets/Shared/AddUserIcon' +import DeleteIcon from '../../../../../assets/Shared/DeleteIcon' +import { LOCAL_PATH } from '../../../../../http' +import AutocompleteInput from '../../../../../shared/components/AutocompleteInput/AutocompleteInput' +import { errorToaster } from '../../../../../shared/components/Toasters/Error.toaster' +import { ContentContainer } from '../../MultiStepRegistration/MultiStepRegistration.styles' + +import { + CustomButton, + InviteArea, + InvitedUser, + InvitedUsersContainer, + InviteFormText, + UserAvatar, + UsernameAvatarContainer, + UserText, +} from './InviteMembersForm.styles' + +const InviteMembersForm = () => { + const [value, setValue] = useState(null) + + const { setFieldValue, setTouched, values } = useFormikContext() + + const addUsersToInviteQueue = () => { + let members = values.members + + const exists = members.some((item) => item.id === value.id) + + if (!exists && members.length < 8) { + members.push(value) + + setFieldValue('members', members) + + setTouched({ members: true }) + } + + if (members.length === 8) { + errorToaster('Only 8 members per team!') + } + } + + const removeUserFromInviteQueue = (member) => { + let members = values.members + + const filteredArray = members.filter((obj) => { + return obj.id !== member.id + }) + + setFieldValue('members', filteredArray) + } + + return ( + + + You can invite up to 7 members to join your team. Send invites now or later.
+ Team members can be removed as needed. +
+ + + + + Send invite + + + + {values.members.map((member, index) => { + return ( + + + + {member?.username} + + {index === 0 ? ( + // Render without delete icon for the first user +
+ + this is you. + +
+ ) : ( + // Render with delete icon for other users +
removeUserFromInviteQueue(member)}> + +
+ )} +
+ ) + })} +
+
+ ) +} + +export default InviteMembersForm diff --git a/client/src/components/RegistrationPipeline/components/RegistrationForms/InviteMembersForm/InviteMembersForm.styles.js b/client/src/components/RegistrationPipeline/components/RegistrationForms/InviteMembersForm/InviteMembersForm.styles.js new file mode 100644 index 000000000..6e6391774 --- /dev/null +++ b/client/src/components/RegistrationPipeline/components/RegistrationForms/InviteMembersForm/InviteMembersForm.styles.js @@ -0,0 +1,89 @@ +import styled from 'styled-components' + +export const InviteFormText = styled.p` + color: #fff; + font-weight: 400; +` + +export const InviteArea = styled.div` + display: flex; + gap: 16px; +` + +export const CustomButton = styled.button` + width: 142px; + height: 48px; + + background: #46a11b; + border-radius: 10px; + font-size: 16px; + font-weight: 400; + color: white; + border: none; + cursor: pointer; + + display: flex; + align-items: center; + justify-content: center; + + gap: 6px; + + &:hover { + -webkit-transform: scale(1.01); + -ms-transform: scale(1.01); + transform: scale(1.01); + } +` + +export const InvitedUsersContainer = styled.div` + display: grid; + grid-template-columns: repeat(2, 270px); + grid-template-rows: repeat(4, 58px); + grid-gap: 16px 30px; /* Adjust the gap between grid items as desired */ + grid-auto-flow: dense; /* Fills in empty spaces */ +` + +export const InvitedUser = styled.div` + width: 270px; + height: 58px; + background-color: inherit; + flex-wrap: wrap; + + display: flex; + justify-content: space-between; + align-items: center; + padding: 5px; + + &:hover { + cursor: pointer; + background: #2f3239; + } +` + +export const UserAvatar = styled.img` + width: 50px; + height: 50px; + border-radius: 50%; +` + +export const UserText = styled.h1` + font-size: ${(props) => props.fontSize || '18px'}; + font-weight: 400; + color: ${(props) => props.color || 'white'}; +` + +export const UsernameAvatarContainer = styled.div` + display: flex; + align-items: center; + gap: 12px; +` + +// export const DeleteContainer = styled.div` +// cursor: pointer; + +// &:hover { +// -webkit-transform: scale(1.01); +// -ms-transform: scale(1.01); +// transform: scale(1.01); +// } +// ` diff --git a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/UserConcentrationForm/UserConcentrationForm.jsx b/client/src/components/RegistrationPipeline/components/RegistrationForms/UserConcentrationForm/UserConcentrationForm.jsx similarity index 70% rename from client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/UserConcentrationForm/UserConcentrationForm.jsx rename to client/src/components/RegistrationPipeline/components/RegistrationForms/UserConcentrationForm/UserConcentrationForm.jsx index b135fe474..24c67e450 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/UserConcentrationForm/UserConcentrationForm.jsx +++ b/client/src/components/RegistrationPipeline/components/RegistrationForms/UserConcentrationForm/UserConcentrationForm.jsx @@ -1,8 +1,8 @@ import React from 'react' -import { userConcentrations } from '../../../../../../constants/finishRegistrationData' -import SelectValue from '../../../../../../shared/components/CustomSelect/components/SelectValue' -import CustomSelect from '../../../../../../shared/components/CustomSelect/CustomSelect' +import { userConcentrations } from '../../../../../constants/finishRegistrationData' +import SelectValue from '../../../../../shared/components/CustomSelect/components/SelectValue' +import CustomSelect from '../../../../../shared/components/CustomSelect/CustomSelect' import { ContentContainer } from '../../MultiStepRegistration/MultiStepRegistration.styles' const UserConcentrationForm = () => { diff --git a/client/src/components/RegistrationPipeline/components/RegistrationForms/UserEducationForm/UserEducationForm.jsx b/client/src/components/RegistrationPipeline/components/RegistrationForms/UserEducationForm/UserEducationForm.jsx new file mode 100644 index 000000000..7910e368f --- /dev/null +++ b/client/src/components/RegistrationPipeline/components/RegistrationForms/UserEducationForm/UserEducationForm.jsx @@ -0,0 +1,77 @@ +import React, { useState } from 'react' +import { useFormikContext } from 'formik' + +import CustomInput from '../../../../../shared/components/CustomInput/CustomInput' +import CheckboxWithLabel from '../../CheckboxWithLabel/CheckboxWithLabel' +import { ContentContainer } from '../../MultiStepRegistration/MultiStepRegistration.styles' + +import { GroupItems, InputWrapper } from './UserEducationForm.styles' + +const UserEducationForm = () => { + const [checkbox, setCheckbox] = useState(false) + const { setFieldValue } = useFormikContext() + + const handleClick = () => { + if (checkbox) { + setCheckbox(false) + setFieldValue('graduationDate', '') + } else { + setCheckbox(true) + setFieldValue('graduationDate', '0') + } + } + + return ( + + + + + + + + + + + + + + + + + + + + + ) +} + +export default UserEducationForm diff --git a/client/src/components/RegistrationPipeline/components/RegistrationForms/UserEducationForm/UserEducationForm.styles.js b/client/src/components/RegistrationPipeline/components/RegistrationForms/UserEducationForm/UserEducationForm.styles.js new file mode 100644 index 000000000..ab8c55a1b --- /dev/null +++ b/client/src/components/RegistrationPipeline/components/RegistrationForms/UserEducationForm/UserEducationForm.styles.js @@ -0,0 +1,12 @@ +import styled from 'styled-components' + +export const GroupItems = styled.div` + display: flex; + justify-content: space-around; + gap: 130px; +` + +export const InputWrapper = styled.div` + flex-grow: ${(props) => props.grow || '1'}; + width: ${(props) => props.width || '100%'}; +` diff --git a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/UserExperienceForm/UserExperienceForm.jsx b/client/src/components/RegistrationPipeline/components/RegistrationForms/UserExperienceForm/UserExperienceForm.jsx similarity index 82% rename from client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/UserExperienceForm/UserExperienceForm.jsx rename to client/src/components/RegistrationPipeline/components/RegistrationForms/UserExperienceForm/UserExperienceForm.jsx index ff2da14dd..1816c04ed 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/UserExperienceForm/UserExperienceForm.jsx +++ b/client/src/components/RegistrationPipeline/components/RegistrationForms/UserExperienceForm/UserExperienceForm.jsx @@ -3,15 +3,15 @@ import React from 'react' import { userExperienceOptions, userLeaderOptions, -} from '../../../../../../constants/finishRegistrationData' -import CustomRadioButtonsGroup from '../../../../../../shared/components/CustomRadioButtonsGroup/CustomRadioButtonsGroup' +} from '../../../../../constants/finishRegistrationData' +import CustomRadioButtonsGroup from '../../../../../shared/components/CustomRadioButtonsGroup/CustomRadioButtonsGroup' import { ContentContainer } from '../../MultiStepRegistration/MultiStepRegistration.styles' import { NoteContainer, NoteText, QuestionSection, QuestionText } from './UserExperienceForm.styles' const UserExperienceForm = () => { return ( - + How many years of experience you have? diff --git a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/UserExperienceForm/UserExperienceForm.styles.js b/client/src/components/RegistrationPipeline/components/RegistrationForms/UserExperienceForm/UserExperienceForm.styles.js similarity index 76% rename from client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/UserExperienceForm/UserExperienceForm.styles.js rename to client/src/components/RegistrationPipeline/components/RegistrationForms/UserExperienceForm/UserExperienceForm.styles.js index cc2c212d8..479212560 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/UserExperienceForm/UserExperienceForm.styles.js +++ b/client/src/components/RegistrationPipeline/components/RegistrationForms/UserExperienceForm/UserExperienceForm.styles.js @@ -1,6 +1,6 @@ import styled from 'styled-components' -import { Text } from '../../../../../../shared/styles/Tpography.styles' +import { Text } from '../../../../../shared/styles/Tpography.styles' export const QuestionSection = styled.div` display: flex; @@ -9,7 +9,8 @@ export const QuestionSection = styled.div` export const QuestionText = styled(Text)` margin-bottom: 1.5rem; - font-size: 24px; + font-size: 22px; + font-weight: 400; ` export const NoteContainer = styled.div` diff --git a/client/src/components/RegistrationPipeline/components/RegistrationForms/UserJobForm/UserJobForm.jsx b/client/src/components/RegistrationPipeline/components/RegistrationForms/UserJobForm/UserJobForm.jsx new file mode 100644 index 000000000..0c94f0082 --- /dev/null +++ b/client/src/components/RegistrationPipeline/components/RegistrationForms/UserJobForm/UserJobForm.jsx @@ -0,0 +1,70 @@ +import React, { useState } from 'react' +import { useFormikContext } from 'formik' + +import CustomInput from '../../../../../shared/components/CustomInput/CustomInput' +import CheckboxWithLabel from '../../CheckboxWithLabel/CheckboxWithLabel' +import { ContentContainer } from '../../MultiStepRegistration/MultiStepRegistration.styles' +import { GroupItems, InputWrapper } from '../UserEducationForm/UserEducationForm.styles' + +const UserJobForm = () => { + const [checkbox, setCheckbox] = useState(false) + const { setFieldValue } = useFormikContext() + + const handleClick = () => { + if (checkbox) { + setCheckbox(false) + setFieldValue('endDate', '') + } else { + setCheckbox(true) + setFieldValue('endDate', '0') + } + } + + return ( + + + + + + + + + + + + + + + + + + + + ) +} + +export default UserJobForm diff --git a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/UserLinksForm/UserLinksForm.jsx b/client/src/components/RegistrationPipeline/components/RegistrationForms/UserLinksForm/UserLinksForm.jsx similarity index 62% rename from client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/UserLinksForm/UserLinksForm.jsx rename to client/src/components/RegistrationPipeline/components/RegistrationForms/UserLinksForm/UserLinksForm.jsx index c52c092c0..676200a60 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/RegistrationForms/UserLinksForm/UserLinksForm.jsx +++ b/client/src/components/RegistrationPipeline/components/RegistrationForms/UserLinksForm/UserLinksForm.jsx @@ -1,8 +1,8 @@ import React from 'react' -import { userLinks } from '../../../../../../constants/finishRegistrationData' -import CustomInput from '../../../../../../shared/components/CustomInput/CustomInput' -import { InputWithIConWrapper } from '../../../../../../shared/components/CustomInput/CustomInput.styles' +import { userLinks } from '../../../../../constants/finishRegistrationData' +import CustomInput from '../../../../../shared/components/CustomInput/CustomInput' +import { InputWithIConWrapper } from '../../../../../shared/components/CustomInput/CustomInput.styles' import { ContentContainer } from '../../MultiStepRegistration/MultiStepRegistration.styles' const UserLinksForm = () => { @@ -16,8 +16,7 @@ const UserLinksForm = () => { name={link.name} type="text" containerWidth="100%" - inputWidth="70%" - placeholder="add link (optional)" + placeholder="add link" /> ))} diff --git a/client/src/components/Forms/RegistrationPipeline/components/Stepper/Stepper.js b/client/src/components/RegistrationPipeline/components/Stepper/Stepper.js similarity index 97% rename from client/src/components/Forms/RegistrationPipeline/components/Stepper/Stepper.js rename to client/src/components/RegistrationPipeline/components/Stepper/Stepper.js index 3563a2e96..faa76750d 100644 --- a/client/src/components/Forms/RegistrationPipeline/components/Stepper/Stepper.js +++ b/client/src/components/RegistrationPipeline/components/Stepper/Stepper.js @@ -8,7 +8,7 @@ import { styled } from '@mui/material/styles' import PropTypes from 'prop-types' // * Constants -import { GREEN } from '../../../../../constants/colors' +import { GREEN } from '../../../../constants/colors' // * Components import { CustomStepper, StepperContainer } from './Stepper.styles' diff --git a/client/src/components/Forms/RegistrationPipeline/components/Stepper/Stepper.styles.js b/client/src/components/RegistrationPipeline/components/Stepper/Stepper.styles.js similarity index 100% rename from client/src/components/Forms/RegistrationPipeline/components/Stepper/Stepper.styles.js rename to client/src/components/RegistrationPipeline/components/Stepper/Stepper.styles.js diff --git a/client/src/components/Forms/RegistrationPipeline/index.js b/client/src/components/RegistrationPipeline/index.js similarity index 68% rename from client/src/components/Forms/RegistrationPipeline/index.js rename to client/src/components/RegistrationPipeline/index.js index bf48ffb5d..f11d29a86 100644 --- a/client/src/components/Forms/RegistrationPipeline/index.js +++ b/client/src/components/RegistrationPipeline/index.js @@ -3,11 +3,14 @@ import React from 'react' import { useDispatch, useSelector } from 'react-redux' import { useNavigate } from 'react-router-dom' -import { useEditUserDetails } from '../../../api/hooks/auth/useEditUserDetails' -import { useUpdateAvatar } from '../../../api/hooks/auth/useUpdateAvatar' -import { defaultUserAvatars } from '../../../constants/finishRegistrationData' -import { finishRegistrationValidation } from '../../../schemas' -import { setIsFinishRegistrationStarted } from '../../../store/reducers/RegistrationAuth' +import { useEditUserDetails } from '../../api/hooks/auth/useEditUserDetails' +import { useUpdateAvatar } from '../../api/hooks/auth/useUpdateAvatar' +import { defaultUserAvatars } from '../../constants/finishRegistrationData' +import { finishRegistrationValidation } from '../../schemas' +import { setIsFinishRegistrationStarted, setStep } from '../../store/reducers/RegistrationAuth' +import { formatDateString } from '../../utils/convertStringToDate' +import { convertYearToDate } from '../../utils/convertYearToDate' +import { removeEmptyFields } from '../../utils/removeEmptyFields' import InitialPart from './components/InitialPart/InitialPart' import MultiStepRegistration from './components/MultiStepRegistration/MultiStepRegistration' @@ -16,6 +19,7 @@ import InfoForm from './components/RegistrationForms/InfoForm' import UserConcentrationForm from './components/RegistrationForms/UserConcentrationForm/UserConcentrationForm' import UserEducationForm from './components/RegistrationForms/UserEducationForm/UserEducationForm' import UserExperienceForm from './components/RegistrationForms/UserExperienceForm/UserExperienceForm' +import UserJobForm from './components/RegistrationForms/UserJobForm/UserJobForm' import UserLinksForm from './components/RegistrationForms/UserLinksForm/UserLinksForm' function FinishRegistration() { @@ -31,6 +35,7 @@ function FinishRegistration() { { component: , name: 'Concentration', isOptional: false }, { component: , name: 'Experience', isOptional: false }, { component: , name: 'Education', isOptional: true }, + { component: , name: 'Work Experience', isOptional: true }, { component: , name: 'Links', isOptional: true }, { component: ( @@ -48,7 +53,7 @@ function FinishRegistration() { fullName: '', country: '', username: '', - age: '', + dateOfBirth: '', description: '', programmingLanguages: [], frameworks: [], @@ -56,8 +61,14 @@ function FinishRegistration() { experience: '', leader: '', university: '', + degree: ``, major: '', + addmissionDate: '', graduationDate: '', + title: '', + company: '', + startDate: '', + endDate: '', github: '', linkedIn: '', telegram: '', @@ -66,15 +77,39 @@ function FinishRegistration() { function onSuccess() { dispatch(setIsFinishRegistrationStarted(false)) + dispatch(setStep(1)) navigate('/', { replace: true }) } const submitForm = (formData, userCurrentData) => { + let universityDates = convertYearToDate(formData.addmissionDate, formData.graduationDate) + + let jobDates = convertYearToDate(formData.startDate, formData.endDate) + + let universityData = { + university: formData.university, + degree: formData.degree, + major: formData.major, + addmissionDate: universityDates.dateOne, + graduationDate: universityDates.dateTwo, + } + + let universityValidated = removeEmptyFields(universityData) + + let jobData = { + title: formData.title, + company: formData.company, + startDate: jobDates.dateOne, + endDate: jobDates.dateTwo, + } + + let jobValidated = removeEmptyFields(jobData) + const registrationData = { email: userCurrentData.email, username: formData.username, fullName: formData.fullName, - age: formData.age, + dateOfBirth: formatDateString(formData.dateOfBirth), description: formData.description, concentration: formData.concentration, country: formData.country, @@ -87,9 +122,8 @@ function FinishRegistration() { }, programmingLanguages: formData.programmingLanguages, frameworks: formData.frameworks, - university: formData.university, - major: formData.major, - graduationDate: formData.graduationDate.toString(), + jobData: jobValidated !== null ? jobValidated : undefined, + universityData: universityValidated !== null ? universityValidated : undefined, isRegistered: false, } diff --git a/client/src/components/SnackBar/SnackBar.js b/client/src/components/SnackBar/SnackBar.js deleted file mode 100644 index ed928b48c..000000000 --- a/client/src/components/SnackBar/SnackBar.js +++ /dev/null @@ -1,29 +0,0 @@ -import React from 'react' -import Snackbar from '@mui/material/Snackbar' -import { isEqual } from 'lodash' - -import { AlertBox } from './SnackBar.styles' - -const SnackBar = ({ open, handleClose, error, vertical = 'top' }) => { - 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/screens/UsersList/UsersList.js b/client/src/components/Teammates/Teammates.js similarity index 50% rename from client/src/screens/UsersList/UsersList.js rename to client/src/components/Teammates/Teammates.js index 13457e9b0..f17521373 100644 --- a/client/src/screens/UsersList/UsersList.js +++ b/client/src/components/Teammates/Teammates.js @@ -1,32 +1,31 @@ // * 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' +// * Components +import Filters from './components/FiltersArea/Filters' import NotFound from './components/NotFound/NotFound' import SliderToTop from './components/SliderToTop/SliderToTop' -// * Components -import TopBar from './components/TopBar/TopBar' import UserProfile from './components/UserProfile/UserProfile' import UserProfilePhone from './components/UserProfilePhone/UserProfilePhone' // * Styles import { CardsContainer, CardsZone, - GlobalStyle, 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) @@ -67,42 +66,43 @@ function UsersList() { 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 ? ( + + + + ) : ( + + + + + + + + + )} + ) } -export default UsersList +export default Teammates diff --git a/client/src/screens/UsersList/UsersList.styles.js b/client/src/components/Teammates/Teammates.styles.js similarity index 64% rename from client/src/screens/UsersList/UsersList.styles.js rename to client/src/components/Teammates/Teammates.styles.js index e211f5f24..8b7a790a6 100644 --- a/client/src/screens/UsersList/UsersList.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/screens/UsersList/components/CardSkeleton/CardSkeleton.js b/client/src/components/Teammates/components/CardSkeleton/CardSkeleton.js similarity index 100% rename from client/src/screens/UsersList/components/CardSkeleton/CardSkeleton.js rename to client/src/components/Teammates/components/CardSkeleton/CardSkeleton.js diff --git a/client/src/screens/UsersList/components/CardSkeleton/CardSkeleton.styles.js b/client/src/components/Teammates/components/CardSkeleton/CardSkeleton.styles.js similarity index 100% rename from client/src/screens/UsersList/components/CardSkeleton/CardSkeleton.styles.js rename to client/src/components/Teammates/components/CardSkeleton/CardSkeleton.styles.js diff --git a/client/src/screens/UsersList/components/Cards/Cards.js b/client/src/components/Teammates/components/Cards/Cards.js similarity index 100% rename from client/src/screens/UsersList/components/Cards/Cards.js rename to client/src/components/Teammates/components/Cards/Cards.js diff --git a/client/src/screens/UsersList/components/Cards/Cards.styles.js b/client/src/components/Teammates/components/Cards/Cards.styles.js similarity index 100% rename from client/src/screens/UsersList/components/Cards/Cards.styles.js rename to client/src/components/Teammates/components/Cards/Cards.styles.js diff --git a/client/src/screens/UsersList/components/TopBar/Contentration.options.js b/client/src/components/Teammates/components/FiltersArea/Contentration.options.js similarity index 100% rename from client/src/screens/UsersList/components/TopBar/Contentration.options.js rename to client/src/components/Teammates/components/FiltersArea/Contentration.options.js diff --git a/client/src/screens/UsersList/components/TopBar/TopBar.js b/client/src/components/Teammates/components/FiltersArea/Filters.js similarity index 95% rename from client/src/screens/UsersList/components/TopBar/TopBar.js rename to client/src/components/Teammates/components/FiltersArea/Filters.js index 9fb91e48f..66731503f 100644 --- a/client/src/screens/UsersList/components/TopBar/TopBar.js +++ b/client/src/components/Teammates/components/FiltersArea/Filters.js @@ -5,12 +5,10 @@ import countryList from 'react-select-country-list' import AppBar from '@mui/material/AppBar' import { Form, Formik } from 'formik' -import Filters from '../../../../assets/Filters' +import Filters from '../../../../assets/Filters/Filters' // * Assets -import PlatformLogo from '../../../../assets/PlatformLogo' -import Search from '../../../../assets/SearchIcon' +import Search from '../../../../assets/Filters/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' @@ -19,17 +17,15 @@ import { PlaceholderText } from '../SelectField/SelectField.styles' // * Options import { concentrationOptions } from './Contentration.options' -import { programmingLanguageOptions } from './ProgrammingLanguages.options' import { - AlternativeLogoContainer, BoxContainer, Button, FilterContainer, FilterText, - LogoContainer, NavBar, SelectContainer, -} from './TopBar.styles' +} from './Filters.styles' +import { programmingLanguageOptions } from './ProgrammingLanguages.options' const TopBar = ({ setDisplayFiltered, displayFiltered }) => { const [filterBar, setFilterBar] = useState(false) diff --git a/client/src/screens/UsersList/components/TopBar/TopBar.styles.js b/client/src/components/Teammates/components/FiltersArea/Filters.styles.js similarity index 100% rename from client/src/screens/UsersList/components/TopBar/TopBar.styles.js rename to client/src/components/Teammates/components/FiltersArea/Filters.styles.js diff --git a/client/src/screens/UsersList/components/TopBar/ProgrammingLanguages.options.js b/client/src/components/Teammates/components/FiltersArea/ProgrammingLanguages.options.js similarity index 100% rename from client/src/screens/UsersList/components/TopBar/ProgrammingLanguages.options.js rename to client/src/components/Teammates/components/FiltersArea/ProgrammingLanguages.options.js diff --git a/client/src/screens/UsersList/components/TopBar/Filters/Countries.js b/client/src/components/Teammates/components/FiltersArea/SpecificFilters/Countries.js similarity index 100% rename from client/src/screens/UsersList/components/TopBar/Filters/Countries.js rename to client/src/components/Teammates/components/FiltersArea/SpecificFilters/Countries.js diff --git a/client/src/screens/UsersList/components/TopBar/Filters/ProgrammingLanguages.js b/client/src/components/Teammates/components/FiltersArea/SpecificFilters/ProgrammingLanguages.js similarity index 100% rename from client/src/screens/UsersList/components/TopBar/Filters/ProgrammingLanguages.js rename to client/src/components/Teammates/components/FiltersArea/SpecificFilters/ProgrammingLanguages.js diff --git a/client/src/screens/UsersList/components/TopBar/Filters/Roles.js b/client/src/components/Teammates/components/FiltersArea/SpecificFilters/Roles.js similarity index 100% rename from client/src/screens/UsersList/components/TopBar/Filters/Roles.js rename to client/src/components/Teammates/components/FiltersArea/SpecificFilters/Roles.js diff --git a/client/src/screens/UsersList/components/FiltersMenu/FiltersMenu.js b/client/src/components/Teammates/components/FiltersMenu/FiltersMenu.js similarity index 90% rename from client/src/screens/UsersList/components/FiltersMenu/FiltersMenu.js rename to client/src/components/Teammates/components/FiltersMenu/FiltersMenu.js index 4640a5da0..3fe68c171 100644 --- a/client/src/screens/UsersList/components/FiltersMenu/FiltersMenu.js +++ b/client/src/components/Teammates/components/FiltersMenu/FiltersMenu.js @@ -2,15 +2,12 @@ import React from 'react' import { useFormikContext } from 'formik' -import Close from '../../../../assets/Close' // * Assets -import Filters from '../../../../assets/Filters' +import Filters from '../../../../assets/Filters/Filters' +import Close from '../../../../assets/Shared/Close' import frameworkOptions from '../../../../constants/frameworks' import SelectValue from '../../../../shared/components/CustomSelect/components/SelectValue' import CustomSelect from '../../../../shared/components/CustomSelect/CustomSelect' -import { PlaceholderText } from '../SelectField/SelectField.styles' -import { concentrationOptions } from '../TopBar/Contentration.options' -import { programmingLanguageOptions } from '../TopBar/ProgrammingLanguages.options' // * Styles import { diff --git a/client/src/screens/UsersList/components/FiltersMenu/FiltersMenu.styles.js b/client/src/components/Teammates/components/FiltersMenu/FiltersMenu.styles.js similarity index 100% rename from client/src/screens/UsersList/components/FiltersMenu/FiltersMenu.styles.js rename to client/src/components/Teammates/components/FiltersMenu/FiltersMenu.styles.js diff --git a/client/src/screens/UsersList/components/NotFound/NotFound.js b/client/src/components/Teammates/components/NotFound/NotFound.js similarity index 91% rename from client/src/screens/UsersList/components/NotFound/NotFound.js rename to client/src/components/Teammates/components/NotFound/NotFound.js index 052fb6d6d..3824c97f8 100644 --- a/client/src/screens/UsersList/components/NotFound/NotFound.js +++ b/client/src/components/Teammates/components/NotFound/NotFound.js @@ -1,5 +1,5 @@ // * Assets -import NonFound from '../../../../assets/NonFound' +import NonFound from '../../../../assets/Shared/SearchingPeople' // * Styles import { diff --git a/client/src/screens/UsersList/components/NotFound/NotFound.styles.js b/client/src/components/Teammates/components/NotFound/NotFound.styles.js similarity index 100% rename from client/src/screens/UsersList/components/NotFound/NotFound.styles.js rename to client/src/components/Teammates/components/NotFound/NotFound.styles.js diff --git a/client/src/screens/UsersList/components/SelectField/MenuProps.js b/client/src/components/Teammates/components/SelectField/MenuProps.js similarity index 100% rename from client/src/screens/UsersList/components/SelectField/MenuProps.js rename to client/src/components/Teammates/components/SelectField/MenuProps.js diff --git a/client/src/screens/UsersList/components/SelectField/SelectField.css b/client/src/components/Teammates/components/SelectField/SelectField.css similarity index 55% rename from client/src/screens/UsersList/components/SelectField/SelectField.css rename to client/src/components/Teammates/components/SelectField/SelectField.css index 77849d7b2..14de5c797 100644 --- a/client/src/screens/UsersList/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/screens/UsersList/components/SelectField/SelectField.js b/client/src/components/Teammates/components/SelectField/SelectField.js similarity index 100% rename from client/src/screens/UsersList/components/SelectField/SelectField.js rename to client/src/components/Teammates/components/SelectField/SelectField.js diff --git a/client/src/screens/UsersList/components/SelectField/SelectField.styles.js b/client/src/components/Teammates/components/SelectField/SelectField.styles.js similarity index 100% rename from client/src/screens/UsersList/components/SelectField/SelectField.styles.js rename to client/src/components/Teammates/components/SelectField/SelectField.styles.js diff --git a/client/src/screens/UsersList/components/SliderToTop/SliderToTop.jsx b/client/src/components/Teammates/components/SliderToTop/SliderToTop.jsx similarity index 97% rename from client/src/screens/UsersList/components/SliderToTop/SliderToTop.jsx rename to client/src/components/Teammates/components/SliderToTop/SliderToTop.jsx index 26310c566..393a58f05 100644 --- a/client/src/screens/UsersList/components/SliderToTop/SliderToTop.jsx +++ b/client/src/components/Teammates/components/SliderToTop/SliderToTop.jsx @@ -3,7 +3,7 @@ import React, { useEffect, useState } from 'react' import { animateScroll as scroll } from 'react-scroll' // * Assets -import Slider from '../../../../assets/Slider' +import Slider from '../../../../assets/Shared/Slider' // * Styles import { diff --git a/client/src/screens/UsersList/components/SliderToTop/SliderToTop.styles.js b/client/src/components/Teammates/components/SliderToTop/SliderToTop.styles.js similarity index 100% rename from client/src/screens/UsersList/components/SliderToTop/SliderToTop.styles.js rename to client/src/components/Teammates/components/SliderToTop/SliderToTop.styles.js diff --git a/client/src/screens/UsersList/components/UserCard/FrameworksCases/LengthFourCase.js b/client/src/components/Teammates/components/UserCard/FrameworksCases/LengthFourCase.js similarity index 88% rename from client/src/screens/UsersList/components/UserCard/FrameworksCases/LengthFourCase.js rename to client/src/components/Teammates/components/UserCard/FrameworksCases/LengthFourCase.js index 5486b397d..d4e0bc0a1 100644 --- a/client/src/screens/UsersList/components/UserCard/FrameworksCases/LengthFourCase.js +++ b/client/src/components/Teammates/components/UserCard/FrameworksCases/LengthFourCase.js @@ -1,6 +1,6 @@ // * Styles // * Colors -import { frameworkColors, frameworkTextColors } from '../FrameworkColors' +import { frameworkColors, frameworkTextColors } from '../../../../../constants/frameworkColors' import { Framework } from '../UserCard.styles' const LengthFourCase = ({ userFrameworks }) => { 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 87% rename from client/src/screens/UsersList/components/UserCard/UserCard.js rename to client/src/components/Teammates/components/UserCard/UserCard.js index 7a4a7097e..f327d31b9 100644 --- a/client/src/screens/UsersList/components/UserCard/UserCard.js +++ b/client/src/components/Teammates/components/UserCard/UserCard.js @@ -1,10 +1,11 @@ import React from 'react' -import Photo from '../../../../components/Profile/Photo.jpg' -import { LOCAL_PATH } from '../../../../http' // * Images -import CrownImg from '../../img/CrownTest.png' -import userImg from '../../img/tempImg.jpg' +import CrownImg from '../../../../assets/UserProfile/LeaderCrown.png' +// * Colors +import { languageOptions } from '../../../../constants/programmingLanguages' +import { LOCAL_PATH } from '../../../../http' +import { calculateAge } from '../../../../utils/calculateAge' import LengthFourCase from './FrameworksCases/LengthFourCase' import LengthFourSlicedCase from './FrameworksCases/LengthFourSlicedCase' @@ -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 @@ -87,10 +82,7 @@ const UserCard = React.forwardRef((props, ref) => { {/* TODO: Change for real image! */}
- +
{programmingLanguages}
@@ -98,7 +90,7 @@ const UserCard = React.forwardRef((props, ref) => { - {person.fullName}, {person.age} + {person.fullName}, {calculateAge(person.dateOfBirth)} 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 86% rename from client/src/screens/UsersList/components/UserProfile/UserProfile.js rename to client/src/components/Teammates/components/UserProfile/UserProfile.js index 06e6b5ae5..0b9d704cb 100644 --- a/client/src/screens/UsersList/components/UserProfile/UserProfile.js +++ b/client/src/components/Teammates/components/UserProfile/UserProfile.js @@ -2,17 +2,15 @@ import React from 'react' import CloseIcon from '@mui/icons-material/Close' import GitHubIcon from '@mui/icons-material/GitHub' -import InstagramIcon from '@mui/icons-material/Instagram' import LinkedInIcon from '@mui/icons-material/LinkedIn' import TelegramIcon from '@mui/icons-material/Telegram' -import AddIcon from '../../../../assets/AddIcon' // * Assets -import LinkIcon from '../../../../assets/LinkIcon' -import MessageIcon from '../../../../assets/MessageIcon' +import LinkIcon from '../../../../assets/Shared/LinkIcon' +import AddIcon from '../../../../assets/UserProfile/AddIcon' +import MessageIcon from '../../../../assets/UserProfile/MessageIcon' import { LOCAL_PATH } from '../../../../http' -// * Temporary image -import AvatarImage from '../../img/tempImg.jpg' +import { calculateAge } from '../../../../utils/calculateAge' 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() */} @@ -57,7 +51,7 @@ const UserProfile = ({ user, handleClose }) => { - {user.fullName}, {user.age} + {user.fullName}, {calculateAge(user.dateOfBirth)} 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 86% rename from client/src/screens/UsersList/components/UserProfilePhone/UserProfilePhone.js rename to client/src/components/Teammates/components/UserProfilePhone/UserProfilePhone.js index c88620c5b..04713544f 100644 --- a/client/src/screens/UsersList/components/UserProfilePhone/UserProfilePhone.js +++ b/client/src/components/Teammates/components/UserProfilePhone/UserProfilePhone.js @@ -4,13 +4,13 @@ import InstagramIcon from '@mui/icons-material/Instagram' import LinkedInIcon from '@mui/icons-material/LinkedIn' import TelegramIcon from '@mui/icons-material/Telegram' -import AddIcon from '../../../../assets/AddIcon' // * Assets -import ComebackArrow from '../../../../assets/ComebackArrow' -import LinkIcon from '../../../../assets/LinkIcon' -import MessageIcon from '../../../../assets/MessageIcon' +import ComebackArrow from '../../../../assets/Arrows/ComebackArrow' +import LinkIcon from '../../../../assets/Shared/LinkIcon' +import AddIcon from '../../../../assets/UserProfile/AddIcon' +import MessageIcon from '../../../../assets/UserProfile/MessageIcon' import { LOCAL_PATH } from '../../../../http' -import TempImg from '../../img/tempImg.jpg' +import { calculateAge } from '../../../../utils/calculateAge' // * Styles import { @@ -38,16 +38,12 @@ const UserProfilePhone = ({ user, mobileProfile, handleClose }) => { - {/* TODO: Change for the REAL photo! */}
- +
- {user.fullName}, {user.age} + {user.fullName}, {calculateAge(user.dateOfBirth)} {user.concentration} 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/components/TopTemplate/TopTemplate.js b/client/src/components/TopTemplate/TopTemplate.js deleted file mode 100644 index 8bb72a8e3..000000000 --- a/client/src/components/TopTemplate/TopTemplate.js +++ /dev/null @@ -1,16 +0,0 @@ -import TeameightsLogo from '../../assets/Team/TeameightsLogo.js' -import NavBar from '../NavBar/NavBar' - -import { NavContainer } from './TopTemplate.styles' - -const TopTemplate = () => { - return ( -
- - - -
- ) -} - -export default TopTemplate diff --git a/client/src/components/TopTemplate/TopTemplate.styles.js b/client/src/components/TopTemplate/TopTemplate.styles.js deleted file mode 100644 index 296feb184..000000000 --- a/client/src/components/TopTemplate/TopTemplate.styles.js +++ /dev/null @@ -1,18 +0,0 @@ -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 c789a9db4..db81cf27e 100644 --- a/client/src/constants/finishRegistrationData.js +++ b/client/src/constants/finishRegistrationData.js @@ -1,16 +1,22 @@ -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 BehanceIcon from '../assets/Links/BehanceIcon' import GitHubIcon from '../assets/Links/GitHubIcon' import LinkedInIcon from '../assets/Links/LinkedInIcon' import TelegramIcon from '../assets/Links/TelegramIcon' import concentrationOptions from './concentrations' import frameworkOptions from './frameworks' -import programmingLanguageOptions from './programmingLanguages' +import { programmingLanguageOptions } from './programmingLanguages' + +const avatarFilenames = [ + 'default-blue.png', + 'default-green.png', + 'default-orange.png', + 'default-pink.png', + 'default-purple.png', + 'default-yellow.png', +] + +const avatars = avatarFilenames.map((filename) => require(`../assets/Images/user/${filename}`)) export const userConcentrations = [ { @@ -46,38 +52,47 @@ export const userLinks = [ name: 'telegram', icon: , }, + { + name: 'behance', + icon: , + }, ] export const defaultUserAvatars = [ - { name: 'green', path: greenAvatar }, - { name: 'pink', path: pinkAvatar }, - { name: 'blue', path: blueAvatar }, - { name: 'orange', path: orangeAvatar }, - { name: 'purple', path: purpleAvatar }, - { name: 'yellow', path: yellowAvatar }, + { name: 'green', path: avatars[0] }, + { name: 'pink', path: avatars[1] }, + { name: 'blue', path: avatars[2] }, + { name: 'orange', path: avatars[3] }, + { name: 'purple', path: avatars[4] }, + { name: 'yellow', path: avatars[5] }, ] + export const userExperienceOptions = [ { - label: '0-1 years', - value: '0-1', + label: 'No experience', + value: '0', }, { label: '1-3 years', value: '1-3', }, { - label: '3+ years', - value: '3+', + label: '3-5 years', + value: '3-5', + }, + { + label: '5+ years', + value: '5+', }, ] export const userLeaderOptions = [ { - label: 'YES', - value: 'true', + label: 'No', + value: 'false', }, { - label: 'NO', - value: 'false', + label: 'Yes', + value: 'true', }, ] 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/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..d883fc30e 100644 --- a/client/src/constants/teamFormData.js +++ b/client/src/constants/teamFormData.js @@ -1,9 +1,13 @@ -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' +const avatarFilenames = [ + 'default-blue.png', + 'default-green.png', + 'default-orange.png', + 'default-pink.png', + 'default-purple.png', + 'default-yellow.png', +] + +const avatars = avatarFilenames.map((filename) => require(`../assets/Images/team/${filename}`)) export const teamTypes = [ { @@ -21,10 +25,10 @@ export const teamTypes = [ ] export const defaultTeamAvatars = [ - { name: 'green', path: greenAvatar }, - { name: 'pink', path: pinkAvatar }, - { name: 'blue', path: blueAvatar }, - { name: 'orange', path: orangeAvatar }, - { name: 'purple', path: purpleAvatar }, - { name: 'yellow', path: yellowAvatar }, + { name: 'green', path: avatars[0] }, + { name: 'pink', path: avatars[1] }, + { name: 'blue', path: avatars[2] }, + { name: 'orange', path: avatars[3] }, + { name: 'purple', path: avatars[4] }, + { name: 'yellow', path: avatars[5] }, ] 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 2d1117843..000000000 Binary files a/client/src/fonts/FontsFree-Net-Noir_regular.woff and /dev/null differ 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/layouts/AuthLayout/AuthLayout.jsx b/client/src/layouts/AuthLayout/AuthLayout.jsx index 7b8c6fdae..e7002d733 100644 --- a/client/src/layouts/AuthLayout/AuthLayout.jsx +++ b/client/src/layouts/AuthLayout/AuthLayout.jsx @@ -1,11 +1,8 @@ -import React, { useEffect, useState } from 'react' -import { useSelector } from 'react-redux' import { Outlet, useLocation, useNavigate } from 'react-router-dom' import { Button } from '@mui/material' import CssBaseline from '@mui/material/CssBaseline' -import CodingImage from '../../assets/CodingImage' -import SnackBar from '../../components/SnackBar/SnackBar' +import CodingImage from '../../assets/Login/CodingImage' import { AuthContainer, @@ -20,25 +17,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 && }