From 0349e10c7abde4202094592f70aa6e22e81c5130 Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Wed, 20 Oct 2021 22:39:19 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fix=20all=20variants=20of=20#81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/group/useGroupMembership.ts | 31 +++++++++++++++++ .../components/notebook/NotebookCreateBox.tsx | 16 ++------- .../notebook/NotebookDeleteButton.tsx | 19 ++--------- .../notebook/NotebookLockButton.tsx | 19 ++--------- .../notebook/NotebookStartButton.tsx | 19 ++--------- .../notebook/NotebookStopButton.tsx | 19 ++--------- .../notebook/NotebookUnlockButton.tsx | 18 ++-------- .../components/project/ProjectCreateBox.tsx | 34 ++----------------- .../project/ProjectDeleteButton.tsx | 19 ++--------- 9 files changed, 48 insertions(+), 146 deletions(-) create mode 100644 frontend/src/components/group/useGroupMembership.ts diff --git a/frontend/src/components/group/useGroupMembership.ts b/frontend/src/components/group/useGroupMembership.ts new file mode 100644 index 0000000..639d446 --- /dev/null +++ b/frontend/src/components/group/useGroupMembership.ts @@ -0,0 +1,31 @@ +import * as React from "react" +import {useAuthorizationContext} from "../../contexts/authorization" +import {useGroupContext} from "../../contexts/group" + + +export function useGroupMembership(): boolean | undefined { + const authorization = useAuthorizationContext() + const group = useGroupContext() + + + return React.useMemo( + () => { + if(!authorization) { + return undefined + } + if(!group) { + return undefined + } + if(!authorization.state.token) { + return false + } + if(!( + group.value.members.includes(authorization.state.user.id) || group.value.owner === authorization.state.user.id + )) { + return false + } + return true + }, + [authorization, group] + ) +} \ No newline at end of file diff --git a/frontend/src/components/notebook/NotebookCreateBox.tsx b/frontend/src/components/notebook/NotebookCreateBox.tsx index 15bd1d9..edabd9b 100644 --- a/frontend/src/components/notebook/NotebookCreateBox.tsx +++ b/frontend/src/components/notebook/NotebookCreateBox.tsx @@ -1,13 +1,13 @@ import {Box, Details, Form, Idiomatic as I, useFormState} from "@steffo/bluelib-react" import * as React from "react" import {useAuthorizationContext} from "../../contexts/authorization" -import {useGroupContext} from "../../contexts/group" import {useProjectContext} from "../../contexts/project" import {useApplyChanges} from "../../hooks/useApplyChanges" import {useFormSlug} from "../../hooks/useFormSlug" import {ManagedResource, ManagedViewSet} from "../../hooks/useManagedViewSet" import {SophonNotebook} from "../../types/SophonTypes" import {Validators} from "../../utils/Validators" +import {useGroupMembership} from "../group/useGroupMembership" export interface NotebookCreateBoxProps { @@ -18,7 +18,6 @@ export interface NotebookCreateBoxProps { export function NotebookCreateBox({viewSet, resource}: NotebookCreateBoxProps): JSX.Element | null { const authorization = useAuthorizationContext() - const group = useGroupContext() const project = useProjectContext() const name = @@ -56,18 +55,7 @@ export function NotebookCreateBox({viewSet, resource}: NotebookCreateBoxProps): [viewSet, resource], ) - if(!authorization) { - return null - } - if(!group) { - return null - } - if(!authorization.state.token) { - return null - } - if(!( - group.value.members.includes(authorization.state.user.id) || group.value.owner === authorization.state.user.id - )) { + if(!useGroupMembership()) { return null } if(resource) { diff --git a/frontend/src/components/notebook/NotebookDeleteButton.tsx b/frontend/src/components/notebook/NotebookDeleteButton.tsx index dd9852a..6a6d1c7 100644 --- a/frontend/src/components/notebook/NotebookDeleteButton.tsx +++ b/frontend/src/components/notebook/NotebookDeleteButton.tsx @@ -1,11 +1,10 @@ import {faTrash} from "@fortawesome/free-solid-svg-icons" import {FontAwesomeIcon} from "@fortawesome/react-fontawesome" import * as React from "react" -import {useAuthorizationContext} from "../../contexts/authorization" -import {useGroupContext} from "../../contexts/group" import {ManagedResource} from "../../hooks/useManagedViewSet" import {SophonNotebook} from "../../types/SophonTypes" import {SafetyButton} from "../elements/SafetyButton" +import {useGroupMembership} from "../group/useGroupMembership" export interface NotebookDeleteButtonProps { @@ -14,21 +13,7 @@ export interface NotebookDeleteButtonProps { export function NotebookDeleteButton({resource}: NotebookDeleteButtonProps): JSX.Element | null { - const authorization = useAuthorizationContext() - const group = useGroupContext() - - if(!authorization) { - return null - } - if(!group) { - return null - } - if(!authorization.state.user) { - return null - } - if(!( - group.value.members.includes(authorization.state.user.id) || group.value.owner === authorization.state.user.id - )) { + if(!useGroupMembership()) { return null } if(resource.value.is_running) { diff --git a/frontend/src/components/notebook/NotebookLockButton.tsx b/frontend/src/components/notebook/NotebookLockButton.tsx index 85f5b34..860420a 100644 --- a/frontend/src/components/notebook/NotebookLockButton.tsx +++ b/frontend/src/components/notebook/NotebookLockButton.tsx @@ -2,10 +2,9 @@ import {faLock} from "@fortawesome/free-solid-svg-icons" import {FontAwesomeIcon} from "@fortawesome/react-fontawesome" import {Button} from "@steffo/bluelib-react" import * as React from "react" -import {useAuthorizationContext} from "../../contexts/authorization" -import {useGroupContext} from "../../contexts/group" import {ManagedResource} from "../../hooks/useManagedViewSet" import {SophonNotebook} from "../../types/SophonTypes" +import {useGroupMembership} from "../group/useGroupMembership" export interface NotebookLockButtonProps { @@ -14,21 +13,7 @@ export interface NotebookLockButtonProps { export function NotebookLockButton({resource}: NotebookLockButtonProps): JSX.Element | null { - const authorization = useAuthorizationContext() - const group = useGroupContext() - - if(!authorization) { - return null - } - if(!group) { - return null - } - if(!authorization.state.user) { - return null - } - if(!( - group.value.members.includes(authorization.state.user.id) || group.value.owner === authorization.state.user.id - )) { + if(!useGroupMembership()) { return null } if(resource.value.locked_by) { diff --git a/frontend/src/components/notebook/NotebookStartButton.tsx b/frontend/src/components/notebook/NotebookStartButton.tsx index 7939cc7..3a58dfa 100644 --- a/frontend/src/components/notebook/NotebookStartButton.tsx +++ b/frontend/src/components/notebook/NotebookStartButton.tsx @@ -2,10 +2,9 @@ import {faLightbulb} from "@fortawesome/free-solid-svg-icons" import {FontAwesomeIcon} from "@fortawesome/react-fontawesome" import {Button} from "@steffo/bluelib-react" import * as React from "react" -import {useAuthorizationContext} from "../../contexts/authorization" -import {useGroupContext} from "../../contexts/group" import {ManagedResource} from "../../hooks/useManagedViewSet" import {SophonNotebook} from "../../types/SophonTypes" +import {useGroupMembership} from "../group/useGroupMembership" export interface NotebookStartButtonProps { @@ -14,21 +13,7 @@ export interface NotebookStartButtonProps { export function NotebookStartButton({resource}: NotebookStartButtonProps): JSX.Element | null { - const authorization = useAuthorizationContext() - const group = useGroupContext() - - if(!authorization) { - return null - } - if(!group) { - return null - } - if(!authorization.state.user) { - return null - } - if(!( - group.value.members.includes(authorization.state.user.id) || group.value.owner === authorization.state.user.id - )) { + if(!useGroupMembership()) { return null } if(resource.value.is_running) { diff --git a/frontend/src/components/notebook/NotebookStopButton.tsx b/frontend/src/components/notebook/NotebookStopButton.tsx index 4c6d9ec..1151254 100644 --- a/frontend/src/components/notebook/NotebookStopButton.tsx +++ b/frontend/src/components/notebook/NotebookStopButton.tsx @@ -2,10 +2,9 @@ import {faLightbulb} from "@fortawesome/free-regular-svg-icons" import {FontAwesomeIcon} from "@fortawesome/react-fontawesome" import {Button} from "@steffo/bluelib-react" import * as React from "react" -import {useAuthorizationContext} from "../../contexts/authorization" -import {useGroupContext} from "../../contexts/group" import {ManagedResource} from "../../hooks/useManagedViewSet" import {SophonNotebook} from "../../types/SophonTypes" +import {useGroupMembership} from "../group/useGroupMembership" export interface NotebookStopButtonProps { @@ -14,21 +13,7 @@ export interface NotebookStopButtonProps { export function NotebookStopButton({resource}: NotebookStopButtonProps): JSX.Element | null { - const authorization = useAuthorizationContext() - const group = useGroupContext() - - if(!authorization) { - return null - } - if(!group) { - return null - } - if(!authorization.state.user) { - return null - } - if(!( - group.value.members.includes(authorization.state.user.id) || group.value.owner === authorization.state.user.id - )) { + if(!useGroupMembership()) { return null } if(!resource.value.is_running) { diff --git a/frontend/src/components/notebook/NotebookUnlockButton.tsx b/frontend/src/components/notebook/NotebookUnlockButton.tsx index 53f4ae3..29d77d1 100644 --- a/frontend/src/components/notebook/NotebookUnlockButton.tsx +++ b/frontend/src/components/notebook/NotebookUnlockButton.tsx @@ -3,10 +3,10 @@ import {FontAwesomeIcon} from "@fortawesome/react-fontawesome" import {Button} from "@steffo/bluelib-react" import * as React from "react" import {useAuthorizationContext} from "../../contexts/authorization" -import {useGroupContext} from "../../contexts/group" import {ManagedResource} from "../../hooks/useManagedViewSet" import {SophonNotebook} from "../../types/SophonTypes" import {SafetyButton} from "../elements/SafetyButton" +import {useGroupMembership} from "../group/useGroupMembership" export interface NotebookUnlockButtonProps { @@ -16,27 +16,15 @@ export interface NotebookUnlockButtonProps { export function NotebookUnlockButton({resource}: NotebookUnlockButtonProps): JSX.Element | null { const authorization = useAuthorizationContext() - const group = useGroupContext() - if(!authorization) { - return null - } - if(!group) { - return null - } - if(!authorization.state.user) { - return null - } - if(!( - group.value.members.includes(authorization.state.user.id) || group.value.owner === authorization.state.user.id - )) { + if(!useGroupMembership()) { return null } if(!resource.value.locked_by) { return null } - if(resource.value.locked_by === authorization.state.user.id) { + if(resource.value.locked_by === authorization!.state.user!.id) { return (