From 9ae3c179130fc3de4aaab6a02d468ddc32b132a0 Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Sat, 22 Aug 2020 19:01:29 -0700 Subject: [PATCH] Don't even render components if the user doesn't have permission --- .../components/screens/ScreenBlock.tsx | 4 +-- .../server/network/NetworkContainer.tsx | 7 ++--- .../scripts/hoc/requireServerPermission.tsx | 27 +++++++++++++++++++ resources/scripts/routers/ServerRouter.tsx | 19 ++++++++----- 4 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 resources/scripts/hoc/requireServerPermission.tsx diff --git a/resources/scripts/components/screens/ScreenBlock.tsx b/resources/scripts/components/screens/ScreenBlock.tsx index 55e1e70a0..38cad46cb 100644 --- a/resources/scripts/components/screens/ScreenBlock.tsx +++ b/resources/scripts/components/screens/ScreenBlock.tsx @@ -52,8 +52,8 @@ export default ({ title, image, message, onBack, onRetry }: Props) => ( } - -

{title}

+ +

{title}

{message}

diff --git a/resources/scripts/components/server/network/NetworkContainer.tsx b/resources/scripts/components/server/network/NetworkContainer.tsx index a330685b1..64d69aec0 100644 --- a/resources/scripts/components/server/network/NetworkContainer.tsx +++ b/resources/scripts/components/server/network/NetworkContainer.tsx @@ -24,7 +24,7 @@ const Code = styled.code`${tw`font-mono py-1 px-2 bg-neutral-900 rounded text-sm const Label = styled.label`${tw`uppercase text-xs mt-1 text-neutral-400 block px-1 select-none transition-colors duration-150`}`; const NetworkContainer = () => { - const { uuid, allocations, name: serverName } = useServer(); + const { uuid, allocations } = useServer(); const { clearFlashes, clearAndAddHttpError } = useFlash(); const [ loading, setLoading ] = useState(false); const { data, error, mutate } = useSWR(uuid, key => getServerAllocations(key), { initialData: allocations }); @@ -61,10 +61,7 @@ const NetworkContainer = () => { }, [ error ]); return ( - - - {serverName} | Network - + {!data ? : diff --git a/resources/scripts/hoc/requireServerPermission.tsx b/resources/scripts/hoc/requireServerPermission.tsx new file mode 100644 index 000000000..88ff05e20 --- /dev/null +++ b/resources/scripts/hoc/requireServerPermission.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import Can from '@/components/elements/Can'; +import NotFound from '@/components/screens/NotFound'; +import ScreenBlock from '@/components/screens/ScreenBlock'; + +const requireServerPermission = (Component: React.ComponentType, permissions: string | string[]) => { + return class extends React.Component { + render () { + return ( + + } + > + + + ); + } + }; +}; + +export default requireServerPermission; diff --git a/resources/scripts/routers/ServerRouter.tsx b/resources/scripts/routers/ServerRouter.tsx index 22e701fa9..7e0e30685 100644 --- a/resources/scripts/routers/ServerRouter.tsx +++ b/resources/scripts/routers/ServerRouter.tsx @@ -28,6 +28,7 @@ import SubNavigation from '@/components/elements/SubNavigation'; import NetworkContainer from '@/components/server/network/NetworkContainer'; import InstallListener from '@/components/server/InstallListener'; import StartupContainer from '@/components/server/startup/StartupContainer'; +import requireServerPermission from '@/hoc/requireServerPermission'; const ServerRouter = ({ match, location }: RouteComponentProps<{ id: string }>) => { const { rootAdmin } = useStoreState(state => state.user.data!); @@ -121,7 +122,11 @@ const ServerRouter = ({ match, location }: RouteComponentProps<{ id: string }>) - + ( @@ -131,17 +136,17 @@ const ServerRouter = ({ match, location }: RouteComponentProps<{ id: string }>) )} exact /> - - + + - - - - + + + +