diff --git a/src/hooks/queries/user/useFetchUser.ts b/src/hooks/queries/user/useFetchUser.ts new file mode 100644 index 0000000..3b27c66 --- /dev/null +++ b/src/hooks/queries/user/useFetchUser.ts @@ -0,0 +1,25 @@ +import { useEffect } from 'react'; +import useAsync from '@educt/hooks/useAsync'; +import { IUser } from '@educt/interfaces'; +import { UserServiceInstance } from '@educt/services'; + +const useFetchUser = (id: string) => { + const fetch = async (id: string) => { + try { + const { data } = await UserServiceInstance.fetchUserById(id); + return data; + } catch (error) { + return Promise.reject(error); + } + }; + + const { execute: fetchUserById, ...state } = useAsync>(fetch); + + useEffect(() => { + fetchUserById(id); + }, []); + + return { ...state }; +}; + +export { useFetchUser }; diff --git a/src/pages/user/user.tsx b/src/pages/user/user.tsx new file mode 100644 index 0000000..0ca51f9 --- /dev/null +++ b/src/pages/user/user.tsx @@ -0,0 +1,83 @@ +import React from 'react'; +import { PageContent, PageWrapper } from '@educt/components/PageElements'; +import { IPageProps } from '@educt/interfaces'; +import { useFetchUser } from '@educt/hooks/queries/user/useFetchUser'; +import { Redirect, useParams } from 'react-router-dom'; +import LoadingPage from '@educt/components/LoadingPage'; +import { + Box, + Button, + Flex, + Avatar, + Text, + Heading, + useColorModeValue, + Icon, + AvatarBadge, + Divider, +} from '@chakra-ui/react'; +import { MdOutlineMessage } from 'react-icons/md'; +import UserBadge from '@educt/components/UserBadge'; +import { CalendarIcon, RepeatClockIcon } from '@chakra-ui/icons'; + +const UserPage: React.FC = () => { + const { id } = useParams<{ id: string }>(); + const { data: user, error, isLoading } = useFetchUser(id); + const color = useColorModeValue('#E2E8F0', '#2D3748'); + + if (error?.response?.status === 404) return ; + + if (user === null || isLoading) return ; + + return ( + + + + + + + + + + + + + {user.fullname} •  + + + + + + + + + + + Registered: {new Date(user.created_at).toLocaleDateString()} + + + + + + Last login: 3 min ago + + + + + + + + Lorem ipsum dolor sit amet consectetur adipisicing elit. A quibusdam sapiente quisquam vero harum ipsam + officiis rerum. Cum, excepturi nulla. + + + + + + + ); +}; + +export default UserPage; diff --git a/src/routes.config.ts b/src/routes.config.ts index afc8899..da631c7 100644 --- a/src/routes.config.ts +++ b/src/routes.config.ts @@ -14,6 +14,7 @@ import CoursePage from '@educt/pages/course/course'; import EditCoursePage from '@educt/pages/courses/edit/edit'; import ChangePasswordPage from '@educt/pages/profile/change-password/change-password'; import ChangeEmailPage from '@educt/pages/profile/change-email/change-email'; +import UserPage from './pages/user/user'; import { UserRoleEnum } from './enums'; const CoursesPage = lazy(() => import('@educt/pages/courses/courses')); const LessonPage = lazy(() => import('@educt/pages/lesson/lesson')); @@ -126,6 +127,13 @@ export const routes: IRouteOption[] = [ isPrivate: true, roles: [UserRoleEnum.ADMIN, UserRoleEnum.TEACHER], }, + { + path: '/user/:id', + title: 'User', + component: UserPage, + isPrivate: true, + exact: true, + }, { path: '/auth', title: 'Auth', diff --git a/src/services/UserService.ts b/src/services/UserService.ts index 5485a48..c5d999d 100644 --- a/src/services/UserService.ts +++ b/src/services/UserService.ts @@ -45,6 +45,17 @@ class UserService { return result.data; } + /** + * Fetch user by id + * + * @param id User id + * @returns Users + */ + public async fetchUserById(id: string): Promise> { + const result = await this.api.get(`/v1/users/${id}`); + return result.data; + } + /** * Create new user *