From 1c8073fea07bc3955df49f735ced83342ebf1ef6 Mon Sep 17 00:00:00 2001 From: Youssef Raafat Date: Mon, 28 Sep 2020 03:05:18 +0200 Subject: [PATCH] [CLIENT] Add Authorization (#38) --- client/components/NavBar.tsx | 162 ++++++++++-------- client/components/providers/AuthProvider.tsx | 18 ++ client/context/AuthContext.ts | 12 ++ client/graphql/queries/role.gql | 3 + client/hocs/withAuth.tsx | 48 ++++++ client/hooks/useAuth.ts | 10 ++ client/pages/_app.tsx | 17 +- client/pages/create/certificateProvider.tsx | 9 +- client/pages/create/releaseRequest.tsx | 8 +- client/pages/create/resourceRequest.tsx | 11 +- client/pages/create/skill.tsx | 6 +- .../pages/edit/certificateProvider/[id].tsx | 7 +- client/pages/edit/releaseRequest/[id].tsx | 7 +- client/pages/edit/resourceRequest/[id].tsx | 10 +- client/pages/edit/skill/[id].tsx | 9 +- client/pages/index.tsx | 8 +- client/pages/view/certificateProviders.tsx | 20 ++- client/pages/view/releaseRequests.tsx | 8 +- client/pages/view/resourceRequests.tsx | 8 +- client/pages/view/skills.tsx | 6 +- client/tsconfig.json | 2 +- client/urql/cacheExchangeOpts.ts | 9 + 22 files changed, 276 insertions(+), 122 deletions(-) create mode 100644 client/components/providers/AuthProvider.tsx create mode 100644 client/context/AuthContext.ts create mode 100644 client/graphql/queries/role.gql create mode 100644 client/hocs/withAuth.tsx create mode 100644 client/hooks/useAuth.ts diff --git a/client/components/NavBar.tsx b/client/components/NavBar.tsx index 5e600c2..6b0dfaa 100644 --- a/client/components/NavBar.tsx +++ b/client/components/NavBar.tsx @@ -1,4 +1,4 @@ -import * as React from "react"; +import React from "react"; import { StatefulMenu } from "baseui/menu"; import { StatefulPopover, TRIGGER_TYPE } from "baseui/popover"; import { @@ -12,15 +12,16 @@ import { Button } from "baseui/button"; import { useRouter } from "next/dist/client/router"; import { Plus } from "baseui/icon"; -import { useMeQuery, useLogoutMutation } from "../generated/graphql"; +import { useLogoutMutation, UserRole as R } from "../generated/graphql"; import { Block } from "baseui/block"; +import { useAuth } from "../hooks/useAuth"; interface NavBarProps {} export const NavBar: React.FC = () => { - const [{ data }] = useMeQuery(); - const [, logout] = useLogoutMutation(); const router = useRouter(); + const { role } = useAuth(); + const [, logout] = useLogoutMutation(); return ( @@ -32,58 +33,63 @@ export const NavBar: React.FC = () => { - - ( - router.push(item.route)} - items={{ - __ungrouped: [], - Requests: [ - { - label: "Resource Request", - route: "/view/resourceRequests", - }, - { - label: "Release Request", - route: "/view/releaseRequests", - }, - ], - }} - /> - )} - > - Talents - - - - ( - router.push(item.route)} - items={{ - __ungrouped: [], - Skills: [ - { - label: "Skills", - route: "/view/skills", - }, - ], - Certifications: [ - { - label: "Certificate Providers", - route: "/view/certificateProviders", - }, - ], - }} - /> - )} - > - Skills & Certifications - - + {role == R.Admin || role == R.Manager ? ( + + ( + router.push(item.route)} + items={{ + __ungrouped: [], + Requests: [ + { + label: "Resource Request", + route: "/view/resourceRequests", + }, + { + label: "Release Request", + route: "/view/releaseRequests", + }, + ], + }} + /> + )} + > + Talents + + + ) : null} + + {role == R.Admin ? ( + + ( + router.push(item.route)} + items={{ + __ungrouped: [], + Skills: [ + { + label: "Skills", + route: "/view/skills", + }, + ], + Certifications: [ + { + label: "Certificate Providers", + route: "/view/certificateProviders", + }, + ], + }} + /> + )} + > + Skills & Certifications + + + ) : null} @@ -96,23 +102,31 @@ export const NavBar: React.FC = () => { onItemSelect={({ item }) => router.push(item.route)} items={{ __ungrouped: [], - Requests: [ - { - label: "Resource Request", - route: "/create/resourceRequest", - }, - { - label: "Release Request", - route: "/create/releaseRequest", - }, - ], - "Skills & Certificates": [ - { label: "Skill", route: "/create/skill" }, - { - label: "Certificate Provider", - route: "/create/certificateProvider", - }, - ], + ...(role == R.Admin || role == R.Manager + ? { + Requests: [ + { + label: "Resource Request", + route: "/create/resourceRequest", + }, + { + label: "Release Request", + route: "/create/releaseRequest", + }, + ], + } + : {}), + ...(role == R.Admin + ? { + Lists: [ + { label: "Skill", route: "/create/skill" }, + { + label: "Certificate Provider", + route: "/create/certificateProvider", + }, + ], + } + : {}), }} /> )} @@ -121,7 +135,7 @@ export const NavBar: React.FC = () => { - {!data?.me ? ( + {!role ? ( ) : (