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 (
-